From 302d546eefdf4df2523eb8fe1b7178219b850644 Mon Sep 17 00:00:00 2001 From: William Wong Date: Thu, 15 Aug 2024 17:12:32 -0700 Subject: [PATCH] [Fluent] Add copy button (#5259) * Add copy button * Add copy button tests * Put copy button inside bubble * Fix screenshot * Fix build pipeline * Localize copy text * Hide toolbox when not needed * Loosen valibot parse * Fix copy button text * Use CSS animation to flip copied text * Add clipboard permissions * Add Copy button entry * Fallback properly * Use keyboard to tap the Copy button * Put "Copy" button under main text only * Clean up * Remove unused var * Incorporate PR feedback * Incorporate PR feedbacks * Incorporate PR feedbacks * Incorporate PR feedbacks * Add tests for dark vs. light and Fluent vs. Copilot * Sort/dedupe CSS vars * Prefer backgroundDisabled than background1Disabled * Fixing padding-block --- .dockerignore | 1 + .github/workflows/pull-request-validation.yml | 1 + CHANGELOG.md | 13 +- ...applied-copy-button-should-work-1-snap.png | Bin 0 -> 18210 bytes ...applied-copy-button-should-work-2-snap.png | Bin 0 -> 18254 bytes ...applied-copy-button-should-work-3-snap.png | Bin 0 -> 27527 bytes ...y-button-should-layout-properly-1-snap.png | Bin 0 -> 20324 bytes ...y-button-should-layout-properly-1-snap.png | Bin 0 -> 21165 bytes ...y-button-should-layout-properly-1-snap.png | Bin 0 -> 20262 bytes ...y-button-should-layout-properly-1-snap.png | Bin 0 -> 21497 bytes __tests__/html/fluentTheme/copyButton.html | 122 + __tests__/html/fluentTheme/copyButton.js | 5 + .../html/fluentTheme/copyButton.layout.html | 123 + .../html/fluentTheme/copyButton.layout.js | 13 + __tests__/html/withEmoji.5.html | 17 +- docker-compose-wsl2.yml | 1 + package.json | 1 + packages/api/src/localization/en-US.json | 3 + .../ActivityToolbox.module.css | 6 + .../activityToolbox/ActivityToolbox.tsx | 31 + .../activityToolbox/Button.module.css | 41 + .../src/components/activityToolbox/Button.tsx | 40 + .../activityToolbox/CopyButton.module.css | 29 + .../components/activityToolbox/CopyButton.tsx | 79 + .../src/components/activityToolbox/index.ts | 1 + .../StarterPromptsCardAction.module.css | 2 +- .../isPreChatMessageActivity.ts | 22 +- .../src/components/theme/Theme.module.css | 34 +- .../src/private/FluentThemeProvider.tsx | 40 +- packages/fluent-theme/src/testIds.ts | 1 + .../src/utils/getMessageEntity.ts | 25 + .../src/host/jest/allocateWebDriver.js | 1 + .../test/harness/src/host/jest/runHTML.js | 2 +- packages/test/web-server/.gitignore | 4 + packages/test/web-server/package-lock.json | 2215 +++++++++++++++++ packages/test/web-server/package.json | 34 + packages/test/web-server/src/index.ts | 29 + packages/test/web-server/tsup.config.ts | 10 + testharness2.dockerfile | 8 +- 39 files changed, 2903 insertions(+), 51 deletions(-) create mode 100644 __tests__/__image_snapshots__/html/copy-button-js-fluent-theme-applied-copy-button-should-work-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/copy-button-js-fluent-theme-applied-copy-button-should-work-2-snap.png create mode 100644 __tests__/__image_snapshots__/html/copy-button-js-fluent-theme-applied-copy-button-should-work-3-snap.png create mode 100644 __tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-dark-theme-and-copilot-variant-copy-button-should-layout-properly-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-dark-theme-and-fluent-variant-copy-button-should-layout-properly-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-light-theme-and-copilot-variant-copy-button-should-layout-properly-1-snap.png create mode 100644 __tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-light-theme-and-fluent-variant-copy-button-should-layout-properly-1-snap.png create mode 100644 __tests__/html/fluentTheme/copyButton.html create mode 100644 __tests__/html/fluentTheme/copyButton.js create mode 100644 __tests__/html/fluentTheme/copyButton.layout.html create mode 100644 __tests__/html/fluentTheme/copyButton.layout.js create mode 100644 packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.module.css create mode 100644 packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.tsx create mode 100644 packages/fluent-theme/src/components/activityToolbox/Button.module.css create mode 100644 packages/fluent-theme/src/components/activityToolbox/Button.tsx create mode 100644 packages/fluent-theme/src/components/activityToolbox/CopyButton.module.css create mode 100644 packages/fluent-theme/src/components/activityToolbox/CopyButton.tsx create mode 100644 packages/fluent-theme/src/components/activityToolbox/index.ts create mode 100644 packages/fluent-theme/src/utils/getMessageEntity.ts create mode 100644 packages/test/web-server/.gitignore create mode 100644 packages/test/web-server/package-lock.json create mode 100644 packages/test/web-server/package.json create mode 100644 packages/test/web-server/src/index.ts create mode 100644 packages/test/web-server/tsup.config.ts diff --git a/.dockerignore b/.dockerignore index d434a8c2ba..1451199d43 100644 --- a/.dockerignore +++ b/.dockerignore @@ -7,4 +7,5 @@ !/packages/test/fluent-bundle/dist !/packages/test/harness/dist !/packages/test/page-object/dist +!/packages/test/web-server/dist !/serve-test.json diff --git a/.github/workflows/pull-request-validation.yml b/.github/workflows/pull-request-validation.yml index 341d3590d9..3439fda50f 100644 --- a/.github/workflows/pull-request-validation.yml +++ b/.github/workflows/pull-request-validation.yml @@ -66,6 +66,7 @@ jobs: ./packages/test/fluent-bundle/dist/ ./packages/test/harness/ ./packages/test/page-object/dist/ + ./packages/test/web-server/dist/ ./serve-test.json ./testharness.dockerfile ./testharness2.dockerfile diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e124cf82b..ee6b977ed9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,14 +30,15 @@ Notes: web developers are advised to use [`~` (tilde range)](https://github.com/ ### Added -- (Experimental) Added pre-chat message with starter prompts, in PR [#5255](https://github.com/microsoft/BotFramework-WebChat/issues/5255), by [@compulim](https://github.com/compulim) +- (Experimental) Added pre-chat message with starter prompts in Fluent UI, in PR [#5255](https://github.com/microsoft/BotFramework-WebChat/issues/5255), by [@compulim](https://github.com/compulim) - (Experimental) Added `isPrimary` props to Fluent UI send box. When set, will wire up with `useSendBoxValue` and works with starter prompts in pre-chat message, in PR [#5257](https://github.com/microsoft/BotFramework-WebChat/issues/5257), by [@compulim](https://github.com/compulim) - (Experimental) Expand Fluent theme support to activities and transcript, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) - - Added new Fluent UI theme variant "copilot" with updated styling and components, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) - - Introduced `ActivityDecorator` component for enhanced message styling and layout, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) - - Added `CopilotMessageHeader` component for displaying bot information in the "copilot" variant, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) - - Updated Fluent theme styling to improve accessibility and visual consistency, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) - - Fixed header font in copilot variant, in PR [#5261](https://github.com/microsoft/BotFramework-WebChat/pull/5261), by [@OEvgeny](https://github.com/OEvgeny) +- Added new Fluent UI theme variant "copilot" with updated styling and components, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) +- Introduced `ActivityDecorator` component for enhanced message styling and layout, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) +- Added `CopilotMessageHeader` component for displaying bot information in the "copilot" variant, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) +- Updated Fluent theme styling to improve accessibility and visual consistency, in PR [#5258](https://github.com/microsoft/BotFramework-WebChat/pull/5258), by [@OEvgeny](https://github.com/OEvgeny) +- Fixed header font in copilot variant, in PR [#5261](https://github.com/microsoft/BotFramework-WebChat/pull/5261), by [@OEvgeny](https://github.com/OEvgeny) +- (Experimental) Added "Copy" button to bot messages in Fluent UI if it contains keyword `AllowCopy`, in PR [#5259](https://github.com/microsoft/BotFramework-WebChat/pull/5259), by [@compulim](https://github.com/compulim) ### Changed diff --git a/__tests__/__image_snapshots__/html/copy-button-js-fluent-theme-applied-copy-button-should-work-1-snap.png b/__tests__/__image_snapshots__/html/copy-button-js-fluent-theme-applied-copy-button-should-work-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..06fb314f720ae482bcb5e55aff1239da4f1e1cea GIT binary patch literal 18210 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 literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-dark-theme-and-copilot-variant-copy-button-should-layout-properly-1-snap.png b/__tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-dark-theme-and-copilot-variant-copy-button-should-layout-properly-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..591a6478aca4a5f48b2385ef14845626c84b498c GIT binary patch literal 20324 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

n`;PNYY_A z;?Sw^;i71HR3|agK!-So$xeKH{O3ErHg4OtjmfEx8mz(6&aTR4!5DKDScy2GesJn> zGX~RrKU`t8o|)_H08b@ay)sB3*mib@t@%YAJM-4eC#Y{t=V5l(e0V=21T&BII;KOf zHS?Xn z$De>Tpi}&4H_>=kdYRWhsX()p!*L1?!=2cdhO0LJRzEfKtoFsUBy*he%fxFN(Am|~n#)538z^o+FhW;ok1 z*bKt8=hiAfEB{-I;vuFQU^|mDGkvp-T1Ie{30?Em`Cu3NU$)~ED_p9#;4U~~aLDa$8kvAzR z76rwuB*Hew8OCvbfp)_WD<4ywQkXEZ*RJ)$EzvIVp~jU5f$9;IVGpCIG!9ynmh)1X z)Y?6q3J9-<-rl`EJ-YcVcQE6sj1+5JY5_9&@oMBKcLrG~>e$7;e?NtZ%QQ@Rf{91D zFBubqJ@sOSMc}eLarjW}{jC;-23V-dD2Z?g>&b7s_}Uc4-Uk=_<$14At(3oS?_M8& z|J?o*=jElPp0Tl{6z6BF7o%)+snb%Hw(r>SV^(5ww%z-`N8ZQ=;8>=4th*n-_2CTm z$G_k3($2wA@?Kml;T3^$1;QNvo$FvBxwg=otDzeIj_nS0HVYwXuo^(Hz=sbvzvR=Z zhOG5-z3_x4@*jub{rHhLKC;Gd{?jw~Pb1-W&!!fjQ&Uru`g|kjxI2!#+3K8Tb=5N2 z#!PK7I=r3FYi#1s6w2v@W!Kkpt=B?N+^dmV&r@zVW}SZ7^~}+uM~PBsZR?n}pSM|E zd6;z*1j&4HBv+`ow3NNGS$F(%PXwj)Q0<#U&HS8N`)Iehu-SnHR);ITltbw9u=8B6 zX!Ym+a!-zop0ppqaRyt;WgE#+gwB1uV~BV+&g_Mp^BT6cwyBI6{%whSnQI&OT!V2* zedtgHtfERR%mNHU#(wI!;g9}u(WE?k-3g>%%cwZ240vdEj-N{sX{pi1lT z8dts0+;M+EEAdwRUM-K+({R@rM64eI)Dq!hSw4!Q8Z2cwl7wd5hBk3 zxGF}3_D!&(=kvsgqdIiRBwyn0+2wv`j3bF+hEHs@vS8JatZ@aFxapk3je!T;cRcQo zQOUTsQquQO2|Qo$EKsa|F5|W|^9I#N%$bV4DFv+iWDhTERuJ=GLQH~x<)IQ`EO0bZ zfg^9iQ8&P<)_=V1kH1qnDxcr+FTvz6i`l+&XAi&t4C~jM^V?uqm~xz} zs(CUVBI&kN3;TJzaNQld^qo%2wFm%aYSTILwsM)ol{a4FGhQ;&JCPi*R3`^I#IC98z?b{3LDjiR6>7x`*l`b zY}ZvCbK62#9V8gP1bRn^*f>uAI7*I8NjY($Jz6MdmDNEto?>WaK)T}R&$NI-+P;ee z^|@h-^U0J^_XjMw{0_OfSMSJ#H&q7}M$F~Wsum&a4@fxM7SwQ!nj18lH)1!?l%Nvi zqb1#h;neAUf2@PUa=|%2S*d>2DyEgsI_||!&*~av62MGT!y3na$uL))Hjux1l>%c! z!Fj6cu;wLauZ(Ngu9adz2ShM3%zi({`SII;)(mVM5FnzP5#|GS`edhZ;d3IJ#Zfc^uALt zFqjVVG@$~J?-=-_q*Yo~^#o}D8!r@J=1v@g?!}BEv-$?1=IIXHYRq+AgoB05tb3-_b+%E^hjB2t61li7R-XqRlMZ6H_A3(l5)Es z*lqg>$T!34h)dbl{h!j)V=nm9zKe^q!B|v%dDCEYig~?w*g{&T)q_V$N(v?Ia3wv>r;VchlNOw3j~sNG;HT&QFGO}f-rD>b!$f(> z#UsR=2LYI@wrI3yHkkl@9FbSva?<0k6sT)!B$o-Y3&(@@iU+Z26&3yf+DK$6bcb(B z_gxgB=_qmSbem@+cp2QQ#msnx_d5ZU-M}hLOZibq^n#}4dVvy;o;}+KokFlaeSQ7O zHk%p@z`jGZgq_se3i+Ge!p_eA3w#+<6sR42_<|VX`oU45-n*B;Q^FyH!q+!2IEfM| zSR6P+f9j5BbTl)}-$8hMq}M=u+u`3^z&^n~NhPA3jjdkSt;t-))-?vefjd` zpfy}$*zMNWz8z;BIKE$|7FW;t`P#*cTT%X_?YSXDfMj@>*!2apsl~>^wF~&v8OUzyU)#h!~n+X#Wcsf7pfA7@jt0%qGY$ z34#|#L_}~R65z4E+({%8u<9kHrCzw^J~b_OkhF8Mva(SE9%7=R1g-Ykx!>HH(!abN z{(H^`*q30*q*JC%L2yWI{?;EO0r!axfg!43&9TIGI1d=DZRsjl9@j&VikQJ9CUT?Y zUnP{h+bS$Vl6sDJ zl&qe*77-Ta3x@@!m!KOw*^Js*P3Y^!%=iCta#S--FUiVohxNPV(<7Ve@CQE689Y9E zR_`$KB!&|hwXY!%F?iQu?8Tui8My^D#M}(xDILU^wek7$=lbMW=rzA*&u+dMsj8S| z+07Yo;qoV`KU8HIIQeIAp_B9T+g`&U7GIsI6Kdb14SEBlL#S!<83Y&ZU<`TB4)?4O zb8$B+5Q9fp!r^F+owd$z3Vsg{5AQSz-kV&)d^R^bn;5>5U=ldN7bYDzefQSAkaBho z4t|RcailT`4G1N~t(mtF+qz-2BR?D(_aw{(NI_wTaRzwsT%Xo(3xwmT>D0d;n~E5N zHsBIiN9UB^Sh2&H`dBkJ`mKtW&_3#5u`zkE5*Ain(f{q}{)fHmw=F#R4SrsKb8ZW! zMwsm6w)Xqb92XG@LqEd2BGKUlO}3`*`bUQ_euEDv13F%HVuFj+%++`*`vz)nicBuX zkq26FyaCu#*Q+Zli2|>Do}a=& zCx$y?{3X}%uJ*RJQ;96>ib#A^hszd#!O~?xW_FD2m6j$Eca*wDvq2-{?(Kqwo?Y(n z>vSh_L77gOw}m2PPz&vehVTRDj__o3bab{zHbQxV2DvZxhp4ZgHgEgVWKsn$Z+8Jq zF}1%jK%&x?amD?15?E4b%MQ*@*Q`dFgL|$YPkz7)ZLkaSkV90oMYK@M3PYN$I2o)Q z99uo%#Sv3hXw_r`FO0`se8ql=I8JK2Bio~E;t=FF;^OFyjY73mhoR%_zgFoQ#A#sRQUf-fOCqVW=~hD$N=Q>Ih57o8=%7AUtf zbC3IAM|4ANmcXPUqIUiLrRXdRGj;MdRkxcEVuC*TipCu>GEd~L0Cc~;Sm|LjR7Qly zGEEO+&Olgkd<6^l0nm(SCzvceLgNQ~SB9Q^;N#MHBvR!=K#pkiO z3yyU!Y`g{oLfJ1&cGoAW5MClEb-2l%OBlezHUB5@1)CkCsH@?EPo6)g;kfpy1f6lA zwR7#e*hF42;gcn*^%=fcVj)!7G#DL?OCj9TEst!h5^XT4KuP^V{06p-7p@uNJLy_D z7^4>uOU=Uq9*da6IE)!DVq}75`x19_(yB)qSN+7>TPCWoRm`a?5B?DhGRwj^%fEof=al!qnH5rf}(u>pm!_DbOv2w4$m>Uc* zX5+vW<4UK{X~?zbDXBrc$SauL)}QDmLMVv$wZ>szyAWP5?JhC-i)c{+VhYA2wkAsW}l7#v`3^%!?MA{u@Fp-UgN3vt*PSztwHly=Ou1uZ> z-@d86iUAS_=DzTGo<4nwlM!R5A}i}NTPF*192p6sgQYvUqc316un#nJYZsiD^c{<^ zf`VVYQq^u}6-ub5v}!v>8238{VUp81UHy!OUko@)m_hJuksri7ST@RxXp*RqIJwBT z82ddwBoyE>p6!im47bNj?^|nYI3R)6DHm6gC5S(*QsYoNC_HTS!BI@s6{ zNl)lbRb~Wszt`0X)MR4r#LmXHi3Hw(gv3|qG9t$+;XI>_D5+`Fry|kM&zKQWhRvbB zDsl28HJmyU984kySCxi=R*QINT^;PHYRSAg5wAZy5czIrT3cIh0=mT|Bv4|vKHl<0 zGNXTIikjW3r3?yi0o~8v_3a5MOsv7DuE$sOT$<1+5mR z4ZtI;z2d#Sw-MHNpn<-=cB*n>VQx-N3-|oY%xCiladAe;s{>aWU&=s$2=AUr!kOku zCkW{l-om-^F+&v935;Qpnka&@K7bSttjp|{vF7w`7)#0|KbO0U}!{KhkbpxwTkn}zJP=#F6!Sy|*{x%Yrf<%K5 z76Aj3&L1K)Zr9g)Fvi4`mWgZvVnZORMsA}pY6dbIHDeIT1QY%TB2iGy>gHcy7&2i> zM-Z%i%*^tRj$f*%jZ94wGhRjr21ztvLlubhCNB6p2G7vngM>!`3zZlk0{2=!Bjd)9 zl0QdJ(*~GBR1n4+5kZBrFl%@w zz)RVz_Z>y04{I+%%pm{`euSzN36P(JaKk_ff#JSzivk_=8^NP<#95P=ZzFU&*cwk^nQaalFq2{~1| zD#ZO>2J2lAiQcc)$8}m-+Wb~L^8;GyWAV0|-5A~KSE8XW7VuERbev*O;Ol44p4n*7 zb0{bvGYI3{HLHT^{EG$8fG1D>Jf>05U0hoFdnB7BnhWABlv9tG^hvWO3{RflMY~(O19*Ei)M`fs(ybZIzD>UDy2!zhx=egp4=Wr4qO9~IRoW)8Py3m_ez5jHO;-Dh7*Rkn_3N^xCXdhL}t z91IxadFOBYmPdyLy#66+tvKZ8V@y+P+4?OTdyM!%5Sp@%kx>~!ik3(EOzERL)Ik_eL`ZwzwQr~VS0mJK_vfy(uk1{?*>T7s#VEiMYVzgvWaLyLU$jhXYr(LtjfH&3X1N9$Xl2 zd*oMc_MUC1^(%TC_zhCA%G$Zxm>fMZ4Y0;%lL(QFQ+=l~IWmI?PHjMrK_7$}53K|t zaSW;Jgd7*i(%QP`-Zmy}P?s!Yf9XE+>t{N*q9v65`bDj!)w!{Cad9yigKKgV+9Gsq z#O%Du`89lA!@gHUsE?Sj;ywuL2^?g&#WYyq;s&=v#9RV08W#Vsdc{Y@BqG!f!v`5L zT4rYE@P0U70DOHu&q6)zuAn_{I=kI3Bnn9s+<@r=wAZV*3Uc zgeVVupipiz@qqTJW&wXf{-9X92M5bQuE}P(M2a_X*1YAjFUJ4-n~2O`R92$eb{8oeKvTy)E(E%#bN0=cEZK15PcWz^uZckllF7nB{xMCRS8<5TAuSXtk{_^(r)|A}A!UDWfR zAGSA$?BK$*4DAL?=_sf{md$NeR)!P=gZl)m!9S=(N=QYBogIT;`ai4K1S>B1y_g8p^=sK z;tmRmBY2c9^Pz2O;8|4PL2zfUbf1-D$k8$2#*uMR9(AL0IkRoc7HVc@t+sYQp94f1 z6T~*IX_;rvb8cqlh=@q`m)!l-ClwVG_QGl}?XXDQ_8ARKZo6N3^koF0@RV0+M@llf z-G78z|LbM=A7ilpu{H;9`~8Kr#eVqk;m&>{ozKG3y+`o~tM&Xr>RQ;P1_-#3(B!V? zJKG7GwdiXgMd6%vc^`GQ$>Z%q7$)>BiLkS8A^0;sK2F zFy+vH1j53?h$k-a=oQqh?A5FKxG?oRM{3Z0CdaM~L@qulA5evUorZ}yPHenV3KKzv z!QTktM=++uLToWgb*Gk=7V;0}<>mP83io0B;#meFJOSSlU2_9rc;gudI{Xy;9USFR zdATf}r28<-u%toQLM?QX6Fc zvzITw182~lMTuNkoP2b_n^hjxEduToqKMZaatPZ{*R2we4DiIGCOh;yd+Ncd!2#0% zbT~PL%`sWXHVyeU4T?MMG1lHGe{-I>Y|2Pt^{m=Qg`szup4>N&Z8WdYe)YJNxjl`! z`K>zd!H)1zcjwvsuvV$B$#gG6&FBQ1pB^+Y^{a@`77W|;*S6@azw+zDs~6N--1)W} zz0~sKa{f3WbB=W|qJ~ng$DeY-rc2<|Dd{U$cG3D9G%Lr%#5{lTLPs$CkKT(HFCLy_ z85kUlPe~~=&$59|fzPtd(8$Qx+}yA(c3bCnQ$hbYpKxA1`%0x6la>XXm4m}=&=np zCe>R!8p-ZF=aXS9`Fg|sqQkg!PQQ)Z4-Jp(y`l8l@9iX>f7%4P=_tXy`A>QIc0BPz z!o9`D##&~pSA6%q7=xz{y6kiRx#`Uh&RS3@Ze`Ip{*%Sk+VSg~{>?CRskkGpI|r=0Vz%E|Fd zN+LzzP~LBC67|5#jXmMx#}o8V`m9ABUyKnoNA##8KxE2Me4-;|-hCH~q7u!9-Mfm0 zt+Tg#;c3iUlQ51x4BConbY#qXME%fTKzQsA{oe=8Vu=CS+5RI08gp#y;F$4U2|JW ziHyuaZDV6xa+{i(TF8_97KTO_EM5Ya-`;JnCBy4Oi@y*{PZbDT|NGL zuNCnaO=IKg>4EpZhfg6}S2}EqO8fJ|nLkY5-JL1CDpoUrbEjc?n4@^|qls0W{08Cm z+o$MD@0=PiOON5)c`@e3YL;foQHDLlk&>6EG%zp#E;&`%;6Jc%AG;G9M^GDo4`7{B zqD*nhPU@`At8GusdAnn%^c5Krp8WIBr%!iVGfe3G-ogd2%x!PWccJt2SX=Z4L+Z5@ zt{t{*8nahbQ%h|fO9E^ zaRh0tuje><8j6IzjgE4|&lrV9e^BJ9nG*Nr%{@FOa?lelVj42yr^PEODo~=8RaHq& zyi9>NRaO1oa-wSJ4;><3zPNASzAx?Om4*V&`AmUj#Vad$qA4=O;d`+9;Cb8B++ z2>UiMUsqdu#>9jRj=wJ6ia=|E)HEb<5CyD39j=xYPw_)+HV2=5kSPOhFc7sUp z&%O`~ulf#KPVV>%U2Sbo9FmVV&d-;59x8_=zkRFQ&pOD4FYX2H^cq#@pK?T@&&q%J2jB||5$jr2c znS6gvg@%1kq?~tg_v_f$iy8+lXdV=u!EFFZ_EvLYFS}vE-aV)f5nWkRGnn7b`jGSS zTTZLd&O&CmA258G|Jr5B^jiuOsr66<9$l_TubAlTZw6e#qrFb!C41x?h(BBY8`g)) zYBx5|tQI=w*Dovx<14ltG}6_*PgrU1QsQp&hUi&Z1{D<*9hKP666Jj1Mi13FAEV&S zpQ+B>dH#R)r_Fe$3t5F@1J6S$diMXtpN_`~djpfrhu9FQ;dq+I_?{jq6AKHB!Tkk{ zs!s?DmjfXlR~fn_+DtC5qSjm`J8$l*-&=dmXT1+eIwDyDPw!Vl!*>`Deii+Ylm(87 zebuK z%$I~E9UIF*bKyo-wraeFlamOFNs^c)zkPcj1I!eWM^rt(Kr8%mazrsd`(9s9Ljn?E zC8x)8C(@kAhD*!KjqNGL-P+dH)*5E4!Q02i##}J~nVFrPLJJ@h{xPQD3TkTpofAj* z`X;*YQYOU4KEgQi{#?B8{?8Tt-_T{3W{d%@WndHa1Zo`FyF*n~^`Bq9;I?!M34_q8 zf!nQ&@N*#;Z+xp>}7dzc?u7$2B9?>rsLe}@P{dy8u5pHYBv1` zeIPn++`gUh_rN)ySvC4>vIpWK?Uc1d2FT{LnJDXX;#v&=uegkz3WPal$I8tLs10+Q_1 z0iqe-nkVKH8YA&}@VtQk^U8ybt*uvFT*UBfjn?cdq_iRe0``cCi5Xj1lns)*$&18q z5Mb)P${fIDBW{R0`qzy{TDS?5LK*AAHXT^>`2r@>GFTmcLQ)AZQF!f0F3{LvO$(bXdb>MVYW zMn*?H4U4nizxV3s(8QK1<{PH2{BCG?R5REMjk>qi1P14xH`je&?RZ}0IPc&f1R8VZ zFzJke0s9{B2Z+nbo7sS?U6hdt$=F0lBO=G;_m*n==K97p#T>=$sgkO@jXVbi25zrg z(A_-2_xtv(TYWp5b=1@j!G}MtA98N{6C!mY8EsKq+}t}Q{#&dR;-_e2c3{iIZ|(8X z(Y7FMb2BsIv4$;UH}`SfVUe~{cKr~W@j~E?h6ZDi_VwMJy6PwS-urq#Jm=F>iwC2! z7+)xUJ4lQ&X6EK})0>G0yCkD2Bjw64*BKrf;>@w!s&aN0O9Qfwf!Zfzm6Sr3vT45^ zq-CNSuojuk$R<9I03GEJ{JM?bZEaVN?ES%ICvMCevMai#41um&Gevo_8&$Wbng=e^ zU1xgKIO6vECZ}*bKJ?+mOK1M;KTpNgs>$r<+Hr^FVJ+wX^yi2B+idy6p0}rYQPlv( zgR)fY-q47@o@mcKnrpC&CF&T)=WUQYU8}U>uf4s!(SW?h6}PjTO32HLfGd1|UTxBI z&(;S=o?ZHwkg%&g1Gp=9?b_}s$B5L_)cf-qlM*}V@{!O%yF}^zx^v6EmiCvU7zX>4eKe@%OpqweBvwue-KxB0{RFeOFP+()rh$TVX2 rZrlh}pj^iTTI}Of&;PSOm!!^C-QCEod4>3WdZbGiA`MD|fV@g0Dbgh(At4~3G?LOG zEuE6*dfvVFIOE&nxA!>X{QWr`<9&toto1zieZ{=yoc9XXxUWcvPm7O2p$P9Op|wyb z3~Lk$GXNJGeo{_5mka;FaMeub@!ZQ1{SxwLMb*OnMr;9h$@5vZ6Ghj>n)8 zzDF)XE~3F5H{sIDb2wOM`@!b?=E(axUYpg*k9EnN`?{8od8;{WA~N$b@@FEd1N1u@ zTFQF5Hm^S6WgX85!|`oMk70V}*_-M*Mdh>DEvOsG+ZOVhfVQX8iXL|9e6HI~e{u5&pX}{C8FS?~d@lcSBDd?W~ct!Yo>r ztfde%i|3p;BX`EWm!w=$SRQ@rZ7r5q30;$iTp5wHK7y$dyrHV>fk{b8KcYxUBzt#ucQc1CMFEX$;sbRe@`YIB(2ml+}Jwo zcN$*XFZ=lMWo6~FxUOSK2q=0}xM!z*d(%D(JoD z*GkvRDl3C!GiCJjXx+pa_PpxvVNJO3Rd~B8IhdL@IkB^N5iBk)!p-n|m1ONcr!c}X z^x3mBGuyp1$;#qY{%dqp+t#+aD}Xock5@e-e(+1z9yD5Ah9&mv&!0b+wH9_1`q};8 zynbi{HzZawu~(R)hHqVOWSp-Y9+u~(L)$0c;s|h}|IKaq^LKodJthNwVVjtopMx!k z1&ek3Hm;^_lJh^*S))6Oy{WK7QBj22TogBXc$mJV{rO|}J|~Bnl@;sq<;yywa#>c{ zZP=gE)0qqm4ETMI-Ln0kuMHEb#NWIdO2m-%jOyw8jErkO=YN+(J+@407VPZooEE!i z2&nl{RSuJ0e-3`Th{2VwQ&V3RJ}i~Z?w4>kRL&udj*fP6cD`$8cT=vGc73Xz?#}a# zZ+wlXJA0#F9kP8gp*e`fo< zzcEQiLPByh6L>W(FKTzG*KBn#Kct;iG1{lV_yLoc%k?S$i?du^f6wE+mB6qt-0$We zt$zCHl$Dp?b#W2cn5w@LrGUlF&3)6bmb|H{X=`tG?Fhv9VD% z@VB+)YHn%4AZL6eE!~()+jn+y*uFkqm9BTTurgM;cH5?kD_@)I`t|G7jC}f^i@x#D zaC6_f6^mimU1C%paddQKTc}t#H23FM#rK{bzd2#lh5Qv=QfL zCv=ilPoG9UH1-`LE|MSnY#(Vq{&^Ozf$g|v*`0hj|I;ZivSZB5%=~bZrwsJ;28(x0 z;MTV%pHI*BN?)L@tvRJm{@j+!fc5XJ_SnwqADK8iJuP!tP)5m^m|Ux?uP-Pwd{UAuXcpz-{ed#uXQaddHJCZM$O zoHqCVyXIdNR^`s~3WFtvU%F~1CML@K&b)$xf@ZpsZa?~Hjz^Av88s8h*YI_9sF2V? zzseyB?qm=a4lT*#yGIhwXB_=^cggJH{7lsERMhL>Pk7a|ACd`ZSP6EuWOEnk`uck3 zt(m()!NI1Jwa=)fe5y@X3se$#MSYI=u?eUHAf8w`IdPwklmu(#3)cC;UL5U@7?V&^ zhJ5`hQ+IYSZowEh`Q^FUV4h~k*(2B$spDnVKagiuIy4%cVcHTx5wBA?gly`UFJESB zG_w^<4>u+$7$XnX$IT$Ltj9jx=y`W1^muGRIZ5DTja5PxccS*$ z6~kJ$ri{CReI2pGi4Q8Ozm;mga`*)^)_>go`nSSWtSDT&{|f6v4{G-`sSzhyrr zxCbA)*>J*Z+4Yqoe6R*u_ouIf5T#8LZQ%!KU+2bd0wnn z*|8NqpMG)5(UU3`2tPELZ;Ntz_N?{g3&c3yFJcMn;2UF>=h6LWRS@5J71<>%$t*w{x^4u<)x6Z>l;tU^K*urKXUOlFst z!+NDoy0$9Hs;U&2|wDzP87Flt^FY(}(6(R%Y;gIm0@8 zcib+{ee2GT*OrG0sZvu@2^JD~4I_l@$G(n?P?3gT+Fk5!8LNEi4BJWijDnmzLotR? z)M*9$k;mUXlcQc3n6Gi-mUi8(`=g`ED*5J;^jt4 z47WGFY|i2h=hnPGN>Vi-^juGkT5XVyVUDsj$!F#_s=Z%XDehcL-|Cq zPhsKsa5DyC2ttijTAFF3)VO_P@=HIgEZ173QE7XMV?#JJCsODP<>lpJ5fLxnydeu{ z=5O#jtL=XZ_hyG{jRaqvCz<#=BHKz@GIrIk6E&`|iiXQ>;(tcVv6ORuT7P?VU09eB zqNwHVjR(ZU!~sx0F;GUH3lwjT&)b>&uW@kTpvoMlrQlMWKy1R7IXP^8r`wA3l3wJ- zzWWrUq@*1L%Z!pp}_6iY9(f)Wu{w)hwYV5M=}Ohoc@g7YQf_`J*swM{-Bl;^68TxL?+9%YpCvI zA@0hO;bQ%4hsj!GYh7GiUMD9_OWJsTG$tC$lMn?<# z{8Q&Ni&<1$OxQ?A#cL3t%HE>FSFdd<4ONp6$~5w9zkdC~#mASmw$9Vk2SjyrFz$$f z5)%`vc3b(!G{^(i+HGTk2I`uepPv*`eZD;3jQ6Bxe6~3yNiXd;QKpWEhiBcFfdP;N z*>LCsbI?vbwq`J-&X3Ga|1PB~l=9(^tEC7d@Mn8_`)IqJNyWZUz@k%Ys@x+!?S~Hi z$-#O{o#*Zr)CC+~US8zwqM4+lA?>L<2J;`_XliOIl)@9WLCie1ICFv$7s})p_Rz@l zGUV-R<(#t5pW7T8&#*K2UtMJoH|N}3UdHwI_Lj32ahMq0+8iCE9OgVX;4YGCwO;%4|hkG#wW$a+XG9J*9fRX>Hd9ejiYjn zObzOH%p=x*ifbMkqL7*86zApLC_gL~ zgf7^gEc6tW(Oh^x!u9!c#V_vb{GL1J*-McJlfQn^+_vgLM^f@!i&HkWwA5V`)Pzc9 z0{{2Ki-_~|%nMc#6BDzq5o*LmYJL+GHX-dLSRF{B(O60FsBB(;{|}uU_5U_QJuz`M%(i{U*S|cc(!0*T=WdZ>Hr~ zk@jU~W@>Q7Sq~S{Kw%4oM#C&EJ^g+}cPKdw3f{E;g`~q&T{uJnD;wKot~h*neYM}2 z_;pe|S|QsYXoAxrBhb2-xw)@gWs8URys(!P%^ds4%pE6yeu z`!zwKz%({C&eq_W>Sdu=_jYjLMVUa;V^dHe4S)ZQ@Nrjnw~B;S2cLz7AGW+}em^zr#~Y6MxzF$9(#Wyde|t=qA5yqi>AAwl@73*w)q-=PqeAR0mAX)0`M6 z3PD=2S(bcjDocC(f9A)&u~_Ht6niJYRkZou9v(7zLaN0%C1mv^0c|K z{T{>McmFl!*Dsq5k$Zb?UCBaMpo!k@VwMh%I8K5NTd8L+I9J?d5h*1l1t9fSPzB6e zP@xaMo!wVbl0oit?=D<&%ltcWwo7<;c;AYfLSwo`rLpF(tQRWVFXTNreC2n#8dmF{ zZyMEYx6zeB$vq_{ukyd}12{a(h@?aePtlGKTH0K z+v*^mRz7)Y-44Fr`CluTO5ToDB_>j%f=4tj0O|*nmhuHOUzi&i8CCoI6+oFZ2jNi* znBz7a%|((XFn`F+#X?#3rbWR9GDC;(^z@__aiB*~IY8feShL#(v)g%O9QRECx>}Ex zF~cAV$iiVS)&m;1$7cQE3>3&<*%tr^SeThHta?&!6)ZuxS3A#RBlAtLEQX?@qUt+w ziqNY}C0mgkPzx0}G~pl7_uq-roJ$;s|L)6_J35+=x#f52(ZU3OQbnDcH5Br-yeUoKlY_Pwop;DLNDXuD4+(ETlcekYin!n@81qTE*@Dc zhfP;a61dFB$e8yamxz)_PkXK)J~fpdf##cayF|7_1;GhMUin?FHz?w|zkioeR*slG zjV>(YhCH-%Nq2Q|$*49FT@e=^= zqYb`ae%MdcdsD&8I9mIRTOo$g{u2+hM40+t06;!Jn!oCXkN^q1!En#IB?jRTkVuO* z_WR2QGu~DBWAMejoB!qgd-v{oc!&Zd2#sdAGY19uXi56QMs#*|X({yb70MZaIyndH zYo(2CfW!Ntd+aUuV=?(`{o72+Oy!XI4Cg9i5I{g8uLaQiil%np!o z1T+Gd2C2JL0HBXkb<7_R+vDG3RB z*!*^YJ_P=ZlK1j-3ke;Ka`1?V+F%L~4!%M)2M=|$H=tf__e%iTq?($VM|B>zV78S@ z6@P{=>9zOu;%xeYSzMeJ!jyMkdKm^rQwN9WY{i(lt=Sd;*on8Th)^a!{$YdlFPyci z^7-omBg|TOPFUolCahaWdQX~l=Jg5r+*pRW-3PAfmze0IA<*gAY+U;uD}4EL~CR-!d} zV}Ao8I{c1Ta;c^LB%rhN!#r;H>tpM0oviz*qA%*|Bw%&oPHa|fUgr(1lBWAc`qK}u zxIyg_T4co-x+%X~aqr$eD8)W=rCxHDlIKdNli^&Mh2x@YGl7dA+)!bDE`tC z^d_C#53rI&{&296l4B)@DQOT`v#{K~1(eyP)&O?ohqVMyPw&de$mAF=L6Aa-=-gw9 zn69hi>LAhV-ZAjel+V=2@V_{ZtF<{9*ny{@o_uTZ`+MwYjq8$`p|`mI`KiF>?*q|= zuslmoUWLA1m+mq}nDu&{rh_>Q$@&NPe-+qDin5TZR9^lB9Sn`WRQr50I^FLW4=A-} zAQK3lMqn(I-d$c@jex*L=!7Fc?}Q>JeD>XC@F`DLe&!(H{AFMux4|0%&eP!`C|XYE zr=C8Clg~8@hb%T!9{XaPi?o_{B!^KHPwM)t&LPt$|N$p+gzrsF^C>2e8?&) zN)3}pd*j8~ri-EobNL^sK<4)}mIaZ)kX!V&~fvL6A zyZ`wv)9;0a*`GNoNUVxOzT5uoILMK(fQS6F!K~piPX~M+Fqn4>hge|Rg2?j!BOIP* znRg(zJh%3f!uYVTNC-Dl_a4mR3<#8g>SxmQ@-iDGudnuYoCX&R+b;(PwX^jNb&)M$0fNEW5dOpHWOY?DSWjGp;}Mj5O2z%(rlB-vct~G7vf~kc0?-0n}hNa5ynT z>?A`3%?7QSup&f6MBjh>xC{InG?%MDAqph8cxlT&{in6Py#?U2^-4|_#YdIh>%N`_ z@LDM8Na!FH(r&t;{+qZ1de4W1J)=`U5YX?FrJi@l91WBd{MD zOakHMG%GtgIx6ArjlPa;idkDHg!@dKLF#A*%WZRt0inpY=iB?=-y>_Ob^K67qdS#s z4m0$?2Q@ih9h_DNZy=2=McAI}naxqev6g}7Qx;tXH#b2_KBHF%J~;imi%^U3d3;4i z^|k27m3mP?8&dnyUdu`jN3yuUvd&bRM3b=ne^*(Q`rwx@F_+zH zx$=8qL;;@qXr%ExxT~v+EB{TH68X-m-A!QZU{GI%Hj!juU}$*Dy6@Vz*4C!sVMh3N^i$y5}5;2H>1%d^Tse-xr z^?&;^jKF|1Uw1A**Fr=60|^7*b|^&o*MR}DgM$Mgcv+x95TUGx3Mc>}U?-`Dz(8o$ znAh-9nycUjSP|n}_532eM zG|>HZbF%m8gO%KrDcopMFG5s@eUp_yPR~F8uo_ z0PbiQoB6#D>{oC2Jrt^bha(wa*TX$fQgHuMvquH|6u1?+k|J8z%rmyST@-Obl# zxpQYcZzE!i$KJ>QiV+MD$VgjPS4ZH8Ek8?7L1D3K3Q}3>YYap39@Oi!wCKD%P9XI8 z*g8OCO4Q!y7l*Rs4CD<^)QJVFIa*XpQkXKaOGI`x zTwVR;OAEv>YG!dU1ZaCncQI78`#LRb*JaoYlniWaKSYqriSzEF8uDU@MHs2EaEQ>I z@jTo^4$kt-#Y461X_z$%~yK?I0J>Gjm}eMV`m5PQF6_p@5+ZU%(0(8{~4gwHnS0=O%utqeP~uXw>+3XP_cnY z(*Hom3?66MlS5l(1SUl2u5CcE7t}ex^yA^}-O}268LGsidM_csM^VtFuZfCQPmFY! z3tYm%0YxG28CFM%)dV;Iw#&d`9|%Tb2mm>d_fXdWE<;t51;RJno`Oco$0O=aznIO>>+}*HWgQ(l z5B#>tPOQfhi9NNrycjO;P`y9~}Qv=7aj50if*Y_ZxK- z3X=L8fR{3uk>rw)IDsVx84g>+LnjhO2JEYh1VEf2GdVEw2r~*ZgZ`7&?fz^G zI&P5TBX16rFQ}!D8hpecWL5rDY2|+dZDnR*;W89g9{tZVUteHBN#5Gsm4kW$6q@rw z2L&RUJ}NVLp?L?`i;!BNg^-~LiZ!d06eF;K{B{UGTlBc1FHe&dYV9R#>^WeG1y>`{ zEKNapWPLd*RLlEb$h?EF!-BMg2(t<_HZn6^9FH^-laOfIHin~FyT}!dj2MBF)mhlD zt*wox>(S}|0Luf@CQ@)(fcl5Hgh}T%7a2Ku5O9#)TchwpKs0^Uf{#8~lR%9Ng*7un zfM=NrhMm2=nuBrSP&1?eEKU<(xm(V2=)56YKHX z{g%sbrMmrLeaI$RpwLx5Jupa@@}2qpI|$ULrrzGGz`K1k9fu1+uIKmKvqqo=P$13F zjBNLgfiY)b5O@0u(Q*sk7&s)@AZ(NdSOEak%&u2Ww*j#3_#+Z)9fY^Ms--9DIQHqs z`w>_)3Q#pdq~&+hf!jCs*}e?YMg&5ffwIT1=Rt)6)MaVS#94>G06`=JbtY4{&>56a zl#I4Ec~(|dUzU8N^7=z~VAM5GeMB6m(7^VnyiF2yW&tr1ABB76N?>8(({KUMZeD!( zatEd@6nRNNT4LfOTYn?}vuB861s@J}#hrL3X?3kBeSSx9KeT0dJM>XlKcR{pCFa)y?<()>K+q1ZDl1ZcpCkfD_iCKg}|Pepodjbw6?Ym7if=RYX4+2;B<0ej}VVQ zFadRagX9BXBp}>{y@TZ=8F1UsLjlR=!PeK;zp3{L7h34e!zg~>Twvuw+AD2` z1WxaWiP3Pyb@20Ojcr3OyyZpa`AKzKU2tJPMd^C8s;BaVq{(iD@XaWHQiVA zVjq=P;Wl}ndvC{%&jbAU1`kqZJH&-luz_54zI}ZwSl*EOdP&400agx_jH)UD%s_qh z-p^41fJG-JCskDOfDLP!oMe!h#jA8*AEU9~1o;s475H96+{;l(fJ8zisbYh|j%)+K zC!orMpiV(wz{}Uhhan@|1(-*Vqpi$LX{g0eMegRGxWWiPKrc!RG6WEf`PM(*lt-W2YbcC*QHxEjB7O+iFLSd%^OG`^l^_7&uG8sUSMu@0?#%a$urC%>9u!0eN%_;2|P>0`5n+I8%qJYRFc`+m>BlA=5EX{^x%=5XoY6 z^bzQ$O&|$FaR9oj1t@Ni1nmd!_t!~ih+0j2v`|5`M`$m&L`1@>nm#A%Rf%G*>`;m^ z-`x)dofWJNUCZC5z&9}i$qR}YaNRS|`9l1X#vEDtl?H7q&-*!m+8O+p+Q~EgazG|D z2r-1;NUTKzP*$L(0d}jUy*>BaF3dE*q?K+nJ@Y?V7kR~S=X0B3w&4Km?2l!&;ALk? zpCe+e{J~`jjqMv`2b^&oTIz2}CDj03fz;vT=2ld)7*_CBuUJ7(Z>(YiyWXV0J|cVh zCL+>WXQt86`t^mcCRMwaq>`5L$n?| z0Bu4tq#_(zK8zuua6xr-wZz&6v8GVr=K#<^fOdm*N#h1F0ob74S~|3LcL7gEaZ!<| zi=QfOREX;Vn(vxX>)roiMK2g$%P7=>IdFDiL1*y*l5XyMEbGuHD@#^^4l7nIsQrjC z0Ax9$9jZ@Z{W%EWpIA42ckQ*+2n61zU`)sjH z+J7Zm;qu-9{t__rrXUm`6Pq?ytFixCFvOw>bj7~4ef1nQmaK@u>KoAo!Z1%Fg$f$* z@^}@WxZ8371-GsVcv+x)G*xUclGJ}SS`H9~n*zsEIh3_ipk2Ynp$K^?D=W)y(LtUn z=Gvy=zBSV{+UPG0owdxWmk~*2l*Si#d*I$o5azDhnH8#9Frx7T5CURe)c08MCfI)V zfnCIa=>nwd!hwrA}{{1^tm5tVB zt?y&C2Icej(h@5VPw|8cu*L{xf_KJ3A=(EJ_fZHn*YRhfh75(s@_WmgpB$$dVQz(f z(*~Lc1_~@w;B>%o-<&#odk_|u#=++%1H(mAS65NxSL<+TM->@}WFJqt7&98KtP9**!C{#93G{Z``=?ukppMP``>7s2YNN?TDbD zOM?YEoz~uvX2eWPjvfXQzt`8-2_G;)Rlp@Aln34&lq*N4JykTjH@pw{EVy-x{>5Xk zOJJd*i;s`@Sg#z}0$UpMjT?AS(;6?%?;!XGMoTOdOuBubz&f=LXYG)bb=%Y%>C)vncC`A5)zFTOmPS*kd(N93wi-o7J4b4qsPyGTn8d2 z2*z0_r>%+&e3GGSLR=XbCa_7sCf$Zv4FJSADWc;A;lZdFj;P(Bn!(WFH9X0jMf;)c zvYUfLi3aNuR1ASlmEwMDFk0r?Zjg{j@)<1`iiU-u+x}lF4XW(p$B%(O92%N%l?M)j zn|tl?^T2=0l^Y~j@L^rX&-|fP{DdQ*9@K$QHZY+7^XJdZ#zs%?XcE zFBMN=V=0LBpuqWGPF8^%8Em9K1~za=`meMMstS2t>XyGB9+qZc@p15Xz@pA2@X?kC zJl3<7Nf16=#D#hIM_hc4g_@_f=*xJe>tNl5i7;5V(06Bwgrq(L5GVLm2x|05-eA(A z0Olf$S6wI?&6fwL7A7s!hj*MsgF5se$HRrbFJaN@6J1;tt|{K2y`((P8fL;7M&J;L;5VSZ^g*Lm+`%`Gf*}&0B|sPQGgm`%-sZL;vGzu zU`oCQsR19s$;rvzbw^tK!obKR#fL9COBoyqa941fV9JT=aMD&o^VR;ue8>_j!xa}_ zQ-5;-+ihFZZMz-xTJd*1dCc`jy^i#xB$?*82^2jP7M8)R%R92QxWMpye4VH`u68D)P=h)VCX9W?$LNW-Vtu}1ef`W6>lTI;cafZfS@=VdUi4f( zu7PpQlCyiJGUu9jX498?lO;nYEmyIR4(+p32PWTe;?7-5l#54HL%M#_TTL6<@A=?d z#5h0O)_rf-use7n)0?1Nn)ealbKS-HiTYq37-&GZJVZZ}Q0tl0Yx=vdi+ke4dY{PP zWd+&8mVy$p)u?sdm0Eh^ryB1xlsWL*v|u+HFZ|RQ@?o6mrgS0 z4Sgngzc^GonDe5!l5))F_T}V8QfK#{wyCtW1c#^UUtQZ$oV@CX9@y(Y?!~+OSnRu+ zQlS0q!`v~-deO8a|9?V5aiFn;!n6|a@dvD^&hu>uZw%5kR2DRdnBaK!<&0B?y2DVY zTP#qpiD;{cqzz&|ObBx@s*8G*@lPPeTOiSZ34>h30^#rlP?_*c;2>~N$h;0!bE}og z7==RS-Pf;)gF-`7>eO}jQ)3yOnLNXTMM68&yPMcrkLH|n z1LUhK*l?ePJpa~GpNTxPT}s_0R~&tbiRZLx(u~+DA~;I#wI&Xw!yDa0QK%xiA%!<$ zawfATSl!0q)d!{TzK7onv0xBN?xH1d#i3ii@~Qgs6Al5EirZb7jI*sfL*F=~b)m zMda0gyGxb6xZw!o$S1A4Nt6+5(p_!JG$iAkq$lGh&9sp zs&14DvWA#AO1^nv3VGcML>eiE*P*z8^>FA0I9o?Ro@*%%rT1C7+EmyrOcWt#{ zl0t0TMpW`xC8+n5l92uIMNJ?fD&yD7*y=BAxVa%W<(^nym#`uTI^SF}i!u6|bc@@0 z-T2(Pe2?k%_xDaKlh~B^-9;r=uNa&j;SAc2=b?>1GF`{;`Z~8sQXZ8{_ukS)smr_% ztIS>xC!Z>daADJ4GWrkBy|72Mgy9?|m?+yy`=BdKzA=58=`95>xc}6zC0Hvy9>J^i z;cZWpcQWfsj_Q@2_e_y^Plx#j5%1{!i-y?)8~1w6CxZ5%v~ z()h82w^uYZgi5c}6qAlk_?S<4;p+D$nCSH4!5eda|IX`g9BuqUn479L)yLYQy{S3> z_g?7Jbm1^bdTf+Zy&F#aGkQ}8M|Ho#W#mpICh zbzUpwyw>N|c%2lO^`O|Rm}u;e1k{k%$v^tf6JiLSeJ8i%uc&yLR80D}wOL5o5DT7( z)c!+|V#{zLk=x(PN-@<}yX!BF3YT87*CoT(6suS{+b!l*MZ^7 z8P{rD4BmTs7@P1G1NFTjJ?x7#PG;*rw@~<4ll|Ai zzO_B2dJnqf6Fh6tzl7F8HDP}xyWY=hrs?sCC|J4?@cQjFitw%}RQ9`V^fd>>EBF0L zcbq*?_rJz1KCH3WZ^r5Wo0_uG?Ka;HhKH2rue$VaEgY~d$O@(!JL=3u5a#moye3O| zRpgCVX0r_IP3lE1%qNr}SMo{5ueR;Cd&HZ^+z1@vz`hyMFtbS!YOZy(u@#u~j$-FQ zg=$IUvL?H_v!Hb!3UQx9XFv?IAdSNL0b~t{jMm`Gfssl9rUW>908;{Jlo5*I zF)n{b3DW%26R}V=m6#4#_AvW+sZa@GsrI!!4L{LHRy@Q7N(-2i65&G1Ohx zX=|UWvU{Rh`+G5u>E=M+Yj$Q7ic}r>UI5g}!%bONX_AhF!7`gaA)mO}_)dOOSTk1% zpIOb16;{q>`^R>rTt&bu;0upe>mhY-Rll9u`rNZHa>0J<&m@;$Lr=6W(P_uJJt$O7 zX#J47K;Q;#!!(s}ngd(MwRx@*f0ljewAG+r`RSzm-i23h?nyB;wx8m|&s~uc%;0h4)pVY;v zD@+)(U@}Lc0D{l`{_*B$IXeb9a0d)S%Rt4J^f)Lt|9Zd}C23)*1`A~q7^uLQj~}NT zj1Ve7DzI0kgHa#m+WGp!sX#D1Dl6j)J5Je+`oaEz4AaL?_|NOts9@RcM}@J*7hZg{ zb>mm;N7RB*LYNJ(&{*zwc4%a!5+wyT^{=n*FhE<8^Gn7iMZxA@tN6s|@h6(R1Or z)dx0_!cTLr@v)KpSaP8CW#JchNQwUHdMxwlqGpRsapxD^cTS79De1|2f)W$yJAc{5KQ23euG{ogs`3()B;y`RNFWFMQKk61^H+m|c(@ji!7W_WH@b^BX z930%=#5kpMWep0rr^I~SK&$j_-!SE1(hd{f=-Q`ji391@q}}DzhKK1ro_Xsno;geF z(hTDBpM3dmud5bo6}?QrKiAP#D$*k+{VLPUc6j3X-E_o>(E7V>V>*qM`DW!u%9Gi( zovOp0)eXgNE1ck5x3FPZEj_(snFLwQJxo&RPM&IKT#@>?%yjcA@(in6kD(B=zvmMqm+rAtt|sp;v1IxC&bmg0(zzlZ{h#pA=|dW~4- z=I5vy>OS?y1GL z7fxYL=makU`YFGJ#49lA03vgHMIp7d>|c)QnB|SO--uCF;EKGB%q-;gIF58JL@Ex&_YI1-{(Tx7pr96 zG#%Jv;$@OV09I*6FE6i|ZI2*#@57B&a2S91@IgagKN4nw%z^@ZINIP)Md$15tCaII z~x=TVWEZXpGf@rR{G6wxbiZ0T184g&*&68oDny<$#o?m#$s z@aNCXKkj$HBA%hmg=m~`6!&hT_p@h01qB6tlao;&KMD*E56^)lfEb72+zDoSZ^A9V z2M@>$c&U_CR6rVyRl1J!gu%fEipCq5(?b(gF{2$+XD^4#LkZ3?CebG zIw|ZXXvsJoot?ll5aV9r=jTVov{(EQyH=m@8^m((H4{fEY=gdQYHf{+3Tm*dpecVu zKop9FtQgq;Zi$Q67ObhEdljc_`?fvk=jZ41ii*gie=NAbu@cdD_fadQqB{B7%NrXC zR#qGlk&y^Pi}El1?g$zSaMKj-Ul^jIqBw8fG~gfp{v8(x7;UaNr=q$#dRR|*$I8k| zkZO>z%MWyquAZK(%uEbA;UXW;e|}sCUk{Lmyhe4njnj=8YCzWL=ukLJH$=g~6NY|k za*$^O2UgGzA5tkOD41001s@O+65?V9F8}%S4W@iVpsuYIN3Gbq0{2t<<%=^+X9R?V zc>1wC&+ixO!U?~rfJujTaLYLZkbG3EJNw0khw{oR1yTqJr63Q+Nza)P#eG1mjgz z_JNnqr+(64<~J2i2{wakooWm~WaCfiMov%3W)j1LZcH~`1v7rJZpzRmBpN~*2ep_o z_bt*fF)0etUPi(BOjdGyy#42;BixtXfhz}cchW%-R^%pS3lK(lZ+--U3rvPLfi+2$ zg)$Nx!KUWsmyi(5(dtaQatU*Jc{yNwT|pozXk<;EpPC%Awy22UelD3`BNJ>n78cg) zALr*+hiywlNF0)9O&rsn z*>4^68I})9PLqiS?sRU8SB-NTl+jSx%PI>=ggQ9JH%uYN!|4X+@yn-Fh)(?8xHf?s;{&CV3Z(ssbH!GG0TUfvJN4 zff#SL6P^cS1}Xpq`|PYNOzc3!P6CKWO-&6FR3&=BOgrX&M`+YYHSMCIa@)2&B%<^4Z~U2VWCCF$J3G5sO|EL3Ftp{x@v#>$dY1z4 z?j0UpY5I~F9*#F_IX_^555I%jASfgRXU_-|largl2pV*;GYv;KpeB_)x`}%U6M86G zM@NUK1U&}m4(=%i&fl^?YPqm5W|>Y-wqM02}@C zoDcTjM~cbI+k0d$2p>v^C*g9gaebPjj}Ou{c(6o1n?A^;r z+Lwwk28S~8GIBb{ePaS_9b9&kW*1*mzFvXr9b7T<`)yIDUgy%zY2875jZgV#>XR>{Ejf- zD;C5Xj#s&%D2vh)9r-lq^s?y>4GlrDcwE`Nfhb_5m}}8R+;3CO-(hF z6g~`X!FcoI`deKH1t4nBHCa72G7oiiku$<5RO!eSXl^wIMDT?n>Aj&4`Vgih&~<*8 zlg>I(E9bcM`@wt*?sjm2V4x(x>HyXfmFTbc?4$iP70@USkNnD+T0Jngef z2#e7-H5Cm%8?_ULzdmRCBWuFFsU;a$FJ#(mKj-D)zK}sdnKde4U#6i^~ zeU=Ws@{rpoK|#TrNfb|T7sdX856~7S1j92@2G{-)_p4+;LlREmS(>%0)T{9OaAbop zQsAOi*y_2u2wwHnORj*DL2`bhGybd|zR$2Uq$b7oiM|-tSJ0kkU21~1C6*dD;l$QK6K+uLX1Sp{%gvvjE2Q9LGX1t5iB)_F$|d`x`vr6hhd-8tXt$BJdHr zSk@cM{7`_qZODBsH2i-ZclMg~I-gGQk^aXiutPk9H5T`ICwwUqwo8qK+3s4LIYS>z zdJ{Y;Vaqh+6cli_oPF)!G0xu1%r!Uh$z*o0-Uom(H8W%K@A#F_8LV{uB}^MaYOlhU zb#x64qfGe2pdc2VnAda6rix7akU<_o*!eZ4-?1hm;kgUF0zwohswNX+n0^XZ8&?Cc ze;Rw(mp{_b(!$Kqsu|lrqf5b@{SpLO0wSX31()L5i)75?urQaH-n;+D!Sz2Bc9QVH b3k*32))Bj`6e;-rNz^_0`{)u`lb8Pwd(%Ko literal 0 HcmV?d00001 diff --git a/__tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-light-theme-and-copilot-variant-copy-button-should-layout-properly-1-snap.png b/__tests__/__image_snapshots__/html/copy-button-layout-js-fluent-theme-applied-with-light-theme-and-copilot-variant-copy-button-should-layout-properly-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..311c97ad9aaa1b0d03aa6c18f66ee50648687c4b GIT binary patch literal 20262 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 j{(pH${3}@AWg*QUHF-6ZPn!f>hxHz1RN@rFL{( literal 0 HcmV?d00001 diff --git a/__tests__/html/fluentTheme/copyButton.html b/__tests__/html/fluentTheme/copyButton.html new file mode 100644 index 0000000000..0726249f61 --- /dev/null +++ b/__tests__/html/fluentTheme/copyButton.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + + +
+ + + diff --git a/__tests__/html/fluentTheme/copyButton.js b/__tests__/html/fluentTheme/copyButton.js new file mode 100644 index 0000000000..937dd0e408 --- /dev/null +++ b/__tests__/html/fluentTheme/copyButton.js @@ -0,0 +1,5 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('Fluent theme applied', () => { + test('copy button should work', () => runHTML('fluentTheme/copyButton')); +}); diff --git a/__tests__/html/fluentTheme/copyButton.layout.html b/__tests__/html/fluentTheme/copyButton.layout.html new file mode 100644 index 0000000000..d520545e54 --- /dev/null +++ b/__tests__/html/fluentTheme/copyButton.layout.html @@ -0,0 +1,123 @@ + + + + + + + + + + + + + +
+ + + diff --git a/__tests__/html/fluentTheme/copyButton.layout.js b/__tests__/html/fluentTheme/copyButton.layout.js new file mode 100644 index 0000000000..97e5c63801 --- /dev/null +++ b/__tests__/html/fluentTheme/copyButton.layout.js @@ -0,0 +1,13 @@ +/** @jest-environment ./packages/test/harness/src/host/jest/WebDriverEnvironment.js */ + +describe('Fluent theme applied', () => { + describe.each([ + ['dark', 'fluent'], + ['dark', 'copilot'], + ['light', 'fluent'], + ['light', 'copilot'] + ])('with %s theme and %s variant', (theme, variant) => + test('copy button should layout properly', () => + runHTML(`fluentTheme/copyButton.layout?${new URLSearchParams({ theme, variant }).toString()}`)) + ); +}); diff --git a/__tests__/html/withEmoji.5.html b/__tests__/html/withEmoji.5.html index d24f6f7201..9c880127ef 100644 --- a/__tests__/html/withEmoji.5.html +++ b/__tests__/html/withEmoji.5.html @@ -1,4 +1,4 @@ - + @@ -56,11 +56,24 @@ await host.sendKeys('ABC'); expect(getTextWithCaret()).toBe('ABC|'); + // Make sure we have write permissions to the clipboard. + expect(window.isSecureContext).toBe(true); + + await host.sendDevToolsCommand('Browser.setPermission', { + permission: { name: 'clipboard-write' }, + setting: 'granted' + }); + + await expect(navigator.permissions.query({ name: 'clipboard-write' })).resolves.toHaveProperty( + 'state', + 'granted' + ); + // In WebDriver, CTRL + X do not cut to clipboard. // We cannot do CTRL + A followed by CTRL + X here. // Instead, we are writing to clipboard directly. await host.sendKeys('+CONTROL', 'A', '-CONTROL'); - navigator.clipboard?.writeText(document.activeElement.value) || document.execCommand('copy'); + await (navigator.clipboard?.writeText(document.activeElement.value) || document.execCommand('copy')); await host.sendKeys('BACK_SPACE'); expect(getTextWithCaret()).toBe('|'); diff --git a/docker-compose-wsl2.yml b/docker-compose-wsl2.yml index cde16d22bc..db37c0df91 100644 --- a/docker-compose-wsl2.yml +++ b/docker-compose-wsl2.yml @@ -41,6 +41,7 @@ services: dockerfile: testharness2.dockerfile ports: - '5081:80' + - '5443:443' stop_grace_period: 0s volumes: - ./__tests__/html/:/var/web/__tests__/html/ diff --git a/package.json b/package.json index 23568680d0..8a868ef75b 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "precommit:eslint:support-cldr-data": "cd packages && cd support && cd cldr-data && npm run precommit:eslint", "precommit:eslint:test-harness": "cd packages && cd test && cd harness && npm run precommit:eslint", "precommit:eslint:test-page-object": "cd packages && cd test && cd page-object && npm run precommit:eslint", + "precommit:eslint:web-server": "cd packages && cd test && cd web-server && npm run precommit:eslint", "precommit:typecheck": "concurrently --raw \"npm run precommit:typecheck:*\"", "precommit:typecheck:api": "cd packages && cd api && npm run precommit:typecheck", "precommit:typecheck:bundle": "cd packages && cd bundle && npm run precommit:typecheck", diff --git a/packages/api/src/localization/en-US.json b/packages/api/src/localization/en-US.json index 8c643ebdc6..fdbddf73d0 100644 --- a/packages/api/src/localization/en-US.json +++ b/packages/api/src/localization/en-US.json @@ -70,6 +70,9 @@ "CONNECTIVITY_STATUS_ALT_SLOW_CONNECTION": "Taking longer than usual to connect.", "CONNECTIVITY_STATUS_ALT": "Connectivity Status: $1", "_CONNECTIVITY_STATUS_ALT.comment": "This is for screen reader. $1 will be one of \"CONNECTIVITY_STATUS_ALT_\"*.", + "COPY_BUTTON_TEXT": "Copy", + "COPY_BUTTON_COPIED_TEXT": "Copied", + "_COPY_BUTTON_COPIED.comment": "After clicking on the copy button, this text will show briefly", "FILE_CONTENT_ALT": "'$1'", "FILE_CONTENT_DOWNLOADABLE_ALT": "Download file '$1'", "FILE_CONTENT_DOWNLOADABLE_WITH_SIZE_ALT": "Download file '$1' of size $2", diff --git a/packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.module.css b/packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.module.css new file mode 100644 index 0000000000..42b6425fa8 --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.module.css @@ -0,0 +1,6 @@ +:global(.webchat-fluent) .activity-toolbox { + display: flex; + padding-block: var(--webchat__bubble--block-padding); + padding-block-start: 0; /* Specifically set block-start to 0. */ + padding-inline: var(--webchat__bubble--inline-padding); +} diff --git a/packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.tsx b/packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.tsx new file mode 100644 index 0000000000..32742ae742 --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/ActivityToolbox.tsx @@ -0,0 +1,31 @@ +import type { WebChatActivity } from 'botframework-webchat-core'; +import React, { memo, useMemo } from 'react'; +import { array, looseObject, optional, parse, string } from 'valibot'; +import { useStyles } from '../../styles'; +import getMessageEntity from '../../utils/getMessageEntity'; +import styles from './ActivityToolbox.module.css'; +import CopyButton from './CopyButton'; + +type Props = Readonly<{ activity: WebChatActivity }>; + +const activitySchema = looseObject({ + entities: optional(array(looseObject({ type: string() }))), + type: string() +}); + +const ActivityToolbox = (props: Props) => { + const activity = useMemo(() => parse(activitySchema, props.activity), [props.activity]); + const classNames = useStyles(styles); + + const allowCopy = useMemo(() => getMessageEntity(activity)?.keywords.includes('AllowCopy'), [activity]); + + return allowCopy ? ( +
+ +
+ ) : null; +}; + +ActivityToolbox.displayName = 'ActivityToolbox'; + +export default memo(ActivityToolbox); diff --git a/packages/fluent-theme/src/components/activityToolbox/Button.module.css b/packages/fluent-theme/src/components/activityToolbox/Button.module.css new file mode 100644 index 0000000000..1b7b8d30f6 --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/Button.module.css @@ -0,0 +1,41 @@ +:global(.webchat-fluent) .activity-toolbox__base-button { + align-items: center; + appearance: none; + background: var(--webchat-colorNeutralBackground1); + border-radius: var(--webchat-borderRadiusMedium); + border: var(--webchat-strokeWidthThin) solid var(--webchat-colorNeutralStroke1); + color: var(--webchat-colorNeutralForeground1); + display: flex; + gap: var(--webchat-spacingHorizontalXS); + justify-content: center; + padding: 5px var(--webchat-spacingHorizontalM); + + &:hover { + background: var(--webchat-colorNeutralBackground1Hover); + border: var(--webchat-strokeWidthThin) solid var(--webchat-colorNeutralStroke1Hover); + color: var(--webchat-colorNeutralForeground1Hover); + } + + &:active { + background: var(--webchat-colorNeutralBackground1Pressed); + border: var(--webchat-strokeWidthThin) solid var(--webchat-colorNeutralStroke1Pressed); + color: var(--webchat-colorNeutralForeground1Pressed); + } + + &:focus-visible { + background: var(--webchat-colorNeutralBackground1); + outline: var(--webchat-strokeWidthThick) solid var(--webchat-colorStrokeFocus2); + outline-offset: calc(var(--webchat-strokeWidthThick) * -1); + } + + &:disabled { + background: var(--webchat-colorNeutralBackgroundDisabled); + border: var(--webchat-strokeWidthThin) solid var(--webchat-colorNeutralStrokeDisabled); + color: var(--webchat-colorNeutralForegroundDisabled); + } +} + +:global(.webchat-fluent) .activity-toolbox__base-button-icon { + height: 20px; + width: 20px; +} diff --git a/packages/fluent-theme/src/components/activityToolbox/Button.tsx b/packages/fluent-theme/src/components/activityToolbox/Button.tsx new file mode 100644 index 0000000000..287e3dcc24 --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/Button.tsx @@ -0,0 +1,40 @@ +import cx from 'classnames'; +import React, { forwardRef, memo, useCallback, type ReactNode } from 'react'; +import { useRefFrom } from 'use-ref-from'; +import { useStyles } from '../../styles'; +import MonochromeImageMasker from '../preChatActivity/private/MonochromeImageMasker'; +import styles from './Button.module.css'; + +type Props = Readonly<{ + children?: ReactNode | undefined; + className?: string | undefined; + 'data-testid'?: string | undefined; + iconURL?: string | undefined; + onClick: () => void; + text?: string | undefined; +}>; + +const Button = forwardRef((props, ref) => { + const classNames = useStyles(styles); + const onClickRef = useRefFrom(props.onClick); + + const handleClick = useCallback(() => onClickRef.current?.(), [onClickRef]); + + return ( + + ); +}); + +export default memo(Button); diff --git a/packages/fluent-theme/src/components/activityToolbox/CopyButton.module.css b/packages/fluent-theme/src/components/activityToolbox/CopyButton.module.css new file mode 100644 index 0000000000..3e9b941e59 --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/CopyButton.module.css @@ -0,0 +1,29 @@ +:global(.webchat-fluent) .activity-toolbox__copy-button { + overflow: hidden; + position: relative; +} + +:global(.webchat-fluent) .activity-toolbox__copy-button__copied-text { + align-items: center; + background-color: var(--webchat-colorNeutralBackground1); + display: flex; + height: 100%; + justify-content: center; + opacity: 0; + position: absolute; + width: 100%; +} + +:global(.webchat-fluent) .activity-toolbox__copy-button--copied .activity-toolbox__copy-button__copied-text { + animation: copied-animation var(--webchat-durationUltraSlow) linear; +} + +@keyframes copied-animation { + 0% { + opacity: 100%; + } + + 100% { + opacity: unset; + } +} diff --git a/packages/fluent-theme/src/components/activityToolbox/CopyButton.tsx b/packages/fluent-theme/src/components/activityToolbox/CopyButton.tsx new file mode 100644 index 0000000000..4deb938487 --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/CopyButton.tsx @@ -0,0 +1,79 @@ +import { hooks as apiHooks } from 'botframework-webchat-api'; +import { hooks as componentHooks } from 'botframework-webchat-component'; +import React, { memo, useCallback, useRef } from 'react'; +import { useRefFrom } from 'use-ref-from'; +import { useStyles } from '../../styles'; +import testIds from '../../testIds'; +import Button from './Button'; +import styles from './CopyButton.module.css'; + +const { useLocalizer } = apiHooks; +const { useRenderMarkdownAsHTML } = componentHooks; + +type Props = Readonly<{ + activity: { + text?: string | undefined; + textFormat?: string | undefined; + type: string; + }; +}>; + +const COPY_ICON_URL = `data:image/svg+xml;utf8,${encodeURIComponent('')}`; + +const CopyButton = (props: Props) => { + const activityRef = useRefFrom(props.activity); + const buttonRef = useRef(null); + const classNames = useStyles(styles); + const renderMarkdownAsHTML = useRenderMarkdownAsHTML(); + const localize = useLocalizer(); + + const copiedText = localize('COPY_BUTTON_COPIED_TEXT'); + const copyText = localize('COPY_BUTTON_TEXT'); + + const handleClick = useCallback(() => { + const { current } = activityRef; + + if (current.type === 'message' && current.text) { + navigator.clipboard + ?.write([ + new ClipboardItem({ + ...(renderMarkdownAsHTML && (!current.textFormat || current.textFormat === 'markdown') + ? { 'text/html': new Blob([renderMarkdownAsHTML(current.text)], { type: 'text/html' }) } + : {}), + 'text/plain': new Blob([current.text], { type: 'text/plain' }) + }) + ]) + .catch(error => console.error(`botframework-webchat-fluent-theme: Failed to copy to clipboard.`, error)); + + buttonRef.current?.classList.remove(...classNames['activity-toolbox__copy-button--copied'].split(' ')); + + // Reading `offsetWidth` will trigger a reflow and this is critical for resetting the animation. + // https://css-tricks.com/restart-css-animation/#aa-update-another-javascript-method-to-restart-a-css-animation + // eslint-disable-next-line no-unused-expressions + buttonRef.current?.offsetWidth; + + buttonRef.current?.classList.add(...classNames['activity-toolbox__copy-button--copied'].split(' ')); + } else { + console.warn( + 'botframework-webchat-fluent-theme: Cannot copy a non-message activity or a message activity with empty content.' + ); + } + }, [activityRef, buttonRef, classNames, renderMarkdownAsHTML]); + + return ( + + ); +}; + +CopyButton.displayName = 'CopyButton'; + +export default memo(CopyButton); diff --git a/packages/fluent-theme/src/components/activityToolbox/index.ts b/packages/fluent-theme/src/components/activityToolbox/index.ts new file mode 100644 index 0000000000..ff5b655ccd --- /dev/null +++ b/packages/fluent-theme/src/components/activityToolbox/index.ts @@ -0,0 +1 @@ +export { default as ActivityToolbox } from './ActivityToolbox'; diff --git a/packages/fluent-theme/src/components/preChatActivity/StarterPromptsCardAction.module.css b/packages/fluent-theme/src/components/preChatActivity/StarterPromptsCardAction.module.css index 6204a9474c..e578912c7d 100644 --- a/packages/fluent-theme/src/components/preChatActivity/StarterPromptsCardAction.module.css +++ b/packages/fluent-theme/src/components/preChatActivity/StarterPromptsCardAction.module.css @@ -18,7 +18,7 @@ } :global(.webchat-fluent) .pre-chat-message-activity__card-action-box:disabled { - background-color: var(--webchat-colorNeutralBackground1Disabled); + background-color: var(--webchat-colorNeutralBackgroundDisabled); } :global(.webchat-fluent) .pre-chat-message-activity__card-action-box:hover { diff --git a/packages/fluent-theme/src/components/preChatActivity/isPreChatMessageActivity.ts b/packages/fluent-theme/src/components/preChatActivity/isPreChatMessageActivity.ts index 344e85a60c..b5be44328a 100644 --- a/packages/fluent-theme/src/components/preChatActivity/isPreChatMessageActivity.ts +++ b/packages/fluent-theme/src/components/preChatActivity/isPreChatMessageActivity.ts @@ -1,26 +1,8 @@ import type { WebChatActivity } from 'botframework-webchat-core'; -import { array, literal, object, safeParse, string, type InferOutput } from 'valibot'; - -const messageEntity = object({ - '@context': literal('https://schema.org'), - '@id': literal(''), // Must be empty string. - '@type': literal('Message'), - keywords: array(string()), - type: literal('https://schema.org/Message') -}); - -type MessageEntity = InferOutput; +import getMessageEntity from '../../utils/getMessageEntity'; export default function isPreChatMessageActivity( activity: undefined | WebChatActivity ): activity is WebChatActivity & { type: 'message' } { - if (activity?.type !== 'message') { - return false; - } - - const message = activity.entities?.find( - (entity): entity is MessageEntity => safeParse(messageEntity, entity).success - ); - - return !!message?.keywords.includes('PreChatMessage'); + return !!(activity && getMessageEntity(activity)?.keywords.includes('PreChatMessage')); } diff --git a/packages/fluent-theme/src/components/theme/Theme.module.css b/packages/fluent-theme/src/components/theme/Theme.module.css index f7f91e8d50..8839d274ab 100644 --- a/packages/fluent-theme/src/components/theme/Theme.module.css +++ b/packages/fluent-theme/src/components/theme/Theme.module.css @@ -1,43 +1,45 @@ :global(.webchat-fluent).theme { display: contents; + --webchat-colorNeutralForegroundDisabled: var(--colorNeutralForegroundDisabled, #bdbdbd); --webchat-colorNeutralForeground1: var(--colorNeutralForeground1, #242424); + --webchat-colorNeutralForeground1Hover: var(--colorNeutralForeground1Hover, #242424); + --webchat-colorNeutralForeground1Pressed: var(--colorNeutralForeground1Pressed, #242424); --webchat-colorNeutralForeground2: var(--colorNeutralForeground2, #424242); - --webchat-colorNeutralForeground3: var(--colorNeutralForeground3, #616161); - --webchat-colorNeutralForeground4: var(--colorNeutralForeground4, #707070); - --webchat-colorNeutralForeground5: var(--colorNeutralForeground5, #7e7e7e); - --webchat-colorNeutralForeground2BrandHover: var(--colorNeutralForeground2BrandHover, #02729c); --webchat-colorNeutralForeground2BrandPressed: var(--colorNeutralForeground2BrandPressed, #01678c); --webchat-colorNeutralForeground2BrandSelected: var(--colorNeutralForeground2BrandSelected, #067191); + --webchat-colorNeutralForeground3: var(--colorNeutralForeground3, #616161); + --webchat-colorNeutralForeground4: var(--colorNeutralForeground4, #707070); + --webchat-colorNeutralForeground5: var(--colorNeutralForeground5, #7e7e7e); - --webchat-colorNeutralForegroundDisabled: var(--colorNeutralForegroundDisabled, #bdbdbd); - + --webchat-colorNeutralBackgroundDisabled: var(--colorNeutralBackgroundDisabled, #f0f0f0); --webchat-colorNeutralBackground1: var(--colorNeutralBackground1, #ffffff); + --webchat-colorNeutralBackground1Hover: var(--colorNeutralBackground1Hover, #f5f5f5); + --webchat-colorNeutralBackground1Pressed: var(--colorNeutralBackground1Pressed, #e0e0e0); --webchat-colorNeutralBackground3: var(--colorNeutralBackground3, #f5f5f5); --webchat-colorNeutralBackground4: var(--colorNeutralBackground4, #f0f0f0); --webchat-colorNeutralBackground5: var(--colorNeutralBackground5, #ebebeb); --webchat-colorTransparentBackground: var(--colorTransparentBackground, rgba(0, 0, 0, 0.4)); - --webchat-colorNeutralBackground1Disabled: var(--colorNeutralBackground1Disabled, #f0f0f0); - --webchat-colorNeutralBackground1Hover: var(--colorNeutralBackground1Pressed, #f0f0f0); - --webchat-colorNeutralBackground1Pressed: var(--colorNeutralBackground1Pressed, #e0e0e0); - + --webchat-colorNeutralStrokeDisabled: var(--colorNeutralStrokeDisabled, #e0e0e0); --webchat-colorNeutralStroke1: var(--colorNeutralStroke1, #d1d1d1); - --webchat-colorNeutralStroke2: var(--colorNeutralStroke2, #e0e0e0); + --webchat-colorNeutralStroke1Hover: var(--colorNeutralStroke1Hover, #c7c7c7); + --webchat-colorNeutralStroke1Pressed: var(--colorNeutralStroke1Pressed, #b3b3b3); --webchat-colorNeutralStroke1Selected: var(--colorNeutralStroke1Selected, #bdbdbd); + --webchat-colorNeutralStroke2: var(--colorNeutralStroke2, #e0e0e0); --webchat-colorStrokeFocus2: var(--colorStrokeFocus2, #000000); --webchat-colorBrandStroke2: var(--colorBrandStroke2, #9edcf7); + --webchat-colorBrandStroke2Pressed: var(--colorBrandStroke2Pressed, #01384d); + --webchat-colorTransparentStroke: var(--colorTransparentStroke, transparent); --webchat-colorBrandForeground1: var(--colorBrandForeground1, #01678c); - --webchat-colorBrandForeground2Hover: var(--colorBrandForeground2Hover, #015a7a); --webchat-colorBrandForeground2Pressed: var(--colorBrandForeground2Pressed, #01384d); - --webchat-colorBrandStroke2Pressed: var(--colorBrandStroke2Pressed, #01384d); --webchat-colorBrandForegroundLink: var(--colorBrandForegroundLink, #01678c); --webchat-colorBrandForegroundLinkHover: var(--colorBrandForegroundLinkHover, #015a7a); @@ -76,6 +78,8 @@ --webchat-spacingHorizontalXL: var(--spacingHorizontalXL, 20px); --webchat-spacingHorizontalXXL: var(--spacingHorizontalXXL, 24px); --webchat-spacingHorizontalXXXL: var(--spacingHorizontalXXXL, 32px); + + /* https://github.com/microsoft/fluentui/blob/master/packages/tokens/src/global/spacings.ts */ --webchat-spacingVerticalNone: var(--spacingVerticalNone, 0); --webchat-spacingVerticalXXS: var(--spacingVerticalXXS, 2px); --webchat-spacingVerticalXS: var(--spacingVerticalXS, 4px); @@ -124,13 +128,17 @@ --webchat-borderRadiusLarge: var(--borderRadiusLarge, 6px); --webchat-borderRadiusXLarge: var(--borderRadiusXLarge, 8px); + /* https://github.com/microsoft/fluentui/blob/master/packages/tokens/src/global/strokeWidths.ts */ --webchat-strokeWidthThin: var(--strokeWidthThin, 1px); --webchat-strokeWidthThick: var(--strokeWidthThicker, 2px); --webchat-strokeWidthThicker: var(--strokeWidthThicker, 3px); + /* https://github.com/microsoft/fluentui/blob/master/packages/tokens/src/global/durations.ts */ --webchat-durationUltraFast: var(--durationUltraFast, 0); --webchat-durationNormal: var(--durationNormal, 200ms); + --webchat-durationUltraSlow: var(--durationUltraSlow, 500ms); + /* https://github.com/microsoft/fluentui/blob/master/packages/tokens/src/global/curves.ts */ --webchat-curveAccelerateMid: var(--curveAccelerateMid, cubic-bezier(1,0,1,1)); --webchat-curveDecelerateMid: var(--curveDecelerateMid, cubic-bezier(0,0,0,1)); } diff --git a/packages/fluent-theme/src/private/FluentThemeProvider.tsx b/packages/fluent-theme/src/private/FluentThemeProvider.tsx index 5f904e9cfe..ec7b0dfe4d 100644 --- a/packages/fluent-theme/src/private/FluentThemeProvider.tsx +++ b/packages/fluent-theme/src/private/FluentThemeProvider.tsx @@ -1,8 +1,9 @@ -import type { ActivityMiddleware } from 'botframework-webchat-api'; +import type { ActivityMiddleware, AttachmentMiddleware } from 'botframework-webchat-api'; import { Components } from 'botframework-webchat-component'; -import React, { memo, type ReactNode } from 'react'; +import React, { Fragment, memo, type ReactNode } from 'react'; import { ActivityDecorator } from '../components/activity'; +import { ActivityToolbox } from '../components/activityToolbox'; import { isPreChatMessageActivity, PreChatMessageActivity } from '../components/preChatActivity'; import { PrimarySendBox } from '../components/sendBox'; import { TelephoneKeypadProvider } from '../components/telephoneKeypad'; @@ -13,7 +14,7 @@ const { ThemeProvider } = Components; type Props = Readonly<{ children?: ReactNode | undefined; variant?: VariantList | undefined }>; -const activityMiddleware: ActivityMiddleware[] = [ +const activityMiddleware: readonly ActivityMiddleware[] = Object.freeze([ () => next => (...args) => { @@ -29,7 +30,32 @@ const activityMiddleware: ActivityMiddleware[] = [ ? (...args) => {renderActivity(...args)} : renderActivity; } -]; +]); + +const attachmentMiddleware: readonly AttachmentMiddleware[] = Object.freeze([ + () => + next => + (...args) => { + const result = next(...args); + const { activity, attachment } = args[0] || {}; + + if (attachment && activity?.from.role === 'bot' && activity.type === 'message') { + const attachments = Array.isArray(activity.attachments) ? activity.attachments : []; + + // Main text message is not an attachment inside the `attachments` field. + if (!attachments.includes(attachment)) { + return ( + + {result} + + + ); + } + } + + return result; + } +]); const sendBoxMiddleware = [() => () => () => PrimarySendBox]; @@ -37,7 +63,11 @@ const FluentThemeProvider = ({ children, variant = 'fluent' }: Props) => ( - + {children} diff --git a/packages/fluent-theme/src/testIds.ts b/packages/fluent-theme/src/testIds.ts index c08180d016..ebcee34e7a 100644 --- a/packages/fluent-theme/src/testIds.ts +++ b/packages/fluent-theme/src/testIds.ts @@ -1,4 +1,5 @@ const testIds = { + copyButton: 'copy button', preChatMessageActivityStarterPromptsCardAction: 'pre-chat message activity starter prompts card action', sendBoxDropZone: 'send box drop zone', sendBoxSendButton: 'send box send button', diff --git a/packages/fluent-theme/src/utils/getMessageEntity.ts b/packages/fluent-theme/src/utils/getMessageEntity.ts new file mode 100644 index 0000000000..fe09dcfc95 --- /dev/null +++ b/packages/fluent-theme/src/utils/getMessageEntity.ts @@ -0,0 +1,25 @@ +import { array, literal, object, optional, safeParse, string, type InferOutput } from 'valibot'; + +const messageEntity = object({ + '@context': literal('https://schema.org'), + '@id': literal(''), // Must be empty string. + '@type': literal('Message'), + keywords: optional(array(string()), []), + type: literal('https://schema.org/Message') +}); + +type MessageEntity = InferOutput; + +// TODO: We should move this file to base package once it's ready. +export default function getMessageEntity( + activity: Readonly<{ + entities?: readonly Readonly<{ type: string }>[] | undefined; + type: string; + }> +): MessageEntity | undefined { + if (activity?.type === 'message') { + return activity.entities?.find((entity): entity is MessageEntity => safeParse(messageEntity, entity).success); + } + + return undefined; +} diff --git a/packages/test/harness/src/host/jest/allocateWebDriver.js b/packages/test/harness/src/host/jest/allocateWebDriver.js index 8a09efff77..372f8bf487 100644 --- a/packages/test/harness/src/host/jest/allocateWebDriver.js +++ b/packages/test/harness/src/host/jest/allocateWebDriver.js @@ -12,6 +12,7 @@ module.exports = async function allocateWebDriver({ webDriverURL }) { new ChromeOptions() .addArguments('--headless') // More info at https://github.com/SeleniumHQ/selenium/commit/5a97adf9864a346fdd8914cdb1b601c05dd837ac .addArguments('--single-process') + .setAcceptInsecureCerts(true) // We are accessing https://webchat2/ which has a self-signed certificate. .setLoggingPrefs(preferences) ); diff --git a/packages/test/harness/src/host/jest/runHTML.js b/packages/test/harness/src/host/jest/runHTML.js index fa07d43f25..d7dfb46676 100644 --- a/packages/test/harness/src/host/jest/runHTML.js +++ b/packages/test/harness/src/host/jest/runHTML.js @@ -48,7 +48,7 @@ global.runHTML = async function runHTML(url, options = DEFAULT_OPTIONS) { const webDriver = (global.webDriver = await allocateWebDriver(options)); try { - const absoluteURL = new URL(url, 'http://webchat2/__tests__/html/'); + const absoluteURL = new URL(url, 'https://webchat2/__tests__/html/'); global.__operation__ = `loading URL ${absoluteURL.toString()}`; diff --git a/packages/test/web-server/.gitignore b/packages/test/web-server/.gitignore new file mode 100644 index 0000000000..666eb6c142 --- /dev/null +++ b/packages/test/web-server/.gitignore @@ -0,0 +1,4 @@ +/.env* +/dist +/node_modules +/serve.json diff --git a/packages/test/web-server/package-lock.json b/packages/test/web-server/package-lock.json new file mode 100644 index 0000000000..b3f414dc75 --- /dev/null +++ b/packages/test/web-server/package-lock.json @@ -0,0 +1,2215 @@ +{ + "name": "test-web-server", + "version": "0.0.0-0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "test-web-server", + "version": "0.0.0-0", + "license": "MIT", + "dependencies": { + "selfsigned": "^2.4.1", + "serve-handler": "^6.1.5" + }, + "devDependencies": { + "tsup": "^8.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.2.0.tgz", + "integrity": "sha512-bm6EG6/pCpkxDf/0gDNDdtDILMOHgaQBVOJGdwsqClnxA3xL6jtMv76rLBc006RVMWbmaf0xbmom4Z/5o2nRkQ==", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bundle-require": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", + "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", + "dev": true, + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tsup": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.2.4.tgz", + "integrity": "sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==", + "dev": true, + "dependencies": { + "bundle-require": "^5.0.0", + "cac": "^6.7.14", + "chokidar": "^3.6.0", + "consola": "^3.2.3", + "debug": "^4.3.5", + "esbuild": "^0.23.0", + "execa": "^5.1.1", + "globby": "^11.1.0", + "joycon": "^3.1.1", + "picocolors": "^1.0.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.19.0", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/packages/test/web-server/package.json b/packages/test/web-server/package.json new file mode 100644 index 0000000000..b95634e957 --- /dev/null +++ b/packages/test/web-server/package.json @@ -0,0 +1,34 @@ +{ + "name": "test-web-server", + "version": "0.0.0-0", + "description": "", + "private": true, + "author": "Microsoft Corporation", + "license": "MIT", + "main": "./dist/index.js", + "scripts": { + "auditfix": "npm audit fix --legacy-peer-deps || exit 0", + "build": "tsup", + "bump": "npm run bump:prod && npm run bump:dev && npm run bump:auditfix", + "bump:auditfix": "npm audit fix --legacy-peer-deps || exit 0", + "bump:dev": "if [ `cat package.json | jq -r '.devDependencies | length'` -ne 0 ]; then npm install --legacy-peer-deps $(cat package.json | jq -r '(.pinDependencies // {}) as $p | ((.devDependencies // {}) | keys) | map(. + \"@\" + ($p[.] // [\"latest\"])[0]) | .[]'); fi", + "bump:prod": "if [ `cat package.json | jq -r '.dependencies | length'` -ne 0 ]; then npm install --legacy-peer-deps --save-exact $(cat package.json | jq -r '(.pinDependencies // {}) as $p | ((.dependencies // {}) | keys) | map(. + \"@\" + ($p[.] // [\"latest\"])[0]) | .[]'); fi", + "eslint": "npm run precommit", + "postauditfix": "npm run postbump", + "postbump": "cat package.json | jq '. + (.dependencies = ((.dependencies + (.localPeerDependencies // {})) | to_entries | sort_by(.key) | from_entries)) | (.devDependencies = ((.devDependencies + (.localPeerDevDependencies // {})) | to_entries | sort_by(.key) | from_entries))' > package-temp.json && mv package-temp.json package.json", + "preauditfix": "npm run prebump", + "prebump": "cat package.json | jq '(((.localPeerDependencies // {}) | keys | map([\"dependencies\", .])) + ((.localPeerDevDependencies // {}) | keys | map([\"devDependencies\", .]))) as $localPeerPaths | delpaths($localPeerPaths)' > package-temp.json && mv package-temp.json package.json", + "precommit": "npm run precommit:eslint -- src", + "precommit:eslint": "../../../node_modules/.bin/eslint --report-unused-disable-directives --max-warnings 0", + "start": "npm run build -- --onSuccess=\"node .\" --watch" + }, + "pinDependencies": {}, + "localPeerDependencies": {}, + "dependencies": { + "selfsigned": "^2.4.1", + "serve-handler": "^6.1.5" + }, + "devDependencies": { + "tsup": "^8.2.4" + } +} diff --git a/packages/test/web-server/src/index.ts b/packages/test/web-server/src/index.ts new file mode 100644 index 0000000000..7b2b320b29 --- /dev/null +++ b/packages/test/web-server/src/index.ts @@ -0,0 +1,29 @@ +/* eslint-disable no-console */ +import { readFile } from 'node:fs/promises'; +import { createServer } from 'node:http'; +import { createServer as createSecureServer } from 'node:https'; +import selfsigned from 'selfsigned'; +import handleServe from 'serve-handler'; + +const { + // eslint-disable-next-line no-magic-numbers + env: { PORT = 5081, PORTS = 5443 } +} = process; + +(async () => { + const config = JSON.parse(await readFile('./serve.json', 'utf8')); + const attrs = [{ name: 'commonName', value: 'webchat2' }]; + const pems = selfsigned.generate(attrs, { days: 365 }); + + const handler = (req, res) => handleServe(req, res, config); + + createSecureServer( + { + cert: pems.cert, + key: pems.private + }, + handler + ).listen(PORTS, () => console.log(`Listening to port ${PORTS} (secure).`)); + + createServer(handler).listen(PORT, () => console.log(`Listening to port ${PORT} (insecure).`)); +})(); diff --git a/packages/test/web-server/tsup.config.ts b/packages/test/web-server/tsup.config.ts new file mode 100644 index 0000000000..fe084a9c43 --- /dev/null +++ b/packages/test/web-server/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: { + index: './src/index.ts' + }, + format: 'cjs', + platform: 'node', + noExternal: ['selfsigned', 'serve-handler'] +}); diff --git a/testharness2.dockerfile b/testharness2.dockerfile index e63f565817..6aaaeb836c 100644 --- a/testharness2.dockerfile +++ b/testharness2.dockerfile @@ -9,10 +9,12 @@ RUN apk update && \ apk add --no-cache bash git openssh ENV PORT=80 +ENV PORTS=443 EXPOSE 80 -RUN npm install serve@11.3.0 -g +EXPOSE 443 WORKDIR /var/web/ -ENTRYPOINT ["npx", "--no-install", "serve", "-c", "serve-test.json", "-p", "80", "/var/web/"] +ENTRYPOINT ["node", "./index.js"] -ADD serve-test.json /var/web/ +ADD serve-test.json /var/web/serve.json +ADD packages/test/web-server/dist/index.js /var/web/ RUN echo {}>/var/web/package.json