From c6b0a250f17f1cff94874c0f881b03429e54575b Mon Sep 17 00:00:00 2001 From: Volodymyr Shelmuk Date: Tue, 15 Oct 2024 10:48:33 +0300 Subject: [PATCH] ESLint: fix eslint-plugin tests --- package-lock.json | 43 +++++- package.json | 2 +- .../data-no-store-string-literals.js | 139 ++++++++++++------ .../rules/__tests__/dependency-group.js | 2 +- .../rules/__tests__/i18n-ellipsis.js | 2 +- .../rules/__tests__/i18n-hyphenated-range.js | 2 +- .../i18n-no-collapsible-whitespace.js | 2 +- .../__tests__/i18n-no-flanking-whitespace.js | 2 +- .../__tests__/i18n-no-placeholders-only.js | 2 +- .../rules/__tests__/i18n-no-variables.js | 2 +- .../rules/__tests__/i18n-text-domain.js | 4 +- .../__tests__/i18n-translator-comments.js | 2 +- .../no-base-control-with-label-without-id.js | 8 +- .../__tests__/no-global-active-element.js | 2 +- .../__tests__/no-global-get-selection.js | 2 +- .../__tests__/no-unguarded-get-range-at.js | 2 +- .../rules/__tests__/no-unsafe-wp-apis.js | 2 +- .../__tests__/no-unused-vars-before-return.js | 8 +- .../rules/__tests__/no-wp-process-env.js | 2 +- .../__tests__/react-no-unsafe-timeout.js | 2 +- .../rules/__tests__/valid-sprintf.js | 2 +- .../rules/__tests__/wp-global-usage.js | 2 +- test/unit/config/jest-environment.js | 17 +++ test/unit/jest.config.js | 1 + 24 files changed, 180 insertions(+), 74 deletions(-) create mode 100644 test/unit/config/jest-environment.js diff --git a/package-lock.json b/package-lock.json index e71024e0b2dc98..8986f3850b4b5b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -185,7 +185,7 @@ "deep-freeze": "0.0.1", "equivalent-key-map": "0.2.2", "escape-html": "1.0.3", - "eslint": "9.11.0", + "eslint": "9.11.1", "eslint-config-prettier": "9.1.0", "eslint-import-resolver-node": "0.3.9", "eslint-plugin-import": "2.31.0", @@ -5001,6 +5001,16 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -5089,9 +5099,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.0.tgz", - "integrity": "sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", "dev": true, "license": "MIT", "engines": { @@ -25293,21 +25303,24 @@ } }, "node_modules/eslint": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.0.tgz", - "integrity": "sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.0", + "@eslint/js": "9.11.1", "@eslint/plugin-kit": "^0.2.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -26086,6 +26099,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", diff --git a/package.json b/package.json index 05c601fdc54abf..a769ecf1837c9d 100644 --- a/package.json +++ b/package.json @@ -197,7 +197,7 @@ "deep-freeze": "0.0.1", "equivalent-key-map": "0.2.2", "escape-html": "1.0.3", - "eslint": "9.11.0", + "eslint": "9.11.1", "eslint-config-prettier": "9.1.0", "eslint-import-resolver-node": "0.3.9", "eslint-plugin-import": "2.31.0", diff --git a/packages/eslint-plugin/rules/__tests__/data-no-store-string-literals.js b/packages/eslint-plugin/rules/__tests__/data-no-store-string-literals.js index c7292d52c6e480..b1635f82063bf8 100644 --- a/packages/eslint-plugin/rules/__tests__/data-no-store-string-literals.js +++ b/packages/eslint-plugin/rules/__tests__/data-no-store-string-literals.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../data-no-store-string-literals'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { sourceType: 'module', ecmaVersion: 6, }, @@ -38,77 +38,134 @@ const valid = [ `import { controls as controlsAlias } from '@wordpress/data'; import { store as coreStore } from '@wordpress/core-data'; controlsAlias.resolveSelect( coreStore );`, ]; -const createSuggestionTestCase = ( code, output ) => ( { - code, - errors: [ - { - suggestions: [ - { - desc: 'Replace literal with store definition. Import store if necessary.', - output, - }, - ], - }, - ], -} ); +const createTestCase = ( code, output, message = '' ) => { + const base = { + code, + errors: [ + { + suggestions: [ + { + desc: 'Replace literal with store definition. Import store if necessary.', + output, + }, + ], + }, + ], + }; + + if ( message ) { + base.errors[ 0 ].message = message; + return base; + } + + base.errors[ 0 ].messageId = 'doNotUseStringLiteral'; + + return base; +}; + +const createCoreDataCase = ( code, output ) => + createTestCase( + code, + output, + `Do not use string literals ( 'core' ) for accessing @wordpress/data stores. Pass the store definition instead` + ); const invalid = [ // Callback functions. - `import { createRegistrySelector } from '@wordpress/data'; createRegistrySelector(( select ) => { select( 'core' ); });`, - `import { useSelect } from '@wordpress/data'; useSelect(( select ) => { select( 'core' ); });`, - `import { withSelect } from '@wordpress/data'; withSelect(( select ) => { select( 'core' ); });`, - `import { withDispatch } from '@wordpress/data'; withDispatch(( select ) => { select( 'core' ); });`, - `import { withDispatch as withDispatchAlias } from '@wordpress/data'; withDispatchAlias(( select ) => { select( 'core' ); });`, + createCoreDataCase( + `import { createRegistrySelector } from '@wordpress/data'; createRegistrySelector(( select ) => { select( 'core' ); });`, + `import { createRegistrySelector } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; createRegistrySelector(( select ) => { select( coreStore ); });` + ), + createCoreDataCase( + `import { useSelect } from '@wordpress/data'; useSelect(( select ) => { select( 'core' ); });`, + `import { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; useSelect(( select ) => { select( coreStore ); });` + ), + createCoreDataCase( + `import { withSelect } from '@wordpress/data'; withSelect(( select ) => { select( 'core' ); });`, + `import { withSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; withSelect(( select ) => { select( coreStore ); });` + ), + createCoreDataCase( + `import { withDispatch } from '@wordpress/data'; withDispatch(( select ) => { select( 'core' ); });`, + `import { withDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; withDispatch(( select ) => { select( coreStore ); });` + ), + createCoreDataCase( + `import { withDispatch as withDispatchAlias } from '@wordpress/data'; withDispatchAlias(( select ) => { select( 'core' ); });`, + `import { withDispatch as withDispatchAlias } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; withDispatchAlias(( select ) => { select( coreStore ); });` + ), // Direct function calls. - `import { useDispatch } from '@wordpress/data'; useDispatch( 'core' );`, - `import { dispatch } from '@wordpress/data'; dispatch( 'core' );`, - `import { useSelect } from '@wordpress/data'; useSelect( 'core' );`, - `import { select } from '@wordpress/data'; select( 'core' );`, - `import { resolveSelect } from '@wordpress/data'; resolveSelect( 'core' );`, - `import { resolveSelect as resolveSelectAlias } from '@wordpress/data'; resolveSelectAlias( 'core' );`, - - // Object property function calls. - `import { controls } from '@wordpress/data'; controls.select( 'core' );`, - `import { controls } from '@wordpress/data'; controls.dispatch( 'core' );`, - `import { controls } from '@wordpress/data'; controls.resolveSelect( 'core' );`, - `import { controls as controlsAlias } from '@wordpress/data'; controlsAlias.resolveSelect( 'core' );`, - - // Direct function calls suggestions - // Replace core with coreStore and import coreStore. - createSuggestionTestCase( + createCoreDataCase( + `import { useDispatch } from '@wordpress/data'; useDispatch( 'core' );`, + `import { useDispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; useDispatch( coreStore );` + ), + createCoreDataCase( + `import { dispatch } from '@wordpress/data'; dispatch( 'core' );`, + `import { dispatch } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; dispatch( coreStore );` + ), + createCoreDataCase( + `import { useSelect } from '@wordpress/data'; useSelect( 'core' );`, + `import { useSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; useSelect( coreStore );` + ), + createCoreDataCase( `import { select } from '@wordpress/data'; select( 'core' );`, `import { select } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; select( coreStore );` ), + createCoreDataCase( + `import { resolveSelect } from '@wordpress/data'; resolveSelect( 'core' );`, + `import { resolveSelect } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; resolveSelect( coreStore );` + ), + createCoreDataCase( + `import { resolveSelect as resolveSelectAlias } from '@wordpress/data'; resolveSelectAlias( 'core' );`, + `import { resolveSelect as resolveSelectAlias } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; resolveSelectAlias( coreStore );` + ), + + // Object property function calls. + createCoreDataCase( + `import { controls } from '@wordpress/data'; controls.select( 'core' );`, + `import { controls } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; controls.select( coreStore );` + ), + createCoreDataCase( + `import { controls } from '@wordpress/data'; controls.dispatch( 'core' );`, + `import { controls } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; controls.dispatch( coreStore );` + ), + createCoreDataCase( + `import { controls } from '@wordpress/data'; controls.resolveSelect( 'core' );`, + `import { controls } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; controls.resolveSelect( coreStore );` + ), + createCoreDataCase( + `import { controls as controlsAlias } from '@wordpress/data'; controlsAlias.resolveSelect( 'core' );`, + `import { controls as controlsAlias } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; controlsAlias.resolveSelect( coreStore );` + ), + // Replace core with coreStore. A @wordpress/core-data already exists, so it should append the import to that one. - createSuggestionTestCase( + createTestCase( `import { select } from '@wordpress/data'; import { something } from '@wordpress/core-data'; select( 'core' );`, `import { select } from '@wordpress/data'; import { something,store as coreStore } from '@wordpress/core-data'; select( coreStore );` ), // Replace core with coreStore. A @wordpress/core-data already exists, so it should append the import to that one. // This time there is a comma after the import. - createSuggestionTestCase( + createTestCase( `import { select } from '@wordpress/data'; import { something, } from '@wordpress/core-data'; select( 'core' );`, `import { select } from '@wordpress/data'; import { something,store as coreStore, } from '@wordpress/core-data'; select( coreStore );` ), // Replace core with coreStore. Store import already exists. It shouldn't modify the import, just replace the literal with the store definition. - createSuggestionTestCase( + createTestCase( `import { select } from '@wordpress/data'; import { store as coreStore } from '@wordpress/core-data'; select( 'core' );`, `import { select } from '@wordpress/data'; import { store as coreStore } from '@wordpress/core-data'; select( coreStore );` ), // Replace core with coreStore. There are internal and WordPress dependencies. // It should append the import after the last WordPress dependency import. - createSuggestionTestCase( + createTestCase( `import { a } from './a'; import { select } from '@wordpress/data'; import { b } from './b'; select( 'core' );`, `import { a } from './a'; import { select } from '@wordpress/data';\nimport { store as coreStore } from '@wordpress/core-data'; import { b } from './b'; select( coreStore );` ), // Replace block-editor with blockEditorStore. - createSuggestionTestCase( + createTestCase( `import { select } from '@wordpress/data'; select( 'core/block-editor' );`, `import { select } from '@wordpress/data';\nimport { store as blockEditorStore } from '@wordpress/block-editor'; select( blockEditorStore );` ), // Replace notices with noticesStore. - createSuggestionTestCase( + createTestCase( `import { select } from '@wordpress/data'; select( 'core/notices' );`, `import { select } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices'; select( noticesStore );` ), diff --git a/packages/eslint-plugin/rules/__tests__/dependency-group.js b/packages/eslint-plugin/rules/__tests__/dependency-group.js index 1dac078aafb363..d1b82661a56f44 100644 --- a/packages/eslint-plugin/rules/__tests__/dependency-group.js +++ b/packages/eslint-plugin/rules/__tests__/dependency-group.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../dependency-group'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { sourceType: 'module', ecmaVersion: 6, }, diff --git a/packages/eslint-plugin/rules/__tests__/i18n-ellipsis.js b/packages/eslint-plugin/rules/__tests__/i18n-ellipsis.js index 2bc487e92d42bd..40d86fa1b00956 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-ellipsis.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-ellipsis.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-ellipsis'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/i18n-hyphenated-range.js b/packages/eslint-plugin/rules/__tests__/i18n-hyphenated-range.js index 12e1c639ecf0be..dc4197c0138c22 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-hyphenated-range.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-hyphenated-range.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-hyphenated-range'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/i18n-no-collapsible-whitespace.js b/packages/eslint-plugin/rules/__tests__/i18n-no-collapsible-whitespace.js index f79352c42692bc..2baaf3a0b5e0d2 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-no-collapsible-whitespace.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-no-collapsible-whitespace.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-no-collapsible-whitespace'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/i18n-no-flanking-whitespace.js b/packages/eslint-plugin/rules/__tests__/i18n-no-flanking-whitespace.js index 914cef2a68876a..18343af5160462 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-no-flanking-whitespace.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-no-flanking-whitespace.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-no-flanking-whitespace'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/i18n-no-placeholders-only.js b/packages/eslint-plugin/rules/__tests__/i18n-no-placeholders-only.js index 7743798805267c..94c131d0669ec2 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-no-placeholders-only.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-no-placeholders-only.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-no-placeholders-only'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/i18n-no-variables.js b/packages/eslint-plugin/rules/__tests__/i18n-no-variables.js index 1ee322944ef9fd..2bf932d5fc5d8c 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-no-variables.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-no-variables.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-no-variables'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/i18n-text-domain.js b/packages/eslint-plugin/rules/__tests__/i18n-text-domain.js index d2c78263e61ed4..5cac42c32bb4f2 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-text-domain.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-text-domain.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-text-domain'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); @@ -168,7 +168,7 @@ ruleTester.run( 'i18n-text-domain', rule, { }, { code: `__( 'Hello World' )`, - output: `__( 'Hello World' )`, + output: null, options: [ { allowedTextDomain: [ 'foo', 'bar' ] } ], errors: [ { messageId: 'missing' } ], }, diff --git a/packages/eslint-plugin/rules/__tests__/i18n-translator-comments.js b/packages/eslint-plugin/rules/__tests__/i18n-translator-comments.js index 59098aa9eac056..a3cf63adef2f7e 100644 --- a/packages/eslint-plugin/rules/__tests__/i18n-translator-comments.js +++ b/packages/eslint-plugin/rules/__tests__/i18n-translator-comments.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../i18n-translator-comments'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/no-base-control-with-label-without-id.js b/packages/eslint-plugin/rules/__tests__/no-base-control-with-label-without-id.js index e1f346ee5dd070..d13abc922b28a8 100644 --- a/packages/eslint-plugin/rules/__tests__/no-base-control-with-label-without-id.js +++ b/packages/eslint-plugin/rules/__tests__/no-base-control-with-label-without-id.js @@ -9,10 +9,12 @@ import { RuleTester } from 'eslint'; import rule from '../no-base-control-with-label-without-id'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, - ecmaFeatures: { - jsx: true, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, }, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/no-global-active-element.js b/packages/eslint-plugin/rules/__tests__/no-global-active-element.js index 0bf38216080145..a69187205664d8 100644 --- a/packages/eslint-plugin/rules/__tests__/no-global-active-element.js +++ b/packages/eslint-plugin/rules/__tests__/no-global-active-element.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../no-global-active-element'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/no-global-get-selection.js b/packages/eslint-plugin/rules/__tests__/no-global-get-selection.js index e798363fec0e4b..02fbec98bb2138 100644 --- a/packages/eslint-plugin/rules/__tests__/no-global-get-selection.js +++ b/packages/eslint-plugin/rules/__tests__/no-global-get-selection.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../no-global-get-selection'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/no-unguarded-get-range-at.js b/packages/eslint-plugin/rules/__tests__/no-unguarded-get-range-at.js index 15c7ac6ff50f54..67548d2a6c5194 100644 --- a/packages/eslint-plugin/rules/__tests__/no-unguarded-get-range-at.js +++ b/packages/eslint-plugin/rules/__tests__/no-unguarded-get-range-at.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../no-unguarded-get-range-at'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/no-unsafe-wp-apis.js b/packages/eslint-plugin/rules/__tests__/no-unsafe-wp-apis.js index 946bf3cbd1c44e..ef69f3ba6aa490 100644 --- a/packages/eslint-plugin/rules/__tests__/no-unsafe-wp-apis.js +++ b/packages/eslint-plugin/rules/__tests__/no-unsafe-wp-apis.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../no-unsafe-wp-apis'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { sourceType: 'module', ecmaVersion: 6, }, diff --git a/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js b/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js index fe909e6c717303..8d41e9fbe8c7cb 100644 --- a/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js +++ b/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js @@ -9,10 +9,12 @@ import { RuleTester } from 'eslint'; import rule from '../no-unused-vars-before-return'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, - ecmaFeatures: { - jsx: true, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, }, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/no-wp-process-env.js b/packages/eslint-plugin/rules/__tests__/no-wp-process-env.js index 330ed560aea992..bed74c59bec822 100644 --- a/packages/eslint-plugin/rules/__tests__/no-wp-process-env.js +++ b/packages/eslint-plugin/rules/__tests__/no-wp-process-env.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../no-wp-process-env'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/react-no-unsafe-timeout.js b/packages/eslint-plugin/rules/__tests__/react-no-unsafe-timeout.js index 4dadadb5da59ed..e8fe4552e7c91d 100644 --- a/packages/eslint-plugin/rules/__tests__/react-no-unsafe-timeout.js +++ b/packages/eslint-plugin/rules/__tests__/react-no-unsafe-timeout.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../react-no-unsafe-timeout'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/valid-sprintf.js b/packages/eslint-plugin/rules/__tests__/valid-sprintf.js index 9b2b7de255d47b..e3c6a585400f01 100644 --- a/packages/eslint-plugin/rules/__tests__/valid-sprintf.js +++ b/packages/eslint-plugin/rules/__tests__/valid-sprintf.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../valid-sprintf'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/packages/eslint-plugin/rules/__tests__/wp-global-usage.js b/packages/eslint-plugin/rules/__tests__/wp-global-usage.js index 9d3dc9b2a29d72..90b95911d70de2 100644 --- a/packages/eslint-plugin/rules/__tests__/wp-global-usage.js +++ b/packages/eslint-plugin/rules/__tests__/wp-global-usage.js @@ -9,7 +9,7 @@ import { RuleTester } from 'eslint'; import rule from '../wp-global-usage'; const ruleTester = new RuleTester( { - parserOptions: { + languageOptions: { ecmaVersion: 6, }, } ); diff --git a/test/unit/config/jest-environment.js b/test/unit/config/jest-environment.js new file mode 100644 index 00000000000000..f621741b6594ff --- /dev/null +++ b/test/unit/config/jest-environment.js @@ -0,0 +1,17 @@ +/** + * External dependencies + */ +const JSDOMEnvironment = require( 'jest-environment-jsdom' ).default; + +/** + * Fix "structuredClone is not defined" error in jsdom environment. + * @see https://github.com/jsdom/jsdom/issues/3363#issuecomment-1575996129 + * @see https://github.com/eslint/eslint/pull/17915 + */ +export default class JestEnvironment extends JSDOMEnvironment { + constructor( ...args ) { + super( ...args ); + + this.global.structuredClone = structuredClone; + } +} diff --git a/test/unit/jest.config.js b/test/unit/jest.config.js index 8564d4116691fd..7367003223304a 100644 --- a/test/unit/jest.config.js +++ b/test/unit/jest.config.js @@ -23,6 +23,7 @@ module.exports = { '/test/unit/config/testing-library.js', '/test/unit/mocks/match-media.js', ], + testEnvironment: '/test/unit/config/jest-environment.js', testEnvironmentOptions: { url: 'http://localhost/', },