From 9659e48a501b2b34776755b9ca0f80743a4edfe9 Mon Sep 17 00:00:00 2001 From: Chris Sauve Date: Mon, 26 Aug 2024 15:40:46 -0400 Subject: [PATCH] e2e tests for legacy adapter --- e2e/basic.e2e.ts | 3 +- e2e/remote-ui-legacy.e2e.ts | 27 ++++ examples/remote-ui/app/host/components.tsx | 42 ++---- examples/remote-ui/app/remote/app.tsx | 67 ++++++--- examples/remote-ui/app/remote/components.tsx | 1 + examples/remote-ui/app/remote/remote.tsx | 17 +-- examples/remote-ui/app/style.css | 8 -- examples/remote-ui/app/types.ts | 2 + package.json | 5 +- playwright.config.ts | 17 ++- pnpm-lock.yaml | 137 +++++++++++++++++-- 11 files changed, 234 insertions(+), 92 deletions(-) create mode 100644 e2e/remote-ui-legacy.e2e.ts diff --git a/e2e/basic.e2e.ts b/e2e/basic.e2e.ts index 9b96b6c7..24f11dc5 100644 --- a/e2e/basic.e2e.ts +++ b/e2e/basic.e2e.ts @@ -30,7 +30,8 @@ import {test, expect} from '@playwright/test'; dialog.dismiss().catch(() => {}); }); + const dialogPromise = page.waitForEvent('dialog'); await page.getByRole('button', {name: 'Close'}).click(); - await page.waitForEvent('dialog'); + await dialogPromise; }); }); diff --git a/e2e/remote-ui-legacy.e2e.ts b/e2e/remote-ui-legacy.e2e.ts new file mode 100644 index 00000000..30e51658 --- /dev/null +++ b/e2e/remote-ui-legacy.e2e.ts @@ -0,0 +1,27 @@ +import {test, expect} from '@playwright/test'; +const sandbox = 'iframe'; +const example = 'react'; + +test.use({baseURL: 'http://localhost:8081'}); + +test(`basic modal interaction remote-ui legacy rendered example`, async ({ + page, +}) => { + await page.goto(`/`); + + await page.getByRole('button', {name: 'Open modal'}).click(); + await page.getByRole('button', {name: 'Click me!'}).click(); + await page.getByRole('button', {name: 'Click me!'}).click(); + + await expect(page.getByText('Click Count: 2')).toBeVisible(); + + page.once('dialog', (dialog) => { + expect(dialog.message()).toBe('You clicked 2 times!'); + dialog.accept().catch(() => {}); + }); + + const dialogPromise = page.waitForEvent('dialog'); + + await page.getByRole('button', {name: 'Close'}).click(); + await dialogPromise; +}); diff --git a/examples/remote-ui/app/host/components.tsx b/examples/remote-ui/app/host/components.tsx index 4fa7cee5..62ffd3fc 100644 --- a/examples/remote-ui/app/host/components.tsx +++ b/examples/remote-ui/app/host/components.tsx @@ -1,6 +1,14 @@ import {type ComponentChildren} from 'preact'; import {forwardRef} from 'preact/compat'; -import {useRef, useImperativeHandle, useEffect} from 'preact/hooks'; +import { + useRef, + useImperativeHandle, + useEffect, + useLayoutEffect, + useState, + useMemo, +} from 'preact/hooks'; +import {createContext, useContext} from 'preact/compat'; import type { ButtonProperties, @@ -31,15 +39,14 @@ export function Button({ children?: ComponentChildren; modal?: ComponentChildren; } & ButtonProperties) { - console.log('#modal', modal); return ( <> @@ -67,30 +74,11 @@ export const Modal = forwardRef< children?: ComponentChildren; primaryAction?: ComponentChildren; } & ModalProperties ->(function Modal({children, primaryAction, onClose}, ref) { - const dialogRef = useRef(null); - - useImperativeHandle(ref, () => ({ - open() { - dialogRef.current?.showModal(); - }, - close() { - dialogRef.current?.close(); - }, - })); - - useEffect(() => { - dialogRef.current?.showModal(); - - return () => { - dialogRef.current?.close(); - }; - }, [dialogRef.current]); - +>(function Modal({children, primaryAction}) { return ( - onClose?.()}> + + ); }); diff --git a/examples/remote-ui/app/remote/app.tsx b/examples/remote-ui/app/remote/app.tsx index 36cebbe0..9d80e081 100644 --- a/examples/remote-ui/app/remote/app.tsx +++ b/examples/remote-ui/app/remote/app.tsx @@ -1,29 +1,60 @@ /** @jsxRuntime automatic */ /** @jsxImportSource react */ -import {useEffect, useState} from 'react'; +import {useState} from 'react'; import {Button, Modal, Stack, Text} from './components'; -export function App() { - const [counter, setCounter] = useState(0); +export function App({api}: {api: any}) { + const [showModal, setShowModal] = useState(false); + const [count, setCount] = useState(0); - useEffect(() => { - const timer = setTimeout(() => { - setCounter(counter + 1); - }, 1000); - - return () => clearTimeout(timer); - }, [counter]); + function removeModal() { + setShowModal(false); + } return ( - - - Counter: {counter} + + <> + + Rendering example: remote-ui legacy + + + } + > + + + Click count: {count} + + + + + ) : undefined + } + > + Open modal + + ); } diff --git a/examples/remote-ui/app/remote/components.tsx b/examples/remote-ui/app/remote/components.tsx index c9fcac9e..dc5ff9f3 100644 --- a/examples/remote-ui/app/remote/components.tsx +++ b/examples/remote-ui/app/remote/components.tsx @@ -16,4 +16,5 @@ export const Stack = createRemoteReactComponent<'Stack', StackProperties>( ); export const Modal = createRemoteReactComponent<'Modal', ModalProperties>( 'Modal', + {fragmentProps: ['primaryAction']}, ); diff --git a/examples/remote-ui/app/remote/remote.tsx b/examples/remote-ui/app/remote/remote.tsx index 62c418eb..814a8f74 100644 --- a/examples/remote-ui/app/remote/remote.tsx +++ b/examples/remote-ui/app/remote/remote.tsx @@ -15,22 +15,7 @@ endpoint.expose({ components: Object.keys(components), }); - const modal = remoteRoot.createFragment(); - modal.appendChild(remoteRoot.createComponent('Modal', {}, ['Hello'])); - const button = remoteRoot.createComponent('Button', {modal}, ['click me']); - - remoteRoot.appendChild(button); - - setTimeout(() => { - const mewModal = remoteRoot.createFragment(); - mewModal.appendChild( - remoteRoot.createComponent('Modal', {}, ['Hello from the new side']), - ); - - button.updateProps({modal: mewModal}); - }, 1000); - - // createRoot(remoteRoot).render(); + createRoot(remoteRoot).render(); remoteRoot.mount(); }, }); diff --git a/examples/remote-ui/app/style.css b/examples/remote-ui/app/style.css index 1890e081..a04ae88e 100644 --- a/examples/remote-ui/app/style.css +++ b/examples/remote-ui/app/style.css @@ -164,14 +164,6 @@ li { background: rgba(9, 9, 11, 0.65); } -.Modal[open] { - animation: OpenModal 0.2s ease normal; -} - -.Modal:not([open]) { - display: none; -} - @keyframes OpenModal { from { opacity: 0; diff --git a/examples/remote-ui/app/types.ts b/examples/remote-ui/app/types.ts index 09ec39a3..1eb5780a 100644 --- a/examples/remote-ui/app/types.ts +++ b/examples/remote-ui/app/types.ts @@ -37,6 +37,8 @@ export interface ModalProperties { * Remote DOM, this property can be set using `addEventListener('press')`. */ onClose?(): void; + + primaryAction?: RemoteFragment; } export interface ModalMethods { diff --git a/package.json b/package.json index 5fa5d4cd..ef12967b 100644 --- a/package.json +++ b/package.json @@ -22,15 +22,16 @@ "example:kitchen-sink": "pnpm run --filter example-kitchen-sink start" }, "devDependencies": { + "wait-on": "^8.0.1", "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.0", - "@playwright/test": "^1.48.2", + "@playwright/test": "^1.49.0", "@quilted/rollup": "^0.2.45", "@quilted/typescript": "^0.4.2", "@quilted/vite": "^0.1.27", "@types/node": "~20.11.0", "jsdom": "^25.0.0", - "playwright": "^1.48.2", + "playwright": "^1.49.0", "prettier": "^3.3.3", "rollup": "^4.21.0", "tsx": "^4.19.0", diff --git a/playwright.config.ts b/playwright.config.ts index 5a231265..178a0a60 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -32,9 +32,16 @@ export default defineConfig({ ], // Run your local dev server before starting the tests - webServer: { - command: 'pnpm run example:kitchen-sink --port 8080', - url: 'http://localhost:8080', - reuseExistingServer: !process.env.CI, - }, + webServer: [ + { + command: 'pnpm run example:kitchen-sink --port 8080', + url: 'http://localhost:8080', + reuseExistingServer: !process.env.CI, + }, + { + command: 'pnpm run example:remote-ui --port 8081', + url: 'http://localhost:8081', + reuseExistingServer: !process.env.CI, + }, + ], }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 439c0de9..1b22f0c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^2.27.0 version: 2.27.7 '@playwright/test': - specifier: ^1.48.2 - version: 1.48.2 + specifier: ^1.49.0 + version: 1.49.0 '@quilted/rollup': specifier: ^0.2.45 version: 0.2.45(@babel/template@7.25.0)(@babel/traverse@7.25.6)(@babel/types@7.25.6)(@types/babel__core@7.20.5)(rollup@4.21.2) @@ -33,8 +33,8 @@ importers: specifier: ^25.0.0 version: 25.0.0 playwright: - specifier: ^1.48.2 - version: 1.48.2 + specifier: ^1.49.0 + version: 1.49.0 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -53,6 +53,9 @@ importers: vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@20.11.16)(jsdom@25.0.0)(lightningcss@1.22.1) + wait-on: + specifier: ^8.0.1 + version: 8.0.1 examples/custom-element: dependencies: @@ -1253,6 +1256,12 @@ packages: cpu: [x64] os: [win32] + '@hapi/hoek@9.3.0': + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + + '@hapi/topo@5.1.0': + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1319,8 +1328,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.48.2': - resolution: {integrity: sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==} + '@playwright/test@1.49.0': + resolution: {integrity: sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==} engines: {node: '>=18'} hasBin: true @@ -1629,6 +1638,15 @@ packages: cpu: [x64] os: [win32] + '@sideway/address@4.1.5': + resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + + '@sideway/formula@3.0.1': + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + + '@sideway/pinpoint@2.0.0': + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -1819,6 +1837,9 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axobject-query@4.0.0: resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} @@ -2192,6 +2213,15 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -2411,6 +2441,9 @@ packages: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + joi@17.13.3: + resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2540,6 +2573,9 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2607,6 +2643,9 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -2771,13 +2810,13 @@ packages: pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - playwright-core@1.48.2: - resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + playwright-core@1.49.0: + resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} engines: {node: '>=18'} hasBin: true - playwright@1.48.2: - resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + playwright@1.49.0: + resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} engines: {node: '>=18'} hasBin: true @@ -2813,6 +2852,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -2946,6 +2988,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3134,6 +3179,9 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.19.0: resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} engines: {node: '>=18.0.0'} @@ -3272,6 +3320,11 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} + wait-on@8.0.1: + resolution: {integrity: sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==} + engines: {node: '>=12.0.0'} + hasBin: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -4568,6 +4621,12 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true + '@hapi/hoek@9.3.0': {} + + '@hapi/topo@5.1.0': + dependencies: + '@hapi/hoek': 9.3.0 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4646,9 +4705,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.48.2': + '@playwright/test@1.49.0': dependencies: - playwright: 1.48.2 + playwright: 1.49.0 '@preact/preset-vite@2.9.0(@babel/core@7.25.2)(preact@10.22.1)(vite@5.4.2(@types/node@20.11.16)(lightningcss@1.22.1))': dependencies: @@ -5011,6 +5070,14 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.21.2': optional: true + '@sideway/address@4.1.5': + dependencies: + '@hapi/hoek': 9.3.0 + + '@sideway/formula@3.0.1': {} + + '@sideway/pinpoint@2.0.0': {} + '@sinclair/typebox@0.27.8': {} '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.2(@types/node@20.11.16)(lightningcss@1.22.1)))(svelte@4.2.19)(vite@5.4.2(@types/node@20.11.16)(lightningcss@1.22.1))': @@ -5240,6 +5307,14 @@ snapshots: asynckit@0.4.0: {} + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.0.0: dependencies: dequal: 2.0.3 @@ -5644,6 +5719,8 @@ snapshots: micromatch: 4.0.5 pkg-dir: 4.2.0 + follow-redirects@1.15.9: {} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 @@ -5853,6 +5930,14 @@ snapshots: jest-get-type: 27.5.1 pretty-format: 27.5.1 + joi@17.13.3: + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.5 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + js-tokens@4.0.0: {} js-tokens@9.0.0: {} @@ -5973,6 +6058,8 @@ snapshots: lodash.startcase@4.4.0: {} + lodash@4.17.21: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6035,6 +6122,8 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + minipass@7.0.4: {} mlly@1.4.2: @@ -6174,11 +6263,11 @@ snapshots: mlly: 1.4.2 pathe: 1.1.1 - playwright-core@1.48.2: {} + playwright-core@1.49.0: {} - playwright@1.48.2: + playwright@1.49.0: dependencies: - playwright-core: 1.48.2 + playwright-core: 1.49.0 optionalDependencies: fsevents: 2.3.2 @@ -6215,6 +6304,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.2.0 + proxy-from-env@1.1.0: {} + pseudomap@1.0.2: {} psl@1.9.0: {} @@ -6353,6 +6444,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + safer-buffer@2.1.2: {} saxes@6.0.0: @@ -6530,6 +6625,8 @@ snapshots: dependencies: punycode: 2.3.1 + tslib@2.8.1: {} + tsx@4.19.0: dependencies: esbuild: 0.23.1 @@ -6654,6 +6751,16 @@ snapshots: dependencies: xml-name-validator: 5.0.0 + wait-on@8.0.1: + dependencies: + axios: 1.7.9 + joi: 17.13.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + wcwidth@1.0.1: dependencies: defaults: 1.0.4