You're Invited:Meet the Socket Team at BlackHat and DEF CON in Las Vegas, Aug 4-6.RSVP
Socket
Book a DemoInstallSign in
Socket

eslint-plugin-testing-library

Package Overview
Dependencies
Maintainers
2
Versions
181
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

eslint-plugin-testing-library - npm Package Compare versions

Comparing version

to
7.1.0

dist/configs/svelte.js

3

dist/create-testing-library-rule/detect-testing-library-utils.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectTestingLibraryUtils = void 0;
exports.detectTestingLibraryUtils = detectTestingLibraryUtils;
const utils_1 = require("@typescript-eslint/utils");

@@ -537,2 +537,1 @@ const node_utils_1 = require("../node-utils");

}
exports.detectTestingLibraryUtils = detectTestingLibraryUtils;

@@ -17,3 +17,28 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.findImportSpecifier = exports.isEmptyFunction = exports.getStatementCallExpression = exports.hasImportMatch = exports.getInnermostReturningFunction = exports.hasClosestExpectResolvesRejects = exports.getAssertNodeInfo = exports.getImportModuleName = exports.getFunctionName = exports.getReferenceNode = exports.getDeepestIdentifierNode = exports.getPropertyIdentifierNode = exports.getFunctionReturnStatementNode = exports.getInnermostFunctionScope = exports.getVariableReferences = exports.isPromiseHandled = exports.isPromisesArrayResolved = exports.isPromiseAllSettled = exports.isPromiseAll = exports.isPromiseIdentifier = exports.hasChainedThen = exports.hasThenProperty = exports.findClosestCallNode = exports.findClosestFunctionExpressionNode = exports.findClosestVariableDeclaratorNode = exports.findClosestCallExpressionNode = void 0;
exports.findClosestCallExpressionNode = findClosestCallExpressionNode;
exports.findClosestVariableDeclaratorNode = findClosestVariableDeclaratorNode;
exports.findClosestFunctionExpressionNode = findClosestFunctionExpressionNode;
exports.findClosestCallNode = findClosestCallNode;
exports.hasThenProperty = hasThenProperty;
exports.hasChainedThen = hasChainedThen;
exports.isPromiseIdentifier = isPromiseIdentifier;
exports.isPromiseAll = isPromiseAll;
exports.isPromiseAllSettled = isPromiseAllSettled;
exports.isPromisesArrayResolved = isPromisesArrayResolved;
exports.isPromiseHandled = isPromiseHandled;
exports.getVariableReferences = getVariableReferences;
exports.getInnermostFunctionScope = getInnermostFunctionScope;
exports.getFunctionReturnStatementNode = getFunctionReturnStatementNode;
exports.getPropertyIdentifierNode = getPropertyIdentifierNode;
exports.getDeepestIdentifierNode = getDeepestIdentifierNode;
exports.getReferenceNode = getReferenceNode;
exports.getFunctionName = getFunctionName;
exports.getImportModuleName = getImportModuleName;
exports.getAssertNodeInfo = getAssertNodeInfo;
exports.hasClosestExpectResolvesRejects = hasClosestExpectResolvesRejects;
exports.getInnermostReturningFunction = getInnermostReturningFunction;
exports.hasImportMatch = hasImportMatch;
exports.getStatementCallExpression = getStatementCallExpression;
exports.isEmptyFunction = isEmptyFunction;
exports.findImportSpecifier = findImportSpecifier;
const scope_manager_1 = require("@typescript-eslint/scope-manager");

@@ -64,3 +89,2 @@ const utils_1 = require("@typescript-eslint/utils");

}
exports.findClosestCallExpressionNode = findClosestCallExpressionNode;
function findClosestVariableDeclaratorNode(node) {

@@ -75,3 +99,2 @@ if (!node) {

}
exports.findClosestVariableDeclaratorNode = findClosestVariableDeclaratorNode;
function findClosestFunctionExpressionNode(node) {

@@ -88,3 +111,2 @@ if (!node) {

}
exports.findClosestFunctionExpressionNode = findClosestFunctionExpressionNode;
function findClosestCallNode(node, name) {

@@ -103,3 +125,2 @@ if (!node.parent) {

}
exports.findClosestCallNode = findClosestCallNode;
function hasThenProperty(node) {

@@ -110,3 +131,2 @@ return ((0, is_node_of_type_1.isMemberExpression)(node) &&

}
exports.hasThenProperty = hasThenProperty;
function hasChainedThen(node) {

@@ -119,7 +139,5 @@ const parent = node.parent;

}
exports.hasChainedThen = hasChainedThen;
function isPromiseIdentifier(node) {
return utils_1.ASTUtils.isIdentifier(node) && node.name === 'Promise';
}
exports.isPromiseIdentifier = isPromiseIdentifier;
function isPromiseAll(node) {

@@ -131,3 +149,2 @@ return ((0, is_node_of_type_1.isMemberExpression)(node.callee) &&

}
exports.isPromiseAll = isPromiseAll;
function isPromiseAllSettled(node) {

@@ -139,3 +156,2 @@ return ((0, is_node_of_type_1.isMemberExpression)(node.callee) &&

}
exports.isPromiseAllSettled = isPromiseAllSettled;
function isPromisesArrayResolved(node) {

@@ -152,3 +168,2 @@ const closestCallExpression = findClosestCallExpressionNode(node, true);

}
exports.isPromisesArrayResolved = isPromisesArrayResolved;
function isPromiseHandled(nodeIdentifier) {

@@ -176,3 +191,2 @@ const closestCallExpressionNode = findClosestCallExpressionNode(nodeIdentifier, true);

}
exports.isPromiseHandled = isPromiseHandled;
function getRootExpression(expression) {

@@ -216,3 +230,2 @@ const { parent } = expression;

}
exports.getVariableReferences = getVariableReferences;
function getInnermostFunctionScope(context, asyncQueryNode) {

@@ -226,3 +239,2 @@ const innermostScope = utils_1.ASTUtils.getInnermostScope((0, utils_2.getScope)(context, asyncQueryNode), asyncQueryNode);

}
exports.getInnermostFunctionScope = getInnermostFunctionScope;
function getFunctionReturnStatementNode(functionNode) {

@@ -241,3 +253,2 @@ if ((0, is_node_of_type_1.isBlockStatement)(functionNode.body)) {

}
exports.getFunctionReturnStatementNode = getFunctionReturnStatementNode;
function getPropertyIdentifierNode(node) {

@@ -258,3 +269,2 @@ if (utils_1.ASTUtils.isIdentifier(node)) {

}
exports.getPropertyIdentifierNode = getPropertyIdentifierNode;
function getDeepestIdentifierNode(node) {

@@ -275,3 +285,2 @@ if (utils_1.ASTUtils.isIdentifier(node)) {

}
exports.getDeepestIdentifierNode = getDeepestIdentifierNode;
function getReferenceNode(node) {

@@ -284,3 +293,2 @@ if (node.parent &&

}
exports.getReferenceNode = getReferenceNode;
function getFunctionName(node) {

@@ -291,3 +299,2 @@ var _a, _b;

}
exports.getFunctionName = getFunctionName;
function getImportModuleName(node) {

@@ -304,3 +311,2 @@ if ((0, is_node_of_type_1.isImportDeclaration)(node) && typeof node.source.value === 'string') {

}
exports.getImportModuleName = getImportModuleName;
function getAssertNodeInfo(node) {

@@ -328,3 +334,2 @@ const emptyInfo = { matcher: null, isNegated: false };

}
exports.getAssertNodeInfo = getAssertNodeInfo;
const matcherNamesHandlePromise = [

@@ -351,3 +356,2 @@ 'resolves',

}
exports.hasClosestExpectResolvesRejects = hasClosestExpectResolvesRejects;
function getInnermostReturningFunction(context, node) {

@@ -368,3 +372,2 @@ const functionScope = getInnermostFunctionScope(context, node);

}
exports.getInnermostReturningFunction = getInnermostReturningFunction;
function hasImportMatch(importNode, identifierName) {

@@ -376,3 +379,2 @@ if (utils_1.ASTUtils.isIdentifier(importNode)) {

}
exports.hasImportMatch = hasImportMatch;
function getStatementCallExpression(statement) {

@@ -410,3 +412,2 @@ if ((0, is_node_of_type_1.isExpressionStatement)(statement)) {

}
exports.getStatementCallExpression = getStatementCallExpression;
function isEmptyFunction(node) {

@@ -418,3 +419,2 @@ if (utils_1.ASTUtils.isFunction(node) && (0, is_node_of_type_1.isBlockStatement)(node.body)) {

}
exports.isEmptyFunction = isEmptyFunction;
function findImportSpecifier(specifierName, node) {

@@ -452,2 +452,1 @@ if ((0, is_node_of_type_1.isImportDeclaration)(node)) {

}
exports.findImportSpecifier = findImportSpecifier;

@@ -23,2 +23,3 @@ "use strict";

vue: ['error', { eventModule: ['fireEvent', 'userEvent'] }],
svelte: ['error', { eventModule: ['fireEvent', 'userEvent'] }],
marko: ['error', { eventModule: ['fireEvent', 'userEvent'] }],

@@ -25,0 +26,0 @@ },

@@ -19,2 +19,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -21,0 +22,0 @@ },

@@ -19,2 +19,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -21,0 +22,0 @@ },

@@ -20,2 +20,3 @@ "use strict";

vue: false,
svelte: false,
marko: false,

@@ -22,0 +23,0 @@ },

@@ -24,2 +24,3 @@ "use strict";

vue: false,
svelte: false,
marko: false,

@@ -26,0 +27,0 @@ },

@@ -18,2 +18,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -20,0 +21,0 @@ },

@@ -19,2 +19,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -21,0 +22,0 @@ },

@@ -28,2 +28,3 @@ "use strict";

vue: 'warn',
svelte: 'warn',
marko: 'warn',

@@ -30,0 +31,0 @@ },

@@ -30,2 +30,3 @@ "use strict";

vue: ['error', 'vue'],
svelte: ['error', 'svelte'],
marko: ['error', 'marko'],

@@ -32,0 +33,0 @@ },

@@ -19,2 +19,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -21,0 +22,0 @@ },

@@ -21,2 +21,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: false,

@@ -23,0 +24,0 @@ },

@@ -19,2 +19,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -21,0 +22,0 @@ },

@@ -20,2 +20,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -22,0 +23,0 @@ },

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findClosestBeforeHook = exports.RULE_NAME = void 0;
exports.RULE_NAME = void 0;
exports.findClosestBeforeHook = findClosestBeforeHook;
const utils_1 = require("@typescript-eslint/utils");

@@ -23,3 +24,2 @@ const create_testing_library_rule_1 = require("../create-testing-library-rule");

}
exports.findClosestBeforeHook = findClosestBeforeHook;
exports.default = (0, create_testing_library_rule_1.createTestingLibraryRule)({

@@ -36,2 +36,3 @@ name: exports.RULE_NAME,

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -38,0 +39,0 @@ },

@@ -19,2 +19,3 @@ "use strict";

vue: false,
svelte: false,
marko: 'error',

@@ -21,0 +22,0 @@ },

@@ -18,2 +18,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -20,0 +21,0 @@ },

@@ -18,2 +18,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -20,0 +21,0 @@ },

@@ -20,2 +20,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -22,0 +23,0 @@ },

@@ -52,2 +52,3 @@ "use strict";

vue: false,
svelte: false,
marko: false,

@@ -54,0 +55,0 @@ },

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFindByQueryVariant = exports.RULE_NAME = void 0;
exports.RULE_NAME = void 0;
exports.getFindByQueryVariant = getFindByQueryVariant;
const utils_1 = require("@typescript-eslint/utils");

@@ -12,3 +13,2 @@ const create_testing_library_rule_1 = require("../create-testing-library-rule");

}
exports.getFindByQueryVariant = getFindByQueryVariant;
function findRenderDefinitionDeclaration(scope, query) {

@@ -39,2 +39,3 @@ var _a;

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -41,0 +42,0 @@ },

@@ -45,2 +45,3 @@ "use strict";

vue: false,
svelte: false,
marko: false,

@@ -47,0 +48,0 @@ },

@@ -17,2 +17,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -19,0 +20,0 @@ },

@@ -18,2 +18,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -20,0 +21,0 @@ },

@@ -17,2 +17,3 @@ "use strict";

vue: false,
svelte: false,
marko: false,

@@ -19,0 +20,0 @@ },

@@ -30,2 +30,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -32,0 +33,0 @@ },

@@ -61,2 +61,3 @@ "use strict";

vue: false,
svelte: false,
marko: false,

@@ -63,0 +64,0 @@ },

@@ -23,2 +23,3 @@ "use strict";

vue: 'error',
svelte: 'error',
marko: 'error',

@@ -25,0 +26,0 @@ },

@@ -9,3 +9,4 @@ "use strict";

'vue',
'svelte',
'marko',
];

@@ -13,8 +13,10 @@ import type { Linter, Rule } from 'eslint';

react: Linter.LegacyConfig;
svelte: Linter.LegacyConfig;
vue: Linter.LegacyConfig;
'flat/angular': Linter.FlatConfig;
'flat/dom': Linter.FlatConfig;
'flat/marko': Linter.FlatConfig;
'flat/react': Linter.FlatConfig;
'flat/vue': Linter.FlatConfig;
'flat/angular': Linter.Config<Linter.RulesRecord>;
'flat/dom': Linter.Config<Linter.RulesRecord>;
'flat/marko': Linter.Config<Linter.RulesRecord>;
'flat/react': Linter.Config<Linter.RulesRecord>;
'flat/svelte': Linter.Config<Linter.RulesRecord>;
'flat/vue': Linter.Config<Linter.RulesRecord>;
};

@@ -21,0 +23,0 @@ rules: {

{
"name": "eslint-plugin-testing-library",
"version": "7.0.0",
"version": "7.1.0",
"description": "ESLint plugin to follow best practices and anticipate common mistakes when writing tests with Testing Library",

@@ -38,17 +38,17 @@ "keywords": [

"build": "tsc",
"generate-all": "npm-run-all --parallel \"generate:*\"",
"generate-all:check": "npm run generate-all && git diff --exit-code",
"generate-all": "pnpm run --parallel \"/^generate:.*/\"",
"generate-all:check": "pnpm run generate-all && git diff --exit-code",
"generate:configs": "ts-node tools/generate-configs",
"generate:rules-doc": "npm run build && npm run rule-doc-generator",
"format": "npm run prettier-base -- --write",
"format:check": "npm run prettier-base -- --check",
"generate:rules-doc": "pnpm run build && pnpm run rule-doc-generator",
"format": "pnpm run prettier-base --write",
"format:check": "pnpm run prettier-base --check",
"lint": "eslint . --max-warnings 0 --ext .js,.ts",
"lint:fix": "npm run lint -- --fix",
"prepare": "is-ci || husky install",
"prettier-base": "prettier . --ignore-unknown --cache --loglevel warn",
"lint:fix": "pnpm run lint --fix",
"prepare": "is-ci || husky",
"prettier-base": "prettier . --ignore-unknown --cache --log-level warn",
"rule-doc-generator": "eslint-doc-generator",
"semantic-release": "semantic-release",
"test": "jest",
"test:ci": "jest --ci --coverage",
"test:watch": "npm run test -- --watch",
"test:ci": "pnpm run test --ci --coverage",
"test:watch": "pnpm run test --watch",
"type-check": "tsc --noEmit"

@@ -61,15 +61,12 @@ },

"devDependencies": {
"@babel/core": "^7.25.8",
"@babel/eslint-parser": "^7.25.8",
"@babel/eslint-plugin": "^7.25.7",
"@commitlint/cli": "^17.8.1",
"@commitlint/config-conventional": "^17.8.1",
"@swc/core": "^1.7.36",
"@swc/jest": "^0.2.36",
"@types/jest": "^27.5.2",
"@types/node": "^22.8.6",
"@commitlint/cli": "^19.6.0",
"@commitlint/config-conventional": "^19.6.0",
"@swc/core": "^1.9.3",
"@swc/jest": "^0.2.37",
"@types/jest": "^29.5.14",
"@types/node": "^22.9.3",
"@typescript-eslint/eslint-plugin": "^8.15.0",
"@typescript-eslint/parser": "^8.15.0",
"@typescript-eslint/rule-tester": "^8.15.0",
"del-cli": "^5.1.0",
"del-cli": "^6.0.0",
"eslint": "^8.57.1",

@@ -80,18 +77,17 @@ "eslint-config-prettier": "^9.1.0",

"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jest": "^28.8.3",
"eslint-plugin-jest": "^28.9.0",
"eslint-plugin-jest-formatting": "^3.1.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.6.0",
"eslint-plugin-promise": "^7.1.0",
"eslint-remote-tester": "^3.0.1",
"eslint-remote-tester-repositories": "^1.0.1",
"husky": "^8.0.3",
"husky": "^9.1.7",
"is-ci": "^3.0.1",
"jest": "^28.1.3",
"lint-staged": "^13.3.0",
"npm-run-all2": "^5.0.2",
"prettier": "^3.3.3",
"semantic-release": "^19.0.5",
"jest": "^29.7.0",
"lint-staged": "^15.2.10",
"prettier": "3.3.3",
"semantic-release": "^24.2.0",
"semver": "^7.6.3",
"ts-node": "^10.9.2",
"typescript": "5.0.4"
"typescript": "^5.7.2"
},

@@ -103,4 +99,5 @@ "peerDependencies": {

"node": "^18.18.0 || ^20.9.0 || >=21.1.0",
"npm": ">=9.8.1"
}
"pnpm": "^9.14.0"
},
"packageManager": "pnpm@9.14.2"
}

@@ -257,2 +257,31 @@ <div align="center">

### Svelte
Enforces recommended rules for Svelte Testing Library.
To enable this configuration use the `extends` property in your
`.eslintrc.js` config file:
```js
module.exports = {
extends: ['plugin:testing-library/svelte'],
};
```
To enable this configuration with `eslint.config.js`, use
`testingLibrary.configs['flat/svelte']`:
```js
const testingLibrary = require('eslint-plugin-testing-library');
module.exports = [
{
files: [
/* glob matching your test files */
],
...testingLibrary.configs['flat/svelte'],
},
];
```
### Marko

@@ -297,31 +326,31 @@

| Name                            | Description | 💼 | ⚠️ | 🔧 |
| :------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------- | :------------------------------------------------------------------ | :-- |
| [await-async-events](docs/rules/await-async-events.md) | Enforce promises from async event methods are handled | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | 🔧 |
| [await-async-queries](docs/rules/await-async-queries.md) | Enforce promises from async queries to be handled | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [await-async-utils](docs/rules/await-async-utils.md) | Enforce promises from async utils to be awaited properly | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [consistent-data-testid](docs/rules/consistent-data-testid.md) | Ensures consistent usage of `data-testid` | | | |
| [no-await-sync-events](docs/rules/no-await-sync-events.md) | Disallow unnecessary `await` for sync events | ![badge-angular][] ![badge-dom][] ![badge-react][] | | |
| [no-await-sync-queries](docs/rules/no-await-sync-queries.md) | Disallow unnecessary `await` for sync queries | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-container](docs/rules/no-container.md) | Disallow the use of `container` methods | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-debugging-utils](docs/rules/no-debugging-utils.md) | Disallow the use of debugging utilities like `debug` | | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-vue][] | |
| [no-dom-import](docs/rules/no-dom-import.md) | Disallow importing from DOM Testing Library | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | 🔧 |
| [no-global-regexp-flag-in-query](docs/rules/no-global-regexp-flag-in-query.md) | Disallow the use of the global RegExp flag (/g) in queries | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | 🔧 |
| [no-manual-cleanup](docs/rules/no-manual-cleanup.md) | Disallow the use of `cleanup` | ![badge-react][] ![badge-vue][] | | |
| [no-node-access](docs/rules/no-node-access.md) | Disallow direct Node access | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-promise-in-fire-event](docs/rules/no-promise-in-fire-event.md) | Disallow the use of promises passed to a `fireEvent` method | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-render-in-lifecycle](docs/rules/no-render-in-lifecycle.md) | Disallow the use of `render` in testing frameworks setup functions | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-unnecessary-act](docs/rules/no-unnecessary-act.md) | Disallow wrapping Testing Library utils or empty callbacks in `act` | ![badge-marko][] ![badge-react][] | | |
| [no-wait-for-multiple-assertions](docs/rules/no-wait-for-multiple-assertions.md) | Disallow the use of multiple `expect` calls inside `waitFor` | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-wait-for-side-effects](docs/rules/no-wait-for-side-effects.md) | Disallow the use of side effects in `waitFor` | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [no-wait-for-snapshot](docs/rules/no-wait-for-snapshot.md) | Ensures no snapshot is generated inside of a `waitFor` call | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [prefer-explicit-assert](docs/rules/prefer-explicit-assert.md) | Suggest using explicit assertions rather than standalone queries | | | |
| [prefer-find-by](docs/rules/prefer-find-by.md) | Suggest using `find(All)By*` query instead of `waitFor` + `get(All)By*` to wait for elements | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | 🔧 |
| [prefer-implicit-assert](docs/rules/prefer-implicit-assert.md) | Suggest using implicit assertions for getBy* & findBy* queries | | | |
| [prefer-presence-queries](docs/rules/prefer-presence-queries.md) | Ensure appropriate `get*`/`query*` queries are used with their respective matchers | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [prefer-query-by-disappearance](docs/rules/prefer-query-by-disappearance.md) | Suggest using `queryBy*` queries when waiting for disappearance | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [prefer-query-matchers](docs/rules/prefer-query-matchers.md) | Ensure the configured `get*`/`query*` query is used with the corresponding matchers | | | |
| [prefer-screen-queries](docs/rules/prefer-screen-queries.md) | Suggest using `screen` while querying | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| [prefer-user-event](docs/rules/prefer-user-event.md) | Suggest using `userEvent` over `fireEvent` for simulating user interactions | | | |
| [render-result-naming-convention](docs/rules/render-result-naming-convention.md) | Enforce a valid naming for return value from `render` | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-vue][] | | |
| Name                            | Description | 💼 | ⚠️ | 🔧 |
| :------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------ | :-- |
| [await-async-events](docs/rules/await-async-events.md) | Enforce promises from async event methods are handled | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | 🔧 |
| [await-async-queries](docs/rules/await-async-queries.md) | Enforce promises from async queries to be handled | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [await-async-utils](docs/rules/await-async-utils.md) | Enforce promises from async utils to be awaited properly | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [consistent-data-testid](docs/rules/consistent-data-testid.md) | Ensures consistent usage of `data-testid` | | | |
| [no-await-sync-events](docs/rules/no-await-sync-events.md) | Disallow unnecessary `await` for sync events | ![badge-angular][] ![badge-dom][] ![badge-react][] | | |
| [no-await-sync-queries](docs/rules/no-await-sync-queries.md) | Disallow unnecessary `await` for sync queries | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-container](docs/rules/no-container.md) | Disallow the use of `container` methods | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-debugging-utils](docs/rules/no-debugging-utils.md) | Disallow the use of debugging utilities like `debug` | | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | |
| [no-dom-import](docs/rules/no-dom-import.md) | Disallow importing from DOM Testing Library | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | 🔧 |
| [no-global-regexp-flag-in-query](docs/rules/no-global-regexp-flag-in-query.md) | Disallow the use of the global RegExp flag (/g) in queries | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | 🔧 |
| [no-manual-cleanup](docs/rules/no-manual-cleanup.md) | Disallow the use of `cleanup` | ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-node-access](docs/rules/no-node-access.md) | Disallow direct Node access | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-promise-in-fire-event](docs/rules/no-promise-in-fire-event.md) | Disallow the use of promises passed to a `fireEvent` method | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-render-in-lifecycle](docs/rules/no-render-in-lifecycle.md) | Disallow the use of `render` in testing frameworks setup functions | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-unnecessary-act](docs/rules/no-unnecessary-act.md) | Disallow wrapping Testing Library utils or empty callbacks in `act` | ![badge-marko][] ![badge-react][] | | |
| [no-wait-for-multiple-assertions](docs/rules/no-wait-for-multiple-assertions.md) | Disallow the use of multiple `expect` calls inside `waitFor` | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-wait-for-side-effects](docs/rules/no-wait-for-side-effects.md) | Disallow the use of side effects in `waitFor` | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [no-wait-for-snapshot](docs/rules/no-wait-for-snapshot.md) | Ensures no snapshot is generated inside of a `waitFor` call | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [prefer-explicit-assert](docs/rules/prefer-explicit-assert.md) | Suggest using explicit assertions rather than standalone queries | | | |
| [prefer-find-by](docs/rules/prefer-find-by.md) | Suggest using `find(All)By*` query instead of `waitFor` + `get(All)By*` to wait for elements | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | 🔧 |
| [prefer-implicit-assert](docs/rules/prefer-implicit-assert.md) | Suggest using implicit assertions for getBy* & findBy* queries | | | |
| [prefer-presence-queries](docs/rules/prefer-presence-queries.md) | Ensure appropriate `get*`/`query*` queries are used with their respective matchers | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [prefer-query-by-disappearance](docs/rules/prefer-query-by-disappearance.md) | Suggest using `queryBy*` queries when waiting for disappearance | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [prefer-query-matchers](docs/rules/prefer-query-matchers.md) | Ensure the configured `get*`/`query*` query is used with the corresponding matchers | | | |
| [prefer-screen-queries](docs/rules/prefer-screen-queries.md) | Suggest using `screen` while querying | ![badge-angular][] ![badge-dom][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |
| [prefer-user-event](docs/rules/prefer-user-event.md) | Suggest using `userEvent` over `fireEvent` for simulating user interactions | | | |
| [render-result-naming-convention](docs/rules/render-result-naming-convention.md) | Enforce a valid naming for return value from `render` | ![badge-angular][] ![badge-marko][] ![badge-react][] ![badge-svelte][] ![badge-vue][] | | |

@@ -328,0 +357,0 @@ <!-- end auto-generated rules list -->