diff --git a/eslint.config.mjs b/eslint.config.mjs index df3425d7a0..03ca13176a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1145,6 +1145,7 @@ export default tseslint.config( 'playwright/prefer-comparison-matcher': [2], 'playwright/prefer-equality-matcher': [2], + 'playwright/prefer-locator': [0], 'playwright/prefer-native-locators': [2], 'playwright/prefer-to-contain': [2], 'playwright/prefer-to-have-length': [2], diff --git a/package-lock.json b/package-lock.json index 2161d9d256..23b067710b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,22 +83,22 @@ }, "devDependencies": { "@axe-core/playwright": "4.11.0", - "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", + "@eslint-community/eslint-plugin-eslint-comments": "4.7.1", "@playwright/test": "1.57.0", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.9.0", + "@stylistic/eslint-plugin": "5.10.0", "@stylistic/stylelint-plugin": "4.0.1", "@vitejs/plugin-vue": "6.0.3", "@vitest/coverage-v8": "4.0.18", "@vitest/eslint-plugin": "1.6.9", "@vue/test-utils": "2.4.6", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-array-func": "5.1.0", + "eslint-plugin-array-func": "5.1.1", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", - "eslint-plugin-playwright": "2.8.0", + "eslint-plugin-playwright": "2.9.0", "eslint-plugin-regexp": "3.0.0", "eslint-plugin-sonarjs": "3.0.7", "eslint-plugin-toml": "0.13.1", @@ -1387,9 +1387,9 @@ } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.6.0.tgz", - "integrity": "sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.7.1.tgz", + "integrity": "sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1403,7 +1403,7 @@ "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/ignore": { @@ -1459,24 +1459,24 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -1513,20 +1513,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -1537,9 +1537,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1574,9 +1574,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -1587,9 +1587,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", - "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -3789,9 +3789,9 @@ } }, "node_modules/@stylistic/eslint-plugin": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.9.0.tgz", - "integrity": "sha512-FqqSkvDMYJReydrMhlugc71M76yLLQWNfmGq+SIlLa7N3kHp8Qq8i2PyWrVNAfjOyOIY+xv9XaaYwvVW7vroMA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7896,25 +7896,25 @@ } }, "node_modules/eslint": { - "version": "9.39.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", - "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.3", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -7933,7 +7933,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -8032,9 +8032,9 @@ } }, "node_modules/eslint-plugin-array-func": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-array-func/-/eslint-plugin-array-func-5.1.0.tgz", - "integrity": "sha512-+OULB0IQdENBmBf8pHMPPObgV6QyfeXFin483jPonOaiurI9UFmc8UydWriK5f5Gel8xBhQLA6NzMwbck1BUJw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-array-func/-/eslint-plugin-array-func-5.1.1.tgz", + "integrity": "sha512-TbVGk+yLqXHgtrS4DnYzg2Ycuk5y+lYFy5NgT748neQdJvNIYUucxp2QQjPU7dwbs9xp9fyktgtK069y9rNdig==", "dev": true, "license": "MIT", "engines": { @@ -8111,9 +8111,9 @@ } }, "node_modules/eslint-plugin-playwright": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.8.0.tgz", - "integrity": "sha512-BRCXbnX20l/ZPOOi1jEqNvqU/UjXpkZRJaghQxSM2kjAvsDph8+osn9u1iMmvoa9Cegbp9d0Skh7vro7242t+Q==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-2.9.0.tgz", + "integrity": "sha512-k3xrG6YzrallWNFMoGUjMNeu3SFFKXN79KJQBD2PkM4PasJegqV2Up+mPY5od2UmPKQGT+MeIhCmWH8r5eYuQQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ccdcb349af..6f5191d518 100644 --- a/package.json +++ b/package.json @@ -82,22 +82,22 @@ }, "devDependencies": { "@axe-core/playwright": "4.11.0", - "@eslint-community/eslint-plugin-eslint-comments": "4.6.0", + "@eslint-community/eslint-plugin-eslint-comments": "4.7.1", "@playwright/test": "1.57.0", "@stoplight/spectral-cli": "6.15.0", - "@stylistic/eslint-plugin": "5.9.0", + "@stylistic/eslint-plugin": "5.10.0", "@stylistic/stylelint-plugin": "4.0.1", "@vitejs/plugin-vue": "6.0.3", "@vitest/coverage-v8": "4.0.18", "@vitest/eslint-plugin": "1.6.9", "@vue/test-utils": "2.4.6", - "eslint": "9.39.3", + "eslint": "9.39.4", "eslint-import-resolver-typescript": "4.4.4", - "eslint-plugin-array-func": "5.1.0", + "eslint-plugin-array-func": "5.1.1", "eslint-plugin-import-x": "4.16.1", "eslint-plugin-no-jquery": "3.1.1", "eslint-plugin-no-use-extend-native": "0.7.2", - "eslint-plugin-playwright": "2.8.0", + "eslint-plugin-playwright": "2.9.0", "eslint-plugin-regexp": "3.0.0", "eslint-plugin-sonarjs": "3.0.7", "eslint-plugin-toml": "0.13.1", diff --git a/tests/e2e/release.test.e2e.ts b/tests/e2e/release.test.e2e.ts index fedb1c8f1d..de30794997 100644 --- a/tests/e2e/release.test.e2e.ts +++ b/tests/e2e/release.test.e2e.ts @@ -18,6 +18,16 @@ import {validate_form} from './shared/forms.ts'; test.use({user: 'user2'}); +test.afterEach(async ({page}) => { + // Delete release + const response = await page.goto('/user2/repo2/releases/edit/2.0'); + test.skip(response.status() === 404, 'No release to delete'); + + await page.locator('.delete-button').dispatchEvent('click'); + await page.locator('.button.ok').click(); + await expect(page).toHaveURL('/user2/repo2/releases'); +}); + test.describe('Releases', () => { test('External release attachments', async ({page, isMobile}) => { test.skip(isMobile); @@ -142,14 +152,4 @@ test.describe('Releases', () => { expect((await release.locator('.detail').boundingBox()).width).toBeLessThan(viewport.width * 0.75); } }); - - test.afterEach(async ({page}) => { - // Delete release - const response = await page.goto('/user2/repo2/releases/edit/2.0'); - test.skip(response.status() === 404, 'No release to delete'); - - await page.locator('.delete-button').dispatchEvent('click'); - await page.locator('.button.ok').click(); - await expect(page).toHaveURL('/user2/repo2/releases'); - }); }); diff --git a/tests/e2e/repo-wiki.test.e2e.ts b/tests/e2e/repo-wiki.test.e2e.ts index 1eb02dfa36..fcbfc822a4 100644 --- a/tests/e2e/repo-wiki.test.e2e.ts +++ b/tests/e2e/repo-wiki.test.e2e.ts @@ -44,7 +44,7 @@ test('Wiki unicode-escape', async ({page}) => { await page.goto('/user2/unicode-escaping/wiki'); await screenshot(page); - expect(await page.locator('.ui.message.unicode-escape-prompt').count()).toEqual(3); + await expect(page.locator('.ui.message.unicode-escape-prompt')).toHaveCount(3); const unescapedElements = page.locator('.ambiguous-code-point'); for (let i = 0; i < await unescapedElements.count(); i++) { diff --git a/tests/e2e/right-settings-button.test.e2e.ts b/tests/e2e/right-settings-button.test.e2e.ts index 1e19fdae8c..27240595be 100644 --- a/tests/e2e/right-settings-button.test.e2e.ts +++ b/tests/e2e/right-settings-button.test.e2e.ts @@ -73,12 +73,12 @@ test.describe('small viewport', () => { await expect(page.locator('.tippy-target>#settings-btn')).toBeVisible(); // Verify that we have no duplicated items - const shownItems = await page.locator('.overflow-menu-items>a').all(); - expect(shownItems).not.toHaveLength(0); - const overflowItems = await page.locator('.tippy-target>a').all(); - expect(overflowItems).not.toHaveLength(0); + const shownItems = page.locator('.overflow-menu-items>a'); + await expect(shownItems).not.toHaveCount(0); + const overflowItems = page.locator('.tippy-target>a'); + await expect(overflowItems).not.toHaveCount(0); - const items = shownItems.concat(overflowItems); + const items = (await shownItems.all()).concat(overflowItems); expect(Array.from(new Set(items))).toHaveLength(items.length); await screenshot(page); }); @@ -94,12 +94,12 @@ test.describe('small viewport', () => { await expect(page.locator('.tippy-target>#settings-btn')).toBeVisible(); // Verify that we have no duplicated items - const shownItems = await page.locator('.overflow-menu-items>a').all(); - expect(shownItems).not.toHaveLength(0); - const overflowItems = await page.locator('.tippy-target>a').all(); - expect(overflowItems).not.toHaveLength(0); + const shownItems = page.locator('.overflow-menu-items>a'); + await expect(shownItems).not.toHaveCount(0); + const overflowItems = page.locator('.tippy-target>a'); + await expect(overflowItems).not.toHaveCount(0); - const items = shownItems.concat(overflowItems); + const items = (await shownItems.all()).concat(overflowItems); expect(Array.from(new Set(items))).toHaveLength(items.length); }); }); @@ -117,12 +117,12 @@ test.describe('small viewport, unauthenticated', () => { await expect(page.locator('.tippy-target>#settings-btn')).toHaveCount(0); // Verify that we have no duplicated items - const shownItems = await page.locator('.overflow-menu-items>a').all(); - expect(shownItems).not.toHaveLength(0); - const overflowItems = await page.locator('.tippy-target>a').all(); - expect(overflowItems).not.toHaveLength(0); + const shownItems = page.locator('.overflow-menu-items>a'); + await expect(shownItems).not.toHaveCount(0); + const overflowItems = page.locator('.tippy-target>a'); + await expect(overflowItems).not.toHaveCount(0); - const items = shownItems.concat(overflowItems); + const items = (await shownItems.all()).concat(overflowItems); expect(Array.from(new Set(items))).toHaveLength(items.length); await screenshot(page); });