diff --git a/package.json b/package.json index 7e5c87bd53e3..809c415e04b7 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,10 @@ "cli-setup": "pnpm install && jetpack cli link", "cli-unlink": "jetpack cli unlink", "lint": "pnpm run lint-file .", + "lint:js:prune-suppressions": "node tools/eslint/lint-js.cjs --prune-suppressions .", + "lint:js:update-suppressions": "node tools/eslint/lint-js.cjs --suppress-rule @wordpress/use-recommended-components .", "lint-changed": "eslint-changed --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.svelte --eslint-options flags='[\"v10_config_lookup_from_file\"]' --git", - "lint-file": "eslint --flag v10_config_lookup_from_file", + "lint-file": "node tools/eslint/lint-js.cjs", "lint-required": "ESLINT_IGNORE_REQUIRED=1 pnpm run lint --max-warnings=0", "lint-style": "stylelint --allow-empty-input --globby-options '{\"gitignore\":true,\"ignore\":[\"tools/docker/data\",\"**/vendor/**\",\"**/jetpack_vendor/**\"]}'", "php:autofix": "composer phpcs:fix", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2066eea14f01..0e06962a88bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6056,8 +6056,8 @@ importers: specifier: 7.0.0-dev.20260225.1 version: 7.0.0-dev.20260225.1 '@wordpress/eslint-plugin': - specifier: 25.0.0 - version: 25.0.0(@babel/core@7.29.0)(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.15.0(eslint@9.39.4)(jest@30.3.0)(typescript@5.9.3))(eslint-plugin-jsdoc@62.8.0(eslint@9.39.4))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4))(eslint-plugin-playwright@2.10.0(eslint@9.39.4))(eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint@9.39.4)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.4))(eslint-plugin-react@7.37.5(eslint@9.39.4))(eslint@9.39.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3))(typescript@5.9.3)(wp-prettier@3.0.3) + specifier: 25.1.0 + version: 25.1.0(@babel/core@7.29.0)(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.15.0(eslint@9.39.4)(jest@30.3.0)(typescript@5.9.3))(eslint-plugin-jsdoc@62.8.0(eslint@9.39.4))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4))(eslint-plugin-playwright@2.10.0(eslint@9.39.4))(eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint@9.39.4)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.4))(eslint-plugin-react@7.37.5(eslint@9.39.4))(eslint@9.39.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3))(typescript@5.9.3)(wp-prettier@3.0.3) '@wordpress/jest-console': specifier: 8.44.0 version: 8.44.0(jest@30.3.0) @@ -10386,8 +10386,8 @@ packages: peerDependencies: '@babel/core': ^7.25.7 - '@wordpress/babel-preset-default@8.44.0': - resolution: {integrity: sha512-6EQW8ysiQkct2MolHlhyqXfZ/Vgl0Cu9dCeHfPEf7S/8575qua1GnuDSFzEqU/8TIrEG88f2e2qP/R7VRB+EwQ==} + '@wordpress/babel-preset-default@8.45.0': + resolution: {integrity: sha512-xlrFFf8bsVDpOjzDW4dwkY8w040YupOIeRSVPB1FJyHBae8ObR+p2siM6E8/DrLNuDznudYoUFRnojYQ16ImjQ==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} '@wordpress/base-styles@6.20.0': @@ -10433,6 +10433,10 @@ packages: resolution: {integrity: sha512-lYtkO7U7ok9RfRBIHWvVWXhcOys6cQuLfwFr1bGuPTE6+LmVHmRyniMnImZlG8Jb3XE4pvH8gXT1ecXogpDI2Q==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/browserslist-config@6.45.0': + resolution: {integrity: sha512-iSRD/0bxD9PUHWssZN1zZa+xZ2E9FtpgNYKeceTPLKV3rd+rRPqI1h2a2iHboLzex80c1vaxe6eQ9kyZQfGtiA==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/build@0.13.0': resolution: {integrity: sha512-a442H7Kh1hW1b9UH8DZzqLaxYAspe84/dWDRyep1R3YZFx2TcMCBs1tAF96xzvli5pN83PAN/gscv2DfNYBHyw==} engines: {node: '>=20.10.0', npm: '>=10.2.3'} @@ -10544,12 +10548,20 @@ packages: resolution: {integrity: sha512-kVCRSwGMPFu7oBcAzN0VzwFQw3mwctUb/TEHkGeG5An1Uus6olruGJyvFwkHNtO9WRCdTXXunUaSk0CIA9+Wig==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/element@6.45.0': + resolution: {integrity: sha512-WFrGNPEnj8uE+XhFW9NVbxvqraYpConaEokLv9IszFYVfyg8juXSQcHOAfEnxjC08HBPfVcayr2igu/XUgGOAw==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/escape-html@3.44.0': resolution: {integrity: sha512-nAEshSe6IYFr3G8sfY8o9pYNTRKvxocQ3DXs3KUesmdaEtrtJSlDmrMOI3FIgaYfv1PP6d+cDZpsygp6IZGo2w==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} - '@wordpress/eslint-plugin@25.0.0': - resolution: {integrity: sha512-GYOPtbsibtFWmvFHm4ZBKUM16SREBcvpVHUuQLfh2s/CQtTP9kbC25XHmIdp0by77i2FDFvEtVGHo7aswoiRCA==} + '@wordpress/escape-html@3.45.0': + resolution: {integrity: sha512-IW4mnA+65XKhABuBkwrQNAlbq97luC6ZIBfdSq0Tkq+AFPqE1lJTMlLo7iBkTpsHsBLyznViPXultq40fz8L7w==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + + '@wordpress/eslint-plugin@25.1.0': + resolution: {integrity: sha512-tZVfrpAZoUNQ2A03XA8nVgfejb5lINPZUvbZcg8ZlTB4Bf58daLx5XOw3zIH4ubdS+t4paRslgrdnbCCpqX4Zg==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} peerDependencies: '@babel/core': '>=7' @@ -10721,8 +10733,8 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@wordpress/prettier-config@4.44.0': - resolution: {integrity: sha512-RT8Pc/dGOhMM9PwCsPamhkpIYx6zjTUDBIs/huVYKusByXImXQFoeZmaI3nK/UNus55woW6xyNNWdb2/nvvXgw==} + '@wordpress/prettier-config@4.45.0': + resolution: {integrity: sha512-Tj8wdH/+uwFOYbyhaQKrfe9WjtCnmGEoOi2i5zQ5KF3NgrdYgfv7ADMnd/fMW2vffxWAZvGjelvH1jybhY6XJA==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} peerDependencies: prettier: '>=3' @@ -10741,6 +10753,10 @@ packages: resolution: {integrity: sha512-fTR1HRshYIrN4yau/Z+zxY+oRFnJz/LS8XGeXx43PT5O4B25+4kO41ApdS9FG56erg8HqUB6HoqDUcReT5pzlQ==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/private-apis@1.45.0': + resolution: {integrity: sha512-UjhIDpoyKKUghPM0tkqd5Whsuk4kqfAfhb5VYGoEYtunDs0rB8IxgFO7hE0PhimHL74QVgaJOlprRZVRCCoQ6w==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/react-i18n@4.43.0': resolution: {integrity: sha512-NASm8oHzEtZsHeqR4vnM27/j//zbojJUefZ4LMXCp2LlCWn63dJMYb8JVMOJtp9rYDwKx0UzztBnVsoN/4H2lA==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} @@ -10813,6 +10829,17 @@ packages: stylelint: optional: true + '@wordpress/theme@0.12.0': + resolution: {integrity: sha512-AmEVO0B+kI9tsxkLnna/S+7yi+EPCMTuaPqagje7pnlXeDfykVQfeDeWJfU+QvhcqHXCySn89vvw1Ihep0rj7w==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + stylelint: '>=16.8.2' + peerDependenciesMeta: + stylelint: + optional: true + '@wordpress/token-list@3.44.0': resolution: {integrity: sha512-+96NDDOC6vA/DQnRk/fnnmLylnZXEpMctklNOdztgpdwrXSsM+LoPoksaOYrmswPUxayzlHPBBbO/5rZ72g7zQ==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} @@ -10857,6 +10884,10 @@ packages: resolution: {integrity: sha512-avxdbIYhDuUh2qi2oiq7KeqYOVv2RubqV8UI/Q7bctZSFSXJE8RQGSR/W2YjABeyWBIjlyX/U5lOxVs2PIfy/w==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/warning@3.45.0': + resolution: {integrity: sha512-NQ9tAhPdwhfceVIzWra1rbumvgAFAEDTgZlWsX880zLiq1F8JTwBouwW6wfIhA3XLcY6Yj7cBBYLa8vnNiDZDw==} + engines: {node: '>=18.12.0', npm: '>=8.19.2'} + '@wordpress/widgets@4.44.0': resolution: {integrity: sha512-wYTWr6/CBip7ZMNwwiV/UyB5mi7W4wR8IU8HcZKwxg/H+Nmwb8MKnVurmAKuxHZvbsmlzLVuBLDqzA5yL1XfmQ==} engines: {node: '>=18.12.0', npm: '>=8.19.2'} @@ -23224,7 +23255,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 - '@wordpress/babel-preset-default@8.44.0': + '@wordpress/babel-preset-default@8.45.0': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) @@ -23232,8 +23263,8 @@ snapshots: '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) '@babel/preset-env': 7.29.2(@babel/core@7.29.0) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@wordpress/browserslist-config': 6.44.0 - '@wordpress/warning': 3.44.0 + '@wordpress/browserslist-config': 6.45.0 + '@wordpress/warning': 3.45.0 browserslist: 4.28.2 core-js: 3.38.1 react: 18.3.1 @@ -23703,6 +23734,8 @@ snapshots: '@wordpress/browserslist-config@6.44.0': {} + '@wordpress/browserslist-config@6.45.0': {} + '@wordpress/build@0.13.0(@babel/core@7.29.0)(@wordpress/boot@0.11.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0))(@wordpress/route@0.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@wordpress/theme@0.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0))(browserslist@4.28.2)': dependencies: '@emotion/babel-plugin': 11.13.5 @@ -24493,17 +24526,29 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@wordpress/element@6.45.0': + dependencies: + '@types/react': 18.3.28 + '@types/react-dom': 18.3.7(@types/react@18.3.28) + '@wordpress/escape-html': 3.45.0 + change-case: 4.1.2 + is-plain-object: 5.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@wordpress/escape-html@3.44.0': {} - '@wordpress/eslint-plugin@25.0.0(@babel/core@7.29.0)(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.15.0(eslint@9.39.4)(jest@30.3.0)(typescript@5.9.3))(eslint-plugin-jsdoc@62.8.0(eslint@9.39.4))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4))(eslint-plugin-playwright@2.10.0(eslint@9.39.4))(eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint@9.39.4)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.4))(eslint-plugin-react@7.37.5(eslint@9.39.4))(eslint@9.39.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3))(typescript@5.9.3)(wp-prettier@3.0.3)': + '@wordpress/escape-html@3.45.0': {} + + '@wordpress/eslint-plugin@25.1.0(@babel/core@7.29.0)(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@29.15.0(eslint@9.39.4)(jest@30.3.0)(typescript@5.9.3))(eslint-plugin-jsdoc@62.8.0(eslint@9.39.4))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4))(eslint-plugin-playwright@2.10.0(eslint@9.39.4))(eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4))(eslint@9.39.4)(wp-prettier@3.0.3))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.4))(eslint-plugin-react@7.37.5(eslint@9.39.4))(eslint@9.39.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3))(typescript@5.9.3)(wp-prettier@3.0.3)': dependencies: '@babel/core': 7.29.0 '@babel/eslint-parser': 7.28.6(@babel/core@7.29.0)(eslint@9.39.4) '@eslint-community/eslint-plugin-eslint-comments': 4.7.1(eslint@9.39.4) '@eslint/compat': 2.0.3(eslint@9.39.4) - '@wordpress/babel-preset-default': 8.44.0 - '@wordpress/prettier-config': 4.44.0(wp-prettier@3.0.3) - '@wordpress/theme': 0.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3)) + '@wordpress/babel-preset-default': 8.45.0 + '@wordpress/prettier-config': 4.45.0(wp-prettier@3.0.3) + '@wordpress/theme': 0.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3)) cosmiconfig: 7.1.0 eslint: 9.39.4 eslint-config-prettier: 10.1.8(eslint@9.39.4) @@ -25254,7 +25299,7 @@ snapshots: - '@emotion/is-prop-valid' - supports-color - '@wordpress/prettier-config@4.44.0(wp-prettier@3.0.3)': + '@wordpress/prettier-config@4.45.0(wp-prettier@3.0.3)': dependencies: prettier: wp-prettier@3.0.3 @@ -25270,6 +25315,8 @@ snapshots: '@wordpress/private-apis@1.44.0': {} + '@wordpress/private-apis@1.45.0': {} + '@wordpress/react-i18n@4.43.0': dependencies: '@wordpress/element': 6.44.0 @@ -25459,6 +25506,17 @@ snapshots: optionalDependencies: stylelint: 17.7.0 + '@wordpress/theme@0.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0(typescript@5.9.3))': + dependencies: + '@wordpress/element': 6.45.0 + '@wordpress/private-apis': 1.45.0 + colorjs.io: 0.6.1 + memize: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + stylelint: 17.7.0(typescript@5.9.3) + '@wordpress/token-list@3.44.0': {} '@wordpress/ui@0.11.0(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0)': @@ -25599,6 +25657,8 @@ snapshots: '@wordpress/warning@3.44.0': {} + '@wordpress/warning@3.45.0': {} + '@wordpress/widgets@4.44.0(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(stylelint@17.7.0)': dependencies: '@wordpress/api-fetch': 7.44.0 diff --git a/tools/eslint/lint-js.cjs b/tools/eslint/lint-js.cjs new file mode 100755 index 000000000000..06733046b3ea --- /dev/null +++ b/tools/eslint/lint-js.cjs @@ -0,0 +1,169 @@ +#!/usr/bin/env node + +/** + * ESLint wrapper that auto-applies the bulk suppressions file, detects stale + * suppressions, and optionally formats the suppressions file after pruning. + * + * Adapted from WordPress/gutenberg – tools/eslint/lint-js.cjs + */ + +const { spawn } = require( 'node:child_process' ); +const fs = require( 'node:fs' ); +const path = require( 'node:path' ); + +const STALE_SUPPRESSIONS_TOKEN = '--prune-suppressions'; + +const PRUNE_HELP_MESSAGE = + '👉 Run `pnpm run lint:js:prune-suppressions` and commit the updated `tools/eslint/suppressions.json`.'; + +const SUPPRESSIONS_FILE = path.join( __dirname, 'suppressions.json' ); + +// Resolve the ESLint binary via its package.json bin field. +const eslintPkgPath = require.resolve( 'eslint/package.json' ); +const eslintBin = path.join( path.dirname( eslintPkgPath ), require( eslintPkgPath ).bin.eslint ); + +// Resolve Prettier via the js-tools workspace (which declares prettier as a dep). +const jstoolsDir = path.join( __dirname, '..', 'js-tools' ); +const prettierPkgPath = require.resolve( 'prettier/package.json', { paths: [ jstoolsDir ] } ); +const prettierPkgData = require( prettierPkgPath ); +const prettierBinRelative = + typeof prettierPkgData.bin === 'string' ? prettierPkgData.bin : prettierPkgData.bin.prettier; +const prettierBin = path.join( path.dirname( prettierPkgPath ), prettierBinRelative ); + +const userArgs = process.argv.slice( 2 ); +const args = userArgs.some( arg => arg.startsWith( '--suppressions-location' ) ) + ? userArgs + : [ '--suppressions-location', SUPPRESSIONS_FILE, ...userArgs ]; + +const eslintFlags = [ '--flag', 'v10_config_lookup_from_file' ]; + +// Re-enable color when the parent has a TTY (child pipes disable it by default). +const childEnv = { ...process.env }; +if ( childEnv.FORCE_COLOR === undefined && ( process.stdout.isTTY || process.stderr.isTTY ) ) { + childEnv.FORCE_COLOR = '1'; +} + +// A small sliding tail buffer so we can scan for the stale-suppressions token +// without buffering all output. +const tailLength = STALE_SUPPRESSIONS_TOKEN.length - 1; +let outputTail = ''; +let staleSuppressionsDetected = false; + +const child = spawn( process.execPath, [ eslintBin, ...eslintFlags, ...args ], { + stdio: [ 'inherit', 'pipe', 'pipe' ], + env: childEnv, +} ); + +child.stdout.on( 'data', handleChunk( process.stdout ) ); +child.stderr.on( 'data', handleChunk( process.stderr ) ); + +child.on( 'error', error => { + throw error; +} ); + +child.on( 'close', ( code, signal ) => { + if ( shouldShowPruneHint() ) { + process.stderr.write( `\n${ PRUNE_HELP_MESSAGE }\n` ); + } + + if ( signal ) { + process.kill( process.pid, signal ); + return; + } + + // After --prune-suppressions, format the file through Prettier so the diff + // stays clean and consistent with the repo's formatting settings. + if ( args.includes( STALE_SUPPRESSIONS_TOKEN ) && fs.existsSync( SUPPRESSIONS_FILE ) ) { + formatSuppressionsFile( code ); + return; + } + + process.exitCode = code ?? 1; +} ); + +/** + * Creates a data handler that forwards chunks to a stream and scans for stale-suppression tokens. + * + * @param {NodeJS.WritableStream} destination - Stream to forward chunks to. + * @return {(chunk: import('node:buffer').Buffer) => void} Data event handler. + */ +function handleChunk( destination ) { + return chunk => { + destination.write( chunk ); + scanForStaleSuppressions( chunk ); + }; +} + +/** + * Scans a chunk of child output for the stale-suppressions token. + * + * @param {import('node:buffer').Buffer} chunk - Chunk of child output. + */ +function scanForStaleSuppressions( chunk ) { + if ( staleSuppressionsDetected ) { + return; + } + + const window = outputTail + chunk.toString( 'utf8' ); + + if ( window.includes( STALE_SUPPRESSIONS_TOKEN ) ) { + staleSuppressionsDetected = true; + outputTail = ''; + return; + } + + outputTail = window.slice( -tailLength ); +} + +/** + * Returns whether the stale-suppressions prune hint should be printed to stderr. + * + * @return {boolean} Whether to print the repo-specific prune hint. + */ +function shouldShowPruneHint() { + return ( + staleSuppressionsDetected && + ! args.includes( '--pass-on-unpruned-suppressions' ) && + ! args.includes( STALE_SUPPRESSIONS_TOKEN ) + ); +} + +/** + * Formats the suppressions file through Prettier after a prune run. + * + * @param {number|null} lintExitCode - Exit code from the lint child process. + */ +function formatSuppressionsFile( lintExitCode ) { + const formatChild = spawn( process.execPath, [ prettierBin, '--write', SUPPRESSIONS_FILE ], { + stdio: 'inherit', + env: childEnv, + } ); + + formatChild.on( 'error', error => { + throw error; + } ); + + formatChild.on( 'close', ( formatCode, formatSignal ) => { + if ( formatSignal ) { + process.kill( process.pid, formatSignal ); + return; + } + + process.exitCode = resolveExitCode( lintExitCode, formatCode ); + } ); +} + +/** + * Resolves the final exit code from the lint and format sub-processes. + * + * @param {number|null} lintExitCode - Exit code from the lint child process. + * @param {number|null} formatExitCode - Exit code from the format child process. + * @return {number} Exit code to use for the wrapper process. + */ +function resolveExitCode( lintExitCode, formatExitCode ) { + if ( lintExitCode !== null && lintExitCode !== 0 ) { + return lintExitCode; + } + + return formatExitCode ?? lintExitCode ?? 1; +} diff --git a/tools/eslint/suppressions.json b/tools/eslint/suppressions.json new file mode 100644 index 000000000000..60b12524f8d7 --- /dev/null +++ b/tools/eslint/suppressions.json @@ -0,0 +1,1217 @@ +{ + "projects/js-packages/ai-client/src/components/message/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/components/components/admin-page/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/components/components/button/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/components/components/notice/stories/index.stories.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/components/components/terms-of-service/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/components/components/upsell-banner/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/js-packages/connection/components/disconnect-dialog/steps/step-disconnect.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/connection/components/manage-connection-dialog/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/connection/components/owner-disconnect-dialog/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/licensing/components/activation-screen-error/use-get-error-content.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/licensing/components/activation-screen-success-info/product-link/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/js-packages/shared-extension-utils/src/components/wpcom-support-link.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/activity-log/src/js/components/ActivityLog/ActivityActor.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/activity-log/src/js/components/ActivityLog/ActivityEvent.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/activity-log/src/js/components/ActivityLog/UpsellCallout.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/activity-log/src/js/components/ActivityLog/formatted-block/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/activity-log/src/js/components/DateRangePicker/date-inputs.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/activity-log/src/js/components/DateRangePicker/date-range-content.tsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/packages/activity-log/src/js/components/DateRangePicker/presets-listbox.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/backup/src/js/components/Admin/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/backup/src/js/components/Backups.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/backup/src/js/components/backup-storage-space/storage-help-popover/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/backup/src/js/components/backup-storage-space/storage-usage-details/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/backup/src/js/components/next-scheduled-backup.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/backup/src/js/components/review-request/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/routes/forms/stage.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/routes/responses/integrations-modal.tsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/packages/forms/routes/responses/stage.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/helpers/akismet.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/helpers/google-drive.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/helpers/hostinger-reach.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/helpers/jetpack-crm.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/helpers/mailpoet.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/helpers/salesforce.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/integration-card/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/integration-card/integration-card-body.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/jetpack-integrations-modal/integration-card/integration-card-header.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/blocks/contact-form/components/notifications-settings.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/contact-form/edit.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/field-hidden/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/field-slider/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/input-range/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/blocks/option/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/empty-responses/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/packages/forms/src/dashboard/components/export-responses/modal.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/dashboard/components/forms-responses-tabs/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/inbox-status-toggle/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/mobile.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/response-fields/field-email/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/response-fields/field-file/file.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/response-fields/field-image-select/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 5 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/response-fields/field-preview/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/response-fields/field-rating/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/response-meta/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/packages/forms/src/dashboard/components/inspector/single.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/components/layout/header.tsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/packages/forms/src/dashboard/components/page/header.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/forms/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/inbox/stage/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/wp-build/components/dataviews-header-row/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/dashboard/wp-build/components/forms-help-modal/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/packages/forms/src/dashboard/wp-build/components/inbox-status-toggle/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/forms/src/form-editor/plugins/embed-form-modal.tsx": { + "@wordpress/use-recommended-components": { + "count": 6 + } + }, + "projects/packages/forms/src/form-editor/plugins/form-pre-publish-panel.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/jetpack-mu-wpcom/src/common/tour-kit/variants/wpcom/components/wpcom-tour-kit-step-card.tsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/packages/jetpack-mu-wpcom/src/features/replace-site-visibility/site-visibility/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/connection-screen/body.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/help-card/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/my-jetpack-tab-panel/help/footer.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/my-jetpack-tab-panel/products/filtered-plans.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/my-jetpack-tab-panel/products/filtered-products.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/my-jetpack-tab-panel/products/product-card.tsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/packages/my-jetpack/_inc/components/onboarding-tour/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/plans-section/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/product-cards-section/backup-card/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/product-detail-card/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/product-interstitial/jetpack-ai/product-page.jsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/my-jetpack/_inc/components/product-interstitial/products/jetpack-ai.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/components/product-interstitial/protect/product-page.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/my-jetpack/_inc/components/stats-section/count-comparison-card.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/get-paid-plan-needs-plugins-content.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/my-jetpack/_inc/hooks/use-notification-watcher/use-paid-plan-needs-plugin-install-activation-notice.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/newsletter/src/settings/components/toggle-with-link.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/newsletter/src/settings/sections/email-byline-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 5 + } + }, + "projects/packages/newsletter/src/settings/sections/email-content-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/packages/newsletter/src/settings/sections/email-reply-to-settings-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/packages/newsletter/src/settings/sections/email-sender-settings-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 6 + } + }, + "projects/packages/newsletter/src/settings/sections/newsletter-categories-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 7 + } + }, + "projects/packages/newsletter/src/settings/sections/newsletter-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 6 + } + }, + "projects/packages/newsletter/src/settings/sections/paid-newsletter-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 5 + } + }, + "projects/packages/newsletter/src/settings/sections/subscriptions-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 6 + } + }, + "projects/packages/newsletter/src/settings/sections/welcome-email-section.tsx": { + "@wordpress/use-recommended-components": { + "count": 6 + } + }, + "projects/packages/paypal-payments/src/block/deprecated/v2/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/paypal-payments/src/block/deprecated/v2/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/paypal-payments/src/block/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/paypal-payments/src/paypal-payment-buttons/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/admin-page/header/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/admin-page/pricing-page/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/admin-page/toggles/social-image-generator-toggle/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/admin-page/toggles/social-module-toggle/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/admin-page/toggles/social-notes-toggle/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/publicize/_inc/components/block-editor/placeholder.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/connection-management/connection-info.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/connection-management/connection-name.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/connection-management/connection-status.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/connection-management/disconnect.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/connection-management/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/customize-and-preview/customization-section/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/customize-and-preview/customization-section/per-connection-notice.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/customize-and-preview/preview-section/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/form/empty-state.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/form/media-requirements-notice.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/manage-connections-modal/confirmation-form/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/publicize/_inc/components/manage-connections-modal/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/manual-sharing/info.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/media-picker/index.js": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/packages/publicize/_inc/components/media-section-v2/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/panel/description.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/services/connect-form.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/services/custom-inputs.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/services/service-item.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/services/utils.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/services/x-notice.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/share-buttons/share-buttons.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/share-status/share-status-action.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/unified-modal/sharing-activity/activity-action.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/publicize/_inc/components/x-usage/x-usage-content.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/search/src/dashboard/components/pages/sections/plan-usage-section.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/admin/components/edit-video-details/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/block-editor/blocks/video/components/details-panel/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/block-editor/blocks/video/components/playback-panel/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/block-editor/blocks/video/components/videopress-uploader/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/block-editor/blocks/video/components/videopress-uploader/uploader-error.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/block-editor/extend/core-embed/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/videopress/src/client/block-editor/extend/core-video/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/packages/yoast-promo/src/js/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/automattic-for-agencies-client/src/js/components/connection-card/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/features/boost-pricing-table/boost-pricing-table.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/features/cornerstone-pages/meta/meta.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/plugins/boost/app/assets/src/js/features/cornerstone-pages/prerender/prerender.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/features/critical-css/regenerate-critical-css-suggestion/regenerate-critical-css-suggestion.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/features/critical-css/show-stopper-error/show-stopper-error.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/plugins/boost/app/assets/src/js/features/image-guide/image-guide.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/features/lcp/status/error-details.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/plugins/boost/app/assets/src/js/features/minify-legacy-notice/minify-legacy-notice.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/features/module/module.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/plugins/boost/app/assets/src/js/features/page-cache/health/error-notices.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/plugins/boost/app/assets/src/js/features/page-cache/meta/meta.tsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + }, + "projects/plugins/boost/app/assets/src/js/features/page-cache/page-cache.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/layout/settings-page/tips/tips.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/lib/utils/external-link-interpolate-var.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/lib/utils/get-critical-css-error-set-interpolate-vars.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/pages/cache-debug-log/cache-debug-log.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/pages/index/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/boost/app/assets/src/js/pages/purchase-success/purchase-success.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/ai/main.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/ai/mcp/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 5 + } + }, + "projects/plugins/jetpack/_inc/client/ai/mcp/read.jsx": { + "@wordpress/use-recommended-components": { + "count": 5 + } + }, + "projects/plugins/jetpack/_inc/client/ai/mcp/setup.jsx": { + "@wordpress/use-recommended-components": { + "count": 4 + } + }, + "projects/plugins/jetpack/_inc/client/ai/mcp/write.jsx": { + "@wordpress/use-recommended-components": { + "count": 5 + } + }, + "projects/plugins/jetpack/_inc/client/at-a-glance/backups.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/at-a-glance/boost/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/at-a-glance/crm/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/at-a-glance/jetpack-ai.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/at-a-glance/stats/dash-stats-bottom.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/at-a-glance/stats/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/block-theme-notice/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/connect-button/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/connection-banner/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/jetpack-benefits/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/jetpack-notices/deprecation-notice.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/jetpack-notices/state-notices.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/jetpack-product-card/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/owner-disconnect-dialog/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/product-expiration/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/section-nav/item.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/settings-card/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/plugins/jetpack/_inc/client/components/settings-nav-tabs/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/components/support-info/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/earn/ads.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/my-plan/my-plan-body.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/my-plan/my-plan-header/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/privacy/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/recommendations/feature-summary/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/recommendations/feature-summary/resource.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/recommendations/prompts/feature-prompt/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/recommendations/prompts/resource-prompt/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/recommendations/sidebar/mobile-app/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/recommendations/sidebar/product-spotlight/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/security/monitor.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/security/sso.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/security/waf.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/traffic/google-analytics.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/traffic/sitemaps.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/traffic/verification-services.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/_inc/client/traffic/verification-services/google.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/ai-assistant/components/feedback-control/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/ai-assistant/components/message/block-message.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/ai-assistant/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/ai-chat/question-answer.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/blog-stats/inactive-placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/calendly/controls.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/calendly/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/donations/controls.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/donations/first-time-modal.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/eventbrite/form.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/google-calendar/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/google-docs-embed/preview.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/instagram-gallery/controls.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/like/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/mailchimp/controls.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/map/controls.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/map/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/opentable/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/podcast-player/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/related-posts/inactive-placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/subscriptions/email-preview.js": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/plugins/jetpack/extensions/blocks/subscriptions/menu.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/top-posts/inactive-placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/videopress/edit.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/videopress/resumable-upload/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/blocks/wordads/components/jetpack-wordads-placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/ai-assistant-plugin/components/ai-assistant-plugin-sidebar/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/ai-assistant-plugin/components/breve/controls.tsx": { + "@wordpress/use-recommended-components": { + "count": 3 + } + }, + "projects/plugins/jetpack/extensions/plugins/ai-assistant-plugin/components/title-optimization/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/ai-content-lens/extend/ai-post-excerpt/index.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/likes/components/placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/payments/index.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/seo/components/placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/plugins/sharing/components/placeholder.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/shared/components/block-nudge/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/shared/components/product-management-controls/inspector-control.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/shared/components/product-management-controls/toolbar-control.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/extensions/shared/memberships/settings.js": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/modules/subscriptions/newsletter-widget/src/components/dashboard-link.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/jetpack/modules/subscriptions/newsletter-widget/test/dashboard-link.test.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/protect/src/js/components/paid-accordion/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/protect/src/js/components/protect-app/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/protect/src/js/hooks/use-notices.tsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/protect/src/js/routes/firewall/firewall-upgrade-prompt.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/protect/src/js/routes/firewall/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 1 + } + }, + "projects/plugins/protect/src/js/routes/settings/index.jsx": { + "@wordpress/use-recommended-components": { + "count": 2 + } + } +} diff --git a/tools/js-tools/eslintrc/base.mjs b/tools/js-tools/eslintrc/base.mjs index f89efd2c3d33..a59c54d46943 100644 --- a/tools/js-tools/eslintrc/base.mjs +++ b/tools/js-tools/eslintrc/base.mjs @@ -196,6 +196,11 @@ export function makeBaseConfig( configurl, opts = {} ) { wordpressEslintPlugin.configs.custom, wordpressEslintPlugin.configs.esnext, wordpressEslintPlugin.configs.i18n, + { + rules: { + '@wordpress/use-recommended-components': 'error', + }, + }, { plugins: { @@ -438,6 +443,14 @@ export function makeBaseConfig( configurl, opts = {} ) { }, }, + // .cjs files are always Node.js scripts — add Node.js globals too. + { + files: [ '**/*.cjs' ], + languageOptions: { + globals: globals.node, + }, + }, + // Various config files should allow 'node' globals. { files: [ '**/*.config.?([cm])js', '**/webpack.config.*.?([cm])js' ], diff --git a/tools/js-tools/package.json b/tools/js-tools/package.json index 2712a2d0ac88..101c8c63e5ca 100644 --- a/tools/js-tools/package.json +++ b/tools/js-tools/package.json @@ -24,7 +24,7 @@ "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "6.9.1", "@typescript/native-preview": "7.0.0-dev.20260225.1", - "@wordpress/eslint-plugin": "25.0.0", + "@wordpress/eslint-plugin": "25.1.0", "@wordpress/jest-console": "8.44.0", "@wordpress/stylelint-config": "23.36.0", "babel-jest": "30.3.0",