From fb14c5e359c830aad1fffe8bcb51b447de0a090a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Nov 2026 22:20:03 +0000 Subject: [PATCH 1/3] chore(deps-dev): Bump @playwright/test from 1.64.1 to 1.65.0 Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.64.1 to 1.65.0. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.64.1...v1.65.0) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-version: 1.65.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 24 ++++++++++++------------ package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29d2487f3c..b1c93408b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "@nextcloud/stylelint-config": "^3.2.1", "@nextcloud/vite-config": "^3.0.0-beta.1", "@pinia/testing": "^2.0.2", - "@playwright/test": "^1.64.1", + "@playwright/test": "^1.65.0", "@stryker-mutator/core": "^10.1.1", "@stryker-mutator/vitest-runner": "^10.1.1", "@testing-library/dom": "^10.4.2", @@ -4916,13 +4916,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.64.1.tgz", - "integrity": "sha512-IaYGml/nSOiZWROfPtuIL7neuu9qDOZ3TNvNljUIrhDMxiGTgPjzj/g9p9RxpS2tSepPDRY+UwAaEeiKtUvIAg==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.65.0.tgz", + "integrity": "sha512-iGURLGuKDLakSEl7Pgfv8h7f+XLT+V861Wfhz0zlEl5nyFuKUopdkFBPKqTllTUp06aOwPuH8iuUEb3yp3MpbQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.64.1" + "playwright": "1.65.0" }, "bin": { "playwright": "cli.js" @@ -14153,13 +14153,13 @@ } }, "node_modules/playwright": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.64.1.tgz", - "integrity": "sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.65.0.tgz", + "integrity": "sha512-F3AMWcR44qMBt4kq+6Kb6mX7bjGXshktKFOPULd7reED6ZJWevjbNRqysP7q+AATE9kdPEZBibex1BYsvpVoeA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.64.1" + "playwright-core": "1.65.0" }, "bin": { "playwright": "cli.js" @@ -14169,9 +14169,9 @@ } }, "node_modules/playwright-core": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.1.tgz", - "integrity": "sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==", + "version": "1.65.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.65.0.tgz", + "integrity": "sha512-vNSKgH6YqtN7cdT/L334zo0a+YwkrpicyrHJlWWPIm/Q+Nn2SWInil01oT0mbu96U4GgoRtCYQD9CzJQgju+lA==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index fb398df7c6..69eb41ad36 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@nextcloud/stylelint-config": "^3.2.1", "@nextcloud/vite-config": "^3.0.0-beta.1", "@pinia/testing": "^2.0.2", - "@playwright/test": "^1.64.1", + "@playwright/test": "^1.65.0", "@stryker-mutator/core": "^10.1.1", "@stryker-mutator/vitest-runner": "^10.1.1", "@testing-library/dom": "^10.4.2", From 74bb348f14d2cc62a33129612ae4228117edd97d Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 9 Nov 2026 01:33:22 +0000 Subject: [PATCH 2/3] fix(ci): align Playwright Dev Container browser image with lockfile Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .devcontainer/docker-compose.yml | 3 ++ .devcontainer/tests/playwright-version.cjs | 41 ++++++++++++++++++++++ .github/workflows/devcontainer.yml | 6 ++++ 3 files changed, 50 insertions(+) create mode 100644 .devcontainer/tests/playwright-version.cjs diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 282a892365..a78c7793ac 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -9,5 +9,8 @@ services: volumes: - ../:/var/www/html/apps-extra/libresign:ro playwright: + # Keep the browser image aligned with the version installed by npm ci. + # NCDD's default image is shared and may target a different Playwright. + image: mcr.microsoft.com/playwright:v1.65.0-noble volumes: - ../:/var/www/html/apps-extra/libresign diff --git a/.devcontainer/tests/playwright-version.cjs b/.devcontainer/tests/playwright-version.cjs new file mode 100644 index 0000000000..ad31820c14 --- /dev/null +++ b/.devcontainer/tests/playwright-version.cjs @@ -0,0 +1,41 @@ +/** + * SPDX-FileCopyrightText: 2026 LibreCode coop and contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +const assert = require('node:assert/strict') +const { readFileSync } = require('node:fs') +const { resolve } = require('node:path') + +const root = resolve(__dirname, '../..') +const manifest = JSON.parse(readFileSync(resolve(root, 'package.json'), 'utf8')) +const lock = JSON.parse(readFileSync(resolve(root, 'package-lock.json'), 'utf8')) +const compose = readFileSync(resolve(root, '.devcontainer/docker-compose.yml'), 'utf8') + +const installed = lock.packages['node_modules/@playwright/test']?.version +assert.ok(installed, 'The lockfile must include @playwright/test') +assert.equal( + lock.packages[''].devDependencies['@playwright/test'], + manifest.devDependencies['@playwright/test'], + 'Update the Playwright manifest and lockfile together', +) + +for (const dependency of ['playwright', 'playwright-core']) { + assert.equal( + lock.packages[`node_modules/${dependency}`]?.version, + installed, + `${dependency} must match @playwright/test in the lockfile`, + ) +} + +const playwrightService = compose.match(/^ playwright:\s*\n((?:^ .*\n|^\s*\n)*)/m)?.[1] +assert.ok(playwrightService, 'Missing Playwright service in devcontainer Compose override') +const image = playwrightService.match(/^ image:\s*(\S+)\s*$/m)?.[1] +assert.ok(image, 'Pin the Playwright image in the devcontainer Compose override') +assert.equal( + image, + `mcr.microsoft.com/playwright:v${installed}-noble`, + 'Playwright Docker image must match package-lock.json', +) + +console.log(`Playwright package and Dev Container image match: ${installed}`) diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index 7e56cfb329..3e15356c27 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -8,12 +8,16 @@ on: paths: - '.devcontainer/**' - '.github/workflows/devcontainer.yml' + - 'package.json' + - 'package-lock.json' push: branches: - main paths: - '.devcontainer/**' - '.github/workflows/devcontainer.yml' + - 'package.json' + - 'package-lock.json' workflow_dispatch: permissions: @@ -51,6 +55,8 @@ jobs: sh -n .devcontainer/prepare.sh bash -n .devcontainer/setup.sh node --check .devcontainer/tests/playwright-smoke.cjs + node --check .devcontainer/tests/playwright-version.cjs + node .devcontainer/tests/playwright-version.cjs ! jq -e ' ((.forwardPorts // [])[]? | strings | contains(":")) or From 46bc1f7feec41be2110c2387809ec29aa8c33110 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 9 Nov 2026 14:16:15 +0000 Subject: [PATCH 3/3] fix(ci): satisfy ESLint regex spacing rule in Playwright version check Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .devcontainer/tests/playwright-version.cjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/tests/playwright-version.cjs b/.devcontainer/tests/playwright-version.cjs index ad31820c14..295a214eb1 100644 --- a/.devcontainer/tests/playwright-version.cjs +++ b/.devcontainer/tests/playwright-version.cjs @@ -28,9 +28,9 @@ for (const dependency of ['playwright', 'playwright-core']) { ) } -const playwrightService = compose.match(/^ playwright:\s*\n((?:^ .*\n|^\s*\n)*)/m)?.[1] +const playwrightService = compose.match(/^ {2}playwright:\s*\n((?:^ {4}.*\n|^\s*\n)*)/m)?.[1] assert.ok(playwrightService, 'Missing Playwright service in devcontainer Compose override') -const image = playwrightService.match(/^ image:\s*(\S+)\s*$/m)?.[1] +const image = playwrightService.match(/^ {4}image:\s*(\S+)\s*$/m)?.[1] assert.ok(image, 'Pin the Playwright image in the devcontainer Compose override') assert.equal( image,