From a68977a49ead3d79334c4db7b7a4c15cec925290 Mon Sep 17 00:00:00 2001 From: Eunji Song <32075932+eunjisong@users.noreply.github.com> Date: Wed, 4 Dec 2024 15:17:35 -0500 Subject: [PATCH] playwright and core.app integration (#2141) Signed-off-by: Eunji Song <32075932+eunjisong@users.noreply.github.com> Co-authored-by: Tyler Hackett --- packages/core-mobile/detox.config.js | 10 + .../e2e/configs/reuseStateConfig.json | 3 +- .../e2e/helpers/playwrightActions.ts | 34 +++ .../e2e/helpers/playwrightSetup.ts | 39 ++++ .../e2e/pages/commonPlaywrightEls.page.ts | 5 +- .../core-mobile/e2e/pages/coreApp.page.ts | 20 +- .../core-mobile/e2e/pages/plusMenu.page.ts | 8 +- .../e2e/tests/playwright/core.spec.ts | 30 --- .../playwright/core/core.e2e.playwright.ts | 11 + .../e2e/tests/playwright/core/core.spec.ts | 25 +++ .../e2e/tests/playwright/core/run-tests.js | 31 +++ packages/core-mobile/package.json | 2 + yarn.lock | 207 +++++++++++++++++- 13 files changed, 374 insertions(+), 51 deletions(-) create mode 100644 packages/core-mobile/e2e/helpers/playwrightActions.ts create mode 100644 packages/core-mobile/e2e/helpers/playwrightSetup.ts delete mode 100644 packages/core-mobile/e2e/tests/playwright/core.spec.ts create mode 100644 packages/core-mobile/e2e/tests/playwright/core/core.e2e.playwright.ts create mode 100644 packages/core-mobile/e2e/tests/playwright/core/core.spec.ts create mode 100644 packages/core-mobile/e2e/tests/playwright/core/run-tests.js diff --git a/packages/core-mobile/detox.config.js b/packages/core-mobile/detox.config.js index b33e19e818..2e91f06d1f 100644 --- a/packages/core-mobile/detox.config.js +++ b/packages/core-mobile/detox.config.js @@ -302,6 +302,16 @@ module.exports = { app: 'android.internal.debug', artifacts: { rootDir: './e2e/artifacts/android' + }, + testRunner: { + $0: 'jest', + args: { + config: './e2e/configs/reuseStateConfig.json' + }, + jest: { + setupTimeout: 300000, + testTimeout: 300000 + } } }, 'android.internal.debug.reuse_state': { diff --git a/packages/core-mobile/e2e/configs/reuseStateConfig.json b/packages/core-mobile/e2e/configs/reuseStateConfig.json index be2bac67f1..a6cb5fffa4 100644 --- a/packages/core-mobile/e2e/configs/reuseStateConfig.json +++ b/packages/core-mobile/e2e/configs/reuseStateConfig.json @@ -7,7 +7,8 @@ "testMatch": [ "/tests/**/*.e2e.ts", "/tests/**/*.e2e.smoke.ts", - "/tests/**/*.e2e.parameterized.ts" + "/tests/**/*.e2e.parameterized.ts", + "/tests/**/*.e2e.playwright.ts" ], "reporters": ["detox/runners/jest/reporter"], "verbose": true, diff --git a/packages/core-mobile/e2e/helpers/playwrightActions.ts b/packages/core-mobile/e2e/helpers/playwrightActions.ts new file mode 100644 index 0000000000..535623efa4 --- /dev/null +++ b/packages/core-mobile/e2e/helpers/playwrightActions.ts @@ -0,0 +1,34 @@ +import { Locator, Page } from '@playwright/test' +import { expect } from '@playwright/test' +const fs = require('fs') + +const tap = async (item: Locator, timeout = 5000) => { + await expect(item.first()).toBeEnabled({ timeout }) + await item.first().click() +} + +const open = async (url: string, page: Page) => { + await page.goto(url) + await page.setViewportSize({ width: 2080, height: 1080 }) +} + +const waitFor = async (item: Locator, timeout = 5000) => { + await expect(item).toBeVisible({ timeout }) +} + +async function writeQrCodeToFile(clipboardValue: string) { + fs.writeFile( + './e2e/tests/playwright/qr_codes.txt', + clipboardValue, + (err: NodeJS.ErrnoException | null) => { + if (err) throw err + } + ) +} + +export default { + tap, + open, + waitFor, + writeQrCodeToFile +} diff --git a/packages/core-mobile/e2e/helpers/playwrightSetup.ts b/packages/core-mobile/e2e/helpers/playwrightSetup.ts new file mode 100644 index 0000000000..7ac811503e --- /dev/null +++ b/packages/core-mobile/e2e/helpers/playwrightSetup.ts @@ -0,0 +1,39 @@ +import { test, Page } from '@playwright/test' +const { chromium } = require('playwright-extra') +const stealth = require('puppeteer-extra-plugin-stealth')() +chromium.use(stealth) + +export const warmupWeb = async () => { + const browser = await chromium.launch({ headless: false }) + const page = await browser.newPage() + return { browser, page } +} + +export const playwrightSetup = () => { + let browser: { close: () => Promise } | null = null + let page: Page | null = null + + test.beforeAll(async () => { + const context = await warmupWeb() + browser = context.browser + page = context.page + console.log('Starting Playwright test...') + }) + + test.afterAll(async () => { + if (browser) { + await browser.close() + browser = null + page = null + } + console.log('Closing Playwright test...') + }) + + return () => { + if (page !== null) { + return { browser, page } + } else { + throw new Error('Page is not initialized or invalid type.') + } + } +} diff --git a/packages/core-mobile/e2e/pages/commonPlaywrightEls.page.ts b/packages/core-mobile/e2e/pages/commonPlaywrightEls.page.ts index 49abbb24d4..7ca10a7add 100644 --- a/packages/core-mobile/e2e/pages/commonPlaywrightEls.page.ts +++ b/packages/core-mobile/e2e/pages/commonPlaywrightEls.page.ts @@ -1,5 +1,6 @@ import { Page } from '@playwright/test' import commonEls from '../locators/commonPlaywrightEls.loc' +import playwrightActions from '../helpers/playwrightActions' class CommonElsPage { page: Page @@ -27,10 +28,12 @@ class CommonElsPage { return this.page.getByText('Connect to a wallet') } - async qrUriValue(locator = 'wcm') { + async qrUriValue(locator = 'wcm', timeout = 5000) { if (locator === 'wcm') { + await playwrightActions.waitFor(this.wcmWalletUri, timeout) return await this.wcmWalletUri.getAttribute('uri') } else { + await playwrightActions.waitFor(this.wuiQrCodeUri, timeout) return await this.wuiQrCodeUri.getAttribute('uri') } } diff --git a/packages/core-mobile/e2e/pages/coreApp.page.ts b/packages/core-mobile/e2e/pages/coreApp.page.ts index 99971cc440..50d895d184 100644 --- a/packages/core-mobile/e2e/pages/coreApp.page.ts +++ b/packages/core-mobile/e2e/pages/coreApp.page.ts @@ -1,13 +1,13 @@ import { Page } from '@playwright/test' -class CoreAppPage { +class CoreApp { page: Page constructor(page: Page) { this.page = page } - get coreAppHomepage() { + get coreUrl() { return 'https://core.app/' } @@ -19,21 +19,13 @@ class CoreAppPage { return this.page.locator('[data-testid="connect-terms-continue-btn"]') } - get connectWalletBtn() { + get connect() { return this.page.locator('[data-testid="connect-wallet-button"]') } - async clickConnectWalletBtn() { - await this.connectWalletBtn.click() - } - - async clickAcceptTermsCheckbox() { - await this.termsCheckBox.click() - } - - async clickContinueBtn() { - await this.continueBtn.click() + get coreMobile() { + return this.page.locator('[data-testid="connect-core-mobile"]') } } -export default CoreAppPage +export default CoreApp diff --git a/packages/core-mobile/e2e/pages/plusMenu.page.ts b/packages/core-mobile/e2e/pages/plusMenu.page.ts index fea759faea..d22b272115 100644 --- a/packages/core-mobile/e2e/pages/plusMenu.page.ts +++ b/packages/core-mobile/e2e/pages/plusMenu.page.ts @@ -53,11 +53,15 @@ class PlusMenuPage { await Actions.tap(this.buyButton) } - async connectWallet(qrUri: string) { + async connectWallet(qrUri = '') { await bottomTabsPage.tapPortfolioTab() await bottomTabsPage.tapPlusIcon() await this.tapWalletConnectButton() - await scanQrCodePage.setQrCode(qrUri.toString()) + if (qrUri) { + await scanQrCodePage.setQrCode(qrUri.toString()) + } else { + await scanQrCodePage.enterQrCode() + } } async tapBridgeButton() { diff --git a/packages/core-mobile/e2e/tests/playwright/core.spec.ts b/packages/core-mobile/e2e/tests/playwright/core.spec.ts deleted file mode 100644 index 3a8c88b884..0000000000 --- a/packages/core-mobile/e2e/tests/playwright/core.spec.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { test, expect } from '@playwright/test' -import actions from '../../helpers/actions' -import CommonPlaywrightPage from '../../pages/commonPlaywrightEls.page' -import CoreAppPage from '../../pages/coreApp.page' - -test('check wallet connect button', async ({ page }) => { - const commonEls = new CommonPlaywrightPage(page) - const coreAppPage = new CoreAppPage(page) - - await actions.openPage(coreAppPage.page, coreAppPage.coreAppHomepage) - await page.setViewportSize({ width: 2080, height: 1080 }) - await expect(coreAppPage.connectWalletBtn).toBeEnabled({ timeout: 10000 }) - await coreAppPage.clickConnectWalletBtn() - await expect(commonEls.walletConnectBtn).toBeVisible() - await commonEls.clickWalletConnectBtn() - await expect(coreAppPage.termsCheckBox).toBeVisible() - await coreAppPage.clickAcceptTermsCheckbox() - await expect(coreAppPage.continueBtn).toBeVisible() - await coreAppPage.clickContinueBtn() - await expect(commonEls.walletConnectBtn).toBeVisible() - await commonEls.clickWalletConnectBtn() - await expect(commonEls.wuiQrCodeUri).toBeVisible() - const qrUri = await commonEls.qrUriValue('w3m') - - if (qrUri) { - await actions.writeQrCodeToFile(qrUri) - } - - console.log('URI: ', qrUri) -}) diff --git a/packages/core-mobile/e2e/tests/playwright/core/core.e2e.playwright.ts b/packages/core-mobile/e2e/tests/playwright/core/core.e2e.playwright.ts new file mode 100644 index 0000000000..b9aae79bd9 --- /dev/null +++ b/packages/core-mobile/e2e/tests/playwright/core/core.e2e.playwright.ts @@ -0,0 +1,11 @@ +import { warmup } from '../../../helpers/warmup' +import connectToSitePage from '../../../pages/connectToSite.page' +import plusMenuPage from '../../../pages/plusMenu.page' + +describe('PlayWright Integration', () => { + it('should connect Core App', async () => { + await warmup() + await plusMenuPage.connectWallet() + await connectToSitePage.selectAccountAndconnect() + }) +}) diff --git a/packages/core-mobile/e2e/tests/playwright/core/core.spec.ts b/packages/core-mobile/e2e/tests/playwright/core/core.spec.ts new file mode 100644 index 0000000000..7839071351 --- /dev/null +++ b/packages/core-mobile/e2e/tests/playwright/core/core.spec.ts @@ -0,0 +1,25 @@ +import { test } from '@playwright/test' +import CoreApp from '../../../pages/coreApp.page' +import CommonPlaywrightPage from '../../../pages/commonPlaywrightEls.page' +import playwrightActions from '../../../helpers/playwrightActions' +import { playwrightSetup } from '../../../helpers/playwrightSetup' + +const getContext = playwrightSetup() + +test('Connect Core', async () => { + const { page } = getContext() + const common = new CommonPlaywrightPage(page) + const core = new CoreApp(page) + + await playwrightActions.open(core.coreUrl, core.page) + await playwrightActions.tap(core.connect, 10000) + await playwrightActions.tap(core.coreMobile) + await playwrightActions.tap(core.termsCheckBox) + await playwrightActions.tap(core.continueBtn) + await playwrightActions.tap(common.walletConnectBtn) + const uri = await common.qrUriValue('w3m') + console.log('URI: ', uri) + if (uri) { + await playwrightActions.writeQrCodeToFile(uri) + } +}) diff --git a/packages/core-mobile/e2e/tests/playwright/core/run-tests.js b/packages/core-mobile/e2e/tests/playwright/core/run-tests.js new file mode 100644 index 0000000000..ba20db1978 --- /dev/null +++ b/packages/core-mobile/e2e/tests/playwright/core/run-tests.js @@ -0,0 +1,31 @@ +const { execSync } = require('child_process') + +const runTests = () => { + const testFile = 'e2e/tests/playwright/core/core.spec.ts' + const testFile2 = 'e2e/tests/playwright/core/core.e2e.playwright.ts' + + try { + // Test Playwright + console.log('Running Playwright tests...') + execSync(`npx playwright test ${testFile} --project=chromium`, { + stdio: 'inherit' + }) + + // Test Detox + console.log('Running Detox tests...') + execSync(`detox test -c ios.internal.debug ${testFile2}`, { + stdio: 'inherit' + }) + + console.log('All tests completed successfully.') + } catch (error) { + if (error instanceof Error) { + console.error('Test execution failed:', error.message) + } else { + console.error('Unexpected error occurred:', error) + } + process.exit(1) + } +} + +runTests() diff --git a/packages/core-mobile/package.json b/packages/core-mobile/package.json index ea2d7f4df5..4dccb66fba 100644 --- a/packages/core-mobile/package.json +++ b/packages/core-mobile/package.json @@ -239,7 +239,9 @@ "msw": "1.3.2", "node-fetch": "3.3.2", "patch-package": "8.0.0", + "playwright-extra": "4.3.6", "postinstall-postinstall": "2.1.0", + "puppeteer-extra-plugin-stealth": "2.11.2", "react-dom": "18.3.1", "react-native-svg-transformer": "1.5.0", "react-test-renderer": "18.3.1", diff --git a/yarn.lock b/yarn.lock index 7fae12b622..b61c2b1fb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -324,7 +324,9 @@ __metadata: node-fetch: 3.3.2 patch-package: 8.0.0 path-browserify: 1.0.1 + playwright-extra: 4.3.6 postinstall-postinstall: 2.1.0 + puppeteer-extra-plugin-stealth: 2.11.2 qrcode-reader: 1.0.4 react: 18.3.1 react-content-loader: 6.2.0 @@ -11217,6 +11219,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.1.0": + version: 4.1.12 + resolution: "@types/debug@npm:4.1.12" + dependencies: + "@types/ms": "*" + checksum: 47876a852de8240bfdaf7481357af2b88cb660d30c72e73789abf00c499d6bc7cd5e52f41c915d1b9cd8ec9fef5b05688d7b7aef17f7f272c2d04679508d1053 + languageName: node + linkType: hard + "@types/debug@npm:^4.1.7": version: 4.1.10 resolution: "@types/debug@npm:4.1.10" @@ -12753,6 +12764,13 @@ __metadata: languageName: node linkType: hard +"arr-union@npm:^3.1.0": + version: 3.1.0 + resolution: "arr-union@npm:3.1.0" + checksum: b5b0408c6eb7591143c394f3be082fee690ddd21f0fdde0a0a01106799e847f67fcae1b7e56b0a0c173290e29c6aca9562e82b300708a268bc8f88f3d6613cb9 + languageName: node + linkType: hard + "array-back@npm:^3.0.1, array-back@npm:^3.1.0": version: 3.1.0 resolution: "array-back@npm:3.1.0" @@ -14781,6 +14799,19 @@ __metadata: languageName: node linkType: hard +"clone-deep@npm:^0.2.4": + version: 0.2.4 + resolution: "clone-deep@npm:0.2.4" + dependencies: + for-own: ^0.1.3 + is-plain-object: ^2.0.1 + kind-of: ^3.0.2 + lazy-cache: ^1.0.3 + shallow-clone: ^0.1.2 + checksum: bcf9752052130c270c47d3e1c357497354b91d682f507e0079bec5950975b3293b619d9e100d70874606d716f2376e84956b045759a09af703e1038ecad6c438 + languageName: node + linkType: hard + "clone-deep@npm:^2.0.1": version: 2.0.2 resolution: "clone-deep@npm:2.0.2" @@ -18368,6 +18399,15 @@ __metadata: languageName: node linkType: hard +"for-own@npm:^0.1.3": + version: 0.1.5 + resolution: "for-own@npm:0.1.5" + dependencies: + for-in: ^1.0.1 + checksum: 07eb0a2e98eb55ce13b56dd11ef4fb5e619ba7380aaec388b9eec1946153d74fa734ce409e8434020557e9489a50c34bc004d55754f5863bf7d77b441d8dee8c + languageName: node + linkType: hard + "for-own@npm:^1.0.0": version: 1.0.0 resolution: "for-own@npm:1.0.0" @@ -18529,6 +18569,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^10.0.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + "fs-extra@npm:^11.1.0, fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -20006,7 +20057,7 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:~1.1.1, is-buffer@npm:~1.1.6": +"is-buffer@npm:^1.0.2, is-buffer@npm:^1.1.5, is-buffer@npm:~1.1.1, is-buffer@npm:~1.1.6": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 @@ -20314,7 +20365,7 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^2.0.4": +"is-plain-object@npm:^2.0.1, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" dependencies: @@ -21634,6 +21685,24 @@ __metadata: languageName: node linkType: hard +"kind-of@npm:^2.0.1": + version: 2.0.1 + resolution: "kind-of@npm:2.0.1" + dependencies: + is-buffer: ^1.0.2 + checksum: 043df2943e113bca612d26224947395e9673bb3808d94aed30e47fbf0bafd618e2a29ff0ca2d5498f64332c320fff07f0aa9d6edfc20906a93c1b8792f11759c + languageName: node + linkType: hard + +"kind-of@npm:^3.0.2": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" + dependencies: + is-buffer: ^1.1.5 + checksum: e898df8ca2f31038f27d24f0b8080da7be274f986bc6ed176f37c77c454d76627619e1681f6f9d2e8d2fd7557a18ecc419a6bb54e422abcbb8da8f1a75e4b386 + languageName: node + linkType: hard + "kind-of@npm:^5.0.0": version: 5.1.0 resolution: "kind-of@npm:5.1.0" @@ -21681,6 +21750,20 @@ __metadata: languageName: node linkType: hard +"lazy-cache@npm:^0.2.3": + version: 0.2.7 + resolution: "lazy-cache@npm:0.2.7" + checksum: b4538aff20db586c354f31de3ed59ea2c8d5dc4f01141bf49f07601e7ca0d7ed43a3f49362ade49b1e18ab1f3d121df0f2c9ea9b599b44dd54fb0c0db253c8b9 + languageName: node + linkType: hard + +"lazy-cache@npm:^1.0.3": + version: 1.0.4 + resolution: "lazy-cache@npm:1.0.4" + checksum: e6650c22e5de1cc3f4a0c25d2b35fe9cd400473c1b3562be9fceadf8f368d708b54d24f5aa51b321b090da65b36426823a8f706b8dbdd68270db0daba812c5d3 + languageName: node + linkType: hard + "lazy-universal-dotenv@npm:^4.0.0": version: 4.0.0 resolution: "lazy-universal-dotenv@npm:4.0.0" @@ -22537,6 +22620,17 @@ __metadata: languageName: node linkType: hard +"merge-deep@npm:^3.0.1": + version: 3.0.3 + resolution: "merge-deep@npm:3.0.3" + dependencies: + arr-union: ^3.1.0 + clone-deep: ^0.2.4 + kind-of: ^3.0.2 + checksum: d2eb367b8300327c66a3e1e01eb06251f51b440bf5bfa5f0f8065ae95bf3af620d21fcd0ab2eb50e74f5119aac40ffd26c85e3bf82f79082e8757675f5885d3d + languageName: node + linkType: hard + "merge-descriptors@npm:1.0.1": version: 1.0.1 resolution: "merge-descriptors@npm:1.0.1" @@ -24976,6 +25070,23 @@ __metadata: languageName: node linkType: hard +"playwright-extra@npm:4.3.6": + version: 4.3.6 + resolution: "playwright-extra@npm:4.3.6" + dependencies: + debug: ^4.3.4 + peerDependencies: + playwright: "*" + playwright-core: "*" + peerDependenciesMeta: + playwright: + optional: true + playwright-core: + optional: true + checksum: 2ecaef65036895a9c6aa8d97be7d01677690a103bf39b514b8a2c153cf29932b4b205040a6e132f145868323891dcfbb32c7b2d97f9ac64a9f25e2e83a2f706e + languageName: node + linkType: hard + "playwright@npm:1.48.0": version: 1.48.0 resolution: "playwright@npm:1.48.0" @@ -25398,6 +25509,84 @@ __metadata: languageName: node linkType: hard +"puppeteer-extra-plugin-stealth@npm:2.11.2": + version: 2.11.2 + resolution: "puppeteer-extra-plugin-stealth@npm:2.11.2" + dependencies: + debug: ^4.1.1 + puppeteer-extra-plugin: ^3.2.3 + puppeteer-extra-plugin-user-preferences: ^2.4.1 + peerDependencies: + playwright-extra: "*" + puppeteer-extra: "*" + peerDependenciesMeta: + playwright-extra: + optional: true + puppeteer-extra: + optional: true + checksum: 13ab2b906c1cd1a75bb346074e6ed75dd33da426e9b7d2e111dee6d497ae9ff42f44c2e5b0d48a04b545e862f9d27d8ecf61fa1863201afc8a9410121ed65a4b + languageName: node + linkType: hard + +"puppeteer-extra-plugin-user-data-dir@npm:^2.4.1": + version: 2.4.1 + resolution: "puppeteer-extra-plugin-user-data-dir@npm:2.4.1" + dependencies: + debug: ^4.1.1 + fs-extra: ^10.0.0 + puppeteer-extra-plugin: ^3.2.3 + rimraf: ^3.0.2 + peerDependencies: + playwright-extra: "*" + puppeteer-extra: "*" + peerDependenciesMeta: + playwright-extra: + optional: true + puppeteer-extra: + optional: true + checksum: f360b3bb22eeb899b23b6e2a38412ddfeda4b2333e08f77452732e16f094f33725272ee81150428e2c20b39d4d88edc87584d8344bd761c9ef8ae5d681968399 + languageName: node + linkType: hard + +"puppeteer-extra-plugin-user-preferences@npm:^2.4.1": + version: 2.4.1 + resolution: "puppeteer-extra-plugin-user-preferences@npm:2.4.1" + dependencies: + debug: ^4.1.1 + deepmerge: ^4.2.2 + puppeteer-extra-plugin: ^3.2.3 + puppeteer-extra-plugin-user-data-dir: ^2.4.1 + peerDependencies: + playwright-extra: "*" + puppeteer-extra: "*" + peerDependenciesMeta: + playwright-extra: + optional: true + puppeteer-extra: + optional: true + checksum: e0e50145d1d32626a8bb75afeb0dc238d63c05a8d264e12bb249b06aa34f7c116f6ec531335e964ea715837759dacd505d2fa8f6c9d478e983303eb2cb701ec9 + languageName: node + linkType: hard + +"puppeteer-extra-plugin@npm:^3.2.3": + version: 3.2.3 + resolution: "puppeteer-extra-plugin@npm:3.2.3" + dependencies: + "@types/debug": ^4.1.0 + debug: ^4.1.1 + merge-deep: ^3.0.1 + peerDependencies: + playwright-extra: "*" + puppeteer-extra: "*" + peerDependenciesMeta: + playwright-extra: + optional: true + puppeteer-extra: + optional: true + checksum: 18c2780a151e023ed145cd7768a6cf2dba1c124bce920de5f7815dcd872550288554161b1474037e8819969b1adfad41bdc09a9aadfd155338abc6d22699b7ed + languageName: node + linkType: hard + "pure-rand@npm:^6.0.0": version: 6.0.4 resolution: "pure-rand@npm:6.0.4" @@ -26406,7 +26595,7 @@ react-native-webview@ava-labs/react-native-webview: peerDependencies: react: "*" react-native: "*" - checksum: a187edd718e1ea3a6b1e5da167744e6ee324bc3c3e492bcb0a9d028ab68a82907f053f37c23aa4229d6a9091541cee3c73549c3c850056e4cf5eb5b3cb2c9ffc + checksum: 871333b155b3899238428ee071c7cce31f668ba2e4ef70f08c14432c76fad42f0a2d460ca278d6d5149e632e83f544c77555937a0d6cf7e9d726f7d6b06c1d0b languageName: node linkType: hard @@ -27768,6 +27957,18 @@ react-native-webview@ava-labs/react-native-webview: languageName: node linkType: hard +"shallow-clone@npm:^0.1.2": + version: 0.1.2 + resolution: "shallow-clone@npm:0.1.2" + dependencies: + is-extendable: ^0.1.1 + kind-of: ^2.0.1 + lazy-cache: ^0.2.3 + mixin-object: ^2.0.1 + checksum: cc4c85c6e42186fec33a81a85622c48dbcfdf280f3a7bd0800b4de57df8e365a8760aa2e31dd79df365b317dddb2fd0bbd92be0aab14dbd2de6a65992eab2177 + languageName: node + linkType: hard + "shallow-clone@npm:^1.0.0": version: 1.0.0 resolution: "shallow-clone@npm:1.0.0"