diff --git a/.github/files/e2e-tests/e2e-matrix.js b/.github/files/e2e-tests/e2e-matrix.js index fd42af9768c06..0ef12a2e92150 100644 --- a/.github/files/e2e-tests/e2e-matrix.js +++ b/.github/files/e2e-tests/e2e-matrix.js @@ -5,7 +5,7 @@ const projects = [ { project: 'Jetpack connection', path: 'projects/plugins/jetpack/tests/e2e', - testArgs: [ 'specs/connection', '--retries=1' ], + testArgs: [ 'specs/connection' ], targets: [ 'plugins/jetpack' ], suite: '', buildGroup: 'jetpack-core', @@ -13,7 +13,7 @@ const projects = [ { project: 'Jetpack pre-connection', path: 'projects/plugins/jetpack/tests/e2e', - testArgs: [ 'specs/pre-connection', '--retries=1' ], + testArgs: [ 'specs/pre-connection' ], targets: [ 'plugins/jetpack', 'monorepo' ], suite: '', buildGroup: 'jetpack-core', @@ -21,7 +21,7 @@ const projects = [ { project: 'Jetpack post-connection', path: 'projects/plugins/jetpack/tests/e2e', - testArgs: [ 'specs/post-connection', '--retries=1' ], + testArgs: [ 'specs/post-connection' ], targets: [ 'plugins/jetpack' ], suite: '', buildGroup: 'jetpack-core', @@ -29,7 +29,7 @@ const projects = [ { project: 'Jetpack post editor', path: 'projects/plugins/jetpack/tests/e2e', - testArgs: [ 'specs/editor', '--retries=1' ], + testArgs: [ 'specs/editor' ], targets: [ 'plugins/jetpack', 'packages/publicize' ], suite: '', buildGroup: 'jetpack-core', @@ -37,7 +37,7 @@ const projects = [ { project: 'Jetpack sync', path: 'projects/plugins/jetpack/tests/e2e', - testArgs: [ 'specs/sync', '--retries=1' ], + testArgs: [ 'specs/sync' ], targets: [ 'packages/sync' ], suite: '', buildGroup: 'jetpack-sync', @@ -45,7 +45,7 @@ const projects = [ { project: 'Jetpack Boost - Base', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/base', '--retries=1' ], + testArgs: [ 'specs/base' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', @@ -53,7 +53,7 @@ const projects = [ { project: 'Jetpack Boost - Modules', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/modules', '--retries=1' ], + testArgs: [ 'specs/modules' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', @@ -61,7 +61,7 @@ const projects = [ { project: 'Jetpack Boost - Critical CSS', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/critical-css', '--retries=1' ], + testArgs: [ 'specs/critical-css' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', @@ -69,7 +69,7 @@ const projects = [ { project: 'Jetpack Boost - Page Cache', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/page-cache', '--retries=1' ], + testArgs: [ 'specs/page-cache' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', @@ -77,7 +77,7 @@ const projects = [ { project: 'Jetpack Boost - Concatenate JS and CSS', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/concatenate', '--retries=1' ], + testArgs: [ 'specs/concatenate' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', @@ -85,7 +85,7 @@ const projects = [ { project: 'Jetpack Boost - Image CDN', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/image-cdn', '--retries=1' ], + testArgs: [ 'specs/image-cdn' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', @@ -93,7 +93,7 @@ const projects = [ { project: 'Jetpack Boost - Image Guide', path: 'projects/plugins/boost/tests/e2e', - testArgs: [ 'specs/image-guide', '--retries=1' ], + testArgs: [ 'specs/image-guide' ], targets: [ 'plugins/boost' ], suite: '', buildGroup: 'jetpack-boost', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 655ad36162146..86503a88cced3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4782,6 +4782,9 @@ importers: '@types/lodash-es': specifier: 4.17.12 version: 4.17.12 + '@wordpress/e2e-test-utils-playwright': + specifier: 1.14.0 + version: 1.14.0(@playwright/test@1.48.2) allure-playwright: specifier: 2.9.2 version: 2.9.2 @@ -6144,6 +6147,21 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@formatjs/ecma402-abstract@2.3.2': + resolution: {integrity: sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==} + + '@formatjs/fast-memoize@2.2.6': + resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} + + '@formatjs/icu-messageformat-parser@2.9.8': + resolution: {integrity: sha512-hZlLNI3+Lev8IAXuwehLoN7QTKqbx3XXwFW1jh0AdIA9XJdzn9Uzr+2LLBspPm/PX0+NLIfykj/8IKxQqHUcUQ==} + + '@formatjs/icu-skeleton-parser@1.8.12': + resolution: {integrity: sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==} + + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -6414,6 +6432,9 @@ packages: '@octokit/types@13.6.2': resolution: {integrity: sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==} + '@paulirish/trace_engine@0.0.39': + resolution: {integrity: sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -6448,6 +6469,11 @@ packages: engines: {node: '>=18'} hasBin: true + '@puppeteer/browsers@2.6.1': + resolution: {integrity: sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==} + engines: {node: '>=18'} + hasBin: true + '@radix-ui/primitive@1.1.0': resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} @@ -6774,18 +6800,42 @@ packages: resolution: {integrity: sha512-GFBaDA4yhlEf3wTXOVXnJVG/diuKxeqZuXcuhsAwJb+YcFR0NhgsRn3wIGuYOZZF8GBXzx9PFnb9yIuFgx5Nbw==} engines: {node: '>=14.18'} + '@sentry-internal/tracing@7.120.2': + resolution: {integrity: sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==} + engines: {node: '>=8'} + '@sentry/browser@8.33.0': resolution: {integrity: sha512-qu/g20ZskywEU8BWc4Fts1kXFFBtw1vS+XvPq7Ta9zCeRG5dlXhhYDVQ4/v4nAL/cs0o6aLCq73m109CFF0Kig==} engines: {node: '>=14.18'} + '@sentry/core@7.120.2': + resolution: {integrity: sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==} + engines: {node: '>=8'} + '@sentry/core@8.33.0': resolution: {integrity: sha512-618PQGHQLBVCpAq1s+e/rpIUaLUnj19IPUgn97rUGXLLna8ETIAoyQoG70wz4q9niw4Z4GlS5kZNrael2O3+2w==} engines: {node: '>=14.18'} + '@sentry/integrations@7.120.2': + resolution: {integrity: sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==} + engines: {node: '>=8'} + + '@sentry/node@7.120.2': + resolution: {integrity: sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==} + engines: {node: '>=8'} + + '@sentry/types@7.120.2': + resolution: {integrity: sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==} + engines: {node: '>=8'} + '@sentry/types@8.33.0': resolution: {integrity: sha512-V/A+72ZdnfGtXeXIpz1kUo3LRdq3WKEYYFUR2RKpCdPh9yeOrHq6u/rmzTWx49+om0yhZN+JhVoxDzt75UoFRg==} engines: {node: '>=14.18'} + '@sentry/utils@7.120.2': + resolution: {integrity: sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==} + engines: {node: '>=8'} + '@sentry/utils@8.33.0': resolution: {integrity: sha512-TdwtGdevJij2wq2x/hDUr+x5TXt47ZhWxZ8zluai/lnIDTUB3Xs/L9yHtj1J+H9hr8obkMASE9IanUrWXzrP6Q==} engines: {node: '>=14.18'} @@ -7971,6 +8021,12 @@ packages: resolution: {integrity: sha512-ucaz3Kh9L3EGpLiXXWqflC0T/1zMOe4DR31ynl+B68YSEWpM0VqTnRUFJRUFEc5wiOa70T8yFa3RLSwWpqJTIw==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/e2e-test-utils-playwright@1.14.0': + resolution: {integrity: sha512-G9r3ZysgzAmUbR4bjGAEEP6P2RCIAG8uMU7yyzxOAHegINSbF3shEZKvVNBeKxNwHKAVa9koh/niGN3U4Kr6Rw==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + peerDependencies: + '@playwright/test': '>=1' + '@wordpress/edit-post@8.14.0': resolution: {integrity: sha512-hS22+eaT8otVsIeeKH8sM+vJZkgCteG4IJ1KO9wuz41rUmq4Fy4AJUpUEoNQ4R38s+bKiYKK+I8L5jDmLTjC/Q==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} @@ -8808,10 +8864,20 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chrome-launcher@1.1.2: + resolution: {integrity: sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==} + engines: {node: '>=12.13.0'} + hasBin: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + chromium-bidi@0.11.0: + resolution: {integrity: sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==} + peerDependencies: + devtools-protocol: '*' + chromium-bidi@0.6.3: resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} peerDependencies: @@ -8988,6 +9054,10 @@ packages: resolution: {integrity: sha512-Vmx389R/QVM3foxqBzXO8t2tUikYZP64Q6vQxGrsMpREeJc/aWRnPRERXWsYzOHAumx/AOoILWe6nU3ZJL+6Sw==} engines: {node: '>= 10.0.0'} + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + configstore@7.0.0: resolution: {integrity: sha512-yk7/5PN5im4qwz0WFZW3PXnzHgPu9mX29Y8uZ3aefe2lBPC1FYttWZRcaW9fKkT0pBCJyuQ2HfbmPVaODi9jcQ==} engines: {node: '>=18'} @@ -9065,6 +9135,13 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + csp_evaluator@1.1.1: + resolution: {integrity: sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==} + css-declaration-sorter@7.2.0: resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} engines: {node: ^14 || ^16 || >=18} @@ -9400,6 +9477,9 @@ packages: devtools-protocol@0.0.1312386: resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} + devtools-protocol@0.0.1367902: + resolution: {integrity: sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9487,6 +9567,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dot-prop@9.0.0: resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} engines: {node: '>=18'} @@ -10273,6 +10357,10 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -10495,6 +10583,10 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-link-header@1.1.3: + resolution: {integrity: sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==} + engines: {node: '>=6.0.0'} + http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -10555,6 +10647,12 @@ packages: resolution: {integrity: sha512-lcX8PNQygAa22u/0BysEY8VhaFRzlOkvdlKczDPnJvrkJD1EuqzEky5VYYKM2iySIuaVIDv9N190DfSreSLw2A==} engines: {node: '>= 4'} + image-ssim@0.2.0: + resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} @@ -10615,6 +10713,9 @@ packages: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} + intl-messageformat@10.7.11: + resolution: {integrity: sha512-IB2N1tmI24k2EFH3PWjU7ivJsnWyLwOWOva0jnXFa29WzB6fb0JZ5EMQGu+XN5lDtjHYFo0/UooP67zBwUg7rQ==} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -10738,6 +10839,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-observable@1.1.0: resolution: {integrity: sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==} engines: {node: '>=4'} @@ -11090,12 +11195,19 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + jquery@3.6.0: resolution: {integrity: sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==} js-base64@3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-library-detector@6.7.0: + resolution: {integrity: sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==} + engines: {node: '>=12'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -11218,6 +11330,20 @@ packages: libsodium@0.7.15: resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==} + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + lighthouse-logger@2.0.1: + resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==} + + lighthouse-stack-packs@1.12.2: + resolution: {integrity: sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==} + + lighthouse@12.3.0: + resolution: {integrity: sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==} + engines: {node: '>=18.16'} + hasBin: true + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -11278,6 +11404,9 @@ packages: resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + localtunnel@2.0.2: resolution: {integrity: sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==} engines: {node: '>=8.3.0'} @@ -11371,6 +11500,9 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lookup-closest-locale@6.2.0: + resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -11434,6 +11566,9 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + math-expression-evaluator@1.4.0: resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} @@ -11506,6 +11641,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + metaviewport-parser@0.3.0: + resolution: {integrity: sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -11614,6 +11752,11 @@ packages: engines: {node: '>=4'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@1.2.0: resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} engines: {node: '>=4'} @@ -11963,6 +12106,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + parse-diff@0.8.1: resolution: {integrity: sha512-0QG0HqwXCC/zMohOlaxkQmV1igZq1LQ6xsv/ziex6TDbY0GFxr3TDJN+/aHjWH3s2WTysSW3Bhs9Yfh6DOelFA==} @@ -12495,6 +12641,10 @@ packages: resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} engines: {node: '>=18'} + puppeteer-core@23.11.1: + resolution: {integrity: sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==} + engines: {node: '>=18'} + pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} @@ -12906,6 +13056,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + robots-parser@3.0.1: + resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} + engines: {node: '>=10.0.0'} + robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -13165,6 +13319,10 @@ packages: select@1.1.2: resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -13350,6 +13508,10 @@ packages: spdx-license-ids@3.0.20: resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + speedline-core@1.4.3: + resolution: {integrity: sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==} + engines: {node: '>=8.0'} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -13740,6 +13902,9 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + third-party-web@0.26.2: + resolution: {integrity: sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==} + thread-loader@3.0.4: resolution: {integrity: sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==} engines: {node: '>= 10.13.0'} @@ -13772,6 +13937,12 @@ packages: tinyqueue@2.0.3: resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + tldts-core@6.1.71: + resolution: {integrity: sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==} + + tldts-icann@6.1.71: + resolution: {integrity: sha512-hEbB+VrNQM3Nhs+2FFWrCNbYGhFJb9MzfzEjK4qrZUBC2y2v0V99sJofJE99SfI0jac4ZdPBtdU82ges+EQGIw==} + tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -13925,6 +14096,9 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} @@ -13998,6 +14172,10 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -14179,6 +14357,9 @@ packages: resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} engines: {node: '>= 14'} + web-vitals@4.2.4: + resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -14377,6 +14558,10 @@ packages: utf-8-validate: optional: true + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} @@ -15807,6 +15992,32 @@ snapshots: '@floating-ui/utils@0.2.8': {} + '@formatjs/ecma402-abstract@2.3.2': + dependencies: + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/intl-localematcher': 0.5.10 + decimal.js: 10.4.3 + tslib: 2.5.0 + + '@formatjs/fast-memoize@2.2.6': + dependencies: + tslib: 2.5.0 + + '@formatjs/icu-messageformat-parser@2.9.8': + dependencies: + '@formatjs/ecma402-abstract': 2.3.2 + '@formatjs/icu-skeleton-parser': 1.8.12 + tslib: 2.5.0 + + '@formatjs/icu-skeleton-parser@1.8.12': + dependencies: + '@formatjs/ecma402-abstract': 2.3.2 + tslib: 2.5.0 + + '@formatjs/intl-localematcher@0.5.10': + dependencies: + tslib: 2.5.0 + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': @@ -16176,6 +16387,10 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 + '@paulirish/trace_engine@0.0.39': + dependencies: + third-party-web: 0.26.2 + '@pkgjs/parseargs@0.11.0': optional: true @@ -16225,6 +16440,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@puppeteer/browsers@2.6.1': + dependencies: + debug: 4.4.0 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.6.3 + tar-fs: 3.0.6 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + '@radix-ui/primitive@1.1.0': {} '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.18)(react@18.3.1)': @@ -16704,6 +16932,12 @@ snapshots: '@sentry/types': 8.33.0 '@sentry/utils': 8.33.0 + '@sentry-internal/tracing@7.120.2': + dependencies: + '@sentry/core': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 + '@sentry/browser@8.33.0': dependencies: '@sentry-internal/browser-utils': 8.33.0 @@ -16714,13 +16948,39 @@ snapshots: '@sentry/types': 8.33.0 '@sentry/utils': 8.33.0 + '@sentry/core@7.120.2': + dependencies: + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 + '@sentry/core@8.33.0': dependencies: '@sentry/types': 8.33.0 '@sentry/utils': 8.33.0 + '@sentry/integrations@7.120.2': + dependencies: + '@sentry/core': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 + localforage: 1.10.0 + + '@sentry/node@7.120.2': + dependencies: + '@sentry-internal/tracing': 7.120.2 + '@sentry/core': 7.120.2 + '@sentry/integrations': 7.120.2 + '@sentry/types': 7.120.2 + '@sentry/utils': 7.120.2 + + '@sentry/types@7.120.2': {} + '@sentry/types@8.33.0': {} + '@sentry/utils@7.120.2': + dependencies: + '@sentry/types': 7.120.2 + '@sentry/utils@8.33.0': dependencies: '@sentry/types': 8.33.0 @@ -18986,6 +19246,20 @@ snapshots: '@babel/runtime': 7.25.7 '@wordpress/deprecated': 4.13.0 + '@wordpress/e2e-test-utils-playwright@1.14.0(@playwright/test@1.48.2)': + dependencies: + '@playwright/test': 1.48.2 + change-case: 4.1.2 + form-data: 4.0.1 + get-port: 5.1.1 + lighthouse: 12.3.0 + mime: 3.0.0 + web-vitals: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@wordpress/edit-post@8.14.0(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.25.7 @@ -20687,8 +20961,23 @@ snapshots: dependencies: readdirp: 4.0.2 + chrome-launcher@1.1.2: + dependencies: + '@types/node': 20.17.11 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.1 + transitivePeerDependencies: + - supports-color + chrome-trace-event@1.0.4: {} + chromium-bidi@0.11.0(devtools-protocol@0.0.1367902): + dependencies: + devtools-protocol: 0.0.1367902 + mitt: 3.0.1 + zod: 3.23.8 + chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): dependencies: devtools-protocol: 0.0.1312386 @@ -20897,6 +21186,15 @@ snapshots: dependencies: json5: 2.2.3 + configstore@5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + configstore@7.0.0: dependencies: atomically: 2.0.3 @@ -21001,6 +21299,10 @@ snapshots: crypto-js@4.2.0: {} + crypto-random-string@2.0.0: {} + + csp_evaluator@1.1.1: {} + css-declaration-sorter@7.2.0(postcss@8.4.47): dependencies: postcss: 8.4.47 @@ -21336,6 +21638,8 @@ snapshots: devtools-protocol@0.0.1312386: {} + devtools-protocol@0.0.1367902: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -21438,6 +21742,10 @@ snapshots: no-case: 3.0.4 tslib: 2.5.0 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dot-prop@9.0.0: dependencies: type-fest: 4.31.0 @@ -22443,6 +22751,8 @@ snapshots: get-package-type@0.1.0: {} + get-port@5.1.1: {} + get-stream@5.2.0: dependencies: pump: 3.0.2 @@ -22703,6 +23013,8 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-link-header@1.1.3: {} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 @@ -22762,6 +23074,10 @@ snapshots: ignore@7.0.0: {} + image-ssim@0.2.0: {} + + immediate@3.0.6: {} + immutable@4.3.7: {} immutable@5.0.3: {} @@ -22811,6 +23127,13 @@ snapshots: interpret@2.2.0: {} + intl-messageformat@10.7.11: + dependencies: + '@formatjs/ecma402-abstract': 2.3.2 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/icu-messageformat-parser': 2.9.8 + tslib: 2.5.0 + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -22914,6 +23237,8 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + is-observable@1.1.0: dependencies: symbol-observable: 1.2.0 @@ -23563,10 +23888,14 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + jpeg-js@0.4.4: {} + jquery@3.6.0: {} js-base64@3.7.7: {} + js-library-detector@6.7.0: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -23691,6 +24020,54 @@ snapshots: libsodium@0.7.15: {} + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + lighthouse-logger@2.0.1: + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + + lighthouse-stack-packs@1.12.2: {} + + lighthouse@12.3.0: + dependencies: + '@paulirish/trace_engine': 0.0.39 + '@sentry/node': 7.120.2 + axe-core: 4.10.2 + chrome-launcher: 1.1.2 + configstore: 5.0.1 + csp_evaluator: 1.1.1 + devtools-protocol: 0.0.1312386 + enquirer: 2.4.1 + http-link-header: 1.1.3 + intl-messageformat: 10.7.11 + jpeg-js: 0.4.4 + js-library-detector: 6.7.0 + lighthouse-logger: 2.0.1 + lighthouse-stack-packs: 1.12.2 + lodash-es: 4.17.21 + lookup-closest-locale: 6.2.0 + metaviewport-parser: 0.3.0 + open: 8.4.2 + parse-cache-control: 1.0.1 + puppeteer-core: 23.11.1 + robots-parser: 3.0.1 + semver: 5.7.2 + speedline-core: 1.4.3 + third-party-web: 0.26.2 + tldts-icann: 6.1.71 + ws: 7.5.10 + yargs: 17.6.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + lilconfig@2.1.0: {} lilconfig@3.1.3: {} @@ -23770,6 +24147,10 @@ snapshots: loader-utils@3.3.1: {} + localforage@1.10.0: + dependencies: + lie: 3.1.1 + localtunnel@2.0.2: dependencies: axios: 1.7.4(debug@4.4.0) @@ -23865,6 +24246,8 @@ snapshots: longest-streak@3.1.0: {} + lookup-closest-locale@6.2.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -23948,6 +24331,8 @@ snapshots: markdown-table@3.0.4: {} + marky@1.2.5: {} + math-expression-evaluator@1.4.0: {} md5-es@1.8.2: {} @@ -24078,6 +24463,8 @@ snapshots: merge2@1.4.1: {} + metaviewport-parser@0.3.0: {} + methods@1.1.2: {} microbuffer@1.0.0: {} @@ -24286,6 +24673,8 @@ snapshots: mime@1.6.0: {} + mime@3.0.0: {} + mimic-fn@1.2.0: {} mimic-fn@2.1.0: {} @@ -24665,6 +25054,8 @@ snapshots: dependencies: callsites: 3.1.0 + parse-cache-control@1.0.1: {} + parse-diff@0.8.1: {} parse-imports@2.2.1: @@ -25174,6 +25565,19 @@ snapshots: - supports-color - utf-8-validate + puppeteer-core@23.11.1: + dependencies: + '@puppeteer/browsers': 2.6.1 + chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) + debug: 4.4.0 + devtools-protocol: 0.0.1367902 + typed-query-selector: 2.12.0 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + pure-rand@6.1.0: {} q-flat@1.0.7: {} @@ -25644,6 +26048,8 @@ snapshots: dependencies: glob: 7.2.3 + robots-parser@3.0.1: {} + robust-predicates@3.0.2: {} rollup-plugin-dts@6.1.1(rollup@3.29.5)(typescript@5.7.2): @@ -25884,6 +26290,8 @@ snapshots: select@1.1.2: {} + semver@5.7.2: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -26100,6 +26508,12 @@ snapshots: spdx-license-ids@3.0.20: {} + speedline-core@1.4.3: + dependencies: + '@types/node': 20.17.11 + image-ssim: 0.2.0 + jpeg-js: 0.4.4 + sprintf-js@1.0.3: {} sprintf-js@1.1.2: {} @@ -26510,6 +26924,8 @@ snapshots: text-hex@1.0.0: {} + third-party-web@0.26.2: {} + thread-loader@3.0.4(webpack@5.94.0): dependencies: json-parse-better-errors: 1.0.2 @@ -26538,6 +26954,12 @@ snapshots: tinyqueue@2.0.3: {} + tldts-core@6.1.71: {} + + tldts-icann@6.1.71: + dependencies: + tldts-core: 6.1.71 + tmp@0.2.3: {} tmpl@1.0.5: {} @@ -26682,6 +27104,8 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.8 + typed-query-selector@2.12.0: {} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 @@ -26756,6 +27180,10 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -26958,6 +27386,8 @@ snapshots: web-streams-polyfill@4.0.0-beta.3: {} + web-vitals@4.2.4: {} + webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} @@ -27204,6 +27634,8 @@ snapshots: ws@8.18.0: {} + xdg-basedir@4.0.0: {} + xdg-basedir@5.1.0: {} xml-name-validator@4.0.0: {} diff --git a/projects/plugins/social/changelog/explore-wp-e2e-setup b/projects/plugins/social/changelog/explore-wp-e2e-setup new file mode 100644 index 0000000000000..31a7d1fe4b51b --- /dev/null +++ b/projects/plugins/social/changelog/explore-wp-e2e-setup @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Updated E2E tests to use @wordpress/e2e-test-utils-playwright diff --git a/projects/plugins/social/tests/e2e/specs/admin-page.test.js b/projects/plugins/social/tests/e2e/specs/admin-page.test.js index 7548e1ad92284..29d171225ff37 100644 --- a/projects/plugins/social/tests/e2e/specs/admin-page.test.js +++ b/projects/plugins/social/tests/e2e/specs/admin-page.test.js @@ -1,7 +1,6 @@ import { prerequisitesBuilder } from 'jetpack-e2e-commons/env/prerequisites.js'; import { expect, test } from 'jetpack-e2e-commons/fixtures/base-test.js'; import logger from 'jetpack-e2e-commons/logger.js'; -import { JetpackSocialPage } from '../pages/index.js'; test.beforeEach( async ( { page } ) => { await prerequisitesBuilder( page ) @@ -11,9 +10,10 @@ test.beforeEach( async ( { page } ) => { .build(); } ); -test( 'Jetpack Social admin page', async ( { page } ) => { +test( 'Jetpack Social admin page', async ( { page, admin } ) => { logger.action( 'Visit the Jetpack Social admin page' ); - await JetpackSocialPage.visit( page ); + + await admin.visitAdminPage( 'admin.php', 'page=jetpack-social' ); logger.action( 'Checking for heading "Jetpack Social"' ); await expect( page.getByRole( 'heading', { name: 'Jetpack Social' } ) ).toBeVisible(); diff --git a/projects/plugins/social/tests/e2e/specs/social-sidebar.test.js b/projects/plugins/social/tests/e2e/specs/social-sidebar.test.js index aacc80ee42c19..1d4f3b3757cd0 100644 --- a/projects/plugins/social/tests/e2e/specs/social-sidebar.test.js +++ b/projects/plugins/social/tests/e2e/specs/social-sidebar.test.js @@ -14,30 +14,20 @@ test.beforeEach( async ( { page } ) => { .build(); } ); -test( 'Jetpack Social sidebar', async ( { page } ) => { +test( 'Jetpack Social sidebar', async ( { page, editor, admin } ) => { await test.step( 'Connect wordpress.com account', async () => { await connect( page ); } ); - /** - * @type {BlockEditorPage} - */ - let blockEditor; + const blockEditor = new BlockEditorPage( page ); await test.step( 'Goto post edit page', async () => { - logger.action( 'Hover over "Posts" in admin menu' ); - await page.getByRole( 'link', { name: 'Posts', exact: true } ).hover(); + logger.action( 'Create new post' ); + await admin.createNewPost(); - logger.action( 'Click on "Add New Post" in admin menu' ); - await page.getByRole( 'link', { name: 'Add New Post' } ).click(); - - blockEditor = await BlockEditorPage.visit( page ); - await blockEditor.waitForEditor(); - - logger.action( 'Close "Welcome to the block editor" dialog' ); - await blockEditor.closeWelcomeGuide(); - - await blockEditor.setTitle( 'Jetpack Social test post' ); + await editor.canvas + .locator( 'role=textbox[name="Add title"i]' ) + .fill( 'Jetpack Social test post' ); } ); await test.step( 'Check Social sidebar', async () => { diff --git a/tools/e2e-commons/config/global-setup.mjs b/tools/e2e-commons/config/global-setup.mjs new file mode 100644 index 0000000000000..dd6482d0844a3 --- /dev/null +++ b/tools/e2e-commons/config/global-setup.mjs @@ -0,0 +1,29 @@ +import { request } from '@playwright/test'; +import { RequestUtils } from '@wordpress/e2e-test-utils-playwright'; + +/** + * Global setup for Playwright tests. + * + * Copied from https://github.com/WordPress/gutenberg/blob/b4304f8bf6bd9b890b4108adcc326cd586a3ab4e/packages/scripts/config/playwright/global-setup.js + * + * @param {import('@playwright/test').PlaywrightTestConfig} config - Playwright test configuration. + */ +async function globalSetup( config ) { + const { storageState, baseURL } = config.projects[ 0 ].use; + const storageStatePath = typeof storageState === 'string' ? storageState : undefined; + + const requestContext = await request.newContext( { + baseURL, + } ); + + const requestUtils = new RequestUtils( requestContext, { + storageStatePath, + } ); + + // Authenticate and save the storageState to disk. + await requestUtils.setupRest(); + + await requestContext.dispose(); +} + +export default globalSetup; diff --git a/tools/e2e-commons/config/playwright.config.default.mjs b/tools/e2e-commons/config/playwright.config.default.mjs index b22ec925ec559..385f5bb072efd 100644 --- a/tools/e2e-commons/config/playwright.config.default.mjs +++ b/tools/e2e-commons/config/playwright.config.default.mjs @@ -1,6 +1,8 @@ import fs from 'fs'; import { fileURLToPath } from 'url'; +import { defineConfig, devices } from '@playwright/test'; import config from 'config'; +import { resolveSiteUrl, setWpEnvVars } from '../helpers/utils-helper'; const reporter = [ [ 'list' ], @@ -14,7 +16,14 @@ const reporter = [ ]; if ( process.env.CI ) { - reporter.push( [ 'github' ] ); + reporter.push( + [ 'github' ], + [ + `${ fileURLToPath( + new URL( '../' + config.get( 'dirs.reporters' ), import.meta.url ) + ) }/flaky-tests-reporter.ts`, + ] + ); } // Fail early if the required test site config is not defined @@ -32,16 +41,19 @@ fs.mkdirSync( config.get( 'dirs.temp' ), { recursive: true } ); if ( ! fs.existsSync( config.get( 'temp.storage' ) ) ) { fs.writeFileSync( config.get( 'temp.storage' ), '{}' ); } +// Ensure the environment variables for `@wordpress/e2e-test-utils-playwright` are set +setWpEnvVars(); -const playwrightConfig = { +const playwrightConfig = defineConfig( { timeout: 300000, - retries: 0, + retries: process.env.CI ? 2 : 0, workers: 1, outputDir: config.get( 'dirs.results' ), reporter, + forbidOnly: !! process.env.CI, + globalSetup: fileURLToPath( new URL( './global-setup.mjs', import.meta.url ).href ), use: { - browserName: 'chromium', - channel: '', + baseURL: resolveSiteUrl(), headless: true, viewport: { width: 1280, height: 1600 }, ignoreHTTPSErrors: true, @@ -55,8 +67,20 @@ const playwrightConfig = { storageState: config.get( 'temp.storage' ), userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36 wp-e2e-tests', + locale: 'en-US', + contextOptions: { + reducedMotion: 'reduce', + // TODO - Enable strictSelectors once all tests are updated. + // strictSelectors: true, + }, }, reportSlowTests: null, -}; + projects: [ + { + name: 'chromium', + use: { ...devices[ 'Desktop Chrome' ] }, + }, + ], +} ); export default playwrightConfig; diff --git a/tools/e2e-commons/fixtures/base-test.js b/tools/e2e-commons/fixtures/base-test.js index 188b7b6e999c6..ab1ce3f863255 100644 --- a/tools/e2e-commons/fixtures/base-test.js +++ b/tools/e2e-commons/fixtures/base-test.js @@ -1,9 +1,9 @@ -import { test as baseTest } from '@playwright/test'; +import { test as baseTest } from '@wordpress/e2e-test-utils-playwright'; import { allure } from 'allure-playwright'; import config from 'config'; import { execWpCommand } from '../helpers/utils-helper.js'; import logger from '../logger.js'; -export { expect } from '@playwright/test'; +export { expect } from '@wordpress/e2e-test-utils-playwright'; const test = baseTest.extend( { page: async ( { page }, use ) => { diff --git a/tools/e2e-commons/helpers/utils-helper.js b/tools/e2e-commons/helpers/utils-helper.js index ae451e88d16fa..c45fade265243 100644 --- a/tools/e2e-commons/helpers/utils-helper.js +++ b/tools/e2e-commons/helpers/utils-helper.js @@ -208,6 +208,17 @@ export function getSiteCredentials() { return { username: site.username, password: site.password, apiPassword: site.apiPassword }; } +/** + * Set environment variables expected by @wordpress/e2e-test-utils-playwright + */ +export function setWpEnvVars() { + const site = getConfigTestSite(); + + process.env.WP_BASE_URL = resolveSiteUrl(); + process.env.WP_USERNAME = site.username; + process.env.WP_PASSWORD = site.password; +} + /** * Get DotCom credentials. * diff --git a/tools/e2e-commons/package.json b/tools/e2e-commons/package.json index ba94f3a366a03..71d926e9a7484 100644 --- a/tools/e2e-commons/package.json +++ b/tools/e2e-commons/package.json @@ -22,6 +22,7 @@ "@playwright/test": "1.48.2", "@slack/web-api": "7.3.2", "@types/lodash-es": "4.17.12", + "@wordpress/e2e-test-utils-playwright": "1.14.0", "allure-playwright": "2.9.2", "axios": "1.7.4", "chalk": "5.4.1", diff --git a/tools/e2e-commons/reporters/flaky-tests-reporter.ts b/tools/e2e-commons/reporters/flaky-tests-reporter.ts new file mode 100644 index 0000000000000..a90341f9fb810 --- /dev/null +++ b/tools/e2e-commons/reporters/flaky-tests-reporter.ts @@ -0,0 +1,85 @@ +/** + * Copied from https://github.com/WordPress/gutenberg/blob/972f0b101d7a67f8a8ee5905bca4e341c162b12c/test/e2e/config/flaky-tests-reporter.ts + * + * A **flaky** test is defined as a test which passed after auto-retrying. + * - By default, all tests run once if they pass. + * - If a test fails, it will automatically re-run at most 2 times. + * - If it pass after retrying (below 2 times), then it's marked as **flaky** + * but displayed as **passed** in the original test suite. + * - If it fail all 3 times, then it's a **failed** test. + */ +import fs from 'fs'; +import { fileNameFormatter } from '../helpers/utils-helper'; +import type { Reporter, TestCase, TestResult } from '@playwright/test/reporter'; + +type FormattedTestResult = Omit< TestResult, 'steps' >; + +/** + * Formats the test result to remove the steps. + * + * Remove "steps" to prevent stringify circular structure. + * + * @param {TestResult} testResult - The test result to format. + * + * @return {FormattedTestResult} The formatted test result. + */ +function formatTestResult( testResult: TestResult ): FormattedTestResult { + const result = { ...testResult, steps: undefined }; + delete result.steps; + return result; +} + +export default class FlakyTestsReporter implements Reporter { + failingTestCaseResults = new Map< string, FormattedTestResult[] >(); + + onBegin() { + try { + fs.mkdirSync( 'flaky-tests' ); + } catch ( err ) { + if ( err instanceof Error && ( err as NodeJS.ErrnoException ).code === 'EEXIST' ) { + // Ignore the error if the directory already exists. + } else { + throw err; + } + } + } + + onTestEnd( test: TestCase, testCaseResult: TestResult ) { + const testPath = test.location.file; + const testTitle = test.title; + + switch ( test.outcome() ) { + case 'unexpected': { + if ( ! this.failingTestCaseResults.has( testTitle ) ) { + this.failingTestCaseResults.set( testTitle, [] ); + } + this.failingTestCaseResults.get( testTitle )!.push( formatTestResult( testCaseResult ) ); + break; + } + case 'flaky': { + fs.writeFileSync( + `flaky-tests/${ fileNameFormatter( testTitle ) }.json`, + JSON.stringify( { + version: 1, + runner: '@playwright/test', + title: testTitle, + path: testPath, + results: this.failingTestCaseResults.get( testTitle ), + } ), + 'utf-8' + ); + break; + } + default: + break; + } + } + + onEnd() { + this.failingTestCaseResults.clear(); + } + + printsToStdio() { + return false; + } +}