From b3b657463882e0bbe7ce71a5d26a3007397b9d52 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 13 Feb 2026 10:20:16 +0000 Subject: [PATCH] Run only the browser in docker for storybook screenshots (#32489) * Remove old screenshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Add experimental playwright-screenshots.sh utility and use it for shared-components `test:storybook:update` Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Tidy up Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate based on review Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- packages/playwright-common/Dockerfile | 13 +++ packages/playwright-common/README.md | 22 ++++ .../playwright-common/docker-entrypoint.sh | 4 + packages/playwright-common/package.json | 21 ++++ .../playwright-screenshots.sh | 36 +++++++ packages/shared-components/package.json | 4 +- .../event-textualevent--default-linux.png | Bin 7075 -> 0 bytes ...l-widgetcontextmenuview--default-linux.png | Bin 16966 -> 0 bytes ...enuview--only-basic-modification-linux.png | Bin 10516 -> 0 bytes ...list-roomlistheaderview--default-linux.png | Bin 6647 -> 0 bytes ...mlistheaderview--no-compose-menu-linux.png | Bin 6648 -> 0 bytes ...oomlistheaderview--no-space-menu-linux.png | Bin 6464 -> 0 bytes .../scripts/storybook-screenshot-update.sh | 19 ---- packages/shared-components/vitest.config.ts | 13 ++- pnpm-lock.yaml | 97 +++++++++++++++++- 15 files changed, 203 insertions(+), 26 deletions(-) create mode 100644 packages/playwright-common/Dockerfile create mode 100644 packages/playwright-common/README.md create mode 100755 packages/playwright-common/docker-entrypoint.sh create mode 100644 packages/playwright-common/package.json create mode 100755 packages/playwright-common/playwright-screenshots.sh delete mode 100644 packages/shared-components/playwright/snapshots/event-textualevent--default-linux.png delete mode 100644 packages/shared-components/playwright/snapshots/rightpanel-widgetcontextmenuview--default-linux.png delete mode 100644 packages/shared-components/playwright/snapshots/rightpanel-widgetcontextmenuview--only-basic-modification-linux.png delete mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--default-linux.png delete mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--no-compose-menu-linux.png delete mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--no-space-menu-linux.png delete mode 100755 packages/shared-components/scripts/storybook-screenshot-update.sh diff --git a/packages/playwright-common/Dockerfile b/packages/playwright-common/Dockerfile new file mode 100644 index 0000000000..d9907f1fc1 --- /dev/null +++ b/packages/playwright-common/Dockerfile @@ -0,0 +1,13 @@ +ARG PLAYWRIGHT_VERSION +FROM mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-noble + +WORKDIR /work + +# fonts-dejavu is needed for the same RTL rendering as on CI +RUN apt-get update && apt-get -y install docker.io fonts-dejavu +# Install the matching playwright runtime, the docker image only includes browsers +RUN npm i -g playwright@${PLAYWRIGHT_VERSION} + +COPY docker-entrypoint.sh /docker-entrypoint.sh + +ENTRYPOINT ["/docker-entrypoint.sh"] diff --git a/packages/playwright-common/README.md b/packages/playwright-common/README.md new file mode 100644 index 0000000000..ab7c192315 --- /dev/null +++ b/packages/playwright-common/README.md @@ -0,0 +1,22 @@ +# @element-hq/element-web-playwright-common + +Set of Playwright utilities to make it easier to write tests for Element Web, Element Web Modules & Element Desktop. + +# This is a partial clone of https://github.com/element-hq/element-modules/tree/main/packages/element-web-playwright-common + +In the future the rest of the package will be brought into this monorepo, for now it serves as an experimental alternative to https://github.com/element-hq/element-modules/pull/188 + +## Releases + +The API is versioned using semver, with the major version incremented for breaking changes. + +## Copyright & License + +Copyright (c) 2026 Element Creations Ltd + +This software is multi licensed by Element Creations Ltd (Element). It can be used either: + +(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR + +(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to). +Unless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses. diff --git a/packages/playwright-common/docker-entrypoint.sh b/packages/playwright-common/docker-entrypoint.sh new file mode 100755 index 0000000000..66a71fcd58 --- /dev/null +++ b/packages/playwright-common/docker-entrypoint.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# We use npm here as we used `npm i -g` to install playwright in the Dockerfile +npm exec -- playwright run-server --port "$PORT" --host 0.0.0.0 diff --git a/packages/playwright-common/package.json b/packages/playwright-common/package.json new file mode 100644 index 0000000000..77b33190cc --- /dev/null +++ b/packages/playwright-common/package.json @@ -0,0 +1,21 @@ +{ + "name": "@element-hq/element-web-playwright-common-local", + "type": "module", + "version": "3.0.0", + "license": "SEE LICENSE IN README.md", + "repository": { + "type": "git", + "url": "git+https://github.com/element-hq/element-web.git", + "directory": "packages/playwright-common" + }, + "author": "element-hq", + "engines": { + "node": ">=20.0.0" + }, + "bin": { + "playwright-screenshots": "playwright-screenshots.sh" + }, + "devDependencies": { + "wait-on": "^9.0.4" + } +} diff --git a/packages/playwright-common/playwright-screenshots.sh b/packages/playwright-common/playwright-screenshots.sh new file mode 100755 index 0000000000..8e2bb9306b --- /dev/null +++ b/packages/playwright-common/playwright-screenshots.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -e + +# Handle symlinks here as we tend to be executed as an npm binary +SCRIPT_PATH=$(readlink -f "$0") +SCRIPT_DIR=$(dirname "$SCRIPT_PATH") + +IMAGE_NAME="element-web-playwright-server" +WS_PORT=3000 + +# Check the playwright version +PW_VERSION=$(npm exec --silent -- playwright --version | gcut -d" " -f2) +echo "Building $IMAGE_NAME:$PW_VERSION image in $SCRIPT_DIR" + +# Build the image +docker build -t "$IMAGE_NAME" --build-arg "PLAYWRIGHT_VERSION=$PW_VERSION" "$SCRIPT_DIR" + +# Start the playwright-server in docker +CONTAINER=$(docker run --network=host --rm -d -e PORT="$WS_PORT" "$IMAGE_NAME") +# Set up an exit trap to clean up the docker container +clean_up() { + ARG=$? + echo "Stopping playwright-server" + docker stop "$CONTAINER" > /dev/null + exit $ARG +} +trap clean_up EXIT + +# Wait for playwright-server to be ready +echo "Waiting for playwright-server" +pnpm wait-on "tcp:$WS_PORT" + +# Run the test we were given, setting PW_TEST_CONNECT_WS_ENDPOINT accordingly +echo "Running '$@'" +PW_TEST_CONNECT_WS_ENDPOINT="http://localhost:$WS_PORT" "$@" diff --git a/packages/shared-components/package.json b/packages/shared-components/package.json index 5c097f1a88..1b49b76a2c 100644 --- a/packages/shared-components/package.json +++ b/packages/shared-components/package.json @@ -40,7 +40,7 @@ "i18n:lint": "matrix-i18n-lint && prettier --log-level=silent --write src/i18n/strings/ --ignore-path /dev/null", "test:unit": "vitest --project=unit", "test:storybook": "pnpm build:doc && vitest --project=storybook", - "test:storybook:update": "cd ../.. && playwright-screenshots --entrypoint /work/packages/shared-components/scripts/storybook-screenshot-update.sh --with-node-modules --no-link-modules", + "test:storybook:update": "CI=1 pnpm playwright-screenshots pnpm vitest --run --update --project=storybook", "build": "vite build", "prepack": "pnpm run build", "storybook": "storybook dev -p 6007", @@ -63,7 +63,7 @@ "temporal-polyfill": "^0.3.0" }, "devDependencies": { - "@element-hq/element-web-playwright-common": "catalog:", + "@element-hq/element-web-playwright-common-local": "workspace:*", "@fetch-mock/vitest": "^0.2.18", "@matrix-org/react-sdk-module-api": "^2.5.0", "@playwright/test": "catalog:", diff --git a/packages/shared-components/playwright/snapshots/event-textualevent--default-linux.png b/packages/shared-components/playwright/snapshots/event-textualevent--default-linux.png deleted file mode 100644 index ede4361ae3fce86f858e85aa6917970bbbe96631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7075 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 diff --git a/packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--default-linux.png b/packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--default-linux.png deleted file mode 100644 index aa0e385a973969f8be5c2585f2cd0510788db5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6647 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 diff --git a/packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--no-compose-menu-linux.png b/packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--no-compose-menu-linux.png deleted file mode 100644 index 4e67ae012935d9a984368ed1495c9766f25fca39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6648 zcmeI0`B&4&7QjQPMT>}is7Mjgp7v-fg;d!p0n{puJPx8DK?o2QH9`!FED=IN)d~-g z_$*5*7*avPo`^I=wnRn1f+T1pEFp=MB@&W+S+WsGc%gqo&+)u-_~p*bch1b*`?)iB z?tJskoQ7F^`uV3I5Xi#!)X6{)Xp6D>(a_e9jKwkVzfC}(ogm+n$Io56FB4|}H+Uwx zZ_@Oj^`93oK~DZtF$im`vBIw^_YCFzb@Dp(hK*hFjWVsN)h~7MdZNeap4Z1K^ZpZT z;^Y6~a^a!fLtjVL|5$UQsMyuDk@y*UD!!O;(63zPGo_Z%{)K=>yCzL(@fE_c3@%QD z!(!ERE=y9;fyQF7MlC?#^o~8oV&^fCsZk#PF!D?YW1KGlbbS^9-mV#M?!xxD(P~L1 zLZNU2+ZxB9YVIQm+0q`8hk?6x04BpLLXiqvwn1mROh+y$ow;heiX_=Imw5D#+JfsF zgJfGBSekC^NMal*LKM$+7im>u2#e7u{;~t`o_o1C^D06d@mf92&2Jy|B^_fz$_dKG zV1x)?`Jf%e8?8c-Q`8SXD>3@(XUn_Rky&+XnNy5qgSdrFSRTCP4#6+g6@qOJKb+Vp zTDAfM3Pt2fKtqVv6KaMSpHHTXpijwmTqfL6}8e!+n8zVMZHtlW96bnzz&!GE9{Cm zD0-aa4-V$I+y4+d#VoY$;YFB2&)^>OsOv3HK3=XB!m zUs-Y8_!Lw?dD5wj`nqJw+1vo~A&nxfT;^}wVX`lbPIV_t5wU#09Kvz|=G}``g2PKi z&QywLQWTlyPg@myVL@|qEwz0PA=y4BGs3v9X8H5n-_m>9n*^oG@cms+I#)vJ%IdM|3eaB_)I(8B>z-nXsO|zVMq_|#!wibC~pD#QUtOT>z(g(2Ywb3!>fYt7!qp^bN zY@@4g++yxKJo~#Z%s$fSf(s7wn$l`)Q?{%|AZ6-rA;TF_i*&-Ust#XviM&`H@d+O& zX-i|9r-te$tNwn}PZ`Owf z?N0(m#;pbf>WUOV%D|G{S>sS%xr=ex2Z?)8u{1HgQpIH#Lt zAhq&g_845e>Q^g`6E|^<6YMAOV6HZ7x6?H*t?vnmYM1ya63vEs-P1>_?4a{L!&g{_P;F zFpX46OjqwnLcs*>44>}S?ivzOKzdx#+-Jv|ICCXTB@gB*@5k*;nVeY0C0ay~Q#lvy zFfinkOf*L5H84(PxX=WKveyFE)bGj8TyH|^)VrAR#%);7wI<0xUGFy3V8t8H#>-^{ zT{Lzb)3&=aEeM7RIXfp6+;GZ%NenyG8Mr;+e(IlgmK0HFo!bs^?5ca6_cf&%|OGf>%VM+b;k%1lR1L+)VPg|LBl zl@0P{3%Qq73AL)%l_k7?v%%4SI3{h3Cdb$g1PTphG0N7+CO20&4iZT_hv*;Xj^rQj zhPkWuU#otQ%)NR>Ax}?`HtrsDoa%ES%p264KALvT#ILOHwk>W{n>;gOngg6w@=!Zg z3a*=)5tfNSma6R5Omrx_hU}Rpdsbz>5u|=oELDkfp)Yz-hS-79^@C={klH{;1S&M8 zDuGgxovD7s(@8b;TMEp!?@cnsPbX=mf^OoZi9LW!U!I6_?7AD;kfz2whu2$_h&yLn z18v|r@it7vz%p5Xo)>(@{9R6TNx#4$^Ah@^2HxsLTjCT7qpcw9mHD0{)w%j@gFF|?*Y(+p-JFV1LOJZE1fn z^P&I+9^&cj9GuEqVqyb6vb2S!{m3mO6%fs6>IGP955bm1TpX*y@frn?0)& zFG+>cRV!KYQ(x=*?XrRbK|BJ^>Bw3!DWDQB@5ORTtXox`eTf3cnnKo$U4iYoG~bU} z_N3|@`D7zmGX-7!X7I#NLDN>_7m%;d>65e{qi*~U*8b6j diff --git a/packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--no-space-menu-linux.png b/packages/shared-components/playwright/snapshots/room-list-roomlistheaderview--no-space-menu-linux.png deleted file mode 100644 index 1466544712568dce914c3d684c5e8580b46cd239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6464 zcmeI0`&ZLP7QlnDKz-3&w<7XLd#JKLfNDz-LI^Il5g(+|N{RtOMR_DV1PMVx646$U zBE%jA)Cef7h&+OV$=4*1fPhqxhgFCWk`N$75=aPX5}N0J>DfPGPs=ZN=FH5QbMNQQ zy)$>Nd=r7(xNh4z2n4b*{LsNj2;^^Icg?WV8n6k49=3x(K7@oHJn&ua-FXo;dqhX> z)%fAqhfvc{Z41KzaDBQx8f8b^)Lr>W<*vt@9wVJ|FOR2mZjo*9{+5;(yqV@1&*?i` z{mpSw_jp(Z-K}`$z82s}2=xnvWX~%KJY{XZwr)0X^>o>F( z4LjUQUb2dZ;0!L83o3J=MwGdtoBf9!pgj10AU9k;xiB2oV9Sx88$wm&>!YXXMFswK z|5Mi>t;z{*P3)>I$IdNd1t_=7z7Z{Nf@oGWH2XxevILbb#t6Ut84CH1eAd>`-hYBt zEm|8*dZHwb{~&=zt_i}D7UWdsR6z@+(35JOY4yH|j^bCt`JLwi zJn~J&97XuX>DpKAioTa#yH+qEe=3ioJTP0CFc(`Dk!m$64HJNZEhkd5-w$Vfod2tL zh*%_Q*QkNiyi@q;hY>yweW9oeFqodj!0a^{9>xGUL^SCBj^m6*iEK9--l}Ea52L9Y zBvg~Zwk*~|ZvtOavJUROU?gpBq#fhTvBruC?Y+#k3q$E~rbRD|eiTRY6n@I?Y`$F<~Ig z&diu>H&zJCVuWZGVcIwPccKrB&rg@h5*lRZdq@8k zfM{z?+DiHq-)FC~#F28+gge)J3R}{2{+sLD(c`>8o2n#**d)|&Q(h(0dCU~lPzC3Sz^{!(#J^X}G^EcZ)3YpPVazh5;ORhWea3mYf5Il) zi_QUbOd$EF<@%}Fi7U<-))(TXNK5y5?L+@fySF6{ZL|GSRaP?@W(o@8UOkMKIC0Eg zFkH{#;l2N%EFE*ss2quYH0q4#+%W=%N8!kL2G#Jg303MSY9fcCr0jplwhqj?N2cNGwqW{l(lUgxWeQmH&KK^g5nLFVX^_eeGatpY15q11 zLu&5_bnYhTyh|NrslYjGQd4s3ozGZSH@9&ZagXu&`_keBdT(*na0~?sH~$Ex_sM?^ z$68@iZ)`}e!L01OWQ+EEiz`$;!=DLM`zQe^K-Ko`=DkJp0l(P2$;0;=_~YmVfHh%odX0Ca<`Ujo#zqX zMcg*CiNOob61+v;)hqjOdHB8n#jtf(#q4d^mwQ&y16{C|gQtQBsmgw>&=t{1v(2$E z=(FXE7=W;4p$S7IR7&2Ou4O*B_C`!#4pv_E5ho9x47|Sp-x?!shF$bmGfyb*)JoVX z3Z@VUwpJ8l0)W&srK>-5B4>zM^r8{F@6kyxy7HaKVB!Qqgyw#fsY~xM6TszrJIb3{|$cdLi?TufofH$V)xE!bW@s<%>6y zKXfVoNGa_HE;)#@rbmu!v5jqaiLkwT=!U5CX%?r)+e$Wnjm;K4!1JC}H|3n2p27%9 z;zAM*#%fOhv64}(D?iOZO?hR>h>o#27Ny?_td`rHN=^@umJ_ylA9Vv-&ft;#SBntb z>PYw##yKhy>m;c99Dge8k1OZ&J%r=(kF$XR*mnVgB2KcVhReyT&sDW6(LQabBfIFd zOK9XVe)`;aZ#sh5O|KDoMQa%+?)aYMX`Tofw}R?Dae&ELy2fq;_}yo}Dpv`t5?CehmnZO}4XpNUwlLk%3t*Y=u=40x3t2ODGtp7A S=X-Dj68=@hLB_x1Fa8(1*0VVP diff --git a/packages/shared-components/scripts/storybook-screenshot-update.sh b/packages/shared-components/scripts/storybook-screenshot-update.sh deleted file mode 100755 index 549ac18d69..0000000000 --- a/packages/shared-components/scripts/storybook-screenshot-update.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# -# Update storybook screenshots -# -# This script should be used as the entrypoint parameter of the `playwright-screenshots` script. It -# installs the pnpm dependencies, and then runs `vitest --run --update --project=storybook` to update the storybook screenshots. -# -# It requires that `playwright-screenshots` is given the `--with-node-modules` parameter. - -set -e - -# First install dependencies. We have to do this within the playwright container rather than the host, -# because we have which must be built for the right architecture (and some environments use a VM -# to run docker containers, meaning that things inside a container use a different architecture than -# those on the host). -pnpm install --frozen-lockfile - -# Now run the screenshot update, we set CI=1 to inform vis to update the real baselines -CI=1 pnpm --dir packages/shared-components test:storybook --run --update diff --git a/packages/shared-components/vitest.config.ts b/packages/shared-components/vitest.config.ts index 23cc026304..115eac0b07 100644 --- a/packages/shared-components/vitest.config.ts +++ b/packages/shared-components/vitest.config.ts @@ -101,6 +101,8 @@ export default defineConfig({ storybookVis({ // 3px of difference allowed before marking as failed failureThreshold: 3, + // When running in CI=1 mode, set the platform to `linux` as that is the platform where the browser-in-docker is running + snapshotRootDir: ({ ci, platform }) => `__vis__/${ci ? "linux" : platform}`, }), ], test: { @@ -110,7 +112,16 @@ export default defineConfig({ headless: true, provider: playwright({ contextOptions: commonContextOptions, - launchOptions: commonLaunchOptions, + launchOptions: process.env.PW_TEST_CONNECT_WS_ENDPOINT ? undefined : commonLaunchOptions, + connectOptions: process.env.PW_TEST_CONNECT_WS_ENDPOINT + ? { + wsEndpoint: process.env.PW_TEST_CONNECT_WS_ENDPOINT, + exposeNetwork: "", + headers: { + "x-playwright-launch-options": JSON.stringify(commonLaunchOptions), + }, + } + : undefined, }), instances: [{ browser: "chromium" }], }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b47cde5f3..ad9629eb2b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -711,6 +711,12 @@ importers: specifier: ^2.3.3 version: 2.8.2 + packages/playwright-common: + devDependencies: + wait-on: + specifier: ^9.0.4 + version: 9.0.4 + packages/shared-components: dependencies: '@element-hq/element-web-module-api': @@ -744,9 +750,9 @@ importers: specifier: ^0.3.0 version: 0.3.0 devDependencies: - '@element-hq/element-web-playwright-common': - specifier: 'catalog:' - version: 2.2.7(@element-hq/element-web-module-api@1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4))(@playwright/test@1.58.1)(playwright-core@1.58.1) + '@element-hq/element-web-playwright-common-local': + specifier: workspace:* + version: link:../playwright-common '@fetch-mock/vitest': specifier: ^0.2.18 version: 0.2.18(vitest@4.0.18) @@ -2268,6 +2274,26 @@ packages: engines: {node: '>=6'} hasBin: true + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} + + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.5': + resolution: {integrity: sha512-Vq/1gnIIsvFUpKlDdfrPd/ssHDpAyBP/baVukh3u2KSG2xoNjsnRNjQiPmuyPPGqsn1cqVWWhtZHfOBaLizFRQ==} + engines: {node: '>=14.0.0'} + + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -4877,6 +4903,9 @@ packages: axios@1.13.4: resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + axios@1.13.5: + resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -7352,6 +7381,10 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joi@18.0.2: + resolution: {integrity: sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==} + engines: {node: '>= 20'} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -9195,6 +9228,9 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -10270,6 +10306,11 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wait-on@9.0.4: + resolution: {integrity: sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==} + engines: {node: '>=20.0.0'} + hasBin: true + walk-up-path@4.0.0: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} @@ -12068,6 +12109,22 @@ snapshots: protobufjs: 7.5.4 yargs: 17.7.2 + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.5': {} + + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -15005,6 +15062,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.13.5: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} b4a@1.7.3: {} @@ -18068,6 +18133,16 @@ snapshots: jju@1.4.0: {} + joi@18.0.2: + dependencies: + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.5 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.1.0 + js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -18368,7 +18443,7 @@ snapshots: mailpit-api@1.7.0: dependencies: - axios: 1.13.4 + axios: 1.13.5 partysocket: 1.1.11 ws: 8.19.0 transitivePeerDependencies: @@ -20141,6 +20216,10 @@ snapshots: rw@1.3.3: {} + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -21436,6 +21515,16 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + wait-on@9.0.4: + dependencies: + axios: 1.13.5 + joi: 18.0.2 + lodash: 4.17.23 + minimist: 1.2.8 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + walk-up-path@4.0.0: {} walk@2.3.15: