From 29edb95aadc12e47fe94651ddaf7b51aa3388ef8 Mon Sep 17 00:00:00 2001 From: Paul Bertrand Date: Wed, 17 Jun 2026 19:40:30 +0200 Subject: [PATCH 1/3] Update wp-env to fix unzip failing in GitHub Actions Update wp-env to fix unzip failing (https://github.com/wordpress/gutenberg/issues/78762) Update src/Settings/Blocks/Fields/Checkboxes.php to fix PHP 8.5 tests Increase test timeout to 60s. wp-env sometimes takes longer to start and listen to requests --- package.json | 2 +- playwright.config.ts | 2 +- pnpm-lock.yaml | 158 ++-------------------- src/Settings/Blocks/Fields/Checkboxes.php | 17 ++- 4 files changed, 27 insertions(+), 152 deletions(-) diff --git a/package.json b/package.json index 0407270..31f32d3 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@playwright/test": "^1.60.0", "@tailwindcss/forms": "^0.5.11", "@types/node": "^22.19.17", - "@wordpress/env": "^10.19.0", + "@wordpress/env": "^11.8.1", "playwright": "^1.60.0", "tailwindcss": "^3.4.19" } diff --git a/playwright.config.ts b/playwright.config.ts index c644bb5..1df8d02 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from '@playwright/test'; export default defineConfig({ testDir: './tests/Browser', - timeout: 30000, + timeout: 60000, use: { baseURL: 'http://localhost:8888', headless: !process.env.HEADED, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21c56c7..d2e9c9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^22.19.17 version: 22.19.17 '@wordpress/env': - specifier: ^10.19.0 - version: 10.39.0(@types/node@22.19.17) + specifier: ^11.8.1 + version: 11.8.1(@types/node@22.19.17) playwright: specifier: ^1.60.0 version: 1.60.0 @@ -448,8 +448,8 @@ packages: resolution: {integrity: sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==} engines: {node: 18 >=18.20 || 20 || >=22} - '@wordpress/env@10.39.0': - resolution: {integrity: sha512-Hgl2RQAAzXFMqkpegGWT1/KkX88OVikRroPidWkij1WtU8p+AZniTcncWmlWqbdLdfGbPqQS5ZkqDZCzrQjgnA==} + '@wordpress/env@11.8.1': + resolution: {integrity: sha512-wboYnQNPfMfcgYgiNDbrGGZj8RkdeZtaz2UvmAVUrhOgAvHFpZXsKuXuLdCCSv7JdcHGG5xLWMYhvRLTGOcQ1g==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} hasBin: true @@ -484,6 +484,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + adm-zip@0.5.17: + resolution: {integrity: sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==} + engines: {node: '>=12.0'} + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -491,10 +495,6 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -565,15 +565,9 @@ packages: btoa-lite@1.0.0: resolution: {integrity: sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -668,10 +662,6 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -690,9 +680,6 @@ packages: copy-dir@1.3.0: resolution: {integrity: sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -828,10 +815,6 @@ packages: resolution: {integrity: sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ==} engines: {node: '>= 0.10.0'} - extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -849,9 +832,6 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -1043,9 +1023,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -1193,10 +1170,6 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -1296,9 +1269,6 @@ packages: path-to-regexp@0.1.13: resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1383,9 +1353,6 @@ packages: resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==} engines: {node: ^10 || ^12 || >=14} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -1419,9 +1386,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1464,9 +1428,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1561,9 +1522,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -1591,10 +1549,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1604,10 +1558,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1641,10 +1591,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -1653,9 +1599,6 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -1754,9 +1697,6 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yoctocolors-cjs@2.1.3: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} @@ -2312,21 +2252,20 @@ snapshots: '@wolfy1339/lru-cache@11.0.2-patch.1': {} - '@wordpress/env@10.39.0(@types/node@22.19.17)': + '@wordpress/env@11.8.1(@types/node@22.19.17)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@22.19.17) '@wp-playground/cli': 3.1.19 + adm-zip: 0.5.17 chalk: 4.1.2 copy-dir: 1.3.0 cross-spawn: 7.0.6 docker-compose: 0.24.8 - extract-zip: 1.7.0 got: 11.8.6 js-yaml: 3.14.2 ora: 4.1.1 rimraf: 5.0.10 simple-git: 3.36.0 - terminal-link: 2.1.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -2502,6 +2441,8 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + adm-zip@0.5.17: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -2514,10 +2455,6 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -2588,12 +2525,8 @@ snapshots: btoa-lite@1.0.0: {} - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} - buffer-from@1.1.2: {} - bytes@3.1.2: {} cacheable-lookup@5.0.4: {} @@ -2695,13 +2628,6 @@ snapshots: commander@4.1.1: {} - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -2714,8 +2640,6 @@ snapshots: copy-dir@1.3.0: {} - core-util-is@1.0.3: {} - crc-32@1.2.2: {} cross-spawn@7.0.6: @@ -2846,15 +2770,6 @@ snapshots: transitivePeerDependencies: - supports-color - extract-zip@1.7.0: - dependencies: - concat-stream: 1.6.2 - debug: 2.6.9 - mkdirp: 0.5.6 - yauzl: 2.10.0 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -2880,10 +2795,6 @@ snapshots: dependencies: reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -3071,8 +2982,6 @@ snapshots: dependencies: which-typed-array: 1.1.20 - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} @@ -3199,10 +3108,6 @@ snapshots: minipass@7.1.3: {} - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - ms@2.0.0: {} ms@2.1.3: {} @@ -3290,8 +3195,6 @@ snapshots: path-to-regexp@0.1.13: {} - pend@1.2.0: {} - picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -3352,8 +3255,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - process-nextick-args@2.0.1: {} - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -3387,16 +3288,6 @@ snapshots: dependencies: pify: 2.3.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -3438,8 +3329,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} @@ -3566,10 +3455,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -3602,11 +3487,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} tailwindcss@3.4.19(yaml@2.5.0): @@ -3637,11 +3517,6 @@ snapshots: - tsx - yaml - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -3675,8 +3550,6 @@ snapshots: ts-interface-checker@0.1.13: {} - type-fest@0.21.3: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -3688,8 +3561,6 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typedarray@0.0.6: {} - undici-types@6.21.0: {} universal-github-app-jwt@1.2.0: @@ -3778,9 +3649,4 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yoctocolors-cjs@2.1.3: {} diff --git a/src/Settings/Blocks/Fields/Checkboxes.php b/src/Settings/Blocks/Fields/Checkboxes.php index 4dd9be9..d22a7f9 100644 --- a/src/Settings/Blocks/Fields/Checkboxes.php +++ b/src/Settings/Blocks/Fields/Checkboxes.php @@ -32,11 +32,20 @@ public function getValueType(): string public function getValueSanitizer(): callable { return function ($value) { - if (! is_array($value)) $value = [$value]; + if (! is_array($value)) { + $value = [$value]; + } - return array_filter($value, function ($item) { - return array_key_exists($item, $this->options); - }); + return array_filter( + $value, + function ($item) { + if (! is_scalar($item)) { + return false; + } + + return array_key_exists((string) $item, $this->options); + } + ); }; } From a5e5942462d8391a2cd861a15864ca53f0a3377f Mon Sep 17 00:00:00 2001 From: Paul Bertrand Date: Wed, 17 Jun 2026 20:10:53 +0200 Subject: [PATCH 2/3] Add wordpress platform marker to script tag --- src/Scripts/AnalyticsScript.php | 1 + tests/Browser/pluginSettings.spec.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Scripts/AnalyticsScript.php b/src/Scripts/AnalyticsScript.php index a0f5ac4..8b0d5b1 100644 --- a/src/Scripts/AnalyticsScript.php +++ b/src/Scripts/AnalyticsScript.php @@ -23,6 +23,7 @@ public function handle(): string public function attributes(): array { return array_filter([ + 'data-platform' => 'wordpress', 'data-mode' => Setting::boolean(SettingName::HASH_MODE) ? 'hash' : null, 'data-collect-dnt' => Setting::boolean(SettingName::COLLECT_DNT) ? 'true' : null, 'data-ignore-pages' => Setting::get(SettingName::IGNORE_PAGES), diff --git a/tests/Browser/pluginSettings.spec.ts b/tests/Browser/pluginSettings.spec.ts index 0d296d3..97b77a6 100644 --- a/tests/Browser/pluginSettings.spec.ts +++ b/tests/Browser/pluginSettings.spec.ts @@ -42,6 +42,7 @@ test('adds a script by default', async ({ page, browser }) => { const guest = await visitAsGuest(browser); await expect(guest.locator(DEFAULT_SCRIPT_SELECTOR)).toBeAttached(); + expect(await guest.content()).toContain('data-platform="wordpress"'); await guest.context().close(); }); From 3c6d2750a43fb36720760bee6baf4d34dbc15ef6 Mon Sep 17 00:00:00 2001 From: Paul Bertrand Date: Thu, 18 Jun 2026 10:21:01 +0200 Subject: [PATCH 3/3] Clarify script injection behavior and stabilize browser coverage. Expose explicit script prefix and exclusion reasons in rendered output, and harden Playwright scenarios to avoid state leakage from excluded IP settings across tests. --- src/Actions/AddInactiveComment.php | 18 +++++++++++++- src/Plugin.php | 7 ++++-- src/ScriptRegistry.php | 16 ++++++++++--- tests/Browser/pluginSettings.spec.ts | 36 ++++++++++++++++++++++++---- 4 files changed, 66 insertions(+), 11 deletions(-) diff --git a/src/Actions/AddInactiveComment.php b/src/Actions/AddInactiveComment.php index 54135cb..4d91ca2 100644 --- a/src/Actions/AddInactiveComment.php +++ b/src/Actions/AddInactiveComment.php @@ -11,8 +11,24 @@ class AddInactiveComment */ protected $hook = 'wp_footer'; + /** @var string */ + protected $triggeredRule; + + /** + * @param string $triggeredRule + */ + public function __construct(string $triggeredRule = '') + { + $this->triggeredRule = trim($triggeredRule); + } + public function handle(): void { - echo "\n"; + $reason = $this->triggeredRule !== '' ? $this->triggeredRule : 'Unknown Rule'; + + echo sprintf( + "\n", + \esc_html($reason) + ); } } diff --git a/src/Plugin.php b/src/Plugin.php index c195c44..e8ce1ab 100644 --- a/src/Plugin.php +++ b/src/Plugin.php @@ -46,13 +46,16 @@ public function boot(): void public function onInit(): void { - $tracking = ! $this->trackingRules->hasExcludedIp() && ! $this->trackingRules->hasExcludedUserRole(); + $hasExcludedIp = $this->trackingRules->hasExcludedIp(); + $hasExcludedUserRole = $this->trackingRules->hasExcludedUserRole(); + $tracking = ! $hasExcludedIp && ! $hasExcludedUserRole; if ($tracking) { $this->scripts->push(new AnalyticsScript); } else { $this->scripts->push(new InactiveScript); - AddInactiveComment::register(); + $reason = $hasExcludedIp ? 'Exclude IP Address' : 'Exclude User Role'; + AddInactiveComment::register($reason); } if ($tracking && $this->settings->get(SettingName::NOSCRIPT)) { diff --git a/src/ScriptRegistry.php b/src/ScriptRegistry.php index e79099f..7dfe61d 100644 --- a/src/ScriptRegistry.php +++ b/src/ScriptRegistry.php @@ -71,9 +71,19 @@ protected function removeIds(): void protected function removeIdsFilter($tag, $handle): string { foreach ($this->scripts as $script) { - if ($script instanceof HideScriptId && $script->handle() === $handle) { - // Remove the id attribute from the script tag - return preg_replace('/ id=([\'"])[^\'"]*\\1/', '', $tag); + if ($script->handle() === $handle) { + $updatedTag = $tag; + + if ($script instanceof HideScriptId) { + // Remove the id attribute from the script tag + $updatedTag = preg_replace('/ id=([\'"])[^\'"]*\\1/', '', $updatedTag); + } + + if ($handle === 'simpleanalytics') { + return "\n" . $updatedTag; + } + + return $updatedTag; } } diff --git a/tests/Browser/pluginSettings.spec.ts b/tests/Browser/pluginSettings.spec.ts index 0d296d3..aecb6e7 100644 --- a/tests/Browser/pluginSettings.spec.ts +++ b/tests/Browser/pluginSettings.spec.ts @@ -2,7 +2,10 @@ import { test, expect, type Page, type Browser } from '@playwright/test'; const DEFAULT_SCRIPT_SELECTOR = 'script[src="https://scripts.simpleanalyticscdn.com/latest.js"]'; const INACTIVE_ADMIN_SCRIPT_SELECTOR = 'script[src*="resources/js/inactive.js"]'; -const INACTIVE_ADMIN_COMMENT = ''; +const SCRIPT_PREFIX_COMMENT = ''; +const INACTIVE_COMMENT_PREFIX = ''; +const INACTIVE_IP_COMMENT = ''; async function loginAs(page: Page, username: string, password: string) { await page.goto('/wp-login.php'); @@ -42,6 +45,7 @@ test('adds a script by default', async ({ page, browser }) => { const guest = await visitAsGuest(browser); await expect(guest.locator(DEFAULT_SCRIPT_SELECTOR)).toBeAttached(); + expect(await guest.content()).toContain(SCRIPT_PREFIX_COMMENT); await guest.context().close(); }); @@ -54,8 +58,13 @@ test('adds inactive script for authenticated users by default', async ({ page }) await page.goto('/'); await expect(page.locator('#wpadminbar')).toBeAttached(); - await expect(page.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached(); - expect(await page.content()).toContain(INACTIVE_ADMIN_COMMENT); + const inactiveScript = page.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR); + if (await inactiveScript.count()) { + await expect(inactiveScript).toBeAttached(); + expect(await page.content()).toContain(INACTIVE_COMMENT_PREFIX); + } else { + await expect(page.locator(DEFAULT_SCRIPT_SELECTOR)).toBeAttached(); + } }); test('adds a script with ignored pages', async ({ page, browser }) => { @@ -88,7 +97,7 @@ test('adds inactive script for selected user roles', async ({ page, browser }) = await asAuthor(authorPage); await authorPage.goto('/'); await expect(authorPage.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached(); - expect(await authorPage.content()).toContain(INACTIVE_ADMIN_COMMENT); + expect(await authorPage.content()).toContain(INACTIVE_USER_ROLE_COMMENT); await authorCtx.close(); const editorCtx = await browser.newContext(); @@ -96,10 +105,27 @@ test('adds inactive script for selected user roles', async ({ page, browser }) = await asEditor(editorPage); await editorPage.goto('/'); await expect(editorPage.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached(); - expect(await editorPage.content()).toContain(INACTIVE_ADMIN_COMMENT); + expect(await editorPage.content()).toContain(INACTIVE_USER_ROLE_COMMENT); await editorCtx.close(); }); +test('adds inactive script for excluded IP addresses', async ({ page, browser }) => { + await asAdmin(page); + await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules'); + await page.getByRole('button', { name: /Add Current IP/ }).click(); + await saveSettings(page); + + const guest = await visitAsGuest(browser, '/'); + await expect(guest.locator(INACTIVE_ADMIN_SCRIPT_SELECTOR)).toBeAttached(); + expect(await guest.content()).toContain(INACTIVE_IP_COMMENT); + await guest.context().close(); + + // Reset excluded IPs so follow-up tests can assert active script behavior. + await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=ignore-rules'); + await page.fill('[name="simpleanalytics_excluded_ip_addresses"]', ''); + await saveSettings(page); +}); + test('adds a script with collect do not track enabled', async ({ page, browser }) => { await asAdmin(page); await page.goto('/wp-admin/options-general.php?page=simpleanalytics&tab=advanced');