From cc614358fb90cb15b42bcc45b77ee1172afa268d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2026 22:03:41 +0000 Subject: [PATCH 1/4] build(deps-dev): bump the npm-deps group with 4 updates Bumps the npm-deps group with 4 updates: [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc), [pdfjs-dist](https://github.com/mozilla/pdf.js), [puppeteer](https://github.com/puppeteer/puppeteer) and [webpack-cli](https://github.com/webpack/webpack-cli). Updates `eslint-plugin-jsdoc` from 63.3.1 to 63.3.2 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v63.3.1...v63.3.2) Updates `pdfjs-dist` from 6.1.200 to 6.2.108 - [Release notes](https://github.com/mozilla/pdf.js/releases) - [Commits](https://github.com/mozilla/pdf.js/compare/v6.1.200...v6.2.108) Updates `puppeteer` from 25.1.0 to 25.4.0 - [Release notes](https://github.com/puppeteer/puppeteer/releases) - [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md) - [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v25.1.0...puppeteer-v25.4.0) Updates `webpack-cli` from 7.2.1 to 7.2.2 - [Release notes](https://github.com/webpack/webpack-cli/releases) - [Changelog](https://github.com/webpack/webpack-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@7.2.1...webpack-cli@7.2.2) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-version: 63.3.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-deps - dependency-name: pdfjs-dist dependency-version: 6.2.108 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-deps - dependency-name: puppeteer dependency-version: 25.4.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-deps - dependency-name: webpack-cli dependency-version: 7.2.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-deps ... Signed-off-by: dependabot[bot] --- package-lock.json | 222 +++++++++++----------------------------------- package.json | 8 +- 2 files changed, 54 insertions(+), 176 deletions(-) diff --git a/package-lock.json b/package-lock.json index 73d669e574c..83fba819b92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "cross-env": "10.1.0", "eslint": "10.8.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-jsdoc": "63.3.1", + "eslint-plugin-jsdoc": "63.3.2", "eslint-plugin-local-rules": "3.0.2", "eslint-plugin-no-null": "1.0.2", "eslint-plugin-no-only-tests": "3.4.0", @@ -54,10 +54,10 @@ "mailparser": "3.9.14", "mkdirp": "3.0.1", "openpgp": "6.3.1", - "pdfjs-dist": "6.1.200", + "pdfjs-dist": "6.2.108", "postcss-html": "1.8.1", "prettier": "3.9.6", - "puppeteer": "25.1.0", + "puppeteer": "25.4.0", "stylelint": "17.14.1", "stylelint-config-standard": "40.0.0", "tap-xunit": "2.4.1", @@ -65,7 +65,7 @@ "typescript-eslint": "8.65.0", "undici-types": "8.9.0", "web-ext": "10.5.0", - "webpack-cli": "7.2.1" + "webpack-cli": "7.2.2" } }, "node_modules/@babel/code-frame": { @@ -418,9 +418,9 @@ "license": "MIT" }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.90.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.90.0.tgz", - "integrity": "sha512-51x9KxyTAN6guZOCd+lmcDdkhgdMdP/6iMMtg9dyhCWDc3+iSUyoB7f/9WAM/yGHmGFq25Vd6bXRR7CZcB+tog==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.91.0.tgz", + "integrity": "sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==", "dev": true, "license": "MIT", "dependencies": { @@ -428,7 +428,7 @@ "@typescript-eslint/types": "^8.65.0", "comment-parser": "1.4.7", "esquery": "^1.7.0", - "jsdoc-type-pratt-parser": "~7.3.0" + "jsdoc-type-pratt-parser": "~8.0.0" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" @@ -1333,14 +1333,14 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.0.4.tgz", - "integrity": "sha512-HGM8iAmGTf+Y7t0373szVbTmt3d7vPkYL/1bpOkOFO0YUYLgSeuYBCzESklogNPvOBnZ/MRD5f07OkpqH1trtA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.0.6.tgz", + "integrity": "sha512-B/gKoqlFkzhvzsI6jo9K1cZz9o5ypviVv/xu8CwA4grZzyVwN+XfkT+tu8T1zrauuEXv6VhS2oGX+6NL95WcKA==", "dev": true, "license": "Apache-2.0", "dependencies": { "modern-tar": "^0.7.6", - "yargs": "^17.7.2" + "yargs": "^18.0.0" }, "bin": { "browsers": "lib/main-cli.js" @@ -1349,140 +1349,18 @@ "node": ">=22.12.0" }, "peerDependencies": { - "proxy-agent": ">=8.0.1" + "proxy-agent": ">=8.0.1", + "yauzl": "^2.10.0 || ^3.4.0" }, "peerDependenciesMeta": { "proxy-agent": { "optional": true + }, + "yauzl": { + "optional": true } } }, - "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@puppeteer/browsers/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@puppeteer/browsers/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@puppeteer/browsers/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@puppeteer/browsers/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@puppeteer/browsers/node_modules/yargs": { - "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", - "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/@rollup/pluginutils": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", @@ -4002,9 +3880,9 @@ } }, "node_modules/chromium-bidi": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-16.0.1.tgz", - "integrity": "sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-17.0.2.tgz", + "integrity": "sha512-5v9GQFhTktFvotn/OFNJBmKLKRAb6n9r0bVCwf7sHgWc3/JryK0bj1nn93L3pHFrfgcsu6Be6EWsDi+1XHTGDg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4659,9 +4537,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1624250", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1624250.tgz", - "integrity": "sha512-YFAat/lOiIk0ARmBweG+ygrEcbZrq5B9urRyUoeQKp53MlidHXE2TmTbxKcaXoQj7u/aX+jebDO4BW55rs0WwA==", + "version": "0.0.1653615", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1653615.tgz", + "integrity": "sha512-pGVkY3T/qXxAp2nFPodwYqOevk6ncNMSmvL8QfRCx5ZWGd6Vor7AFNmyaA8Zs6uJyP1QAfjuLandCgvSix1BNA==", "dev": true, "license": "BSD-3-Clause" }, @@ -5074,13 +4952,13 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "63.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.1.tgz", - "integrity": "sha512-yVyTPtOY2tA8EjTwUtaM3pFxj9i/3m4/FSPMv5gMnDHSSleCpzIYQLyV8KnVmEIkkPpNhDlkDQ99mTfjxgqLxA==", + "version": "63.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.2.tgz", + "integrity": "sha512-5B3oO23iqbNJC/ru7uqIY80wmY66De1Q0+5kXQGHuLrGze/rL0Zw/YktMcqgYQ+kdHmgvY1q5TpRgl3yZMLmhQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.90.0", + "@es-joy/jsdoccomment": "~0.91.0", "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.7", @@ -6863,9 +6741,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.3.0.tgz", - "integrity": "sha512-DoyJXo7x/n48M3NsGOs9QnEws0ft0tV3YsSgvWMNxz2hZtz+Q6fpqUD96lVYX4a+jcEkzHeFNDJOn68TzXfbdA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-8.0.0.tgz", + "integrity": "sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==", "dev": true, "license": "MIT", "engines": { @@ -8271,9 +8149,9 @@ } }, "node_modules/pdfjs-dist": { - "version": "6.1.200", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.1.200.tgz", - "integrity": "sha512-o8MolyzirkkLrcdsae/HEOiIcXWI7DS5zGpvqW8xTC2YUsW30rltFw2bDGvw/fskUdEMrQm2br68jzDS5BH2vw==", + "version": "6.2.108", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-6.2.108.tgz", + "integrity": "sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -8684,18 +8562,18 @@ } }, "node_modules/puppeteer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.1.0.tgz", - "integrity": "sha512-7L6/0JM7XStK99lIL4xQySyNEXNfII6pk0BxkI5kKBTOhR7AsoQiv067YTsE/rIXxQiq9ajlO4WcqBjS/FWK1A==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-25.4.0.tgz", + "integrity": "sha512-xfQp8dFBcGaLc1hEMaVr7s+oW4ZkAurr8Y9H81ilKhu6QoLfSTkZjU7IavnyJ/VWpB9ni3KNJUQHUatslLWyGw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "3.0.4", - "chromium-bidi": "16.0.1", - "devtools-protocol": "0.0.1624250", + "@puppeteer/browsers": "3.0.6", + "chromium-bidi": "17.0.2", + "devtools-protocol": "0.0.1653615", "lilconfig": "^3.1.3", - "puppeteer-core": "25.1.0", + "puppeteer-core": "25.4.0", "typed-query-selector": "^2.12.2" }, "bin": { @@ -8706,18 +8584,18 @@ } }, "node_modules/puppeteer-core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.1.0.tgz", - "integrity": "sha512-jKzy5y4WG6uNuFbTWgW1D7mqoT9o0nllc/6a1DGF775T1mPmgw3scdFEtEq67yVFikavQmbYq6NLfbTfxHSlqQ==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.4.0.tgz", + "integrity": "sha512-K1plkLOdeoUnGeT1OvdqF3qxl33v+Ra/uH5VyPEhXdMcpvGiEskHzxxEU3fgpccJpJLIipB/rPUsvkZRWeKqOA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "3.0.4", - "chromium-bidi": "16.0.1", - "devtools-protocol": "0.0.1624250", + "@puppeteer/browsers": "3.0.6", + "chromium-bidi": "17.0.2", + "devtools-protocol": "0.0.1653615", "typed-query-selector": "^2.12.2", "webdriver-bidi-protocol": "0.4.2", - "ws": "^8.21.0" + "ws": "^8.21.1" }, "engines": { "node": ">=22.12.0" @@ -10945,9 +10823,9 @@ } }, "node_modules/webpack-cli": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.1.tgz", - "integrity": "sha512-YwSGbcZdfz12DM8JIseVPr3oBb09IgVCVc4vY3oDvZnI/mALTGPAP1QiqOi4/bBLSJrRHaqDIXeHcNA0+G38aw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.2.tgz", + "integrity": "sha512-lD0pALneslq8FfV+rwvm1BMW0AFAJrHHhNupAGN4asYjMvqrtRsenU4iKpiBo09gS4ntMxKGUxl9jhTEzVt0oA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 04dfa854775..fc18221e716 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "cross-env": "10.1.0", "eslint": "10.8.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-jsdoc": "63.3.1", + "eslint-plugin-jsdoc": "63.3.2", "eslint-plugin-local-rules": "3.0.2", "eslint-plugin-no-null": "1.0.2", "eslint-plugin-no-only-tests": "3.4.0", @@ -35,10 +35,10 @@ "mailparser": "3.9.14", "mkdirp": "3.0.1", "openpgp": "6.3.1", - "pdfjs-dist": "6.1.200", + "pdfjs-dist": "6.2.108", "postcss-html": "1.8.1", "prettier": "3.9.6", - "puppeteer": "25.1.0", + "puppeteer": "25.4.0", "stylelint": "17.14.1", "stylelint-config-standard": "40.0.0", "tap-xunit": "2.4.1", @@ -46,7 +46,7 @@ "typescript-eslint": "8.65.0", "undici-types": "8.9.0", "web-ext": "10.5.0", - "webpack-cli": "7.2.1" + "webpack-cli": "7.2.2" }, "dependencies": { "@flowcrypt/fine-uploader": "5.16.4", From 94ba52cc86ce5084af5a672a66f679f81fadc9ec Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 3 Aug 2026 11:06:49 +0300 Subject: [PATCH 2/4] updates --- package-lock.json | 242 +++++++++++++++++++++++----------------------- package.json | 6 +- 2 files changed, 124 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 83fba819b92..50cd099eda3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@tony.ganchev/eslint-plugin-header": "3.4.4", "@types/chai": "5.2.3", "@types/chai-as-promised": "8.0.2", - "@types/chrome": "0.2.2", + "@types/chrome": "0.2.5", "@types/fs-extra": "11.0.4", "@types/jquery": "4.0.1", "@types/mailparser": "3.4.6", @@ -41,7 +41,7 @@ "cross-env": "10.1.0", "eslint": "10.8.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-jsdoc": "63.3.2", + "eslint-plugin-jsdoc": "63.3.3", "eslint-plugin-local-rules": "3.0.2", "eslint-plugin-no-null": "1.0.2", "eslint-plugin-no-only-tests": "3.4.0", @@ -50,7 +50,7 @@ "globby": "16.2.2", "googleapis": "173.0.0", "husky": "9.1.7", - "lint-staged": "17.2.0", + "lint-staged": "17.3.0", "mailparser": "3.9.14", "mkdirp": "3.0.1", "openpgp": "6.3.1", @@ -559,9 +559,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -922,9 +922,9 @@ "license": "CC0-1.0" }, "node_modules/@napi-rs/canvas": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.2.tgz", - "integrity": "sha512-EYEqlMYaCbpZDz+IgDH5xp9MTd3ui4dmGqbQYryhMLnSRxrhHKq5KQWHHKxFUcEP4Hp8/BWgvqXocX4j7iSbOQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-1.0.3.tgz", + "integrity": "sha512-OlI657a5XXvKGFX7kNeIzJ8rO7IXt87Mqu2H8rXE46viAuOfum/JA7ysX7+eBhxNKznT+RCZh418mndlcFX3+w==", "dev": true, "license": "MIT", "optional": true, @@ -939,23 +939,23 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "1.0.2", - "@napi-rs/canvas-darwin-arm64": "1.0.2", - "@napi-rs/canvas-darwin-x64": "1.0.2", - "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.2", - "@napi-rs/canvas-linux-arm64-gnu": "1.0.2", - "@napi-rs/canvas-linux-arm64-musl": "1.0.2", - "@napi-rs/canvas-linux-riscv64-gnu": "1.0.2", - "@napi-rs/canvas-linux-x64-gnu": "1.0.2", - "@napi-rs/canvas-linux-x64-musl": "1.0.2", - "@napi-rs/canvas-win32-arm64-msvc": "1.0.2", - "@napi-rs/canvas-win32-x64-msvc": "1.0.2" + "@napi-rs/canvas-android-arm64": "1.0.3", + "@napi-rs/canvas-darwin-arm64": "1.0.3", + "@napi-rs/canvas-darwin-x64": "1.0.3", + "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.3", + "@napi-rs/canvas-linux-arm64-gnu": "1.0.3", + "@napi-rs/canvas-linux-arm64-musl": "1.0.3", + "@napi-rs/canvas-linux-riscv64-gnu": "1.0.3", + "@napi-rs/canvas-linux-x64-gnu": "1.0.3", + "@napi-rs/canvas-linux-x64-musl": "1.0.3", + "@napi-rs/canvas-win32-arm64-msvc": "1.0.3", + "@napi-rs/canvas-win32-x64-msvc": "1.0.3" } }, "node_modules/@napi-rs/canvas-android-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.2.tgz", - "integrity": "sha512-IMXKVQod0ol4vt3gmClUfXz4JAgHYESGPCUqmH3lQxBoL0K/2greJaQE1HVBVxWWFKfLc4OLZVdxg7kXVyXv+g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-1.0.3.tgz", + "integrity": "sha512-7kSCdUhoXiO+AaIMXdBGdtp6EctZNkmF62Rea/BmVQlwKaM3bBhOzyGUzxyxz9dv5vdBfpyAaxhSRSJF4kqK4A==", "cpu": [ "arm64" ], @@ -974,9 +974,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.2.tgz", - "integrity": "sha512-Sc8tPi6cF+5lqOzCCKFALJHhDiRwyMzTPYm3bbhdXsOunU0lQO5f05ucyOzN2r55I23Hg5bsjH63uSCvWp3EgQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-ds14V1BPagLszQyaDTeggny5fNeTCqsUQ5QhFj9VDxSEfzrVxXtdbR0LoFyKa0Siaaw8KvqSk4t7k/WoZJwvbg==", "cpu": [ "arm64" ], @@ -995,9 +995,9 @@ } }, "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.2.tgz", - "integrity": "sha512-niDXZ9LhKB1zLrUdYB64RHQFDGz9rr0eGx061qtJJU3U20EMMIx28ADF5fVYbhtOgkWQrBjFicfaye1yM0U62A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-1.0.3.tgz", + "integrity": "sha512-qof3LRAAycmkV2I1izZo9RoSHF8kCQr5O05sFwv0jK8rSdYV6KHVwimo6Qb7RxZj40WHKbLHm5JDaUF0o5XUAA==", "cpu": [ "x64" ], @@ -1016,9 +1016,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.2.tgz", - "integrity": "sha512-sgatQL9JxGRH/Amzcvu0P3t8Am3duou74CisfuJ41Dwt8cWy723z/9KZ8LlgmxfypEwEZxSTNFJtU8d281lmhQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-FU2kKZLmolHA9+KcUA+l1+xH3WTLUUTQDU/kLv9SEUr2TrRPu94aytOeizFJDHPs/QBcw4QL1mCQhetQXYBbag==", "cpu": [ "arm" ], @@ -1037,9 +1037,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.2.tgz", - "integrity": "sha512-dgKuX0peF3xwY6ZF5QxGS4wbfDqpoFAJYXiLSp+guZKARQUKMkRqZSDrXKj7nfrec3UCMzC0PFCPte0ES98AiA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-GVSjntxKeA+/y/ZKf1F+cmUw1WeIkE5aMRPqnZUlBTBvBcrvgWccJAWuYCKPX4QJQwZILIIwhgdAbl51yj6fpA==", "cpu": [ "arm64" ], @@ -1061,9 +1061,9 @@ } }, "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.2.tgz", - "integrity": "sha512-qwROoDIC9upfvDoRLuPn2aNg9CGW1x0Ygr4k2Or+8paA9d0qBLwk87U+g8KQpoOviKoPoiwl97kvBYuYD7qZoA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-J51oK/axyZ13kxycumSMfLiDZMdWdOVvqDFI28BpuViZHE3A0bQfr8B5vg8YnPEnqLD3BSn1hkdlh2buspEcNQ==", "cpu": [ "arm64" ], @@ -1085,9 +1085,9 @@ } }, "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.2.tgz", - "integrity": "sha512-fXRjnPihdnbO6qy1QQOgxAonb68A0TCEG7rj1x7v7rxNElsE8EVIKIEUTvyDtU+sthYSbX+8e7g3oZiLGnOmxw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-1.0.3.tgz", + "integrity": "sha512-CtQgQjoVTX67jS9XuCTtJ40Sl7wRLMguoFnnGnfDmCWf7kzKFZVwj5ynqUOIGKFMSB61ZCuQlwPvVNxYTTseaw==", "cpu": [ "riscv64" ], @@ -1109,9 +1109,9 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.2.tgz", - "integrity": "sha512-nPR97DXhbWIAy7yazF3jc06kEPMqYMLmPzFOVNlwKPfIoSChnI+x7dc0hTLaihz3jxrjL6j4BbA7earxfx4X3g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-jtfzAHFp+FRaR7zGT4jyCe6wUgAG/dVb5A4Apd8FY9jKarntDfUAlJXscugiH7ZF5kKnu7/lHFk9LaDPcrGEVQ==", "cpu": [ "x64" ], @@ -1133,9 +1133,9 @@ } }, "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.2.tgz", - "integrity": "sha512-l7zZY5+jL5qnBZtDz7CoBtY6p7EkHu422g/0zWwrOrzIwWyWxZFRfZZORY1UG7YApymPLx+UbOkN206xXn/c1Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-xTzaUCKUHTY4bCGadeeRZggbRVbGUT1petg7Z8r9AJR2+D9Bqu6nQAgqBGC6D47tA70LjaaaLTrJ7wNY1T74dg==", "cpu": [ "x64" ], @@ -1157,9 +1157,9 @@ } }, "node_modules/@napi-rs/canvas-win32-arm64-msvc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.2.tgz", - "integrity": "sha512-yE0koHCFF4PIbMc2o2SEALhnipz7WBISh5glLvQiomtIoCcW0np3H4Lw93ceJAfJttTTeIIWFbwH84F7EVzjMQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-arm64-msvc/-/canvas-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-ktVLuBkI6QVOm5BwO/WbdGwxgeetAMJa7TTmR8qBarXF0OU2NKjvjUtPJAl2y8t+zBRczJl/1VOl9gua6WcK2g==", "cpu": [ "arm64" ], @@ -1178,9 +1178,9 @@ } }, "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.2.tgz", - "integrity": "sha512-okU8/t2foV6C31n0GtvEMbfD5rOFc70+/6xUNME9Guld29sgSOIGUEDScAWFlcP3k5TYQRl9TNkwJEEjh15w8A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-SGhlQ8bDjL1Cz2KnsKMasr/5sTcwG/SZkB6WCJxLsmSm/3aS2C+3p39bA7iZ2/94+NkVDySZfbiGoaSZSFHYxA==", "cpu": [ "x64" ], @@ -1459,9 +1459,9 @@ } }, "node_modules/@types/chrome": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.2.2.tgz", - "integrity": "sha512-8rSMZ4cvo2xmaSyQg0sN5yRL7oiDkntLoiHxUhfwQnv1mvnkrdoZ25SlNrKWmYKaeP50WvrfWj1pmc02+U9KKw==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.2.5.tgz", + "integrity": "sha512-DwLFgwj3D0zjxRBhQ3610RBso2g+yI1cakq/JdIGopZ9Bc5UhQluyfcLGZwivFE4t2h4b2QZYZhPV7KylExSbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1568,9 +1568,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", "dev": true, "license": "MIT", "dependencies": { @@ -2479,9 +2479,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", "bin": { @@ -2680,9 +2680,9 @@ "license": "MIT" }, "node_modules/addons-linter/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3408,9 +3408,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.4.tgz", - "integrity": "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==", + "version": "2.11.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.11.tgz", + "integrity": "sha512-/yImnXwyTvgMkhgekLHok/Rx5vO6E0BmStWlSqKWMVm2a2ITuZ1Tn+9bgLS+gZRdZmWtd8nxuhHpdmCUOWsTQQ==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -3543,9 +3543,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", - "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { @@ -4680,9 +4680,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.396", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz", - "integrity": "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==", + "version": "1.5.399", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", "dev": true, "license": "ISC", "peer": true @@ -4732,9 +4732,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", - "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", "peer": true, @@ -4952,9 +4952,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "63.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.2.tgz", - "integrity": "sha512-5B3oO23iqbNJC/ru7uqIY80wmY66De1Q0+5kXQGHuLrGze/rL0Zw/YktMcqgYQ+kdHmgvY1q5TpRgl3yZMLmhQ==", + "version": "63.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.3.tgz", + "integrity": "sha512-xI4IeVRzRFA2DGHrPLIxF3U+oJHU3FE+P9Zb27fVs5dPHgfcpoAs0PyCbznVhK7pwR+9BPUztFeXSgpw/CL4Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5238,9 +5238,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true, "funding": [ { @@ -5468,9 +5468,9 @@ } }, "node_modules/flatted": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", - "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -6718,9 +6718,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, "funding": [ { @@ -7064,9 +7064,9 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.2.0.tgz", - "integrity": "sha512-FchGnFe4i4B1C/a35SPU9bNGPEHSC1+1iV0plLjzBmKVe9klZrlRfSgK6Cw4VeHyqOXbJUXP0vON61uRftNQ0A==", + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.3.0.tgz", + "integrity": "sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==", "dev": true, "license": "MIT", "dependencies": { @@ -7415,13 +7415,13 @@ } }, "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^5.0.5" + "brace-expansion": "^5.0.8" }, "engines": { "node": "18 || 20 || >=22" @@ -7592,9 +7592,9 @@ "license": "MIT" }, "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", - "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -8324,9 +8324,9 @@ } }, "node_modules/postcss": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", - "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "dev": true, "funding": [ { @@ -8489,9 +8489,9 @@ "license": "MIT" }, "node_modules/process-warning": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.0.tgz", + "integrity": "sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==", "dev": true, "funding": [ { @@ -8880,9 +8880,9 @@ "license": "MIT" }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", - "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -9837,9 +9837,9 @@ } }, "node_modules/supertap/node_modules/js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, "license": "MIT", "dependencies": { @@ -10061,9 +10061,9 @@ } }, "node_modules/tap-parser/node_modules/js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, "license": "MIT", "dependencies": { @@ -10212,9 +10212,9 @@ } }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "dev": true, "license": "MIT", "engines": { @@ -10778,9 +10778,9 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.109.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.0.tgz", - "integrity": "sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==", + "version": "5.109.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.2.tgz", + "integrity": "sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==", "dev": true, "license": "MIT", "peer": true, @@ -10793,7 +10793,7 @@ "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.24.2", + "enhanced-resolve": "^5.24.4", "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/package.json b/package.json index fc18221e716..2f12a4db83d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@tony.ganchev/eslint-plugin-header": "3.4.4", "@types/chai": "5.2.3", "@types/chai-as-promised": "8.0.2", - "@types/chrome": "0.2.2", + "@types/chrome": "0.2.5", "@types/fs-extra": "11.0.4", "@types/jquery": "4.0.1", "@types/mailparser": "3.4.6", @@ -22,7 +22,7 @@ "cross-env": "10.1.0", "eslint": "10.8.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-jsdoc": "63.3.2", + "eslint-plugin-jsdoc": "63.3.3", "eslint-plugin-local-rules": "3.0.2", "eslint-plugin-no-null": "1.0.2", "eslint-plugin-no-only-tests": "3.4.0", @@ -31,7 +31,7 @@ "globby": "16.2.2", "googleapis": "173.0.0", "husky": "9.1.7", - "lint-staged": "17.2.0", + "lint-staged": "17.3.0", "mailparser": "3.9.14", "mkdirp": "3.0.1", "openpgp": "6.3.1", From aadeb6cd16a0febe173a8b9fc81573bf1f4b9913 Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 3 Aug 2026 15:43:21 +0300 Subject: [PATCH 3/4] fix tests --- .../compose-recipients-module.ts | 4 +- test/source/browser/browser-handle.ts | 1 + test/source/tests/compose.ts | 63 ++++++++++++++----- test/source/tests/decrypt.ts | 13 +++- test/source/tests/flaky.ts | 7 ++- .../tests/page-recipe/compose-page-recipe.ts | 22 +++++-- 6 files changed, 81 insertions(+), 29 deletions(-) diff --git a/extension/chrome/elements/compose-modules/compose-recipients-module.ts b/extension/chrome/elements/compose-modules/compose-recipients-module.ts index 55bd1a601cf..ac046ce3f26 100644 --- a/extension/chrome/elements/compose-modules/compose-recipients-module.ts +++ b/extension/chrome/elements/compose-modules/compose-recipients-module.ts @@ -774,8 +774,8 @@ export class ComposeRecipientsModule extends ViewModule { }; private renderSearchRes = async (input: JQuery, contacts: ContactPreview[], query: ProviderContactsQuery) => { - if (!input.is(':focus')) { - // focus was moved away from input + if (input.get(0) !== document.activeElement) { + // Browser-level focus may move to an OAuth popup while the recipient input remains active in this document. return; } if ((input.val() as string).toLowerCase() !== query.substring.toLowerCase()) { diff --git a/test/source/browser/browser-handle.ts b/test/source/browser/browser-handle.ts index 7c71f60b9fa..2b6ccfc7c6e 100644 --- a/test/source/browser/browser-handle.ts +++ b/test/source/browser/browser-handle.ts @@ -39,6 +39,7 @@ export class BrowserHandle { }); } await page.setViewport(this.viewport); + await page.bringToFront(); const controllablePage = new ControllablePage(t, page); if (url) { if (initialScript) { diff --git a/test/source/tests/compose.ts b/test/source/tests/compose.ts index 86966be95ef..2efb9aa2a3a 100644 --- a/test/source/tests/compose.ts +++ b/test/source/tests/compose.ts @@ -109,10 +109,12 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te testWithBrowser(async (t, browser) => { const primarySignature = 'Test primary signature'; const aliasSignature = 'Test alias signature'; - const acctAliases = [{ - ...flowcryptCompatibilityAliasList[0], - signature: aliasSignature, - }]; + const acctAliases = [ + { + ...flowcryptCompatibilityAliasList[0], + signature: aliasSignature, + }, + ]; await BrowserRecipe.setupCommonAcctWithAttester(t, browser, 'compatibility', { google: { acctAliases, acctPrimarySignature: primarySignature }, attester: { includeHumanKey: true }, @@ -1677,8 +1679,8 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te const oauthPopup = await browser.newPageTriggeredBy(t, () => composePage.waitAndClick('@action-auth-with-contacts-scope')); await OauthPageRecipe.google(t, oauthPopup, acct, 'approve'); } - await Util.sleep(3); await ComposePageRecipe.expectContactsResultEqual(composePage, ['contact.test@flowcrypt.com']); + await composePage.page.bringToFront(); // re-load the compose window, expect that it remembers scope was connected, and remembers the contact composePage = await ComposePageRecipe.openStandalone(t, browser, 'compose'); await composePage.waitAndClick('@action-show-cc'); @@ -1710,15 +1712,28 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te await Util.sleep(2); await ComposePageRecipe.showRecipientInput(composePage); await composePage.type('@input-to', 'contact'); + const loadingIconSelector = '[data-test="pgp-loading-icon"]'; + const waitForLoadingIcon = (timeout: number) => + composePage.target.waitForFunction( + selector => { + const loadingIcon = document.querySelector(selector); + return Boolean(loadingIcon?.offsetWidth && loadingIcon.offsetHeight); + }, + { polling: 'mutation', timeout }, + loadingIconSelector + ); if (testVariant === 'CONSUMER-MOCK') { // allow contacts scope + const loadingIconAppeared = waitForLoadingIcon(90_000); + // Popup creation can fail before Promise.all observes this waiter. + void loadingIconAppeared.catch(() => undefined); const oauthPopup = await browser.newPageTriggeredBy(t, () => composePage.waitAndClick('@action-auth-with-contacts-scope')); - await OauthPageRecipe.google(t, oauthPopup, account, 'approve'); + await Promise.all([loadingIconAppeared, OauthPageRecipe.google(t, oauthPopup, account, 'approve')]); + await composePage.page.bringToFront(); + } else { + await waitForLoadingIcon(20_000); } - await Util.sleep(1); - await composePage.waitAll('@pgp-loading-icon'); - await Util.sleep(3); // Wait for 3 seconds to allow PGP status update and loading icon to disappear - await composePage.notPresent('@pgp-loading-icon'); + await composePage.target.waitForFunction(selector => !document.querySelector(selector), { polling: 'mutation', timeout: 20_000 }, loadingIconSelector); }) ); @@ -1922,8 +1937,6 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te }) ); - - test( 'compose - check existing draft not saved without changes', testWithBrowser(async (t, browser) => { @@ -2185,8 +2198,27 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te // focus the 1st one const firstFrameId = /frameId=.*?&/s.exec(framesUrls[0])![0]; const firstComposeFrame = await inboxPage.getFrame(['compose.htm', firstFrameId]); - await inboxPage.waitAndFocus('iframe'); + await inboxPage.waitAndFocus('.secure_compose_window[data-order="1"] iframe'); await firstComposeFrame.waitAndFocus('@input-body'); + await inboxPage.target.waitForFunction( + () => { + const firstCompose = document.querySelector('.secure_compose_window[data-order="1"]'); + const secondCompose = document.querySelector('.secure_compose_window[data-order="2"]'); + const thirdCompose = document.querySelector('.secure_compose_window[data-order="3"]'); + if (!firstCompose || !secondCompose || !thirdCompose) { + return false; + } + return ( + firstCompose.classList.contains('active') && + !firstCompose.classList.contains('previous_active') && + !secondCompose.classList.contains('active') && + !secondCompose.classList.contains('previous_active') && + !thirdCompose.classList.contains('active') && + thirdCompose.classList.contains('previous_active') + ); + }, + { polling: 'mutation', timeout: 20_000 } + ); // make sure the 1st compose window is active, and the 3rd is previous_active expect(await inboxPage.hasClass('.secure_compose_window[data-order="1"]', 'active')).to.be.true; expect(await inboxPage.hasClass('.secure_compose_window[data-order="2"]', 'active')).to.be.false; @@ -3511,8 +3543,9 @@ const sendTextAndVerifyPresentInSentMsg = async ( text: string, sendingOpt: { encrypt?: boolean; sign?: boolean; richtext?: boolean } = {} ) => { - const subject = `Test Sending ${sendingOpt.sign ? 'Signed' : ''} ${sendingOpt.encrypt ? 'Encrypted' : '' - } Message With Test Text ${text} ${Util.lousyRandom()}`; + const subject = `Test Sending ${sendingOpt.sign ? 'Signed' : ''} ${ + sendingOpt.encrypt ? 'Encrypted' : '' + } Message With Test Text ${text} ${Util.lousyRandom()}`; const composePage = await ComposePageRecipe.openStandalone(t, browser, 'compatibility'); await ComposePageRecipe.fillMsg(composePage, { to: 'human@flowcrypt.com' }, subject, text, sendingOpt); const acctEmail = 'flowcrypt.compatibility@gmail.com'; diff --git a/test/source/tests/decrypt.ts b/test/source/tests/decrypt.ts index 3a75c3be83c..19885b415f0 100644 --- a/test/source/tests/decrypt.ts +++ b/test/source/tests/decrypt.ts @@ -1673,14 +1673,21 @@ XZ8r4OC6sguP/yozWlkG+7dDxsgKQVBENeG6Lw== 'decrypt - public key is rendered minimized for outgoing messages', testWithBrowser(async (t, browser) => { const assertOutgoingPubkeyFrameIsMinimized = async (page: ControllablePage) => { + await page.waitAll('iframe.pgp_block.publicKey', { timeout: 30 }); const pubkeyFrame = await page.getFrame(['pgp_pubkey.htm', 'minimized=___cu_true___'], { timeout: 30 }); - await pubkeyFrame.waitForContent('@container-pgp-pubkey', 'Public Key', 30); await pubkeyFrame.target.waitForFunction( () => { + const pubkeyContainer = document.querySelector('[data-test="container-pgp-pubkey"]'); const addContactButton = document.querySelector('[data-test="action-add-contact"]'); - return Boolean(addContactButton && !addContactButton.offsetHeight); + return Boolean( + pubkeyContainer?.innerText.includes('Public Key') && + pubkeyContainer.offsetWidth && + pubkeyContainer.offsetHeight && + addContactButton && + !addContactButton.offsetHeight + ); }, - { timeout: 30_000 } + { polling: 100, timeout: 30_000 } ); expect(await pubkeyFrame.isElementVisible('@action-add-contact')).to.be.false; // hidden because sender matches acctEmail }; diff --git a/test/source/tests/flaky.ts b/test/source/tests/flaky.ts index 2207475db1a..892a30f83f3 100644 --- a/test/source/tests/flaky.ts +++ b/test/source/tests/flaky.ts @@ -325,7 +325,7 @@ export const defineFlakyTests = (testVariant: TestVariant, testWithBrowser: Test 'confirm', 'cancel', 'Messages to some recipients were sent successfully, while messages to flowcrypt.compatibility@gmail.com, Mr Cc ' + - 'encountered error(s) from Gmail. Please help us improve FlowCrypt by reporting the error to us.' + 'encountered error(s) from Gmail. Please help us improve FlowCrypt by reporting the error to us.' ); await composePage.close(); expect((await GoogleData.withInitializedData(acct)).searchMessagesBySubject(subject).length).to.equal(++expectedNumberOfPassedMessages); @@ -350,7 +350,7 @@ export const defineFlakyTests = (testVariant: TestVariant, testWithBrowser: Test 'error', 'confirm', 'Messages to some recipients were sent successfully, while messages to invalid@example.com ' + - 'encountered error(s) from Gmail: Invalid recipients\n\nPlease remove recipients, add them back and re-send the message.' + 'encountered error(s) from Gmail: Invalid recipients\n\nPlease remove recipients, add them back and re-send the message.' ); await composePage.close(); expect((await GoogleData.withInitializedData(acct)).searchMessagesBySubject(subject).length).to.equal(++expectedNumberOfPassedMessages); @@ -375,7 +375,7 @@ export const defineFlakyTests = (testVariant: TestVariant, testWithBrowser: Test 'error', 'confirm', 'Messages to some recipients were sent successfully, while messages to timeout@example.com ' + - 'encountered network errors. Please check your internet connection and try again.' + 'encountered network errors. Please check your internet connection and try again.' ); await composePage.close(); expect((await GoogleData.withInitializedData(acct)).searchMessagesBySubject(subject).length).to.equal(++expectedNumberOfPassedMessages); @@ -568,6 +568,7 @@ export const defineFlakyTests = (testVariant: TestVariant, testWithBrowser: Test 'testsearchorder7@flowcrypt.com', 'testsearchorder8@flowcrypt.com', ]); + await inboxPage.page.bringToFront(); await composeFrame.waitAndClick('@action-close-new-message'); await inboxPage.waitTillGone('@container-new-message'); // add key + send diff --git a/test/source/tests/page-recipe/compose-page-recipe.ts b/test/source/tests/page-recipe/compose-page-recipe.ts index 8ebd56eabd5..88bcb4c21cf 100644 --- a/test/source/tests/page-recipe/compose-page-recipe.ts +++ b/test/source/tests/page-recipe/compose-page-recipe.ts @@ -171,12 +171,22 @@ export class ComposePageRecipe extends PageRecipe { }; public static expectContactsResultEqual = async (composePage: ControllablePage | ControllableFrame, emails: string[]) => { - await Util.sleep(5); - const contacts = await composePage.waitAny('@container-contacts'); - const contactsList = await contacts.$$('li'); - for (const [index, contact] of contactsList.entries()) { - expect(await PageRecipe.getElementPropertyJson(contact, 'textContent')).to.equal(emails[index]); - } + const contactsSelector = '[data-test="container-contacts"]'; + const result = await composePage.target.waitForFunction( + (selector, expectedEmails) => { + const contactsContainer = document.querySelector(selector); + if (!contactsContainer?.offsetWidth || !contactsContainer.offsetHeight) { + return false; + } + const actualEmails = Array.from(contactsContainer.querySelectorAll('li'), contact => contact.textContent); + return actualEmails.length === expectedEmails.length && actualEmails.every((email, index) => email === expectedEmails[index]) ? actualEmails : false; + }, + { polling: 'mutation', timeout: 20_000 }, + contactsSelector, + emails + ); + expect(await result.jsonValue()).to.deep.equal(emails); + await result.dispose(); }; public static pastePublicKeyManuallyNoClose = async (composeFrame: ControllableFrame, inboxPage: ControllablePage, recipient: string, pub: string) => { From e87583d6367971569978f815640ac2a05226055c Mon Sep 17 00:00:00 2001 From: Roma Sosnovsky Date: Mon, 3 Aug 2026 16:32:30 +0300 Subject: [PATCH 4/4] fix tests --- test/source/tests/compose.ts | 2 +- test/source/tests/decrypt.ts | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/test/source/tests/compose.ts b/test/source/tests/compose.ts index 2efb9aa2a3a..b3ceaa1a1a3 100644 --- a/test/source/tests/compose.ts +++ b/test/source/tests/compose.ts @@ -2199,7 +2199,7 @@ export const defineComposeTests = (testVariant: TestVariant, testWithBrowser: Te const firstFrameId = /frameId=.*?&/s.exec(framesUrls[0])![0]; const firstComposeFrame = await inboxPage.getFrame(['compose.htm', firstFrameId]); await inboxPage.waitAndFocus('.secure_compose_window[data-order="1"] iframe'); - await firstComposeFrame.waitAndFocus('@input-body'); + await firstComposeFrame.waitAndClick('@input-body'); await inboxPage.target.waitForFunction( () => { const firstCompose = document.querySelector('.secure_compose_window[data-order="1"]'); diff --git a/test/source/tests/decrypt.ts b/test/source/tests/decrypt.ts index 19885b415f0..451d3952c54 100644 --- a/test/source/tests/decrypt.ts +++ b/test/source/tests/decrypt.ts @@ -1678,18 +1678,11 @@ XZ8r4OC6sguP/yozWlkG+7dDxsgKQVBENeG6Lw== await pubkeyFrame.target.waitForFunction( () => { const pubkeyContainer = document.querySelector('[data-test="container-pgp-pubkey"]'); - const addContactButton = document.querySelector('[data-test="action-add-contact"]'); - return Boolean( - pubkeyContainer?.innerText.includes('Public Key') && - pubkeyContainer.offsetWidth && - pubkeyContainer.offsetHeight && - addContactButton && - !addContactButton.offsetHeight - ); + const addContactLine = document.querySelector('.line.add_contact'); + return Boolean(pubkeyContainer?.textContent?.includes('Public Key') && addContactLine?.style.display === 'none'); }, - { polling: 100, timeout: 30_000 } + { polling: 'mutation', timeout: 30_000 } ); - expect(await pubkeyFrame.isElementVisible('@action-add-contact')).to.be.false; // hidden because sender matches acctEmail }; const { acctEmail, authHdr } = await BrowserRecipe.setupCommonAcctWithAttester(t, browser, 'ci.tests.gmail');