@vitest/eslint-plugin 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";const utils=require("@typescript-eslint/utils"),n$3=require("typescript"),node_path=require("node:path"),node_module=require("node:module");var _documentCurrentScript=typeof document<"u"?document.currentScript:null;function _interopDefaultCompat(q){return q&&typeof q=="object"&&"default"in q?q.default:q}const n__default=_interopDefaultCompat(n$3),version="1.3.0",createEslintRule=utils.ESLintUtils.RuleCreator(q=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${q}.md`),joinNames=(q,$)=>q&&$?`${q}.${$}`:null,isFunction=q=>q.type===utils.AST_NODE_TYPES.FunctionExpression||q.type===utils.AST_NODE_TYPES.ArrowFunctionExpression;function getNodeName(q){if(isSupportedAccessor(q))return getAccessorValue(q);switch(q.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeName(q.tag);case utils.AST_NODE_TYPES.MemberExpression:return joinNames(getNodeName(q.object),getNodeName(q.property));case utils.AST_NODE_TYPES.NewExpression:case utils.AST_NODE_TYPES.CallExpression:return getNodeName(q.callee)}return null}const isSupportedAccessor=(q,$)=>isIdentifier(q,$)||isStringNode(q,$),isIdentifier=(q,$)=>q.type===utils.AST_NODE_TYPES.Identifier&&($===void 0||q.name===$),S$4=(q,$)=>q.type===utils.AST_NODE_TYPES.TemplateLiteral&&q.quasis.length===1&&($===void 0||q.quasis[0].value.raw===$),g$2=(q,$)=>q.type===utils.AST_NODE_TYPES.Literal&&typeof q.value=="string"&&($===void 0||q.value===$),isStringNode=(q,$)=>g$2(q,$)||S$4(q,$),getAccessorValue=q=>q.type===utils.AST_NODE_TYPES.Identifier?q.name:getStringValue(q),getStringValue=q=>q?.type===utils.AST_NODE_TYPES.TemplateLiteral?q.quasis[0].value.raw:q?.value,replaceAccessorFixer=(q,$,Y)=>q.replaceText($,$.type===utils.AST_NODE_TYPES.Identifier?Y:`'${Y}'`),removeExtraArgumentsFixer=(q,$,Y,B)=>{const F=Y.arguments[B],W=Y.arguments[Y.arguments.length-1],{sourceCode:V}=$;let H=V.getTokenAfter(W);return H.value===","&&(H=V.getTokenAfter(H)),q.removeRange([F.range[0],H.range[0]])},isParsedInstanceOfMatcherCall=(q,$)=>getAccessorValue(q.matcher)==="toBeInstanceOf"&&q.args.length===1&&isSupportedAccessor(q.args[0],$);var UtilName=(q=>(q.vi="vi",q.vitest="vitest",q))(UtilName||{}),DescribeAlias=(q=>(q.describe="describe",q.fdescribe="fdescribe",q.xdescribe="xdescribe",q))(DescribeAlias||{}),TestCaseName=(q=>(q.fit="fit",q.it="it",q.test="test",q.xit="xit",q.xtest="xtest",q.bench="bench",q))(TestCaseName||{}),HookName=(q=>(q.beforeAll="beforeAll",q.beforeEach="beforeEach",q.afterAll="afterAll",q.afterEach="afterEach",q))(HookName||{}),ModifierName=(q=>(q.to="to",q.have="have",q.not="not",q.rejects="rejects",q.resolves="resolves",q.returns="returns",q.branded="branded",q.asserts="asserts",q.constructorParameters="constructorParameters",q.parameters="parameters",q.thisParameter="thisParameter",q.guards="guards",q.instance="instance",q.items="items",q))(ModifierName||{}),EqualityMatcher=(q=>(q.toBe="toBe",q.toEqual="toEqual",q.toStrictEqual="toStrictEqual",q))(EqualityMatcher||{});function isClassOrFunctionType(q){return q.getCallSignatures().length>0?!0:q.getSymbol()?.getDeclarations()?.some($=>n__default.isArrowFunction($)||n__default.isClassDeclaration($)||n__default.isClassExpression($)||n__default.isFunctionDeclaration($)||n__default.isFunctionExpression($)||n__default.isMethodDeclaration($)||n__default.isFunctionTypeNode($))??!1}const ValidVitestFnCallChains=new Set(["beforeEach","beforeAll","afterEach","afterAll","it","it.skip","it.only","it.concurrent","it.sequential","it.todo","it.fails","it.extend","it.skipIf","it.runIf","it.each","it.skip.only","it.skip.concurrent","it.skip.sequential","it.skip.todo","it.skip.fails","it.only.skip","it.only.concurrent","it.only.sequential","it.only.todo","it.only.fails","it.concurrent.skip","it.concurrent.only","it.concurrent.sequential","it.concurrent.todo","it.concurrent.fails","it.sequential.skip","it.sequential.only","it.sequential.concurrent","it.sequential.todo","it.sequential.fails","it.todo.skip","it.todo.only","it.todo.concurrent","it.todo.sequential","it.todo.fails","it.fails.skip","it.fails.only","it.fails.concurrent","it.fails.sequential","it.fails.todo","it.extend.skip","it.extend.only","it.extend.concurrent","it.extend.sequential","it.extend.todo","it.extend.fails","it.skipIf.skip","it.skipIf.only","it.skipIf.concurrent","it.skipIf.sequential","it.skipIf.todo","it.skipIf.fails","it.runIf.skip","it.runIf.only","it.runIf.concurrent","it.runIf.sequential","it.runIf.todo","it.runIf.fails","it.skip.each","it.only.each","it.concurrent.each","it.sequential.each","it.todo.each","it.fails.each","it.extend.skipIf","it.extend.runIf","it.extend.each","it.skipIf.each","it.runIf.each","it.skip.only.concurrent","it.skip.only.sequential","it.skip.only.todo","it.skip.only.fails","it.skip.concurrent.only","it.skip.concurrent.sequential","it.skip.concurrent.todo","it.skip.concurrent.fails","it.skip.sequential.only","it.skip.sequential.concurrent","it.skip.sequential.todo","it.skip.sequential.fails","it.skip.todo.only","it.skip.todo.concurrent","it.skip.todo.sequential","it.skip.todo.fails","it.skip.fails.only","it.skip.fails.concurrent","it.skip.fails.sequential","it.skip.fails.todo","it.only.skip.concurrent","it.only.skip.sequential","it.only.skip.todo","it.only.skip.fails","it.only.concurrent.skip","it.only.concurrent.sequential","it.only.concurrent.todo","it.only.concurrent.fails","it.only.sequential.skip","it.only.sequential.concurrent","it.only.sequential.todo","it.only.sequential.fails","it.only.todo.skip","it.only.todo.concurrent","it.only.todo.sequential","it.only.todo.fails","it.only.fails.skip","it.only.fails.concurrent","it.only.fails.sequential","it.only.fails.todo","it.concurrent.skip.only","it.concurrent.skip.sequential","it.concurrent.skip.todo","it.concurrent.skip.fails","it.concurrent.only.skip","it.concurrent.only.sequential","it.concurrent.only.todo","it.concurrent.only.fails","it.concurrent.sequential.skip","it.concurrent.sequential.only","it.concurrent.sequential.todo","it.concurrent.sequential.fails","it.concurrent.todo.skip","it.concurrent.todo.only","it.concurrent.todo.sequential","it.concurrent.todo.fails","it.concurrent.fails.skip","it.concurrent.fails.only","it.concurrent.fails.sequential","it.concurrent.fails.todo","it.sequential.skip.only","it.sequential.skip.concurrent","it.sequential.skip.todo","it.sequential.skip.fails","it.sequential.only.skip","it.sequential.only.concurrent","it.sequential.only.todo","it.sequential.only.fails","it.sequential.concurrent.skip","it.sequential.concurrent.only","it.sequential.concurrent.todo","it.sequential.concurrent.fails","it.sequential.todo.skip","it.sequential.todo.only","it.sequential.todo.concurrent","it.sequential.todo.fails","it.sequential.fails.skip","it.sequential.fails.only","it.sequential.fails.concurrent","it.sequential.fails.todo","it.todo.skip.only","it.todo.skip.concurrent","it.todo.skip.sequential","it.todo.skip.fails","it.todo.only.skip","it.todo.only.concurrent","it.todo.only.sequential","it.todo.only.fails","it.todo.concurrent.skip","it.todo.concurrent.only","it.todo.concurrent.sequential","it.todo.concurrent.fails","it.todo.sequential.skip","it.todo.sequential.only","it.todo.sequential.concurrent","it.todo.sequential.fails","it.todo.fails.skip","it.todo.fails.only","it.todo.fails.concurrent","it.todo.fails.sequential","it.fails.skip.only","it.fails.skip.concurrent","it.fails.skip.sequential","it.fails.skip.todo","it.fails.only.skip","it.fails.only.concurrent","it.fails.only.sequential","it.fails.only.todo","it.fails.concurrent.skip","it.fails.concurrent.only","it.fails.concurrent.sequential","it.fails.concurrent.todo","it.fails.sequential.skip","it.fails.sequential.only","it.fails.sequential.concurrent","it.fails.sequential.todo","it.fails.todo.skip","it.fails.todo.only","it.fails.todo.concurrent","it.fails.todo.sequential","it.extend.skip.only","it.extend.skip.concurrent","it.extend.skip.sequential","it.extend.skip.todo","it.extend.skip.fails","it.extend.only.skip","it.extend.only.concurrent","it.extend.only.sequential","it.extend.only.todo","it.extend.only.fails","it.extend.concurrent.skip","it.extend.concurrent.only","it.extend.concurrent.sequential","it.extend.concurrent.todo","it.extend.concurrent.fails","it.extend.sequential.skip","it.extend.sequential.only","it.extend.sequential.concurrent","it.extend.sequential.todo","it.extend.sequential.fails","it.extend.todo.skip","it.extend.todo.only","it.extend.todo.concurrent","it.extend.todo.sequential","it.extend.todo.fails","it.extend.fails.skip","it.extend.fails.only","it.extend.fails.concurrent","it.extend.fails.sequential","it.extend.fails.todo","it.skipIf.skip.only","it.skipIf.skip.concurrent","it.skipIf.skip.sequential","it.skipIf.skip.todo","it.skipIf.skip.fails","it.skipIf.only.skip","it.skipIf.only.concurrent","it.skipIf.only.sequential","it.skipIf.only.todo","it.skipIf.only.fails","it.skipIf.concurrent.skip","it.skipIf.concurrent.only","it.skipIf.concurrent.sequential","it.skipIf.concurrent.todo","it.skipIf.concurrent.fails","it.skipIf.sequential.skip","it.skipIf.sequential.only","it.skipIf.sequential.concurrent","it.skipIf.sequential.todo","it.skipIf.sequential.fails","it.skipIf.todo.skip","it.skipIf.todo.only","it.skipIf.todo.concurrent","it.skipIf.todo.sequential","it.skipIf.todo.fails","it.skipIf.fails.skip","it.skipIf.fails.only","it.skipIf.fails.concurrent","it.skipIf.fails.sequential","it.skipIf.fails.todo","it.runIf.skip.only","it.runIf.skip.concurrent","it.runIf.skip.sequential","it.runIf.skip.todo","it.runIf.skip.fails","it.runIf.only.skip","it.runIf.only.concurrent","it.runIf.only.sequential","it.runIf.only.todo","it.runIf.only.fails","it.runIf.concurrent.skip","it.runIf.concurrent.only","it.runIf.concurrent.sequential","it.runIf.concurrent.todo","it.runIf.concurrent.fails","it.runIf.sequential.skip","it.runIf.sequential.only","it.runIf.sequential.concurrent","it.runIf.sequential.todo","it.runIf.sequential.fails","it.runIf.todo.skip","it.runIf.todo.only","it.runIf.todo.concurrent","it.runIf.todo.sequential","it.runIf.todo.fails","it.runIf.fails.skip","it.runIf.fails.only","it.runIf.fails.concurrent","it.runIf.fails.sequential","it.runIf.fails.todo","it.skip.only.each","it.skip.concurrent.each","it.skip.sequential.each","it.skip.todo.each","it.skip.fails.each","it.only.skip.each","it.only.concurrent.each","it.only.sequential.each","it.only.todo.each","it.only.fails.each","it.concurrent.skip.each","it.concurrent.only.each","it.concurrent.sequential.each","it.concurrent.todo.each","it.concurrent.fails.each","it.sequential.skip.each","it.sequential.only.each","it.sequential.concurrent.each","it.sequential.todo.each","it.sequential.fails.each","it.todo.skip.each","it.todo.only.each","it.todo.concurrent.each","it.todo.sequential.each","it.todo.fails.each","it.fails.skip.each","it.fails.only.each","it.fails.concurrent.each","it.fails.sequential.each","it.fails.todo.each","it.extend.skipIf.skip","it.extend.skipIf.only","it.extend.skipIf.concurrent","it.extend.skipIf.sequential","it.extend.skipIf.todo","it.extend.skipIf.fails","it.extend.runIf.skip","it.extend.runIf.only","it.extend.runIf.concurrent","it.extend.runIf.sequential","it.extend.runIf.todo","it.extend.runIf.fails","it.extend.skip.each","it.extend.only.each","it.extend.concurrent.each","it.extend.sequential.each","it.extend.todo.each","it.extend.fails.each","it.skipIf.skip.each","it.skipIf.only.each","it.skipIf.concurrent.each","it.skipIf.sequential.each","it.skipIf.todo.each","it.skipIf.fails.each","it.runIf.skip.each","it.runIf.only.each","it.runIf.concurrent.each","it.runIf.sequential.each","it.runIf.todo.each","it.runIf.fails.each","it.extend.skipIf.each","it.extend.runIf.each","test","test.skip","test.only","test.concurrent","test.sequential","test.todo","test.fails","test.extend","test.skipIf","test.runIf","test.each","test.skip.only","test.skip.concurrent","test.skip.sequential","test.skip.todo","test.skip.fails","test.only.skip","test.only.concurrent","test.only.sequential","test.only.todo","test.only.fails","test.concurrent.skip","test.concurrent.only","test.concurrent.sequential","test.concurrent.todo","test.concurrent.fails","test.sequential.skip","test.sequential.only","test.sequential.concurrent","test.sequential.todo","test.sequential.fails","test.todo.skip","test.todo.only","test.todo.concurrent","test.todo.sequential","test.todo.fails","test.fails.skip","test.fails.only","test.fails.concurrent","test.fails.sequential","test.fails.todo","test.extend.skip","test.extend.only","test.extend.concurrent","test.extend.sequential","test.extend.todo","test.extend.fails","test.skipIf.skip","test.skipIf.only","test.skipIf.concurrent","test.skipIf.sequential","test.skipIf.todo","test.skipIf.fails","test.runIf.skip","test.runIf.only","test.runIf.concurrent","test.runIf.sequential","test.runIf.todo","test.runIf.fails","test.skip.each","test.only.each","test.concurrent.each","test.sequential.each","test.todo.each","test.fails.each","test.extend.skipIf","test.extend.runIf","test.extend.each","test.skipIf.each","test.runIf.each","test.skip.only.concurrent","test.skip.only.sequential","test.skip.only.todo","test.skip.only.fails","test.skip.concurrent.only","test.skip.concurrent.sequential","test.skip.concurrent.todo","test.skip.concurrent.fails","test.skip.sequential.only","test.skip.sequential.concurrent","test.skip.sequential.todo","test.skip.sequential.fails","test.skip.todo.only","test.skip.todo.concurrent","test.skip.todo.sequential","test.skip.todo.fails","test.skip.fails.only","test.skip.fails.concurrent","test.skip.fails.sequential","test.skip.fails.todo","test.only.skip.concurrent","test.only.skip.sequential","test.only.skip.todo","test.only.skip.fails","test.only.concurrent.skip","test.only.concurrent.sequential","test.only.concurrent.todo","test.only.concurrent.fails","test.only.sequential.skip","test.only.sequential.concurrent","test.only.sequential.todo","test.only.sequential.fails","test.only.todo.skip","test.only.todo.concurrent","test.only.todo.sequential","test.only.todo.fails","test.only.fails.skip","test.only.fails.concurrent","test.only.fails.sequential","test.only.fails.todo","test.concurrent.skip.only","test.concurrent.skip.sequential","test.concurrent.skip.todo","test.concurrent.skip.fails","test.concurrent.only.skip","test.concurrent.only.sequential","test.concurrent.only.todo","test.concurrent.only.fails","test.concurrent.sequential.skip","test.concurrent.sequential.only","test.concurrent.sequential.todo","test.concurrent.sequential.fails","test.concurrent.todo.skip","test.concurrent.todo.only","test.concurrent.todo.sequential","test.concurrent.todo.fails","test.concurrent.fails.skip","test.concurrent.fails.only","test.concurrent.fails.sequential","test.concurrent.fails.todo","test.sequential.skip.only","test.sequential.skip.concurrent","test.sequential.skip.todo","test.sequential.skip.fails","test.sequential.only.skip","test.sequential.only.concurrent","test.sequential.only.todo","test.sequential.only.fails","test.sequential.concurrent.skip","test.sequential.concurrent.only","test.sequential.concurrent.todo","test.sequential.concurrent.fails","test.sequential.todo.skip","test.sequential.todo.only","test.sequential.todo.concurrent","test.sequential.todo.fails","test.sequential.fails.skip","test.sequential.fails.only","test.sequential.fails.concurrent","test.sequential.fails.todo","test.todo.skip.only","test.todo.skip.concurrent","test.todo.skip.sequential","test.todo.skip.fails","test.todo.only.skip","test.todo.only.concurrent","test.todo.only.sequential","test.todo.only.fails","test.todo.concurrent.skip","test.todo.concurrent.only","test.todo.concurrent.sequential","test.todo.concurrent.fails","test.todo.sequential.skip","test.todo.sequential.only","test.todo.sequential.concurrent","test.todo.sequential.fails","test.todo.fails.skip","test.todo.fails.only","test.todo.fails.concurrent","test.todo.fails.sequential","test.fails.skip.only","test.fails.skip.concurrent","test.fails.skip.sequential","test.fails.skip.todo","test.fails.only.skip","test.fails.only.concurrent","test.fails.only.sequential","test.fails.only.todo","test.fails.concurrent.skip","test.fails.concurrent.only","test.fails.concurrent.sequential","test.fails.concurrent.todo","test.fails.sequential.skip","test.fails.sequential.only","test.fails.sequential.concurrent","test.fails.sequential.todo","test.fails.todo.skip","test.fails.todo.only","test.fails.todo.concurrent","test.fails.todo.sequential","test.extend.skip.only","test.extend.skip.concurrent","test.extend.skip.sequential","test.extend.skip.todo","test.extend.skip.fails","test.extend.only.skip","test.extend.only.concurrent","test.extend.only.sequential","test.extend.only.todo","test.extend.only.fails","test.extend.concurrent.skip","test.extend.concurrent.only","test.extend.concurrent.sequential","test.extend.concurrent.todo","test.extend.concurrent.fails","test.extend.sequential.skip","test.extend.sequential.only","test.extend.sequential.concurrent","test.extend.sequential.todo","test.extend.sequential.fails","test.extend.todo.skip","test.extend.todo.only","test.extend.todo.concurrent","test.extend.todo.sequential","test.extend.todo.fails","test.extend.fails.skip","test.extend.fails.only","test.extend.fails.concurrent","test.extend.fails.sequential","test.extend.fails.todo","test.skipIf.skip.only","test.skipIf.skip.concurrent","test.skipIf.skip.sequential","test.skipIf.skip.todo","test.skipIf.skip.fails","test.skipIf.only.skip","test.skipIf.only.concurrent","test.skipIf.only.sequential","test.skipIf.only.todo","test.skipIf.only.fails","test.skipIf.concurrent.skip","test.skipIf.concurrent.only","test.skipIf.concurrent.sequential","test.skipIf.concurrent.todo","test.skipIf.concurrent.fails","test.skipIf.sequential.skip","test.skipIf.sequential.only","test.skipIf.sequential.concurrent","test.skipIf.sequential.todo","test.skipIf.sequential.fails","test.skipIf.todo.skip","test.skipIf.todo.only","test.skipIf.todo.concurrent","test.skipIf.todo.sequential","test.skipIf.todo.fails","test.skipIf.fails.skip","test.skipIf.fails.only","test.skipIf.fails.concurrent","test.skipIf.fails.sequential","test.skipIf.fails.todo","test.runIf.skip.only","test.runIf.skip.concurrent","test.runIf.skip.sequential","test.runIf.skip.todo","test.runIf.skip.fails","test.runIf.only.skip","test.runIf.only.concurrent","test.runIf.only.sequential","test.runIf.only.todo","test.runIf.only.fails","test.runIf.concurrent.skip","test.runIf.concurrent.only","test.runIf.concurrent.sequential","test.runIf.concurrent.todo","test.runIf.concurrent.fails","test.runIf.sequential.skip","test.runIf.sequential.only","test.runIf.sequential.concurrent","test.runIf.sequential.todo","test.runIf.sequential.fails","test.runIf.todo.skip","test.runIf.todo.only","test.runIf.todo.concurrent","test.runIf.todo.sequential","test.runIf.todo.fails","test.runIf.fails.skip","test.runIf.fails.only","test.runIf.fails.concurrent","test.runIf.fails.sequential","test.runIf.fails.todo","test.skip.only.each","test.skip.concurrent.each","test.skip.sequential.each","test.skip.todo.each","test.skip.fails.each","test.only.skip.each","test.only.concurrent.each","test.only.sequential.each","test.only.todo.each","test.only.fails.each","test.concurrent.skip.each","test.concurrent.only.each","test.concurrent.sequential.each","test.concurrent.todo.each","test.concurrent.fails.each","test.sequential.skip.each","test.sequential.only.each","test.sequential.concurrent.each","test.sequential.todo.each","test.sequential.fails.each","test.todo.skip.each","test.todo.only.each","test.todo.concurrent.each","test.todo.sequential.each","test.todo.fails.each","test.fails.skip.each","test.fails.only.each","test.fails.concurrent.each","test.fails.sequential.each","test.fails.todo.each","test.extend.skipIf.skip","test.extend.skipIf.only","test.extend.skipIf.concurrent","test.extend.skipIf.sequential","test.extend.skipIf.todo","test.extend.skipIf.fails","test.extend.runIf.skip","test.extend.runIf.only","test.extend.runIf.concurrent","test.extend.runIf.sequential","test.extend.runIf.todo","test.extend.runIf.fails","test.extend.skip.each","test.extend.only.each","test.extend.concurrent.each","test.extend.sequential.each","test.extend.todo.each","test.extend.fails.each","test.skipIf.skip.each","test.skipIf.only.each","test.skipIf.concurrent.each","test.skipIf.sequential.each","test.skipIf.todo.each","test.skipIf.fails.each","test.runIf.skip.each","test.runIf.only.each","test.runIf.concurrent.each","test.runIf.sequential.each","test.runIf.todo.each","test.runIf.fails.each","test.extend.skipIf.each","test.extend.runIf.each","bench","bench.skip","bench.only","bench.todo","bench.skipIf","bench.runIf","bench.skip.only","bench.skip.todo","bench.only.skip","bench.only.todo","bench.todo.skip","bench.todo.only","bench.skipIf.skip","bench.skipIf.only","bench.skipIf.todo","bench.runIf.skip","bench.runIf.only","bench.runIf.todo","bench.skip.only.todo","bench.skip.todo.only","bench.only.skip.todo","bench.only.todo.skip","bench.todo.skip.only","bench.todo.only.skip","bench.skipIf.skip.only","bench.skipIf.skip.todo","bench.skipIf.only.skip","bench.skipIf.only.todo","bench.skipIf.todo.skip","bench.skipIf.todo.only","bench.runIf.skip.only","bench.runIf.skip.todo","bench.runIf.only.skip","bench.runIf.only.todo","bench.runIf.todo.skip","bench.runIf.todo.only","describe","describe.skip","describe.only","describe.concurrent","describe.sequential","describe.shuffle","describe.todo","describe.skipIf","describe.runIf","describe.each","describe.skip.only","describe.skip.concurrent","describe.skip.sequential","describe.skip.shuffle","describe.skip.todo","describe.only.skip","describe.only.concurrent","describe.only.sequential","describe.only.shuffle","describe.only.todo","describe.concurrent.skip","describe.concurrent.only","describe.concurrent.sequential","describe.concurrent.shuffle","describe.concurrent.todo","describe.sequential.skip","describe.sequential.only","describe.sequential.concurrent","describe.sequential.shuffle","describe.sequential.todo","describe.shuffle.skip","describe.shuffle.only","describe.shuffle.concurrent","describe.shuffle.sequential","describe.shuffle.todo","describe.todo.skip","describe.todo.only","describe.todo.concurrent","describe.todo.sequential","describe.todo.shuffle","describe.skipIf.skip","describe.skipIf.only","describe.skipIf.concurrent","describe.skipIf.sequential","describe.skipIf.shuffle","describe.skipIf.todo","describe.runIf.skip","describe.runIf.only","describe.runIf.concurrent","describe.runIf.sequential","describe.runIf.shuffle","describe.runIf.todo","describe.skip.each","describe.only.each","describe.concurrent.each","describe.sequential.each","describe.shuffle.each","describe.todo.each","describe.skipIf.each","describe.runIf.each","describe.skip.only.concurrent","describe.skip.only.sequential","describe.skip.only.shuffle","describe.skip.only.todo","describe.skip.concurrent.only","describe.skip.concurrent.sequential","describe.skip.concurrent.shuffle","describe.skip.concurrent.todo","describe.skip.sequential.only","describe.skip.sequential.concurrent","describe.skip.sequential.shuffle","describe.skip.sequential.todo","describe.skip.shuffle.only","describe.skip.shuffle.concurrent","describe.skip.shuffle.sequential","describe.skip.shuffle.todo","describe.skip.todo.only","describe.skip.todo.concurrent","describe.skip.todo.sequential","describe.skip.todo.shuffle","describe.only.skip.concurrent","describe.only.skip.sequential","describe.only.skip.shuffle","describe.only.skip.todo","describe.only.concurrent.skip","describe.only.concurrent.sequential","describe.only.concurrent.shuffle","describe.only.concurrent.todo","describe.only.sequential.skip","describe.only.sequential.concurrent","describe.only.sequential.shuffle","describe.only.sequential.todo","describe.only.shuffle.skip","describe.only.shuffle.concurrent","describe.only.shuffle.sequential","describe.only.shuffle.todo","describe.only.todo.skip","describe.only.todo.concurrent","describe.only.todo.sequential","describe.only.todo.shuffle","describe.concurrent.skip.only","describe.concurrent.skip.sequential","describe.concurrent.skip.shuffle","describe.concurrent.skip.todo","describe.concurrent.only.skip","describe.concurrent.only.sequential","describe.concurrent.only.shuffle","describe.concurrent.only.todo","describe.concurrent.sequential.skip","describe.concurrent.sequential.only","describe.concurrent.sequential.shuffle","describe.concurrent.sequential.todo","describe.concurrent.shuffle.skip","describe.concurrent.shuffle.only","describe.concurrent.shuffle.sequential","describe.concurrent.shuffle.todo","describe.concurrent.todo.skip","describe.concurrent.todo.only","describe.concurrent.todo.sequential","describe.concurrent.todo.shuffle","describe.sequential.skip.only","describe.sequential.skip.concurrent","describe.sequential.skip.shuffle","describe.sequential.skip.todo","describe.sequential.only.skip","describe.sequential.only.concurrent","describe.sequential.only.shuffle","describe.sequential.only.todo","describe.sequential.concurrent.skip","describe.sequential.concurrent.only","describe.sequential.concurrent.shuffle","describe.sequential.concurrent.todo","describe.sequential.shuffle.skip","describe.sequential.shuffle.only","describe.sequential.shuffle.concurrent","describe.sequential.shuffle.todo","describe.sequential.todo.skip","describe.sequential.todo.only","describe.sequential.todo.concurrent","describe.sequential.todo.shuffle","describe.shuffle.skip.only","describe.shuffle.skip.concurrent","describe.shuffle.skip.sequential","describe.shuffle.skip.todo","describe.shuffle.only.skip","describe.shuffle.only.concurrent","describe.shuffle.only.sequential","describe.shuffle.only.todo","describe.shuffle.concurrent.skip","describe.shuffle.concurrent.only","describe.shuffle.concurrent.sequential","describe.shuffle.concurrent.todo","describe.shuffle.sequential.skip","describe.shuffle.sequential.only","describe.shuffle.sequential.concurrent","describe.shuffle.sequential.todo","describe.shuffle.todo.skip","describe.shuffle.todo.only","describe.shuffle.todo.concurrent","describe.shuffle.todo.sequential","describe.todo.skip.only","describe.todo.skip.concurrent","describe.todo.skip.sequential","describe.todo.skip.shuffle","describe.todo.only.skip","describe.todo.only.concurrent","describe.todo.only.sequential","describe.todo.only.shuffle","describe.todo.concurrent.skip","describe.todo.concurrent.only","describe.todo.concurrent.sequential","describe.todo.concurrent.shuffle","describe.todo.sequential.skip","describe.todo.sequential.only","describe.todo.sequential.concurrent","describe.todo.sequential.shuffle","describe.todo.shuffle.skip","describe.todo.shuffle.only","describe.todo.shuffle.concurrent","describe.todo.shuffle.sequential","describe.skipIf.skip.only","describe.skipIf.skip.concurrent","describe.skipIf.skip.sequential","describe.skipIf.skip.shuffle","describe.skipIf.skip.todo","describe.skipIf.only.skip","describe.skipIf.only.concurrent","describe.skipIf.only.sequential","describe.skipIf.only.shuffle","describe.skipIf.only.todo","describe.skipIf.concurrent.skip","describe.skipIf.concurrent.only","describe.skipIf.concurrent.sequential","describe.skipIf.concurrent.shuffle","describe.skipIf.concurrent.todo","describe.skipIf.sequential.skip","describe.skipIf.sequential.only","describe.skipIf.sequential.concurrent","describe.skipIf.sequential.shuffle","describe.skipIf.sequential.todo","describe.skipIf.shuffle.skip","describe.skipIf.shuffle.only","describe.skipIf.shuffle.concurrent","describe.skipIf.shuffle.sequential","describe.skipIf.shuffle.todo","describe.skipIf.todo.skip","describe.skipIf.todo.only","describe.skipIf.todo.concurrent","describe.skipIf.todo.sequential","describe.skipIf.todo.shuffle","describe.runIf.skip.only","describe.runIf.skip.concurrent","describe.runIf.skip.sequential","describe.runIf.skip.shuffle","describe.runIf.skip.todo","describe.runIf.only.skip","describe.runIf.only.concurrent","describe.runIf.only.sequential","describe.runIf.only.shuffle","describe.runIf.only.todo","describe.runIf.concurrent.skip","describe.runIf.concurrent.only","describe.runIf.concurrent.sequential","describe.runIf.concurrent.shuffle","describe.runIf.concurrent.todo","describe.runIf.sequential.skip","describe.runIf.sequential.only","describe.runIf.sequential.concurrent","describe.runIf.sequential.shuffle","describe.runIf.sequential.todo","describe.runIf.shuffle.skip","describe.runIf.shuffle.only","describe.runIf.shuffle.concurrent","describe.runIf.shuffle.sequential","describe.runIf.shuffle.todo","describe.runIf.todo.skip","describe.runIf.todo.only","describe.runIf.todo.concurrent","describe.runIf.todo.sequential","describe.runIf.todo.shuffle","describe.skip.only.each","describe.skip.concurrent.each","describe.skip.sequential.each","describe.skip.shuffle.each","describe.skip.todo.each","describe.only.skip.each","describe.only.concurrent.each","describe.only.sequential.each","describe.only.shuffle.each","describe.only.todo.each","describe.concurrent.skip.each","describe.concurrent.only.each","describe.concurrent.sequential.each","describe.concurrent.shuffle.each","describe.concurrent.todo.each","describe.sequential.skip.each","describe.sequential.only.each","describe.sequential.concurrent.each","describe.sequential.shuffle.each","describe.sequential.todo.each","describe.shuffle.skip.each","describe.shuffle.only.each","describe.shuffle.concurrent.each","describe.shuffle.sequential.each","describe.shuffle.todo.each","describe.todo.skip.each","describe.todo.only.each","describe.todo.concurrent.each","describe.todo.sequential.each","describe.todo.shuffle.each","describe.skipIf.skip.each","describe.skipIf.only.each","describe.skipIf.concurrent.each","describe.skipIf.sequential.each","describe.skipIf.shuffle.each","describe.skipIf.todo.each","describe.runIf.skip.each","describe.runIf.only.each","describe.runIf.concurrent.each","describe.runIf.sequential.each","describe.runIf.shuffle.each","describe.runIf.todo.each","suite","suite.skip","suite.only","suite.concurrent","suite.sequential","suite.shuffle","suite.todo","suite.skipIf","suite.runIf","suite.each","suite.skip.only","suite.skip.concurrent","suite.skip.sequential","suite.skip.shuffle","suite.skip.todo","suite.only.skip","suite.only.concurrent","suite.only.sequential","suite.only.shuffle","suite.only.todo","suite.concurrent.skip","suite.concurrent.only","suite.concurrent.sequential","suite.concurrent.shuffle","suite.concurrent.todo","suite.sequential.skip","suite.sequential.only","suite.sequential.concurrent","suite.sequential.shuffle","suite.sequential.todo","suite.shuffle.skip","suite.shuffle.only","suite.shuffle.concurrent","suite.shuffle.sequential","suite.shuffle.todo","suite.todo.skip","suite.todo.only","suite.todo.concurrent","suite.todo.sequential","suite.todo.shuffle","suite.skipIf.skip","suite.skipIf.only","suite.skipIf.concurrent","suite.skipIf.sequential","suite.skipIf.shuffle","suite.skipIf.todo","suite.runIf.skip","suite.runIf.only","suite.runIf.concurrent","suite.runIf.sequential","suite.runIf.shuffle","suite.runIf.todo","suite.skip.each","suite.only.each","suite.concurrent.each","suite.sequential.each","suite.shuffle.each","suite.todo.each","suite.skipIf.each","suite.runIf.each","suite.skip.only.concurrent","suite.skip.only.sequential","suite.skip.only.shuffle","suite.skip.only.todo","suite.skip.concurrent.only","suite.skip.concurrent.sequential","suite.skip.concurrent.shuffle","suite.skip.concurrent.todo","suite.skip.sequential.only","suite.skip.sequential.concurrent","suite.skip.sequential.shuffle","suite.skip.sequential.todo","suite.skip.shuffle.only","suite.skip.shuffle.concurrent","suite.skip.shuffle.sequential","suite.skip.shuffle.todo","suite.skip.todo.only","suite.skip.todo.concurrent","suite.skip.todo.sequential","suite.skip.todo.shuffle","suite.only.skip.concurrent","suite.only.skip.sequential","suite.only.skip.shuffle","suite.only.skip.todo","suite.only.concurrent.skip","suite.only.concurrent.sequential","suite.only.concurrent.shuffle","suite.only.concurrent.todo","suite.only.sequential.skip","suite.only.sequential.concurrent","suite.only.sequential.shuffle","suite.only.sequential.todo","suite.only.shuffle.skip","suite.only.shuffle.concurrent","suite.only.shuffle.sequential","suite.only.shuffle.todo","suite.only.todo.skip","suite.only.todo.concurrent","suite.only.todo.sequential","suite.only.todo.shuffle","suite.concurrent.skip.only","suite.concurrent.skip.sequential","suite.concurrent.skip.shuffle","suite.concurrent.skip.todo","suite.concurrent.only.skip","suite.concurrent.only.sequential","suite.concurrent.only.shuffle","suite.concurrent.only.todo","suite.concurrent.sequential.skip","suite.concurrent.sequential.only","suite.concurrent.sequential.shuffle","suite.concurrent.sequential.todo","suite.concurrent.shuffle.skip","suite.concurrent.shuffle.only","suite.concurrent.shuffle.sequential","suite.concurrent.shuffle.todo","suite.concurrent.todo.skip","suite.concurrent.todo.only","suite.concurrent.todo.sequential","suite.concurrent.todo.shuffle","suite.sequential.skip.only","suite.sequential.skip.concurrent","suite.sequential.skip.shuffle","suite.sequential.skip.todo","suite.sequential.only.skip","suite.sequential.only.concurrent","suite.sequential.only.shuffle","suite.sequential.only.todo","suite.sequential.concurrent.skip","suite.sequential.concurrent.only","suite.sequential.concurrent.shuffle","suite.sequential.concurrent.todo","suite.sequential.shuffle.skip","suite.sequential.shuffle.only","suite.sequential.shuffle.concurrent","suite.sequential.shuffle.todo","suite.sequential.todo.skip","suite.sequential.todo.only","suite.sequential.todo.concurrent","suite.sequential.todo.shuffle","suite.shuffle.skip.only","suite.shuffle.skip.concurrent","suite.shuffle.skip.sequential","suite.shuffle.skip.todo","suite.shuffle.only.skip","suite.shuffle.only.concurrent","suite.shuffle.only.sequential","suite.shuffle.only.todo","suite.shuffle.concurrent.skip","suite.shuffle.concurrent.only","suite.shuffle.concurrent.sequential","suite.shuffle.concurrent.todo","suite.shuffle.sequential.skip","suite.shuffle.sequential.only","suite.shuffle.sequential.concurrent","suite.shuffle.sequential.todo","suite.shuffle.todo.skip","suite.shuffle.todo.only","suite.shuffle.todo.concurrent","suite.shuffle.todo.sequential","suite.todo.skip.only","suite.todo.skip.concurrent","suite.todo.skip.sequential","suite.todo.skip.shuffle","suite.todo.only.skip","suite.todo.only.concurrent","suite.todo.only.sequential","suite.todo.only.shuffle","suite.todo.concurrent.skip","suite.todo.concurrent.only","suite.todo.concurrent.sequential","suite.todo.concurrent.shuffle","suite.todo.sequential.skip","suite.todo.sequential.only","suite.todo.sequential.concurrent","suite.todo.sequential.shuffle","suite.todo.shuffle.skip","suite.todo.shuffle.only","suite.todo.shuffle.concurrent","suite.todo.shuffle.sequential","suite.skipIf.skip.only","suite.skipIf.skip.concurrent","suite.skipIf.skip.sequential","suite.skipIf.skip.shuffle","suite.skipIf.skip.todo","suite.skipIf.only.skip","suite.skipIf.only.concurrent","suite.skipIf.only.sequential","suite.skipIf.only.shuffle","suite.skipIf.only.todo","suite.skipIf.concurrent.skip","suite.skipIf.concurrent.only","suite.skipIf.concurrent.sequential","suite.skipIf.concurrent.shuffle","suite.skipIf.concurrent.todo","suite.skipIf.sequential.skip","suite.skipIf.sequential.only","suite.skipIf.sequential.concurrent","suite.skipIf.sequential.shuffle","suite.skipIf.sequential.todo","suite.skipIf.shuffle.skip","suite.skipIf.shuffle.only","suite.skipIf.shuffle.concurrent","suite.skipIf.shuffle.sequential","suite.skipIf.shuffle.todo","suite.skipIf.todo.skip","suite.skipIf.todo.only","suite.skipIf.todo.concurrent","suite.skipIf.todo.sequential","suite.skipIf.todo.shuffle","suite.runIf.skip.only","suite.runIf.skip.concurrent","suite.runIf.skip.sequential","suite.runIf.skip.shuffle","suite.runIf.skip.todo","suite.runIf.only.skip","suite.runIf.only.concurrent","suite.runIf.only.sequential","suite.runIf.only.shuffle","suite.runIf.only.todo","suite.runIf.concurrent.skip","suite.runIf.concurrent.only","suite.runIf.concurrent.sequential","suite.runIf.concurrent.shuffle","suite.runIf.concurrent.todo","suite.runIf.sequential.skip","suite.runIf.sequential.only","suite.runIf.sequential.concurrent","suite.runIf.sequential.shuffle","suite.runIf.sequential.todo","suite.runIf.shuffle.skip","suite.runIf.shuffle.only","suite.runIf.shuffle.concurrent","suite.runIf.shuffle.sequential","suite.runIf.shuffle.todo","suite.runIf.todo.skip","suite.runIf.todo.only","suite.runIf.todo.concurrent","suite.runIf.todo.sequential","suite.runIf.todo.shuffle","suite.skip.only.each","suite.skip.concurrent.each","suite.skip.sequential.each","suite.skip.shuffle.each","suite.skip.todo.each","suite.only.skip.each","suite.only.concurrent.each","suite.only.sequential.each","suite.only.shuffle.each","suite.only.todo.each","suite.concurrent.skip.each","suite.concurrent.only.each","suite.concurrent.sequential.each","suite.concurrent.shuffle.each","suite.concurrent.todo.each","suite.sequential.skip.each","suite.sequential.only.each","suite.sequential.concurrent.each","suite.sequential.shuffle.each","suite.sequential.todo.each","suite.shuffle.skip.each","suite.shuffle.only.each","suite.shuffle.concurrent.each","suite.shuffle.sequential.each","suite.shuffle.todo.each","suite.todo.skip.each","suite.todo.only.each","suite.todo.concurrent.each","suite.todo.sequential.each","suite.todo.shuffle.each","suite.skipIf.skip.each","suite.skipIf.only.each","suite.skipIf.concurrent.each","suite.skipIf.sequential.each","suite.skipIf.shuffle.each","suite.skipIf.todo.each","suite.runIf.skip.each","suite.runIf.only.each","suite.runIf.concurrent.each","suite.runIf.sequential.each","suite.runIf.shuffle.each","suite.runIf.todo.each","xtest","xtest.each","xit","xit.each","fit","xdescribe","xdescribe.each","fdescribe"]);function getScope(q,$){return q.sourceCode.getScope?q.sourceCode.getScope($):q.getScope()}function getModuleScope(q,$){let Y=getScope(q,$);for(;Y;){if(Y.type==="module")return Y;Y=Y.upper}return Y}const isTypeOfVitestFnCall=(q,$,Y)=>{const B=parseVitestFnCall(q,$);return B!==null&&Y.includes(B.type)},parseVitestFnCall=(q,$)=>{const Y=parseVitestFnCallWithReason(q,$);return typeof Y=="string"?null:Y},y$4=new WeakMap,parseVitestFnCallWithReason=(q,$)=>{let Y=y$4.get(q);return Y||(Y=M$3(q,$),y$4.set(q,Y),Y)},A$3=q=>q==="expect"?"expect":q==="expectTypeOf"?"expectTypeOf":q==="vi"?"vi":q==="vitest"?"vitest":DescribeAlias.hasOwnProperty(q)?"describe":TestCaseName.hasOwnProperty(q)?"test":HookName.hasOwnProperty(q)?"hook":"unknown",w$2=q=>{const $=[];for(const Y of q){if(Y.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&Y.parent.parent?.type===utils.AST_NODE_TYPES.CallExpression)return{matcher:Y,args:Y.parent.parent.arguments,modifiers:$};const B=getAccessorValue(Y);if($.length===0){if(!ModifierName.hasOwnProperty(B))return"modifier-unknown"}else if($.length===1){if(B!==ModifierName.not&&B!=ModifierName.have)return"modifier-unknown";const F=getAccessorValue($[0]);if(F!==ModifierName.resolves&&F!==ModifierName.rejects&&F!==ModifierName.to)return"modifier-unknown"}else return"modifier-unknown";$.push(Y)}return"matcher-not-found"},P$2=(q,$)=>{const Y=w$2(q.members);return typeof Y=="string"?Y:{...q,type:$,...Y}},findTopMostCallExpression=q=>{let $=q,{parent:Y}=q;for(;Y;){if(Y.type===utils.AST_NODE_TYPES.CallExpression){$=Y,Y=Y.parent;continue}if(Y.type!==utils.AST_NODE_TYPES.MemberExpression)break;Y=Y.parent}return $},M$3=(q,$)=>{const Y=getNodeChain(q);if(!Y?.length)return null;const[B,...F]=Y,W=getAccessorValue(Y[Y.length-1]);if(W==="each"&&q.callee.type!==utils.AST_NODE_TYPES.CallExpression&&q.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||q.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&W!=="each")return null;const V=v($,q,getAccessorValue(B));if(!V)return null;const H=V.original??V.local,G=[H,...F.map(getAccessorValue)];if(V.type!=="testContext"&&H!=="vi"&&H!=="vitest"&&H!=="expect"&&H!=="expectTypeOf"&&!ValidVitestFnCallChains.has(G.join(".")))return null;const z={name:H,head:{...V,node:B},members:F},J=A$3(H);if(J==="expect"||J==="expectTypeOf"){const X=P$2(z,J);return typeof X=="string"&&findTopMostCallExpression(q)!==q?null:X==="matcher-not-found"&&q.parent?.type===utils.AST_NODE_TYPES.MemberExpression?"matcher-not-called":X}return Y.slice(0,Y.length-1).some(X=>X.parent?.type!==utils.AST_NODE_TYPES.MemberExpression)||q.parent?.type===utils.AST_NODE_TYPES.CallExpression||q.parent?.type===utils.AST_NODE_TYPES.MemberExpression?null:{...z,type:J}},k$1=(q,$)=>q&&$?[...q,...$]:null;function getNodeChain(q){if(isSupportedAccessor(q))return[q];switch(q.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeChain(q.tag);case utils.AST_NODE_TYPES.MemberExpression:return k$1(getNodeChain(q.object),getNodeChain(q.property));case utils.AST_NODE_TYPES.CallExpression:return getNodeChain(q.callee)}return null}const v=(q,$,Y)=>{const B=getScope(q,$),F=resolveScope(B,Y);return F==="local"?null:F==="testContext"?{local:Y,original:null,type:"testContext"}:F?F.source==="vitest"?{original:F.imported,local:F.local,type:"import"}:null:{original:N$4(Y,q),local:Y,type:"global"}},N$4=(q,$)=>{const Y=$.settings.vitest?.globalAliases??{},B=Object.entries(Y).find(([F,W])=>W.includes(q));return B?B[0]:null},I$1=({parent:q})=>{if(q?.type===utils.AST_NODE_TYPES.CallExpression&&q.callee.type===utils.AST_NODE_TYPES.Identifier)return TestCaseName.hasOwnProperty(q.callee.name)},resolveScope=(q,$)=>{let Y=q;for(;Y!==null;){const B=Y.set.get($);if(B&&B.defs.length>0){const F=B.defs[B.defs.length-1],W=isFunction(F.node)?F.node.params.find(G=>G.type===utils.AST_NODE_TYPES.ObjectPattern):void 0;if(W){const G=W.properties.find(z=>z.type===utils.AST_NODE_TYPES.Property);if((G?.key.type===utils.AST_NODE_TYPES.Identifier?G.key:void 0)?.name===$)return"testContext"}const V=isFunction(F.node)?F.node.params.find(G=>G.type===utils.AST_NODE_TYPES.Identifier):void 0;if(V&&I$1(V.parent))return"testContext";const H=D$1(F);return H?.local===$?H:"local"}Y=Y.upper}return null},R=q=>q.type===utils.AST_NODE_TYPES.AwaitExpression?q.argument.type===utils.AST_NODE_TYPES.ImportExpression?q.argument.source:null:q.type===utils.AST_NODE_TYPES.CallExpression&&isIdentifier(q.callee,"require")?q.arguments[0]??null:null,O$2=q=>q.parent.type===utils.AST_NODE_TYPES.TSImportEqualsDeclaration||q.node.type!==utils.AST_NODE_TYPES.ImportSpecifier||q.node.imported.type!=utils.AST_NODE_TYPES.Identifier||q.parent.importKind==="type"?null:{source:q.parent.source.value,imported:q.node.imported.name,local:q.node.local.name},D$1=q=>q.type==="Variable"?L$1(q):q.type==="ImportBinding"?O$2(q):null,L$1=q=>{if(!q.node.init)return null;const $=R(q.node.init);return!$||!isStringNode($)||q.name.parent?.type!==utils.AST_NODE_TYPES.Property||!isSupportedAccessor(q.name.parent.key)?null:{source:getStringValue($),imported:getAccessorValue(q.name.parent.key),local:q.name.name}},getTestCallExpressionsFromDeclaredVariables=(q,$)=>q.reduce((Y,{references:B})=>Y.concat(B.map(({identifier:F})=>F.parent).filter(F=>F?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(F,$,["test"]))),[]),getFirstMatcherArg=q=>{const[$]=q.args;return $.type===utils.AST_NODE_TYPES.SpreadElement?$:followTypeAssertionChain$1($)},K=q=>q.type===utils.AST_NODE_TYPES.TSAsExpression||q.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain$1=q=>K(q)?followTypeAssertionChain$1(q.expression):q,RULE_NAME$16="prefer-lowercase-title",E$5=q=>q.arguments[0]&&isStringNode(q.arguments[0]),x$4=q=>{const $=[];return q.includes(DescribeAlias.describe)&&$.push(...Object.keys(DescribeAlias)),q.includes(TestCaseName.test)&&$.push(...Object.keys(TestCaseName).filter(Y=>Y.endsWith(TestCaseName.test))),q.includes(TestCaseName.it)&&$.push(...Object.keys(TestCaseName).filter(Y=>Y.endsWith(TestCaseName.it))),$},be=createEslintRule({name:RULE_NAME$16,meta:{type:"problem",docs:{description:"enforce lowercase titles",recommended:!1},fixable:"code",messages:{lowerCaseTitle:"`{{ method }}`s should begin with lowercase",fullyLowerCaseTitle:"`{{ method }}`s should be lowercase"},schema:[{type:"object",properties:{ignore:{type:"array",items:{type:"string",enum:[DescribeAlias.describe,TestCaseName.test,TestCaseName.it]}},allowedPrefixes:{type:"array",items:{type:"string"},additionalItems:!1},ignoreTopLevelDescribe:{type:"boolean",default:!1},lowercaseFirstCharacterOnly:{type:"boolean",default:!0}},additionalProperties:!1}]},defaultOptions:[{ignore:[],allowedPrefixes:[],ignoreTopLevelDescribe:!1,lowercaseFirstCharacterOnly:!0}],create:(q,[{ignore:$=[],allowedPrefixes:Y=[],ignoreTopLevelDescribe:B=!1,lowercaseFirstCharacterOnly:F=!1}])=>{const W=x$4($);let V=0;return{CallExpression(H){const G=parseVitestFnCall(H,q);if(!G||!E$5)return;if(G?.type==="describe"){if(V++,B&&V===1)return}else if(G?.type!=="test")return;const[z]=H.arguments,J=getStringValue(z);if(typeof J!="string"||Y.some(te=>J.startsWith(te)))return;const X=J.charAt(0);W.includes(G.name)||F&&(!X||X===X.toLowerCase())||!F&&J===J.toLowerCase()||q.report({messageId:F?"lowerCaseTitle":"fullyLowerCaseTitle",node:H.arguments[0],data:{method:G.name},fix:te=>{const Q=getStringValue(z),se=[z.range[0]+1,z.range[1]-1],Z=F?Q.substring(0,1).toLowerCase()+Q.substring(1):Q.toLowerCase();return[te.replaceTextRange(se,Z)]}})},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,q,["describe"])&&V--}}}}),RULE_NAME$15="max-nested-describe",ge=createEslintRule({name:RULE_NAME$15,meta:{type:"problem",docs:{description:"require describe block to be less than set max value or default value",recommended:!1},schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}],messages:{maxNestedDescribe:"Nested describe block should be less than set max value"}},defaultOptions:[{max:5}],create(q,[{max:$}]){const Y=[];function B(W){W.parent?.type==="CallExpression"&&(W.parent.callee.type!=="Identifier"||W.parent.callee.name!=="describe"||(Y.push(0),Y.length>$&&q.report({node:W.parent,messageId:"maxNestedDescribe"})))}function F(W){W.parent?.type==="CallExpression"&&(W.parent.callee.type!=="Identifier"||W.parent.callee.name!=="describe"||Y.pop())}return{FunctionExpression:B,"FunctionExpression:exit":F,ArrowFunctionExpression:B,"ArrowFunctionExpression:exit":F}}}),RULE_NAME$14="no-identical-title",c$4=()=>({describeTitles:[],testTitles:[]}),he=createEslintRule({name:RULE_NAME$14,meta:{type:"problem",docs:{description:"disallow identical titles",recommended:!1},fixable:"code",schema:[],messages:{multipleTestTitle:"Test is used multiple times in the same describe(suite) block",multipleDescribeTitle:"Describe is used multiple times in the same describe(suite) block"}},defaultOptions:[],create(q){const $=[c$4()];return{CallExpression(Y){const B=$[$.length-1],F=parseVitestFnCall(Y,q);if(!F||((F.name==="describe"||F.name==="suite")&&$.push(c$4()),F.members.find(H=>isSupportedAccessor(H,"each"))))return;const[W]=Y.arguments;if(!W||!isStringNode(W))return;const V=getStringValue(W);F.type==="test"&&(B?.testTitles.includes(V)&&q.report({node:Y,messageId:"multipleTestTitle"}),B?.testTitles.push(V)),F.type==="describe"&&(B?.describeTitles.includes(V)&&q.report({node:Y,messageId:"multipleDescribeTitle"}),B?.describeTitles.push(V))},"CallExpression:exit"(Y){isTypeOfVitestFnCall(Y,q,["describe"])&&$.pop()}}}}),RULE_NAME$13="no-focused-tests",n$2=q=>q.type==="Identifier"&&["it","test","describe"].includes(q.name),a$6=q=>q.type==="Identifier"&&q.name==="only",ke=createEslintRule({name:RULE_NAME$13,meta:{type:"problem",docs:{description:"disallow focused tests",recommended:!1},fixable:"code",schema:[{type:"object",properties:{fixable:{type:"boolean",default:!0}},additionalProperties:!1}],messages:{noFocusedTests:"Focused tests are not allowed"}},defaultOptions:[{fixable:!0}],create:q=>{const $=q.options[0]?.fixable;return{ExpressionStatement(Y){if(Y.expression.type==="CallExpression"){const{callee:B}=Y.expression;if(B.type==="MemberExpression"&&n$2(B.object)&&a$6(B.property)&&q.report({node:B.property,messageId:"noFocusedTests",fix:F=>$?F.removeRange([B.property.range[0]-1,B.property.range[1]]):null}),B.type==="TaggedTemplateExpression"){const F=B.tag.type==="MemberExpression"?B.tag.object:null;if(!F)return;F.type==="MemberExpression"&&n$2(F.object)&&a$6(F.property)&&q.report({node:F.property,messageId:"noFocusedTests",fix:W=>$?W.removeRange([F.property.range[0]-1,F.property.range[1]]):null})}}},CallExpression(Y){if(Y.callee.type==="CallExpression"){const{callee:B}=Y.callee;if(B.type==="MemberExpression"&&B.object.type==="MemberExpression"&&n$2(B.object.object)&&a$6(B.object.property)&&B.property.type==="Identifier"&&B.property.name==="each"){const F=B.object.property;q.report({node:B.object.property,messageId:"noFocusedTests",fix:W=>$?W.removeRange([F.range[0]-1,F.range[1]]):null})}}}}}}),RULE_NAME$12="no-conditional-tests",xe=createEslintRule({name:RULE_NAME$12,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(q){return{Identifier:function($){["test","it","describe"].includes($.name)&&$.parent?.parent?.parent?.parent?.type==="IfStatement"&&q.report({node:$,messageId:"noConditionalTests"})}}}}),i$2={typecheck:!1};function parsePluginSettings(q){const $=typeof q.vitest!="object"||q.vitest===null?{}:q.vitest;return{...i$2,...$}}const RULE_NAME$11="expect-expect",ve=createEslintRule({name:RULE_NAME$11,meta:{type:"suggestion",docs:{description:"enforce having expectation in test body",recommended:!1},schema:[{type:"object",properties:{assertFunctionNames:{type:"array",items:{type:"string"}},additionalTestBlockFunctions:{type:"array",items:{type:"string"}}},additionalProperties:!1}],messages:{noAssertions:"Test has no assertions"}},defaultOptions:[{assertFunctionNames:["expect","assert"],additionalTestBlockFunctions:[]}],create(q,[{assertFunctionNames:$=["expect"],additionalTestBlockFunctions:Y=[]}]){const B=[];parsePluginSettings(q.settings).typecheck&&$.push("expectTypeOf","assertType");const F=$.map(x$3);function W(V){for(const H of V){const G=H.type===utils.AST_NODE_TYPES.CallExpression?B.indexOf(H):-1;if(H.type===utils.AST_NODE_TYPES.FunctionDeclaration){const z=q.sourceCode.getDeclaredVariables(H),J=getTestCallExpressionsFromDeclaredVariables(z,q);W(J)}if(G!==-1){B.splice(G,1);break}}}return{CallExpression(V){if(V.callee.type===utils.AST_NODE_TYPES.Identifier&&V.callee.name==="bench"||V?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&V.callee.property.type===utils.AST_NODE_TYPES.Identifier&&V.callee.property.name==="extend"||V?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&V.callee.property.type===utils.AST_NODE_TYPES.Identifier&&V.callee.property.name==="skip")return;const H=getNodeName(V)??"";if(isTypeOfVitestFnCall(V,q,["test"])||Y.includes(H)){if(V.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(V.callee.property,"todo"))return;B.push(V)}else F.some(G=>G.test(H))&&W(q.sourceCode.getAncestors(V))},"Program:exit"(){B.forEach(V=>{q.report({node:V.callee,messageId:"noAssertions"})})}}}});function x$3(q){const $=q.split(".").map(Y=>Y==="**"?"[_a-z\\d\\.]*":Y.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${$.join("\\.")}(\\.|$)`,"ui")}const RULE_NAME$10="consistent-test-it",g$1=(q,$,Y)=>B=>[B.replaceText(q.type===utils.AST_NODE_TYPES.MemberExpression?q.object:q,E$4($,Y))];function E$4(q,$){return q===TestCaseName.fit?"test.only":q.startsWith("f")||q.startsWith("x")?q.charAt(0)+$:$}function u$4(q){return q===TestCaseName.test?TestCaseName.it:TestCaseName.test}const Ce=createEslintRule({name:RULE_NAME$10,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using test or it but not both",recommended:!1},messages:{consistentMethod:"Prefer using {{ testFnKeyWork }} instead of {{ oppositeTestKeyword }}",consistentMethodWithinDescribe:"Prefer using {{ testKeywordWithinDescribe }} instead of {{ oppositeTestKeyword }} within describe"},schema:[{type:"object",properties:{fn:{type:"string",enum:[TestCaseName.test,TestCaseName.it]},withinDescribe:{type:"string",enum:[TestCaseName.test,TestCaseName.it]}},additionalProperties:!1}]},defaultOptions:[{fn:TestCaseName.test,withinDescribe:TestCaseName.it}],create(q){const $=q.options[0]??{},Y=$.fn||TestCaseName.test,B=$?.withinDescribe||$?.fn||TestCaseName?.it,F=Y===B?Y:void 0;let W=0;return{ImportDeclaration(V){if(F==null||V.source.type!=="Literal"||V.source.value!=="vitest")return;const H=u$4(F);for(const G of V.specifiers)G.type==="ImportSpecifier"&&G.imported.type==="Identifier"&&G.local.name===G.imported.name&&G.local.name===H&&q.report({node:G,data:{testFnKeyWork:Y,oppositeTestKeyword:H},messageId:"consistentMethod",fix:z=>{const J=V.specifiers.filter(X=>X.local.name!==H);if(J.length>0){const X=J.map(Q=>Q.local.name).join(", "),te=V.specifiers.at(-1)?.range;return te?z.replaceTextRange([V.specifiers[0].range[0],te[1]],X):null}return z.replaceText(G.local,F)}})},CallExpression(V){if(V.callee.type===utils.AST_NODE_TYPES.Identifier&&V.callee.name==="bench")return;const H=parseVitestFnCall(V,q);if(!H)return;if(H.type==="describe"){W++;return}const G=V.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?V.callee.tag:V.callee.type===utils.AST_NODE_TYPES.CallExpression?V.callee.callee:V.callee;if(H.type==="test"&&W===0&&!H.name.endsWith(Y)){const z=u$4(Y);q.report({node:V.callee,data:{testFnKeyWork:Y,oppositeTestKeyword:z},messageId:"consistentMethod",fix:g$1(G,H.name,Y)})}else if(H.type==="test"&&W>0&&!H.name.endsWith(B)){const z=u$4(B);q.report({messageId:"consistentMethodWithinDescribe",node:V.callee,data:{testKeywordWithinDescribe:B,oppositeTestKeyword:z},fix:g$1(G,H.name,B)})}},"CallExpression:exit"(V){isTypeOfVitestFnCall(V,q,["describe"])&&W--}}}}),RULE_NAME$$="consistent-vitest-vi",d=q=>q===UtilName.vi?UtilName.vitest:UtilName.vi,Be=createEslintRule({name:RULE_NAME$$,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using vitest or vi but not both",recommended:!1},messages:{consistentUtil:"Prefer using {{ utilKeyword }} instead of {{ oppositeUtilKeyword }}"},schema:[{type:"object",properties:{fn:{type:"string",enum:[UtilName.vi,UtilName.vitest]}},additionalProperties:!1}]},defaultOptions:[{fn:UtilName.vi}],create(q){const $=(q.options[0]??{}).fn||UtilName.vi,Y=d($);return{ImportDeclaration(B){if(!(B.source.type!==utils.AST_NODE_TYPES.Literal||B.source.value!=="vitest"))for(const F of B.specifiers)F.type===utils.AST_NODE_TYPES.ImportSpecifier&&F.imported.type===utils.AST_NODE_TYPES.Identifier&&F.local.name===F.imported.name&&F.imported.name===Y&&q.report({node:F,messageId:"consistentUtil",data:{utilKeyword:$,oppositeUtilKeyword:Y},fix:W=>{const V=B.specifiers.filter(H=>H.local.name!==Y);if(V.length>0){const H=V.map(z=>z.local.name).join(", "),G=B.specifiers.at(-1)?.range;return G?W.replaceTextRange([B.specifiers[0].range[0],G[1]],H):null}return W.replaceText(F.local,$)}})},CallExpression(B){if(parseVitestFnCall(B,q)?.type!==Y)return;const F=B.callee.type===utils.AST_NODE_TYPES.MemberExpression?B.callee.object:B.callee;q.report({node:F,data:{utilKeyword:$,oppositeUtilKeyword:Y},messageId:"consistentUtil",fix:W=>W.replaceText(F,$)})}}}}),RULE_NAME$_="prefer-to-be",E$3=q=>q.type===utils.AST_NODE_TYPES.Literal&&q.value===null,N$3=q=>E$3(getFirstMatcherArg(q)),c$3=(q,$)=>isIdentifier(getFirstMatcherArg(q),$),h$2=q=>Math.floor(q)!==Math.ceil(q),y$3=q=>{let $=getFirstMatcherArg(q);return $.type===utils.AST_NODE_TYPES.Literal&&typeof $.value=="number"&&h$2($.value)?!1:($.type===utils.AST_NODE_TYPES.UnaryExpression&&$.operator==="-"&&($=$.argument),$.type===utils.AST_NODE_TYPES.Literal?!("regex"in $):$.type===utils.AST_NODE_TYPES.TemplateLiteral)},o$2=(q,$,Y,B,F)=>{q.report({messageId:`useToBe${$}`,fix(W){const V=[replaceAccessorFixer(W,Y.matcher,`toBe${$}`)];return Y.args?.length&&$!==""&&V.push(removeExtraArgumentsFixer(W,q,B,0)),F&&V.push(W.removeRange([F.range[0]-1,F.range[1]])),V},node:Y.matcher})},ye=createEslintRule({name:RULE_NAME$_,meta:{type:"suggestion",docs:{description:"enforce using toBe()",recommended:!1},schema:[],fixable:"code",messages:{useToBe:"Use `toBe` instead",useToBeUndefined:"Use `toBeUndefined()` instead",useToBeDefined:"Use `toBeDefined()` instead",useToBeNull:"Use `toBeNull()` instead",useToBeNaN:"Use `toBeNaN()` instead"}},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect")return;const B=getAccessorValue(Y.matcher),F=Y.modifiers.find(W=>getAccessorValue(W)==="not");if(F&&["toBeUndefined","toBeDefined"].includes(B)){o$2(q,B==="toBeDefined"?"Undefined":"Defined",Y,$,F);return}if(!(!EqualityMatcher.hasOwnProperty(B)||Y.args.length===0)){if(N$3(Y)){o$2(q,"Null",Y,$);return}if(c$3(Y,"undefined")){o$2(q,F?"Defined":"Undefined",Y,$);return}if(c$3(Y,"NaN")){o$2(q,"NaN",Y,$);return}y$3(Y)&&B!==EqualityMatcher.toBe&&o$2(q,"",Y,$)}}}}}),RULE_NAME$Z="no-hooks",Ie=createEslintRule({name:RULE_NAME$Z,meta:{type:"suggestion",docs:{description:"disallow setup and teardown hooks",recommended:!1},schema:[{type:"object",properties:{allow:{type:"array",contains:["beforeAll","beforeEach","afterAll","afterEach"]}},additionalProperties:!1}],messages:{unexpectedHook:"Unexpected '{{ hookName }}' hook"}},defaultOptions:[{allow:[]}],create(q,[{allow:$=[]}]){return{CallExpression(Y){const B=parseVitestFnCall(Y,q);B?.type==="hook"&&!$.includes(B.name)&&q.report({node:Y,messageId:"unexpectedHook",data:{hookName:B.name}})}}}}),RULE_NAME$Y="no-restricted-vi-methods",Se=createEslintRule({name:RULE_NAME$Y,meta:{type:"suggestion",docs:{description:"disallow specific `vi.` methods",recommended:!1},schema:[{type:"object",additionalProperties:{type:["string","null"]}}],messages:{restrictedViMethod:"Use of `{{ restriction }}` is disallowed",restrictedViMethodWithMessage:"{{ message }}"}},defaultOptions:[{}],create(q,[$]){return{CallExpression(Y){const B=parseVitestFnCall(Y,q);if(B?.type!=="vi"||B.members.length===0)return;const F=getAccessorValue(B.members[0]);if(F in $){const W=$[F];q.report({messageId:W?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:W,restriction:F},loc:{start:B.members[0].loc.start,end:B.members[B.members.length-1].loc.end}})}}}}}),RULE_NAME$X="consistent-test-filename",o$1=/.*\.test\.[tj]sx?$/,e=/.*\.(test|spec)\.[tj]sx?$/,Oe=createEslintRule({name:RULE_NAME$X,meta:{type:"problem",docs:{recommended:!1,requiresTypeChecking:!1,description:"require .spec test file pattern"},messages:{consistentTestFilename:"Use test file name pattern {{ pattern }}"},schema:[{type:"object",additionalProperties:!1,properties:{pattern:{format:"regex",default:o$1.source},allTestPattern:{format:"regex",default:e.source}}}]},defaultOptions:[{pattern:e.source,allTestPattern:e.source}],create:q=>{const $=q.options[0]??{},{pattern:Y=o$1,allTestPattern:B=e}=$,F=typeof Y=="string"?new RegExp(Y):Y,W=typeof B=="string"?new RegExp(B):B,{filename:V}=q;return W.test(V)?{Program:H=>{F.test(V)||q.report({node:H,messageId:"consistentTestFilename",data:{pattern:F.source}})}}:{}}}),RULE_NAME$W="max-expects",De=createEslintRule({name:RULE_NAME$W,meta:{docs:{requiresTypeChecking:!1,recommended:!1,description:"enforce a maximum number of expect per test"},messages:{maxExpect:"Too many assertion calls ({{ count }}) - maximum allowed is {{ max }}"},type:"suggestion",schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}]},defaultOptions:[{max:5}],create(q,[{max:$}]){let Y=0;const B=F=>{(F.parent?.type!==utils.AST_NODE_TYPES.CallExpression||isTypeOfVitestFnCall(F.parent,q,["test"]))&&(Y=0)};return{FunctionExpression:B,"FunctionExpression:exit":B,ArrowFunctionExpression:B,"ArrowFunctionExpression:exit":B,CallExpression(F){const W=parseVitestFnCall(F,q);W?.type!=="expect"||W.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression||(Y+=1,Y>$&&q.report({node:F,messageId:"maxExpect",data:{count:Y,max:$}}))}}}}),RULE_NAME$V="no-alias-methods",He=createEslintRule({name:RULE_NAME$V,meta:{docs:{description:"disallow alias methods",requiresTypeChecking:!1,recommended:!1},messages:{noAliasMethods:"Replace {{ alias }}() with its canonical name {{ canonical }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(q){const $={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(Y){const B=parseVitestFnCall(Y,q);if(B?.type!=="expect")return;const{matcher:F}=B,W=getAccessorValue(F);if(W in $){const V=$[W];q.report({messageId:"noAliasMethods",data:{alias:W,canonical:V},node:F,fix:H=>[replaceAccessorFixer(H,F,V)]})}}}}}),RULE_NAME$U="no-commented-out-tests";function n$1(q){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(q.value)}const qe=createEslintRule({name:RULE_NAME$U,meta:{docs:{description:"disallow commented out tests",requiresTypeChecking:!1,recommended:!1},messages:{noCommentedOutTests:"Remove commented out tests - you may want to use `skip` or `only` instead"},schema:[],type:"suggestion"},defaultOptions:[],create(q){const{sourceCode:$}=q;function Y(B){n$1(B)&&q.report({messageId:"noCommentedOutTests",node:B})}return{Program(){$.getAllComments().forEach(Y)}}}}),RULE_NAME$T="no-conditional-expect",r=q=>q.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.callee.property,"catch"),Fe=createEslintRule({name:RULE_NAME$T,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(q){let $=0,Y=!1,B=!1;const F=()=>Y&&$++,W=()=>Y&&$--;return{FunctionDeclaration(V){const H=q.sourceCode.getDeclaredVariables(V);getTestCallExpressionsFromDeclaredVariables(H,q).length>0&&(Y=!0)},CallExpression(V){const{type:H}=parseVitestFnCall(V,q)??{};H==="test"&&(Y=!0),r(V)&&(B=!0),Y&&H==="expect"&&$>0&&q.report({messageId:"noConditionalExpect",node:V}),B&&H==="expect"&&q.report({messageId:"noConditionalExpect",node:V})},"CallExpression:exit"(V){isTypeOfVitestFnCall(V,q,["test"])&&(Y=!1),r(V)&&(B=!1)},CatchClause:F,"CatchClause:exit":W,IfStatement:F,"IfStatement:exit":W,SwitchStatement:F,"SwitchStatement:exit":W,ConditionalExpression:F,"ConditionalExpression:exit":W,LogicalExpression:F,"LogicalExpression:exit":W}}}),RULE_NAME$S="no-import-node-test",Ve=createEslintRule({name:RULE_NAME$S,meta:{docs:{description:"disallow importing `node:test`",recommended:!1},type:"suggestion",messages:{noImportNodeTest:"Import from `vitest` instead of `node:test`"},fixable:"code",schema:[]},defaultOptions:[],create(q){return{ImportDeclaration($){$.source.value==="node:test"&&q.report({messageId:"noImportNodeTest",node:$,fix:Y=>Y.replaceText($.source,$.source.raw.replace("node:test","vitest"))})}}}}),VITEST_GLOBALS=new Set(["suite","test","chai","describe","it","expectTypeOf","assertType","expect","assert","vitest","vi","beforeAll","afterAll","beforeEach","afterEach","onTestFailed","onTestFinished"]),isVitestImport=q=>q.source.value==="vitest",isVitestGlobalsImportSpecifier=q=>q.type===utils.AST_NODE_TYPES.ImportSpecifier&&q.imported.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(q.imported.name),isVitestGlobalsProperty=q=>q.type===utils.AST_NODE_TYPES.Property&&q.key.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(q.key.name),isVitestGlobalsFunction=q=>q.callee.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(q.callee.name),isRequireVitestCall=q=>{if(q?.type!==utils.AST_NODE_TYPES.CallExpression||q.callee.type!==utils.AST_NODE_TYPES.Identifier||q.callee.name!=="require")return!1;const $=q.arguments;return $.length===1&&$[0].type===utils.AST_NODE_TYPES.Literal&&$[0].value==="vitest"},isObjectPattern=q=>q.type===utils.AST_NODE_TYPES.ObjectPattern,removeVariableDeclarator=(q,$)=>{const Y=$.parent,B=Y.declarations;if(B.length===1)return q.remove(Y);const F=B.findIndex(W=>W.range[0]===$.range[0]&&W.range[1]===$.range[1]);if(F===0){const W=B[1];return q.removeRange([$.range[0],W.range[0]])}else{const W=B[F-1];return q.removeRange([W.range[1],$.range[1]])}},removeNodeFromArray=(q,$,Y)=>{const B=$.indexOf(Y);if(B===-1)throw new Error("Target node not found in nodes array");if(B===0){const F=$[1];return q.removeRange([Y.range[0],F.range[0]])}else{const F=$[B-1];return q.removeRange([F.range[1],Y.range[1]])}},RULE_NAME$R="no-importing-vitest-globals",Pe=createEslintRule({name:RULE_NAME$R,meta:{type:"suggestion",docs:{description:"disallow importing Vitest globals",recommended:!1},messages:{noImportingVitestGlobals:"Do not import '{{name}}' from 'vitest'. Use globals configuration instead.",noRequiringVitestGlobals:"Do not require '{{name}}' from 'vitest'. Use globals configuration instead."},fixable:"code",schema:[]},defaultOptions:[],create(q){return{ImportDeclaration($){if(!isVitestImport($))return;const Y=$.specifiers;for(const B of Y)isVitestGlobalsImportSpecifier(B)&&q.report({node:B,messageId:"noImportingVitestGlobals",data:{name:B.imported.name},fix(F){return Y.every(W=>isVitestGlobalsImportSpecifier(W))?F.remove($):removeNodeFromArray(F,Y,B)}})},VariableDeclarator($){if(!isRequireVitestCall($.init)||!isObjectPattern($.id))return;const Y=$.id.properties;for(const B of Y)isVitestGlobalsProperty(B)&&q.report({node:B,messageId:"noRequiringVitestGlobals",data:{name:B.key.name},fix(F){return Y.every(W=>isVitestGlobalsProperty(W))?removeVariableDeclarator(F,$):removeNodeFromArray(F,Y,B)}})}}}}),RULE_NAME$Q="prefer-importing-vitest-globals",Ge=createEslintRule({name:RULE_NAME$Q,meta:{type:"suggestion",docs:{description:"enforce importing Vitest globals",recommended:!1},messages:{preferImportingVitestGlobals:"Import '{{name}}' from 'vitest'"},schema:[],fixable:"code"},defaultOptions:[],create(q){const $=new Set;let Y,B;return{ImportDeclaration(F){if(!isVitestImport(F))return;const W=F.specifiers;for(const V of W)if(isVitestGlobalsImportSpecifier(V)){const H=V.imported.name;$.add(H)}Y=F.specifiers},VariableDeclarator(F){if(!isRequireVitestCall(F.init)||!isObjectPattern(F.id))return;const W=F.id.properties;for(const V of W)if(isVitestGlobalsProperty(V)){const H=V.key.name;$.add(H)}B=W},CallExpression(F){if(!isVitestGlobalsFunction(F))return;const W=F.callee.name;if($.has(W))return;const V=q.sourceCode.getScope(F).set.get(W);V&&V.defs.length>0&&V.defs.some(H=>!(H.type==="ImportBinding"||H.type==="Variable"&&H.node.init&&isRequireVitestCall(H.node.init)))||q.report({node:F.callee,messageId:"preferImportingVitestGlobals",data:{name:W},fix(H){const G=q.sourceCode.ast;if(!Y)if(B){const X=B[B.length-1];return H.insertTextAfter(X,`, ${W}`)}else return H.insertTextBefore(G.body[0],`import { ${W} } from 'vitest';
|
|
1
|
+
"use strict";const utils=require("@typescript-eslint/utils"),n$3=require("typescript"),node_path=require("node:path"),node_module=require("node:module");var _documentCurrentScript=typeof document<"u"?document.currentScript:null;function _interopDefaultCompat(q){return q&&typeof q=="object"&&"default"in q?q.default:q}const n__default=_interopDefaultCompat(n$3),version="1.3.2",createEslintRule=utils.ESLintUtils.RuleCreator(q=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${q}.md`),joinNames=(q,$)=>q&&$?`${q}.${$}`:null,isFunction=q=>q.type===utils.AST_NODE_TYPES.FunctionExpression||q.type===utils.AST_NODE_TYPES.ArrowFunctionExpression;function getNodeName(q){if(isSupportedAccessor(q))return getAccessorValue(q);switch(q.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeName(q.tag);case utils.AST_NODE_TYPES.MemberExpression:return joinNames(getNodeName(q.object),getNodeName(q.property));case utils.AST_NODE_TYPES.NewExpression:case utils.AST_NODE_TYPES.CallExpression:return getNodeName(q.callee)}return null}const isSupportedAccessor=(q,$)=>isIdentifier(q,$)||isStringNode(q,$),isIdentifier=(q,$)=>q.type===utils.AST_NODE_TYPES.Identifier&&($===void 0||q.name===$),S$4=(q,$)=>q.type===utils.AST_NODE_TYPES.TemplateLiteral&&q.quasis.length===1&&($===void 0||q.quasis[0].value.raw===$),g$2=(q,$)=>q.type===utils.AST_NODE_TYPES.Literal&&typeof q.value=="string"&&($===void 0||q.value===$),isStringNode=(q,$)=>g$2(q,$)||S$4(q,$),getAccessorValue=q=>q.type===utils.AST_NODE_TYPES.Identifier?q.name:getStringValue(q),getStringValue=q=>q?.type===utils.AST_NODE_TYPES.TemplateLiteral?q.quasis[0].value.raw:q?.value,replaceAccessorFixer=(q,$,Y)=>q.replaceText($,$.type===utils.AST_NODE_TYPES.Identifier?Y:`'${Y}'`),removeExtraArgumentsFixer=(q,$,Y,B)=>{const F=Y.arguments[B],W=Y.arguments[Y.arguments.length-1],{sourceCode:V}=$;let H=V.getTokenAfter(W);return H.value===","&&(H=V.getTokenAfter(H)),q.removeRange([F.range[0],H.range[0]])},isParsedInstanceOfMatcherCall=(q,$)=>getAccessorValue(q.matcher)==="toBeInstanceOf"&&q.args.length===1&&isSupportedAccessor(q.args[0],$);var UtilName=(q=>(q.vi="vi",q.vitest="vitest",q))(UtilName||{}),DescribeAlias=(q=>(q.describe="describe",q.fdescribe="fdescribe",q.xdescribe="xdescribe",q))(DescribeAlias||{}),TestCaseName=(q=>(q.fit="fit",q.it="it",q.test="test",q.xit="xit",q.xtest="xtest",q.bench="bench",q))(TestCaseName||{}),HookName=(q=>(q.beforeAll="beforeAll",q.beforeEach="beforeEach",q.afterAll="afterAll",q.afterEach="afterEach",q))(HookName||{}),ModifierName=(q=>(q.to="to",q.have="have",q.not="not",q.rejects="rejects",q.resolves="resolves",q.returns="returns",q.branded="branded",q.asserts="asserts",q.constructorParameters="constructorParameters",q.parameters="parameters",q.thisParameter="thisParameter",q.guards="guards",q.instance="instance",q.items="items",q))(ModifierName||{}),EqualityMatcher=(q=>(q.toBe="toBe",q.toEqual="toEqual",q.toStrictEqual="toStrictEqual",q))(EqualityMatcher||{});function isClassOrFunctionType(q){return q.getCallSignatures().length>0?!0:q.getSymbol()?.getDeclarations()?.some($=>n__default.isArrowFunction($)||n__default.isClassDeclaration($)||n__default.isClassExpression($)||n__default.isFunctionDeclaration($)||n__default.isFunctionExpression($)||n__default.isMethodDeclaration($)||n__default.isFunctionTypeNode($))??!1}const ValidVitestFnCallChains=new Set(["beforeEach","beforeAll","afterEach","afterAll","it","it.skip","it.only","it.concurrent","it.sequential","it.todo","it.fails","it.extend","it.skipIf","it.runIf","it.each","it.skip.only","it.skip.concurrent","it.skip.sequential","it.skip.todo","it.skip.fails","it.only.skip","it.only.concurrent","it.only.sequential","it.only.todo","it.only.fails","it.concurrent.skip","it.concurrent.only","it.concurrent.sequential","it.concurrent.todo","it.concurrent.fails","it.sequential.skip","it.sequential.only","it.sequential.concurrent","it.sequential.todo","it.sequential.fails","it.todo.skip","it.todo.only","it.todo.concurrent","it.todo.sequential","it.todo.fails","it.fails.skip","it.fails.only","it.fails.concurrent","it.fails.sequential","it.fails.todo","it.extend.skip","it.extend.only","it.extend.concurrent","it.extend.sequential","it.extend.todo","it.extend.fails","it.skipIf.skip","it.skipIf.only","it.skipIf.concurrent","it.skipIf.sequential","it.skipIf.todo","it.skipIf.fails","it.runIf.skip","it.runIf.only","it.runIf.concurrent","it.runIf.sequential","it.runIf.todo","it.runIf.fails","it.skip.each","it.only.each","it.concurrent.each","it.sequential.each","it.todo.each","it.fails.each","it.extend.skipIf","it.extend.runIf","it.extend.each","it.skipIf.each","it.runIf.each","it.skip.only.concurrent","it.skip.only.sequential","it.skip.only.todo","it.skip.only.fails","it.skip.concurrent.only","it.skip.concurrent.sequential","it.skip.concurrent.todo","it.skip.concurrent.fails","it.skip.sequential.only","it.skip.sequential.concurrent","it.skip.sequential.todo","it.skip.sequential.fails","it.skip.todo.only","it.skip.todo.concurrent","it.skip.todo.sequential","it.skip.todo.fails","it.skip.fails.only","it.skip.fails.concurrent","it.skip.fails.sequential","it.skip.fails.todo","it.only.skip.concurrent","it.only.skip.sequential","it.only.skip.todo","it.only.skip.fails","it.only.concurrent.skip","it.only.concurrent.sequential","it.only.concurrent.todo","it.only.concurrent.fails","it.only.sequential.skip","it.only.sequential.concurrent","it.only.sequential.todo","it.only.sequential.fails","it.only.todo.skip","it.only.todo.concurrent","it.only.todo.sequential","it.only.todo.fails","it.only.fails.skip","it.only.fails.concurrent","it.only.fails.sequential","it.only.fails.todo","it.concurrent.skip.only","it.concurrent.skip.sequential","it.concurrent.skip.todo","it.concurrent.skip.fails","it.concurrent.only.skip","it.concurrent.only.sequential","it.concurrent.only.todo","it.concurrent.only.fails","it.concurrent.sequential.skip","it.concurrent.sequential.only","it.concurrent.sequential.todo","it.concurrent.sequential.fails","it.concurrent.todo.skip","it.concurrent.todo.only","it.concurrent.todo.sequential","it.concurrent.todo.fails","it.concurrent.fails.skip","it.concurrent.fails.only","it.concurrent.fails.sequential","it.concurrent.fails.todo","it.sequential.skip.only","it.sequential.skip.concurrent","it.sequential.skip.todo","it.sequential.skip.fails","it.sequential.only.skip","it.sequential.only.concurrent","it.sequential.only.todo","it.sequential.only.fails","it.sequential.concurrent.skip","it.sequential.concurrent.only","it.sequential.concurrent.todo","it.sequential.concurrent.fails","it.sequential.todo.skip","it.sequential.todo.only","it.sequential.todo.concurrent","it.sequential.todo.fails","it.sequential.fails.skip","it.sequential.fails.only","it.sequential.fails.concurrent","it.sequential.fails.todo","it.todo.skip.only","it.todo.skip.concurrent","it.todo.skip.sequential","it.todo.skip.fails","it.todo.only.skip","it.todo.only.concurrent","it.todo.only.sequential","it.todo.only.fails","it.todo.concurrent.skip","it.todo.concurrent.only","it.todo.concurrent.sequential","it.todo.concurrent.fails","it.todo.sequential.skip","it.todo.sequential.only","it.todo.sequential.concurrent","it.todo.sequential.fails","it.todo.fails.skip","it.todo.fails.only","it.todo.fails.concurrent","it.todo.fails.sequential","it.fails.skip.only","it.fails.skip.concurrent","it.fails.skip.sequential","it.fails.skip.todo","it.fails.only.skip","it.fails.only.concurrent","it.fails.only.sequential","it.fails.only.todo","it.fails.concurrent.skip","it.fails.concurrent.only","it.fails.concurrent.sequential","it.fails.concurrent.todo","it.fails.sequential.skip","it.fails.sequential.only","it.fails.sequential.concurrent","it.fails.sequential.todo","it.fails.todo.skip","it.fails.todo.only","it.fails.todo.concurrent","it.fails.todo.sequential","it.extend.skip.only","it.extend.skip.concurrent","it.extend.skip.sequential","it.extend.skip.todo","it.extend.skip.fails","it.extend.only.skip","it.extend.only.concurrent","it.extend.only.sequential","it.extend.only.todo","it.extend.only.fails","it.extend.concurrent.skip","it.extend.concurrent.only","it.extend.concurrent.sequential","it.extend.concurrent.todo","it.extend.concurrent.fails","it.extend.sequential.skip","it.extend.sequential.only","it.extend.sequential.concurrent","it.extend.sequential.todo","it.extend.sequential.fails","it.extend.todo.skip","it.extend.todo.only","it.extend.todo.concurrent","it.extend.todo.sequential","it.extend.todo.fails","it.extend.fails.skip","it.extend.fails.only","it.extend.fails.concurrent","it.extend.fails.sequential","it.extend.fails.todo","it.skipIf.skip.only","it.skipIf.skip.concurrent","it.skipIf.skip.sequential","it.skipIf.skip.todo","it.skipIf.skip.fails","it.skipIf.only.skip","it.skipIf.only.concurrent","it.skipIf.only.sequential","it.skipIf.only.todo","it.skipIf.only.fails","it.skipIf.concurrent.skip","it.skipIf.concurrent.only","it.skipIf.concurrent.sequential","it.skipIf.concurrent.todo","it.skipIf.concurrent.fails","it.skipIf.sequential.skip","it.skipIf.sequential.only","it.skipIf.sequential.concurrent","it.skipIf.sequential.todo","it.skipIf.sequential.fails","it.skipIf.todo.skip","it.skipIf.todo.only","it.skipIf.todo.concurrent","it.skipIf.todo.sequential","it.skipIf.todo.fails","it.skipIf.fails.skip","it.skipIf.fails.only","it.skipIf.fails.concurrent","it.skipIf.fails.sequential","it.skipIf.fails.todo","it.runIf.skip.only","it.runIf.skip.concurrent","it.runIf.skip.sequential","it.runIf.skip.todo","it.runIf.skip.fails","it.runIf.only.skip","it.runIf.only.concurrent","it.runIf.only.sequential","it.runIf.only.todo","it.runIf.only.fails","it.runIf.concurrent.skip","it.runIf.concurrent.only","it.runIf.concurrent.sequential","it.runIf.concurrent.todo","it.runIf.concurrent.fails","it.runIf.sequential.skip","it.runIf.sequential.only","it.runIf.sequential.concurrent","it.runIf.sequential.todo","it.runIf.sequential.fails","it.runIf.todo.skip","it.runIf.todo.only","it.runIf.todo.concurrent","it.runIf.todo.sequential","it.runIf.todo.fails","it.runIf.fails.skip","it.runIf.fails.only","it.runIf.fails.concurrent","it.runIf.fails.sequential","it.runIf.fails.todo","it.skip.only.each","it.skip.concurrent.each","it.skip.sequential.each","it.skip.todo.each","it.skip.fails.each","it.only.skip.each","it.only.concurrent.each","it.only.sequential.each","it.only.todo.each","it.only.fails.each","it.concurrent.skip.each","it.concurrent.only.each","it.concurrent.sequential.each","it.concurrent.todo.each","it.concurrent.fails.each","it.sequential.skip.each","it.sequential.only.each","it.sequential.concurrent.each","it.sequential.todo.each","it.sequential.fails.each","it.todo.skip.each","it.todo.only.each","it.todo.concurrent.each","it.todo.sequential.each","it.todo.fails.each","it.fails.skip.each","it.fails.only.each","it.fails.concurrent.each","it.fails.sequential.each","it.fails.todo.each","it.extend.skipIf.skip","it.extend.skipIf.only","it.extend.skipIf.concurrent","it.extend.skipIf.sequential","it.extend.skipIf.todo","it.extend.skipIf.fails","it.extend.runIf.skip","it.extend.runIf.only","it.extend.runIf.concurrent","it.extend.runIf.sequential","it.extend.runIf.todo","it.extend.runIf.fails","it.extend.skip.each","it.extend.only.each","it.extend.concurrent.each","it.extend.sequential.each","it.extend.todo.each","it.extend.fails.each","it.skipIf.skip.each","it.skipIf.only.each","it.skipIf.concurrent.each","it.skipIf.sequential.each","it.skipIf.todo.each","it.skipIf.fails.each","it.runIf.skip.each","it.runIf.only.each","it.runIf.concurrent.each","it.runIf.sequential.each","it.runIf.todo.each","it.runIf.fails.each","it.extend.skipIf.each","it.extend.runIf.each","test","test.skip","test.only","test.concurrent","test.sequential","test.todo","test.fails","test.extend","test.skipIf","test.runIf","test.each","test.skip.only","test.skip.concurrent","test.skip.sequential","test.skip.todo","test.skip.fails","test.only.skip","test.only.concurrent","test.only.sequential","test.only.todo","test.only.fails","test.concurrent.skip","test.concurrent.only","test.concurrent.sequential","test.concurrent.todo","test.concurrent.fails","test.sequential.skip","test.sequential.only","test.sequential.concurrent","test.sequential.todo","test.sequential.fails","test.todo.skip","test.todo.only","test.todo.concurrent","test.todo.sequential","test.todo.fails","test.fails.skip","test.fails.only","test.fails.concurrent","test.fails.sequential","test.fails.todo","test.extend.skip","test.extend.only","test.extend.concurrent","test.extend.sequential","test.extend.todo","test.extend.fails","test.skipIf.skip","test.skipIf.only","test.skipIf.concurrent","test.skipIf.sequential","test.skipIf.todo","test.skipIf.fails","test.runIf.skip","test.runIf.only","test.runIf.concurrent","test.runIf.sequential","test.runIf.todo","test.runIf.fails","test.skip.each","test.only.each","test.concurrent.each","test.sequential.each","test.todo.each","test.fails.each","test.extend.skipIf","test.extend.runIf","test.extend.each","test.skipIf.each","test.runIf.each","test.skip.only.concurrent","test.skip.only.sequential","test.skip.only.todo","test.skip.only.fails","test.skip.concurrent.only","test.skip.concurrent.sequential","test.skip.concurrent.todo","test.skip.concurrent.fails","test.skip.sequential.only","test.skip.sequential.concurrent","test.skip.sequential.todo","test.skip.sequential.fails","test.skip.todo.only","test.skip.todo.concurrent","test.skip.todo.sequential","test.skip.todo.fails","test.skip.fails.only","test.skip.fails.concurrent","test.skip.fails.sequential","test.skip.fails.todo","test.only.skip.concurrent","test.only.skip.sequential","test.only.skip.todo","test.only.skip.fails","test.only.concurrent.skip","test.only.concurrent.sequential","test.only.concurrent.todo","test.only.concurrent.fails","test.only.sequential.skip","test.only.sequential.concurrent","test.only.sequential.todo","test.only.sequential.fails","test.only.todo.skip","test.only.todo.concurrent","test.only.todo.sequential","test.only.todo.fails","test.only.fails.skip","test.only.fails.concurrent","test.only.fails.sequential","test.only.fails.todo","test.concurrent.skip.only","test.concurrent.skip.sequential","test.concurrent.skip.todo","test.concurrent.skip.fails","test.concurrent.only.skip","test.concurrent.only.sequential","test.concurrent.only.todo","test.concurrent.only.fails","test.concurrent.sequential.skip","test.concurrent.sequential.only","test.concurrent.sequential.todo","test.concurrent.sequential.fails","test.concurrent.todo.skip","test.concurrent.todo.only","test.concurrent.todo.sequential","test.concurrent.todo.fails","test.concurrent.fails.skip","test.concurrent.fails.only","test.concurrent.fails.sequential","test.concurrent.fails.todo","test.sequential.skip.only","test.sequential.skip.concurrent","test.sequential.skip.todo","test.sequential.skip.fails","test.sequential.only.skip","test.sequential.only.concurrent","test.sequential.only.todo","test.sequential.only.fails","test.sequential.concurrent.skip","test.sequential.concurrent.only","test.sequential.concurrent.todo","test.sequential.concurrent.fails","test.sequential.todo.skip","test.sequential.todo.only","test.sequential.todo.concurrent","test.sequential.todo.fails","test.sequential.fails.skip","test.sequential.fails.only","test.sequential.fails.concurrent","test.sequential.fails.todo","test.todo.skip.only","test.todo.skip.concurrent","test.todo.skip.sequential","test.todo.skip.fails","test.todo.only.skip","test.todo.only.concurrent","test.todo.only.sequential","test.todo.only.fails","test.todo.concurrent.skip","test.todo.concurrent.only","test.todo.concurrent.sequential","test.todo.concurrent.fails","test.todo.sequential.skip","test.todo.sequential.only","test.todo.sequential.concurrent","test.todo.sequential.fails","test.todo.fails.skip","test.todo.fails.only","test.todo.fails.concurrent","test.todo.fails.sequential","test.fails.skip.only","test.fails.skip.concurrent","test.fails.skip.sequential","test.fails.skip.todo","test.fails.only.skip","test.fails.only.concurrent","test.fails.only.sequential","test.fails.only.todo","test.fails.concurrent.skip","test.fails.concurrent.only","test.fails.concurrent.sequential","test.fails.concurrent.todo","test.fails.sequential.skip","test.fails.sequential.only","test.fails.sequential.concurrent","test.fails.sequential.todo","test.fails.todo.skip","test.fails.todo.only","test.fails.todo.concurrent","test.fails.todo.sequential","test.extend.skip.only","test.extend.skip.concurrent","test.extend.skip.sequential","test.extend.skip.todo","test.extend.skip.fails","test.extend.only.skip","test.extend.only.concurrent","test.extend.only.sequential","test.extend.only.todo","test.extend.only.fails","test.extend.concurrent.skip","test.extend.concurrent.only","test.extend.concurrent.sequential","test.extend.concurrent.todo","test.extend.concurrent.fails","test.extend.sequential.skip","test.extend.sequential.only","test.extend.sequential.concurrent","test.extend.sequential.todo","test.extend.sequential.fails","test.extend.todo.skip","test.extend.todo.only","test.extend.todo.concurrent","test.extend.todo.sequential","test.extend.todo.fails","test.extend.fails.skip","test.extend.fails.only","test.extend.fails.concurrent","test.extend.fails.sequential","test.extend.fails.todo","test.skipIf.skip.only","test.skipIf.skip.concurrent","test.skipIf.skip.sequential","test.skipIf.skip.todo","test.skipIf.skip.fails","test.skipIf.only.skip","test.skipIf.only.concurrent","test.skipIf.only.sequential","test.skipIf.only.todo","test.skipIf.only.fails","test.skipIf.concurrent.skip","test.skipIf.concurrent.only","test.skipIf.concurrent.sequential","test.skipIf.concurrent.todo","test.skipIf.concurrent.fails","test.skipIf.sequential.skip","test.skipIf.sequential.only","test.skipIf.sequential.concurrent","test.skipIf.sequential.todo","test.skipIf.sequential.fails","test.skipIf.todo.skip","test.skipIf.todo.only","test.skipIf.todo.concurrent","test.skipIf.todo.sequential","test.skipIf.todo.fails","test.skipIf.fails.skip","test.skipIf.fails.only","test.skipIf.fails.concurrent","test.skipIf.fails.sequential","test.skipIf.fails.todo","test.runIf.skip.only","test.runIf.skip.concurrent","test.runIf.skip.sequential","test.runIf.skip.todo","test.runIf.skip.fails","test.runIf.only.skip","test.runIf.only.concurrent","test.runIf.only.sequential","test.runIf.only.todo","test.runIf.only.fails","test.runIf.concurrent.skip","test.runIf.concurrent.only","test.runIf.concurrent.sequential","test.runIf.concurrent.todo","test.runIf.concurrent.fails","test.runIf.sequential.skip","test.runIf.sequential.only","test.runIf.sequential.concurrent","test.runIf.sequential.todo","test.runIf.sequential.fails","test.runIf.todo.skip","test.runIf.todo.only","test.runIf.todo.concurrent","test.runIf.todo.sequential","test.runIf.todo.fails","test.runIf.fails.skip","test.runIf.fails.only","test.runIf.fails.concurrent","test.runIf.fails.sequential","test.runIf.fails.todo","test.skip.only.each","test.skip.concurrent.each","test.skip.sequential.each","test.skip.todo.each","test.skip.fails.each","test.only.skip.each","test.only.concurrent.each","test.only.sequential.each","test.only.todo.each","test.only.fails.each","test.concurrent.skip.each","test.concurrent.only.each","test.concurrent.sequential.each","test.concurrent.todo.each","test.concurrent.fails.each","test.sequential.skip.each","test.sequential.only.each","test.sequential.concurrent.each","test.sequential.todo.each","test.sequential.fails.each","test.todo.skip.each","test.todo.only.each","test.todo.concurrent.each","test.todo.sequential.each","test.todo.fails.each","test.fails.skip.each","test.fails.only.each","test.fails.concurrent.each","test.fails.sequential.each","test.fails.todo.each","test.extend.skipIf.skip","test.extend.skipIf.only","test.extend.skipIf.concurrent","test.extend.skipIf.sequential","test.extend.skipIf.todo","test.extend.skipIf.fails","test.extend.runIf.skip","test.extend.runIf.only","test.extend.runIf.concurrent","test.extend.runIf.sequential","test.extend.runIf.todo","test.extend.runIf.fails","test.extend.skip.each","test.extend.only.each","test.extend.concurrent.each","test.extend.sequential.each","test.extend.todo.each","test.extend.fails.each","test.skipIf.skip.each","test.skipIf.only.each","test.skipIf.concurrent.each","test.skipIf.sequential.each","test.skipIf.todo.each","test.skipIf.fails.each","test.runIf.skip.each","test.runIf.only.each","test.runIf.concurrent.each","test.runIf.sequential.each","test.runIf.todo.each","test.runIf.fails.each","test.extend.skipIf.each","test.extend.runIf.each","bench","bench.skip","bench.only","bench.todo","bench.skipIf","bench.runIf","bench.skip.only","bench.skip.todo","bench.only.skip","bench.only.todo","bench.todo.skip","bench.todo.only","bench.skipIf.skip","bench.skipIf.only","bench.skipIf.todo","bench.runIf.skip","bench.runIf.only","bench.runIf.todo","bench.skip.only.todo","bench.skip.todo.only","bench.only.skip.todo","bench.only.todo.skip","bench.todo.skip.only","bench.todo.only.skip","bench.skipIf.skip.only","bench.skipIf.skip.todo","bench.skipIf.only.skip","bench.skipIf.only.todo","bench.skipIf.todo.skip","bench.skipIf.todo.only","bench.runIf.skip.only","bench.runIf.skip.todo","bench.runIf.only.skip","bench.runIf.only.todo","bench.runIf.todo.skip","bench.runIf.todo.only","describe","describe.skip","describe.only","describe.concurrent","describe.sequential","describe.shuffle","describe.todo","describe.skipIf","describe.runIf","describe.each","describe.skip.only","describe.skip.concurrent","describe.skip.sequential","describe.skip.shuffle","describe.skip.todo","describe.only.skip","describe.only.concurrent","describe.only.sequential","describe.only.shuffle","describe.only.todo","describe.concurrent.skip","describe.concurrent.only","describe.concurrent.sequential","describe.concurrent.shuffle","describe.concurrent.todo","describe.sequential.skip","describe.sequential.only","describe.sequential.concurrent","describe.sequential.shuffle","describe.sequential.todo","describe.shuffle.skip","describe.shuffle.only","describe.shuffle.concurrent","describe.shuffle.sequential","describe.shuffle.todo","describe.todo.skip","describe.todo.only","describe.todo.concurrent","describe.todo.sequential","describe.todo.shuffle","describe.skipIf.skip","describe.skipIf.only","describe.skipIf.concurrent","describe.skipIf.sequential","describe.skipIf.shuffle","describe.skipIf.todo","describe.runIf.skip","describe.runIf.only","describe.runIf.concurrent","describe.runIf.sequential","describe.runIf.shuffle","describe.runIf.todo","describe.skip.each","describe.only.each","describe.concurrent.each","describe.sequential.each","describe.shuffle.each","describe.todo.each","describe.skipIf.each","describe.runIf.each","describe.skip.only.concurrent","describe.skip.only.sequential","describe.skip.only.shuffle","describe.skip.only.todo","describe.skip.concurrent.only","describe.skip.concurrent.sequential","describe.skip.concurrent.shuffle","describe.skip.concurrent.todo","describe.skip.sequential.only","describe.skip.sequential.concurrent","describe.skip.sequential.shuffle","describe.skip.sequential.todo","describe.skip.shuffle.only","describe.skip.shuffle.concurrent","describe.skip.shuffle.sequential","describe.skip.shuffle.todo","describe.skip.todo.only","describe.skip.todo.concurrent","describe.skip.todo.sequential","describe.skip.todo.shuffle","describe.only.skip.concurrent","describe.only.skip.sequential","describe.only.skip.shuffle","describe.only.skip.todo","describe.only.concurrent.skip","describe.only.concurrent.sequential","describe.only.concurrent.shuffle","describe.only.concurrent.todo","describe.only.sequential.skip","describe.only.sequential.concurrent","describe.only.sequential.shuffle","describe.only.sequential.todo","describe.only.shuffle.skip","describe.only.shuffle.concurrent","describe.only.shuffle.sequential","describe.only.shuffle.todo","describe.only.todo.skip","describe.only.todo.concurrent","describe.only.todo.sequential","describe.only.todo.shuffle","describe.concurrent.skip.only","describe.concurrent.skip.sequential","describe.concurrent.skip.shuffle","describe.concurrent.skip.todo","describe.concurrent.only.skip","describe.concurrent.only.sequential","describe.concurrent.only.shuffle","describe.concurrent.only.todo","describe.concurrent.sequential.skip","describe.concurrent.sequential.only","describe.concurrent.sequential.shuffle","describe.concurrent.sequential.todo","describe.concurrent.shuffle.skip","describe.concurrent.shuffle.only","describe.concurrent.shuffle.sequential","describe.concurrent.shuffle.todo","describe.concurrent.todo.skip","describe.concurrent.todo.only","describe.concurrent.todo.sequential","describe.concurrent.todo.shuffle","describe.sequential.skip.only","describe.sequential.skip.concurrent","describe.sequential.skip.shuffle","describe.sequential.skip.todo","describe.sequential.only.skip","describe.sequential.only.concurrent","describe.sequential.only.shuffle","describe.sequential.only.todo","describe.sequential.concurrent.skip","describe.sequential.concurrent.only","describe.sequential.concurrent.shuffle","describe.sequential.concurrent.todo","describe.sequential.shuffle.skip","describe.sequential.shuffle.only","describe.sequential.shuffle.concurrent","describe.sequential.shuffle.todo","describe.sequential.todo.skip","describe.sequential.todo.only","describe.sequential.todo.concurrent","describe.sequential.todo.shuffle","describe.shuffle.skip.only","describe.shuffle.skip.concurrent","describe.shuffle.skip.sequential","describe.shuffle.skip.todo","describe.shuffle.only.skip","describe.shuffle.only.concurrent","describe.shuffle.only.sequential","describe.shuffle.only.todo","describe.shuffle.concurrent.skip","describe.shuffle.concurrent.only","describe.shuffle.concurrent.sequential","describe.shuffle.concurrent.todo","describe.shuffle.sequential.skip","describe.shuffle.sequential.only","describe.shuffle.sequential.concurrent","describe.shuffle.sequential.todo","describe.shuffle.todo.skip","describe.shuffle.todo.only","describe.shuffle.todo.concurrent","describe.shuffle.todo.sequential","describe.todo.skip.only","describe.todo.skip.concurrent","describe.todo.skip.sequential","describe.todo.skip.shuffle","describe.todo.only.skip","describe.todo.only.concurrent","describe.todo.only.sequential","describe.todo.only.shuffle","describe.todo.concurrent.skip","describe.todo.concurrent.only","describe.todo.concurrent.sequential","describe.todo.concurrent.shuffle","describe.todo.sequential.skip","describe.todo.sequential.only","describe.todo.sequential.concurrent","describe.todo.sequential.shuffle","describe.todo.shuffle.skip","describe.todo.shuffle.only","describe.todo.shuffle.concurrent","describe.todo.shuffle.sequential","describe.skipIf.skip.only","describe.skipIf.skip.concurrent","describe.skipIf.skip.sequential","describe.skipIf.skip.shuffle","describe.skipIf.skip.todo","describe.skipIf.only.skip","describe.skipIf.only.concurrent","describe.skipIf.only.sequential","describe.skipIf.only.shuffle","describe.skipIf.only.todo","describe.skipIf.concurrent.skip","describe.skipIf.concurrent.only","describe.skipIf.concurrent.sequential","describe.skipIf.concurrent.shuffle","describe.skipIf.concurrent.todo","describe.skipIf.sequential.skip","describe.skipIf.sequential.only","describe.skipIf.sequential.concurrent","describe.skipIf.sequential.shuffle","describe.skipIf.sequential.todo","describe.skipIf.shuffle.skip","describe.skipIf.shuffle.only","describe.skipIf.shuffle.concurrent","describe.skipIf.shuffle.sequential","describe.skipIf.shuffle.todo","describe.skipIf.todo.skip","describe.skipIf.todo.only","describe.skipIf.todo.concurrent","describe.skipIf.todo.sequential","describe.skipIf.todo.shuffle","describe.runIf.skip.only","describe.runIf.skip.concurrent","describe.runIf.skip.sequential","describe.runIf.skip.shuffle","describe.runIf.skip.todo","describe.runIf.only.skip","describe.runIf.only.concurrent","describe.runIf.only.sequential","describe.runIf.only.shuffle","describe.runIf.only.todo","describe.runIf.concurrent.skip","describe.runIf.concurrent.only","describe.runIf.concurrent.sequential","describe.runIf.concurrent.shuffle","describe.runIf.concurrent.todo","describe.runIf.sequential.skip","describe.runIf.sequential.only","describe.runIf.sequential.concurrent","describe.runIf.sequential.shuffle","describe.runIf.sequential.todo","describe.runIf.shuffle.skip","describe.runIf.shuffle.only","describe.runIf.shuffle.concurrent","describe.runIf.shuffle.sequential","describe.runIf.shuffle.todo","describe.runIf.todo.skip","describe.runIf.todo.only","describe.runIf.todo.concurrent","describe.runIf.todo.sequential","describe.runIf.todo.shuffle","describe.skip.only.each","describe.skip.concurrent.each","describe.skip.sequential.each","describe.skip.shuffle.each","describe.skip.todo.each","describe.only.skip.each","describe.only.concurrent.each","describe.only.sequential.each","describe.only.shuffle.each","describe.only.todo.each","describe.concurrent.skip.each","describe.concurrent.only.each","describe.concurrent.sequential.each","describe.concurrent.shuffle.each","describe.concurrent.todo.each","describe.sequential.skip.each","describe.sequential.only.each","describe.sequential.concurrent.each","describe.sequential.shuffle.each","describe.sequential.todo.each","describe.shuffle.skip.each","describe.shuffle.only.each","describe.shuffle.concurrent.each","describe.shuffle.sequential.each","describe.shuffle.todo.each","describe.todo.skip.each","describe.todo.only.each","describe.todo.concurrent.each","describe.todo.sequential.each","describe.todo.shuffle.each","describe.skipIf.skip.each","describe.skipIf.only.each","describe.skipIf.concurrent.each","describe.skipIf.sequential.each","describe.skipIf.shuffle.each","describe.skipIf.todo.each","describe.runIf.skip.each","describe.runIf.only.each","describe.runIf.concurrent.each","describe.runIf.sequential.each","describe.runIf.shuffle.each","describe.runIf.todo.each","suite","suite.skip","suite.only","suite.concurrent","suite.sequential","suite.shuffle","suite.todo","suite.skipIf","suite.runIf","suite.each","suite.skip.only","suite.skip.concurrent","suite.skip.sequential","suite.skip.shuffle","suite.skip.todo","suite.only.skip","suite.only.concurrent","suite.only.sequential","suite.only.shuffle","suite.only.todo","suite.concurrent.skip","suite.concurrent.only","suite.concurrent.sequential","suite.concurrent.shuffle","suite.concurrent.todo","suite.sequential.skip","suite.sequential.only","suite.sequential.concurrent","suite.sequential.shuffle","suite.sequential.todo","suite.shuffle.skip","suite.shuffle.only","suite.shuffle.concurrent","suite.shuffle.sequential","suite.shuffle.todo","suite.todo.skip","suite.todo.only","suite.todo.concurrent","suite.todo.sequential","suite.todo.shuffle","suite.skipIf.skip","suite.skipIf.only","suite.skipIf.concurrent","suite.skipIf.sequential","suite.skipIf.shuffle","suite.skipIf.todo","suite.runIf.skip","suite.runIf.only","suite.runIf.concurrent","suite.runIf.sequential","suite.runIf.shuffle","suite.runIf.todo","suite.skip.each","suite.only.each","suite.concurrent.each","suite.sequential.each","suite.shuffle.each","suite.todo.each","suite.skipIf.each","suite.runIf.each","suite.skip.only.concurrent","suite.skip.only.sequential","suite.skip.only.shuffle","suite.skip.only.todo","suite.skip.concurrent.only","suite.skip.concurrent.sequential","suite.skip.concurrent.shuffle","suite.skip.concurrent.todo","suite.skip.sequential.only","suite.skip.sequential.concurrent","suite.skip.sequential.shuffle","suite.skip.sequential.todo","suite.skip.shuffle.only","suite.skip.shuffle.concurrent","suite.skip.shuffle.sequential","suite.skip.shuffle.todo","suite.skip.todo.only","suite.skip.todo.concurrent","suite.skip.todo.sequential","suite.skip.todo.shuffle","suite.only.skip.concurrent","suite.only.skip.sequential","suite.only.skip.shuffle","suite.only.skip.todo","suite.only.concurrent.skip","suite.only.concurrent.sequential","suite.only.concurrent.shuffle","suite.only.concurrent.todo","suite.only.sequential.skip","suite.only.sequential.concurrent","suite.only.sequential.shuffle","suite.only.sequential.todo","suite.only.shuffle.skip","suite.only.shuffle.concurrent","suite.only.shuffle.sequential","suite.only.shuffle.todo","suite.only.todo.skip","suite.only.todo.concurrent","suite.only.todo.sequential","suite.only.todo.shuffle","suite.concurrent.skip.only","suite.concurrent.skip.sequential","suite.concurrent.skip.shuffle","suite.concurrent.skip.todo","suite.concurrent.only.skip","suite.concurrent.only.sequential","suite.concurrent.only.shuffle","suite.concurrent.only.todo","suite.concurrent.sequential.skip","suite.concurrent.sequential.only","suite.concurrent.sequential.shuffle","suite.concurrent.sequential.todo","suite.concurrent.shuffle.skip","suite.concurrent.shuffle.only","suite.concurrent.shuffle.sequential","suite.concurrent.shuffle.todo","suite.concurrent.todo.skip","suite.concurrent.todo.only","suite.concurrent.todo.sequential","suite.concurrent.todo.shuffle","suite.sequential.skip.only","suite.sequential.skip.concurrent","suite.sequential.skip.shuffle","suite.sequential.skip.todo","suite.sequential.only.skip","suite.sequential.only.concurrent","suite.sequential.only.shuffle","suite.sequential.only.todo","suite.sequential.concurrent.skip","suite.sequential.concurrent.only","suite.sequential.concurrent.shuffle","suite.sequential.concurrent.todo","suite.sequential.shuffle.skip","suite.sequential.shuffle.only","suite.sequential.shuffle.concurrent","suite.sequential.shuffle.todo","suite.sequential.todo.skip","suite.sequential.todo.only","suite.sequential.todo.concurrent","suite.sequential.todo.shuffle","suite.shuffle.skip.only","suite.shuffle.skip.concurrent","suite.shuffle.skip.sequential","suite.shuffle.skip.todo","suite.shuffle.only.skip","suite.shuffle.only.concurrent","suite.shuffle.only.sequential","suite.shuffle.only.todo","suite.shuffle.concurrent.skip","suite.shuffle.concurrent.only","suite.shuffle.concurrent.sequential","suite.shuffle.concurrent.todo","suite.shuffle.sequential.skip","suite.shuffle.sequential.only","suite.shuffle.sequential.concurrent","suite.shuffle.sequential.todo","suite.shuffle.todo.skip","suite.shuffle.todo.only","suite.shuffle.todo.concurrent","suite.shuffle.todo.sequential","suite.todo.skip.only","suite.todo.skip.concurrent","suite.todo.skip.sequential","suite.todo.skip.shuffle","suite.todo.only.skip","suite.todo.only.concurrent","suite.todo.only.sequential","suite.todo.only.shuffle","suite.todo.concurrent.skip","suite.todo.concurrent.only","suite.todo.concurrent.sequential","suite.todo.concurrent.shuffle","suite.todo.sequential.skip","suite.todo.sequential.only","suite.todo.sequential.concurrent","suite.todo.sequential.shuffle","suite.todo.shuffle.skip","suite.todo.shuffle.only","suite.todo.shuffle.concurrent","suite.todo.shuffle.sequential","suite.skipIf.skip.only","suite.skipIf.skip.concurrent","suite.skipIf.skip.sequential","suite.skipIf.skip.shuffle","suite.skipIf.skip.todo","suite.skipIf.only.skip","suite.skipIf.only.concurrent","suite.skipIf.only.sequential","suite.skipIf.only.shuffle","suite.skipIf.only.todo","suite.skipIf.concurrent.skip","suite.skipIf.concurrent.only","suite.skipIf.concurrent.sequential","suite.skipIf.concurrent.shuffle","suite.skipIf.concurrent.todo","suite.skipIf.sequential.skip","suite.skipIf.sequential.only","suite.skipIf.sequential.concurrent","suite.skipIf.sequential.shuffle","suite.skipIf.sequential.todo","suite.skipIf.shuffle.skip","suite.skipIf.shuffle.only","suite.skipIf.shuffle.concurrent","suite.skipIf.shuffle.sequential","suite.skipIf.shuffle.todo","suite.skipIf.todo.skip","suite.skipIf.todo.only","suite.skipIf.todo.concurrent","suite.skipIf.todo.sequential","suite.skipIf.todo.shuffle","suite.runIf.skip.only","suite.runIf.skip.concurrent","suite.runIf.skip.sequential","suite.runIf.skip.shuffle","suite.runIf.skip.todo","suite.runIf.only.skip","suite.runIf.only.concurrent","suite.runIf.only.sequential","suite.runIf.only.shuffle","suite.runIf.only.todo","suite.runIf.concurrent.skip","suite.runIf.concurrent.only","suite.runIf.concurrent.sequential","suite.runIf.concurrent.shuffle","suite.runIf.concurrent.todo","suite.runIf.sequential.skip","suite.runIf.sequential.only","suite.runIf.sequential.concurrent","suite.runIf.sequential.shuffle","suite.runIf.sequential.todo","suite.runIf.shuffle.skip","suite.runIf.shuffle.only","suite.runIf.shuffle.concurrent","suite.runIf.shuffle.sequential","suite.runIf.shuffle.todo","suite.runIf.todo.skip","suite.runIf.todo.only","suite.runIf.todo.concurrent","suite.runIf.todo.sequential","suite.runIf.todo.shuffle","suite.skip.only.each","suite.skip.concurrent.each","suite.skip.sequential.each","suite.skip.shuffle.each","suite.skip.todo.each","suite.only.skip.each","suite.only.concurrent.each","suite.only.sequential.each","suite.only.shuffle.each","suite.only.todo.each","suite.concurrent.skip.each","suite.concurrent.only.each","suite.concurrent.sequential.each","suite.concurrent.shuffle.each","suite.concurrent.todo.each","suite.sequential.skip.each","suite.sequential.only.each","suite.sequential.concurrent.each","suite.sequential.shuffle.each","suite.sequential.todo.each","suite.shuffle.skip.each","suite.shuffle.only.each","suite.shuffle.concurrent.each","suite.shuffle.sequential.each","suite.shuffle.todo.each","suite.todo.skip.each","suite.todo.only.each","suite.todo.concurrent.each","suite.todo.sequential.each","suite.todo.shuffle.each","suite.skipIf.skip.each","suite.skipIf.only.each","suite.skipIf.concurrent.each","suite.skipIf.sequential.each","suite.skipIf.shuffle.each","suite.skipIf.todo.each","suite.runIf.skip.each","suite.runIf.only.each","suite.runIf.concurrent.each","suite.runIf.sequential.each","suite.runIf.shuffle.each","suite.runIf.todo.each","xtest","xtest.each","xit","xit.each","fit","xdescribe","xdescribe.each","fdescribe"]);function getScope(q,$){return q.sourceCode.getScope?q.sourceCode.getScope($):q.getScope()}function getModuleScope(q,$){let Y=getScope(q,$);for(;Y;){if(Y.type==="module")return Y;Y=Y.upper}return Y}const isTypeOfVitestFnCall=(q,$,Y)=>{const B=parseVitestFnCall(q,$);return B!==null&&Y.includes(B.type)},parseVitestFnCall=(q,$)=>{const Y=parseVitestFnCallWithReason(q,$);return typeof Y=="string"?null:Y},y$4=new WeakMap,parseVitestFnCallWithReason=(q,$)=>{let Y=y$4.get(q);return Y||(Y=M$3(q,$),y$4.set(q,Y),Y)},A$3=q=>q==="expect"?"expect":q==="expectTypeOf"?"expectTypeOf":q==="vi"?"vi":q==="vitest"?"vitest":DescribeAlias.hasOwnProperty(q)?"describe":TestCaseName.hasOwnProperty(q)?"test":HookName.hasOwnProperty(q)?"hook":"unknown",w$2=q=>{const $=[];for(const Y of q){if(Y.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&Y.parent.parent?.type===utils.AST_NODE_TYPES.CallExpression)return{matcher:Y,args:Y.parent.parent.arguments,modifiers:$};const B=getAccessorValue(Y);if($.length===0){if(!ModifierName.hasOwnProperty(B))return"modifier-unknown"}else if($.length===1){if(B!==ModifierName.not&&B!=ModifierName.have)return"modifier-unknown";const F=getAccessorValue($[0]);if(F!==ModifierName.resolves&&F!==ModifierName.rejects&&F!==ModifierName.to)return"modifier-unknown"}else return"modifier-unknown";$.push(Y)}return"matcher-not-found"},P$2=(q,$)=>{const Y=w$2(q.members);return typeof Y=="string"?Y:{...q,type:$,...Y}},findTopMostCallExpression=q=>{let $=q,{parent:Y}=q;for(;Y;){if(Y.type===utils.AST_NODE_TYPES.CallExpression){$=Y,Y=Y.parent;continue}if(Y.type!==utils.AST_NODE_TYPES.MemberExpression)break;Y=Y.parent}return $},M$3=(q,$)=>{const Y=getNodeChain(q);if(!Y?.length)return null;const[B,...F]=Y,W=getAccessorValue(Y[Y.length-1]);if(W==="each"&&q.callee.type!==utils.AST_NODE_TYPES.CallExpression&&q.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||q.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&W!=="each")return null;const V=v($,q,getAccessorValue(B));if(!V)return null;const H=V.original??V.local,G=[H,...F.map(getAccessorValue)];if(V.type!=="testContext"&&H!=="vi"&&H!=="vitest"&&H!=="expect"&&H!=="expectTypeOf"&&!ValidVitestFnCallChains.has(G.join(".")))return null;const z={name:H,head:{...V,node:B},members:F},J=A$3(H);if(J==="expect"||J==="expectTypeOf"){const X=P$2(z,J);return typeof X=="string"&&findTopMostCallExpression(q)!==q?null:X==="matcher-not-found"&&q.parent?.type===utils.AST_NODE_TYPES.MemberExpression?"matcher-not-called":X}return Y.slice(0,Y.length-1).some(X=>X.parent?.type!==utils.AST_NODE_TYPES.MemberExpression)||q.parent?.type===utils.AST_NODE_TYPES.CallExpression||q.parent?.type===utils.AST_NODE_TYPES.MemberExpression?null:{...z,type:J}},k$1=(q,$)=>q&&$?[...q,...$]:null;function getNodeChain(q){if(isSupportedAccessor(q))return[q];switch(q.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeChain(q.tag);case utils.AST_NODE_TYPES.MemberExpression:return k$1(getNodeChain(q.object),getNodeChain(q.property));case utils.AST_NODE_TYPES.CallExpression:return getNodeChain(q.callee)}return null}const v=(q,$,Y)=>{const B=getScope(q,$),F=resolveScope(B,Y);return F==="local"?null:F==="testContext"?{local:Y,original:null,type:"testContext"}:F?F.source==="vitest"?{original:F.imported,local:F.local,type:"import"}:null:{original:N$4(Y,q),local:Y,type:"global"}},N$4=(q,$)=>{const Y=$.settings.vitest?.globalAliases??{},B=Object.entries(Y).find(([F,W])=>W.includes(q));return B?B[0]:null},I$1=({parent:q})=>{if(q?.type===utils.AST_NODE_TYPES.CallExpression&&q.callee.type===utils.AST_NODE_TYPES.Identifier)return TestCaseName.hasOwnProperty(q.callee.name)},resolveScope=(q,$)=>{let Y=q;for(;Y!==null;){const B=Y.set.get($);if(B&&B.defs.length>0){const F=B.defs[B.defs.length-1],W=isFunction(F.node)?F.node.params.find(G=>G.type===utils.AST_NODE_TYPES.ObjectPattern):void 0;if(W){const G=W.properties.find(z=>z.type===utils.AST_NODE_TYPES.Property);if((G?.key.type===utils.AST_NODE_TYPES.Identifier?G.key:void 0)?.name===$)return"testContext"}const V=isFunction(F.node)?F.node.params.find(G=>G.type===utils.AST_NODE_TYPES.Identifier):void 0;if(V&&I$1(V.parent))return"testContext";const H=D$1(F);return H?.local===$?H:"local"}Y=Y.upper}return null},R=q=>q.type===utils.AST_NODE_TYPES.AwaitExpression?q.argument.type===utils.AST_NODE_TYPES.ImportExpression?q.argument.source:null:q.type===utils.AST_NODE_TYPES.CallExpression&&isIdentifier(q.callee,"require")?q.arguments[0]??null:null,O$2=q=>q.parent.type===utils.AST_NODE_TYPES.TSImportEqualsDeclaration||q.node.type!==utils.AST_NODE_TYPES.ImportSpecifier||q.node.imported.type!=utils.AST_NODE_TYPES.Identifier||q.parent.importKind==="type"?null:{source:q.parent.source.value,imported:q.node.imported.name,local:q.node.local.name},D$1=q=>q.type==="Variable"?L$1(q):q.type==="ImportBinding"?O$2(q):null,L$1=q=>{if(!q.node.init)return null;const $=R(q.node.init);return!$||!isStringNode($)||q.name.parent?.type!==utils.AST_NODE_TYPES.Property||!isSupportedAccessor(q.name.parent.key)?null:{source:getStringValue($),imported:getAccessorValue(q.name.parent.key),local:q.name.name}},getTestCallExpressionsFromDeclaredVariables=(q,$)=>q.reduce((Y,{references:B})=>Y.concat(B.map(({identifier:F})=>F.parent).filter(F=>F?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(F,$,["test"]))),[]),getFirstMatcherArg=q=>{const[$]=q.args;return $.type===utils.AST_NODE_TYPES.SpreadElement?$:followTypeAssertionChain$1($)},K=q=>q.type===utils.AST_NODE_TYPES.TSAsExpression||q.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain$1=q=>K(q)?followTypeAssertionChain$1(q.expression):q,RULE_NAME$16="prefer-lowercase-title",E$5=q=>q.arguments[0]&&isStringNode(q.arguments[0]),x$4=q=>{const $=[];return q.includes(DescribeAlias.describe)&&$.push(...Object.keys(DescribeAlias)),q.includes(TestCaseName.test)&&$.push(...Object.keys(TestCaseName).filter(Y=>Y.endsWith(TestCaseName.test))),q.includes(TestCaseName.it)&&$.push(...Object.keys(TestCaseName).filter(Y=>Y.endsWith(TestCaseName.it))),$},be=createEslintRule({name:RULE_NAME$16,meta:{type:"problem",docs:{description:"enforce lowercase titles",recommended:!1},fixable:"code",messages:{lowerCaseTitle:"`{{ method }}`s should begin with lowercase",fullyLowerCaseTitle:"`{{ method }}`s should be lowercase"},schema:[{type:"object",properties:{ignore:{type:"array",items:{type:"string",enum:[DescribeAlias.describe,TestCaseName.test,TestCaseName.it]}},allowedPrefixes:{type:"array",items:{type:"string"},additionalItems:!1},ignoreTopLevelDescribe:{type:"boolean",default:!1},lowercaseFirstCharacterOnly:{type:"boolean",default:!0}},additionalProperties:!1}]},defaultOptions:[{ignore:[],allowedPrefixes:[],ignoreTopLevelDescribe:!1,lowercaseFirstCharacterOnly:!0}],create:(q,[{ignore:$=[],allowedPrefixes:Y=[],ignoreTopLevelDescribe:B=!1,lowercaseFirstCharacterOnly:F=!1}])=>{const W=x$4($);let V=0;return{CallExpression(H){const G=parseVitestFnCall(H,q);if(!G||!E$5)return;if(G?.type==="describe"){if(V++,B&&V===1)return}else if(G?.type!=="test")return;const[z]=H.arguments,J=getStringValue(z);if(typeof J!="string"||Y.some(te=>J.startsWith(te)))return;const X=J.charAt(0);W.includes(G.name)||F&&(!X||X===X.toLowerCase())||!F&&J===J.toLowerCase()||q.report({messageId:F?"lowerCaseTitle":"fullyLowerCaseTitle",node:H.arguments[0],data:{method:G.name},fix:te=>{const Q=getStringValue(z),se=[z.range[0]+1,z.range[1]-1],Z=F?Q.substring(0,1).toLowerCase()+Q.substring(1):Q.toLowerCase();return[te.replaceTextRange(se,Z)]}})},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,q,["describe"])&&V--}}}}),RULE_NAME$15="max-nested-describe",ge=createEslintRule({name:RULE_NAME$15,meta:{type:"problem",docs:{description:"require describe block to be less than set max value or default value",recommended:!1},schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}],messages:{maxNestedDescribe:"Nested describe block should be less than set max value"}},defaultOptions:[{max:5}],create(q,[{max:$}]){const Y=[];function B(W){W.parent?.type==="CallExpression"&&(W.parent.callee.type!=="Identifier"||W.parent.callee.name!=="describe"||(Y.push(0),Y.length>$&&q.report({node:W.parent,messageId:"maxNestedDescribe"})))}function F(W){W.parent?.type==="CallExpression"&&(W.parent.callee.type!=="Identifier"||W.parent.callee.name!=="describe"||Y.pop())}return{FunctionExpression:B,"FunctionExpression:exit":F,ArrowFunctionExpression:B,"ArrowFunctionExpression:exit":F}}}),RULE_NAME$14="no-identical-title",c$4=()=>({describeTitles:[],testTitles:[]}),he=createEslintRule({name:RULE_NAME$14,meta:{type:"problem",docs:{description:"disallow identical titles",recommended:!1},fixable:"code",schema:[],messages:{multipleTestTitle:"Test is used multiple times in the same describe(suite) block",multipleDescribeTitle:"Describe is used multiple times in the same describe(suite) block"}},defaultOptions:[],create(q){const $=[c$4()];return{CallExpression(Y){const B=$[$.length-1],F=parseVitestFnCall(Y,q);if(!F||((F.name==="describe"||F.name==="suite")&&$.push(c$4()),F.members.find(H=>isSupportedAccessor(H,"each"))))return;const[W]=Y.arguments;if(!W||!isStringNode(W))return;const V=getStringValue(W);F.type==="test"&&(B?.testTitles.includes(V)&&q.report({node:Y,messageId:"multipleTestTitle"}),B?.testTitles.push(V)),F.type==="describe"&&(B?.describeTitles.includes(V)&&q.report({node:Y,messageId:"multipleDescribeTitle"}),B?.describeTitles.push(V))},"CallExpression:exit"(Y){isTypeOfVitestFnCall(Y,q,["describe"])&&$.pop()}}}}),RULE_NAME$13="no-focused-tests",n$2=q=>q.type==="Identifier"&&["it","test","describe"].includes(q.name),a$6=q=>q.type==="Identifier"&&q.name==="only",ke=createEslintRule({name:RULE_NAME$13,meta:{type:"problem",docs:{description:"disallow focused tests",recommended:!1},fixable:"code",schema:[{type:"object",properties:{fixable:{type:"boolean",default:!0}},additionalProperties:!1}],messages:{noFocusedTests:"Focused tests are not allowed"}},defaultOptions:[{fixable:!0}],create:q=>{const $=q.options[0]?.fixable;return{ExpressionStatement(Y){if(Y.expression.type==="CallExpression"){const{callee:B}=Y.expression;if(B.type==="MemberExpression"&&n$2(B.object)&&a$6(B.property)&&q.report({node:B.property,messageId:"noFocusedTests",fix:F=>$?F.removeRange([B.property.range[0]-1,B.property.range[1]]):null}),B.type==="TaggedTemplateExpression"){const F=B.tag.type==="MemberExpression"?B.tag.object:null;if(!F)return;F.type==="MemberExpression"&&n$2(F.object)&&a$6(F.property)&&q.report({node:F.property,messageId:"noFocusedTests",fix:W=>$?W.removeRange([F.property.range[0]-1,F.property.range[1]]):null})}}},CallExpression(Y){if(Y.callee.type==="CallExpression"){const{callee:B}=Y.callee;if(B.type==="MemberExpression"&&B.object.type==="MemberExpression"&&n$2(B.object.object)&&a$6(B.object.property)&&B.property.type==="Identifier"&&B.property.name==="each"){const F=B.object.property;q.report({node:B.object.property,messageId:"noFocusedTests",fix:W=>$?W.removeRange([F.range[0]-1,F.range[1]]):null})}}}}}}),RULE_NAME$12="no-conditional-tests",xe=createEslintRule({name:RULE_NAME$12,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(q){return{Identifier:function($){["test","it","describe"].includes($.name)&&$.parent?.parent?.parent?.parent?.type==="IfStatement"&&q.report({node:$,messageId:"noConditionalTests"})}}}}),i$2={typecheck:!1};function parsePluginSettings(q){const $=typeof q.vitest!="object"||q.vitest===null?{}:q.vitest;return{...i$2,...$}}const RULE_NAME$11="expect-expect",ve=createEslintRule({name:RULE_NAME$11,meta:{type:"suggestion",docs:{description:"enforce having expectation in test body",recommended:!1},schema:[{type:"object",properties:{assertFunctionNames:{type:"array",items:{type:"string"}},additionalTestBlockFunctions:{type:"array",items:{type:"string"}}},additionalProperties:!1}],messages:{noAssertions:"Test has no assertions"}},defaultOptions:[{assertFunctionNames:["expect","assert"],additionalTestBlockFunctions:[]}],create(q,[{assertFunctionNames:$=["expect"],additionalTestBlockFunctions:Y=[]}]){const B=[];parsePluginSettings(q.settings).typecheck&&$.push("expectTypeOf","assertType");const F=$.map(x$3);function W(V){for(const H of V){const G=H.type===utils.AST_NODE_TYPES.CallExpression?B.indexOf(H):-1;if(H.type===utils.AST_NODE_TYPES.FunctionDeclaration){const z=q.sourceCode.getDeclaredVariables(H),J=getTestCallExpressionsFromDeclaredVariables(z,q);W(J)}if(G!==-1){B.splice(G,1);break}}}return{CallExpression(V){if(V.callee.type===utils.AST_NODE_TYPES.Identifier&&V.callee.name==="bench"||V?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&V.callee.property.type===utils.AST_NODE_TYPES.Identifier&&V.callee.property.name==="extend"||V?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&V.callee.property.type===utils.AST_NODE_TYPES.Identifier&&V.callee.property.name==="skip")return;const H=getNodeName(V)??"";if(isTypeOfVitestFnCall(V,q,["test"])||Y.includes(H)){if(V.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(V.callee.property,"todo"))return;B.push(V)}else F.some(G=>G.test(H))&&W(q.sourceCode.getAncestors(V))},"Program:exit"(){B.forEach(V=>{q.report({node:V.callee,messageId:"noAssertions"})})}}}});function x$3(q){const $=q.split(".").map(Y=>Y==="**"?"[_a-z\\d\\.]*":Y.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${$.join("\\.")}(\\.|$)`,"ui")}const RULE_NAME$10="consistent-test-it",g$1=(q,$,Y)=>B=>[B.replaceText(q.type===utils.AST_NODE_TYPES.MemberExpression?q.object:q,E$4($,Y))];function E$4(q,$){return q===TestCaseName.fit?"test.only":q.startsWith("f")||q.startsWith("x")?q.charAt(0)+$:$}function u$4(q){return q===TestCaseName.test?TestCaseName.it:TestCaseName.test}const Ce=createEslintRule({name:RULE_NAME$10,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using test or it but not both",recommended:!1},messages:{consistentMethod:"Prefer using {{ testFnKeyWork }} instead of {{ oppositeTestKeyword }}",consistentMethodWithinDescribe:"Prefer using {{ testKeywordWithinDescribe }} instead of {{ oppositeTestKeyword }} within describe"},schema:[{type:"object",properties:{fn:{type:"string",enum:[TestCaseName.test,TestCaseName.it]},withinDescribe:{type:"string",enum:[TestCaseName.test,TestCaseName.it]}},additionalProperties:!1}]},defaultOptions:[{fn:TestCaseName.test,withinDescribe:TestCaseName.it}],create(q){const $=q.options[0]??{},Y=$.fn||TestCaseName.test,B=$?.withinDescribe||$?.fn||TestCaseName?.it,F=Y===B?Y:void 0;let W=0;return{ImportDeclaration(V){if(F==null||V.source.type!=="Literal"||V.source.value!=="vitest")return;const H=u$4(F);for(const G of V.specifiers)G.type==="ImportSpecifier"&&G.imported.type==="Identifier"&&G.local.name===G.imported.name&&G.local.name===H&&q.report({node:G,data:{testFnKeyWork:Y,oppositeTestKeyword:H},messageId:"consistentMethod",fix:z=>{const J=V.specifiers.filter(X=>X.local.name!==H);if(J.length>0){const X=J.map(Q=>Q.local.name).join(", "),te=V.specifiers.at(-1)?.range;return te?z.replaceTextRange([V.specifiers[0].range[0],te[1]],X):null}return z.replaceText(G.local,F)}})},CallExpression(V){if(V.callee.type===utils.AST_NODE_TYPES.Identifier&&V.callee.name==="bench")return;const H=parseVitestFnCall(V,q);if(!H)return;if(H.type==="describe"){W++;return}const G=V.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?V.callee.tag:V.callee.type===utils.AST_NODE_TYPES.CallExpression?V.callee.callee:V.callee;if(H.type==="test"&&W===0&&!H.name.endsWith(Y)){const z=u$4(Y);q.report({node:V.callee,data:{testFnKeyWork:Y,oppositeTestKeyword:z},messageId:"consistentMethod",fix:g$1(G,H.name,Y)})}else if(H.type==="test"&&W>0&&!H.name.endsWith(B)){const z=u$4(B);q.report({messageId:"consistentMethodWithinDescribe",node:V.callee,data:{testKeywordWithinDescribe:B,oppositeTestKeyword:z},fix:g$1(G,H.name,B)})}},"CallExpression:exit"(V){isTypeOfVitestFnCall(V,q,["describe"])&&W--}}}}),RULE_NAME$$="consistent-vitest-vi",d=q=>q===UtilName.vi?UtilName.vitest:UtilName.vi,Be=createEslintRule({name:RULE_NAME$$,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using vitest or vi but not both",recommended:!1},messages:{consistentUtil:"Prefer using {{ utilKeyword }} instead of {{ oppositeUtilKeyword }}"},schema:[{type:"object",properties:{fn:{type:"string",enum:[UtilName.vi,UtilName.vitest]}},additionalProperties:!1}]},defaultOptions:[{fn:UtilName.vi}],create(q){const $=(q.options[0]??{}).fn||UtilName.vi,Y=d($);return{ImportDeclaration(B){if(!(B.source.type!==utils.AST_NODE_TYPES.Literal||B.source.value!=="vitest"))for(const F of B.specifiers)F.type===utils.AST_NODE_TYPES.ImportSpecifier&&F.imported.type===utils.AST_NODE_TYPES.Identifier&&F.local.name===F.imported.name&&F.imported.name===Y&&q.report({node:F,messageId:"consistentUtil",data:{utilKeyword:$,oppositeUtilKeyword:Y},fix:W=>{const V=B.specifiers.filter(H=>H.local.name!==Y);if(V.length>0){const H=V.map(z=>z.local.name).join(", "),G=B.specifiers.at(-1)?.range;return G?W.replaceTextRange([B.specifiers[0].range[0],G[1]],H):null}return W.replaceText(F.local,$)}})},CallExpression(B){if(parseVitestFnCall(B,q)?.type!==Y)return;const F=B.callee.type===utils.AST_NODE_TYPES.MemberExpression?B.callee.object:B.callee;q.report({node:F,data:{utilKeyword:$,oppositeUtilKeyword:Y},messageId:"consistentUtil",fix:W=>W.replaceText(F,$)})}}}}),RULE_NAME$_="prefer-to-be",E$3=q=>q.type===utils.AST_NODE_TYPES.Literal&&q.value===null,N$3=q=>E$3(getFirstMatcherArg(q)),c$3=(q,$)=>isIdentifier(getFirstMatcherArg(q),$),h$2=q=>Math.floor(q)!==Math.ceil(q),y$3=q=>{let $=getFirstMatcherArg(q);return $.type===utils.AST_NODE_TYPES.Literal&&typeof $.value=="number"&&h$2($.value)?!1:($.type===utils.AST_NODE_TYPES.UnaryExpression&&$.operator==="-"&&($=$.argument),$.type===utils.AST_NODE_TYPES.Literal?!("regex"in $):$.type===utils.AST_NODE_TYPES.TemplateLiteral)},o$2=(q,$,Y,B,F)=>{q.report({messageId:`useToBe${$}`,fix(W){const V=[replaceAccessorFixer(W,Y.matcher,`toBe${$}`)];return Y.args?.length&&$!==""&&V.push(removeExtraArgumentsFixer(W,q,B,0)),F&&V.push(W.removeRange([F.range[0]-1,F.range[1]])),V},node:Y.matcher})},ye=createEslintRule({name:RULE_NAME$_,meta:{type:"suggestion",docs:{description:"enforce using toBe()",recommended:!1},schema:[],fixable:"code",messages:{useToBe:"Use `toBe` instead",useToBeUndefined:"Use `toBeUndefined()` instead",useToBeDefined:"Use `toBeDefined()` instead",useToBeNull:"Use `toBeNull()` instead",useToBeNaN:"Use `toBeNaN()` instead"}},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect")return;const B=getAccessorValue(Y.matcher),F=Y.modifiers.find(W=>getAccessorValue(W)==="not");if(F&&["toBeUndefined","toBeDefined"].includes(B)){o$2(q,B==="toBeDefined"?"Undefined":"Defined",Y,$,F);return}if(!(!EqualityMatcher.hasOwnProperty(B)||Y.args.length===0)){if(N$3(Y)){o$2(q,"Null",Y,$);return}if(c$3(Y,"undefined")){o$2(q,F?"Defined":"Undefined",Y,$);return}if(c$3(Y,"NaN")){o$2(q,"NaN",Y,$);return}y$3(Y)&&B!==EqualityMatcher.toBe&&o$2(q,"",Y,$)}}}}}),RULE_NAME$Z="no-hooks",Ie=createEslintRule({name:RULE_NAME$Z,meta:{type:"suggestion",docs:{description:"disallow setup and teardown hooks",recommended:!1},schema:[{type:"object",properties:{allow:{type:"array",contains:["beforeAll","beforeEach","afterAll","afterEach"]}},additionalProperties:!1}],messages:{unexpectedHook:"Unexpected '{{ hookName }}' hook"}},defaultOptions:[{allow:[]}],create(q,[{allow:$=[]}]){return{CallExpression(Y){const B=parseVitestFnCall(Y,q);B?.type==="hook"&&!$.includes(B.name)&&q.report({node:Y,messageId:"unexpectedHook",data:{hookName:B.name}})}}}}),RULE_NAME$Y="no-restricted-vi-methods",Se=createEslintRule({name:RULE_NAME$Y,meta:{type:"suggestion",docs:{description:"disallow specific `vi.` methods",recommended:!1},schema:[{type:"object",additionalProperties:{type:["string","null"]}}],messages:{restrictedViMethod:"Use of `{{ restriction }}` is disallowed",restrictedViMethodWithMessage:"{{ message }}"}},defaultOptions:[{}],create(q,[$]){return{CallExpression(Y){const B=parseVitestFnCall(Y,q);if(B?.type!=="vi"||B.members.length===0)return;const F=getAccessorValue(B.members[0]);if(F in $){const W=$[F];q.report({messageId:W?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:W,restriction:F},loc:{start:B.members[0].loc.start,end:B.members[B.members.length-1].loc.end}})}}}}}),RULE_NAME$X="consistent-test-filename",o$1=/.*\.test\.[tj]sx?$/,e=/.*\.(test|spec)\.[tj]sx?$/,Oe=createEslintRule({name:RULE_NAME$X,meta:{type:"problem",docs:{recommended:!1,requiresTypeChecking:!1,description:"require .spec test file pattern"},messages:{consistentTestFilename:"Use test file name pattern {{ pattern }}"},schema:[{type:"object",additionalProperties:!1,properties:{pattern:{format:"regex",default:o$1.source},allTestPattern:{format:"regex",default:e.source}}}]},defaultOptions:[{pattern:e.source,allTestPattern:e.source}],create:q=>{const $=q.options[0]??{},{pattern:Y=o$1,allTestPattern:B=e}=$,F=typeof Y=="string"?new RegExp(Y):Y,W=typeof B=="string"?new RegExp(B):B,{filename:V}=q;return W.test(V)?{Program:H=>{F.test(V)||q.report({node:H,messageId:"consistentTestFilename",data:{pattern:F.source}})}}:{}}}),RULE_NAME$W="max-expects",De=createEslintRule({name:RULE_NAME$W,meta:{docs:{requiresTypeChecking:!1,recommended:!1,description:"enforce a maximum number of expect per test"},messages:{maxExpect:"Too many assertion calls ({{ count }}) - maximum allowed is {{ max }}"},type:"suggestion",schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}]},defaultOptions:[{max:5}],create(q,[{max:$}]){let Y=0;const B=F=>{(F.parent?.type!==utils.AST_NODE_TYPES.CallExpression||isTypeOfVitestFnCall(F.parent,q,["test"]))&&(Y=0)};return{FunctionExpression:B,"FunctionExpression:exit":B,ArrowFunctionExpression:B,"ArrowFunctionExpression:exit":B,CallExpression(F){const W=parseVitestFnCall(F,q);W?.type!=="expect"||W.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression||(Y+=1,Y>$&&q.report({node:F,messageId:"maxExpect",data:{count:Y,max:$}}))}}}}),RULE_NAME$V="no-alias-methods",He=createEslintRule({name:RULE_NAME$V,meta:{docs:{description:"disallow alias methods",requiresTypeChecking:!1,recommended:!1},messages:{noAliasMethods:"Replace {{ alias }}() with its canonical name {{ canonical }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(q){const $={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(Y){const B=parseVitestFnCall(Y,q);if(B?.type!=="expect")return;const{matcher:F}=B,W=getAccessorValue(F);if(W in $){const V=$[W];q.report({messageId:"noAliasMethods",data:{alias:W,canonical:V},node:F,fix:H=>[replaceAccessorFixer(H,F,V)]})}}}}}),RULE_NAME$U="no-commented-out-tests";function n$1(q){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(q.value)}const qe=createEslintRule({name:RULE_NAME$U,meta:{docs:{description:"disallow commented out tests",requiresTypeChecking:!1,recommended:!1},messages:{noCommentedOutTests:"Remove commented out tests - you may want to use `skip` or `only` instead"},schema:[],type:"suggestion"},defaultOptions:[],create(q){const{sourceCode:$}=q;function Y(B){n$1(B)&&q.report({messageId:"noCommentedOutTests",node:B})}return{Program(){$.getAllComments().forEach(Y)}}}}),RULE_NAME$T="no-conditional-expect",r=q=>q.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.callee.property,"catch"),Fe=createEslintRule({name:RULE_NAME$T,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(q){let $=0,Y=!1,B=!1;const F=()=>Y&&$++,W=()=>Y&&$--;return{FunctionDeclaration(V){const H=q.sourceCode.getDeclaredVariables(V);getTestCallExpressionsFromDeclaredVariables(H,q).length>0&&(Y=!0)},CallExpression(V){const{type:H}=parseVitestFnCall(V,q)??{};H==="test"&&(Y=!0),r(V)&&(B=!0),Y&&H==="expect"&&$>0&&q.report({messageId:"noConditionalExpect",node:V}),B&&H==="expect"&&q.report({messageId:"noConditionalExpect",node:V})},"CallExpression:exit"(V){isTypeOfVitestFnCall(V,q,["test"])&&(Y=!1),r(V)&&(B=!1)},CatchClause:F,"CatchClause:exit":W,IfStatement:F,"IfStatement:exit":W,SwitchStatement:F,"SwitchStatement:exit":W,ConditionalExpression:F,"ConditionalExpression:exit":W,LogicalExpression:F,"LogicalExpression:exit":W}}}),RULE_NAME$S="no-import-node-test",Ve=createEslintRule({name:RULE_NAME$S,meta:{docs:{description:"disallow importing `node:test`",recommended:!1},type:"suggestion",messages:{noImportNodeTest:"Import from `vitest` instead of `node:test`"},fixable:"code",schema:[]},defaultOptions:[],create(q){return{ImportDeclaration($){$.source.value==="node:test"&&q.report({messageId:"noImportNodeTest",node:$,fix:Y=>Y.replaceText($.source,$.source.raw.replace("node:test","vitest"))})}}}}),VITEST_GLOBALS=new Set(["suite","test","chai","describe","it","expectTypeOf","assertType","expect","assert","vitest","vi","beforeAll","afterAll","beforeEach","afterEach","onTestFailed","onTestFinished"]),isVitestImport=q=>q.source.value==="vitest",isVitestGlobalsImportSpecifier=q=>q.type===utils.AST_NODE_TYPES.ImportSpecifier&&q.imported.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(q.imported.name),isVitestGlobalsProperty=q=>q.type===utils.AST_NODE_TYPES.Property&&q.key.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(q.key.name),isVitestGlobalsFunction=q=>q.callee.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(q.callee.name),isRequireVitestCall=q=>{if(q?.type!==utils.AST_NODE_TYPES.CallExpression||q.callee.type!==utils.AST_NODE_TYPES.Identifier||q.callee.name!=="require")return!1;const $=q.arguments;return $.length===1&&$[0].type===utils.AST_NODE_TYPES.Literal&&$[0].value==="vitest"},isObjectPattern=q=>q.type===utils.AST_NODE_TYPES.ObjectPattern,removeVariableDeclarator=(q,$)=>{const Y=$.parent,B=Y.declarations;if(B.length===1)return q.remove(Y);const F=B.findIndex(W=>W.range[0]===$.range[0]&&W.range[1]===$.range[1]);if(F===0){const W=B[1];return q.removeRange([$.range[0],W.range[0]])}else{const W=B[F-1];return q.removeRange([W.range[1],$.range[1]])}},removeNodeFromArray=(q,$,Y)=>{const B=$.indexOf(Y);if(B===-1)throw new Error("Target node not found in nodes array");if(B===0){const F=$[1];return q.removeRange([Y.range[0],F.range[0]])}else{const F=$[B-1];return q.removeRange([F.range[1],Y.range[1]])}},RULE_NAME$R="no-importing-vitest-globals",Pe=createEslintRule({name:RULE_NAME$R,meta:{type:"suggestion",docs:{description:"disallow importing Vitest globals",recommended:!1},messages:{noImportingVitestGlobals:"Do not import '{{name}}' from 'vitest'. Use globals configuration instead.",noRequiringVitestGlobals:"Do not require '{{name}}' from 'vitest'. Use globals configuration instead."},fixable:"code",schema:[]},defaultOptions:[],create(q){return{ImportDeclaration($){if(!isVitestImport($))return;const Y=$.specifiers;for(const B of Y)isVitestGlobalsImportSpecifier(B)&&q.report({node:B,messageId:"noImportingVitestGlobals",data:{name:B.imported.name},fix(F){return Y.every(W=>isVitestGlobalsImportSpecifier(W))?F.remove($):removeNodeFromArray(F,Y,B)}})},VariableDeclarator($){if(!isRequireVitestCall($.init)||!isObjectPattern($.id))return;const Y=$.id.properties;for(const B of Y)isVitestGlobalsProperty(B)&&q.report({node:B,messageId:"noRequiringVitestGlobals",data:{name:B.key.name},fix(F){return Y.every(W=>isVitestGlobalsProperty(W))?removeVariableDeclarator(F,$):removeNodeFromArray(F,Y,B)}})}}}}),RULE_NAME$Q="prefer-importing-vitest-globals",Ge=createEslintRule({name:RULE_NAME$Q,meta:{type:"suggestion",docs:{description:"enforce importing Vitest globals",recommended:!1},messages:{preferImportingVitestGlobals:"Import '{{name}}' from 'vitest'"},schema:[],fixable:"code"},defaultOptions:[],create(q){const $=new Set;let Y,B;return{ImportDeclaration(F){if(!isVitestImport(F))return;const W=F.specifiers;for(const V of W)if(isVitestGlobalsImportSpecifier(V)){const H=V.imported.name;$.add(H)}Y=F.specifiers},VariableDeclarator(F){if(!isRequireVitestCall(F.init)||!isObjectPattern(F.id))return;const W=F.id.properties;for(const V of W)if(isVitestGlobalsProperty(V)){const H=V.key.name;$.add(H)}B=W},CallExpression(F){if(!isVitestGlobalsFunction(F))return;const W=F.callee.name;if($.has(W))return;const V=q.sourceCode.getScope(F).set.get(W);V&&V.defs.length>0&&V.defs.some(H=>!(H.type==="ImportBinding"||H.type==="Variable"&&H.node.init&&isRequireVitestCall(H.node.init)))||q.report({node:F.callee,messageId:"preferImportingVitestGlobals",data:{name:W},fix(H){const G=q.sourceCode.ast;if(!Y)if(B){const X=B[B.length-1];return H.insertTextAfter(X,`, ${W}`)}else return H.insertTextBefore(G.body[0],`import { ${W} } from 'vitest';
|
|
2
2
|
`);if(Y.find(X=>X.type==="ImportNamespaceSpecifier"))return H.insertTextBefore(G.body[0],`import { ${W} } from 'vitest';
|
|
3
3
|
`);const z=Y.find(X=>X.type==="ImportDefaultSpecifier");if(z)return H.insertTextAfter(z,`, { ${W} }`);const J=Y[Y.length-1];return H.insertTextAfter(J,`, ${W}`)}})}}}}),RULE_NAME$P="no-conditional-in-test",je=createEslintRule({name:RULE_NAME$P,meta:{docs:{description:"disallow conditional tests",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalInTest:"Remove conditional tests"},schema:[],type:"problem"},defaultOptions:[],create(q){return{IfStatement($){$.parent?.parent?.parent?.type==="CallExpression"&&isTypeOfVitestFnCall($.parent?.parent?.parent,q,["test","it"])&&q.report({messageId:"noConditionalInTest",node:$})}}}}),RULE_NAME$O="no-disabled-tests",Ke=createEslintRule({name:RULE_NAME$O,meta:{type:"suggestion",docs:{description:"disallow disabled tests",recommended:!1},messages:{missingFunction:"Test is missing function argument",pending:"Call to pending()",pendingSuite:"Call to pending() within test suite",pendingTest:"Call to pending() within test",disabledSuite:"Disabled test suite - if you want to skip a test suite temporarily, use .todo() instead",disabledTest:"Disabled test - if you want to skip a test temporarily, use .todo() instead"},schema:[]},defaultOptions:[],create(q){let $=0,Y=0;return{CallExpression(B){const F=parseVitestFnCall(B,q);if(!F)return;F.type==="describe"&&$++,F.type==="test"&&(Y++,B.arguments.length<2&&F.members.every(V=>getAccessorValue(V)==="skip")&&q.report({messageId:"missingFunction",node:B}));const W=F.members.find(V=>getAccessorValue(V)==="skip");(F.name.startsWith("x")||W!==void 0)&&q.report({messageId:F.type==="describe"?"disabledSuite":"disabledTest",node:W??F.head.node})},"CallExpression:exit"(B){const F=parseVitestFnCall(B,q);F&&(F.type==="describe"&&$--,F.type==="test"&&Y--)},'CallExpression[callee.name="pending"]'(B){const F=getScope(q,B);resolveScope(F,"pending")||(Y>0?q.report({messageId:"pendingTest",node:B}):$>0?q.report({messageId:"pendingSuite",node:B}):q.report({messageId:"pending",node:B}))}}}}),RULE_NAME$N="no-done-callback",P$1=(q,$,Y)=>{if($)return q.arguments[1];const B=parseVitestFnCall(q,Y);return B?.type==="hook"&&q.arguments.length>=1?q.arguments[0]:B?.type==="test"&&q.arguments.length>=2?q.arguments[1]:null},$e=createEslintRule({name:RULE_NAME$N,meta:{type:"suggestion",docs:{description:"disallow using a callback in asynchronous tests and hooks",recommended:!1},deprecated:!0,schema:[],messages:{noDoneCallback:"Return a promise instead of relying on callback parameter",suggestWrappingInPromise:"Wrap in `new Promise({{ callback }} => ...`",useAwaitInsteadOfCallback:"Use `await` instead of callback in async function"},hasSuggestions:!0},defaultOptions:[],create(q){return{CallExpression($){const Y=/\.each$|\.concurrent$/.test(getNodeName($.callee)??"");if(Y&&$.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||q.sourceCode.getAncestors($).some(V=>V.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(V,q,["describe","test"])?!1:V.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(V.callee.property,"concurrent")))return;const B=P$1($,Y,q),F=Number(Y);if(!B||!isFunction(B)||B.params.length!==1+F)return;const W=B.params[F];if(W.type!==utils.AST_NODE_TYPES.Identifier){q.report({node:W,messageId:"noDoneCallback"});return}if(B.async){q.report({node:W,messageId:"useAwaitInsteadOfCallback"});return}q.report({node:$,messageId:"noDoneCallback",suggest:[{messageId:"suggestWrappingInPromise",data:{callback:W.name},fix(V){const{body:H,params:G}=B,{sourceCode:z}=q,J=z.getFirstToken(H),X=z.getLastToken(H),[te]=G,Q=G[G.length-1],se=z.getTokenBefore(te);let Z=z.getTokenAfter(Q);if(Z?.value===","&&(Z=z.getTokenAfter(Z)),!J||!X||!se||!Z)throw new Error(`Unexpected null when attempting to fix ${q.filename} - please file an issue at https://github/veritem/eslint-plugin-vitest`);let ee=V.replaceText(te,"()");se.value==="("&&Z.value===")"&&(ee=V.removeRange([se.range[1],Z.range[0]]));let oe=`new Promise(${W.name} => `,re=")",ne=!0;return H.type===utils.AST_NODE_TYPES.BlockStatement&&(oe=`return ${oe}{`,re+="}",ne=!1),[ee,ne?V.insertTextBefore(J,oe):V.insertTextAfter(J,oe),V.insertTextAfter(X,re)]}}]})}}}}),RULE_NAME$M="no-duplicate-hooks",We=createEslintRule({name:RULE_NAME$M,meta:{docs:{recommended:!1,description:"disallow duplicate hooks and teardown hooks",requiresTypeChecking:!1},messages:{noDuplicateHooks:"Duplicate {{ hook }} in describe block"},schema:[],type:"suggestion"},defaultOptions:[],create(q){const $=[{}];return{CallExpression(Y){const B=parseVitestFnCall(Y,q);if(B?.type==="describe"&&$.push({}),B?.type!=="hook")return;const F=$[$.length-1];F[B.name]||=0,F[B.name]+=1,F[B.name]>1&&q.report({messageId:"noDuplicateHooks",data:{hook:B.name},node:Y})},"CallExpression:exit"(Y){isTypeOfVitestFnCall(Y,q,["describe"])&&$.pop()}}}}),RULE_NAME$L="no-large-snapshots",m$5=(q,$,{maxSize:Y=50,allowedSnapshots:B={}})=>{const F=$.loc.start.line,W=$.loc.end.line-F;if(!Object.keys(B).every(node_path.isAbsolute))throw new Error("All paths for allowedSnapshots must be absolute. You can use JS config and `path.resolve`");let V=!1;if($.type===utils.AST_NODE_TYPES.ExpressionStatement&&"left"in $.expression&&$.expression.left.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor($.expression.left.property)){const H=q.filename,G=B[H];if(G){const z=getAccessorValue($.expression.left.property);V=G.some(J=>J instanceof RegExp?J.test(z):z===J)}}!V&&W>Y&&q.report({node:$,messageId:Y===0?"noSnapShot":"tooLongSnapShot",data:{lineCount:W,lineLimit:Y}})},ze=createEslintRule({name:RULE_NAME$L,meta:{docs:{description:"disallow large snapshots",recommended:!1},messages:{noSnapShot:"`{{ lineCount }}`s should begin with lowercase",tooLongSnapShot:"Expected vitest snapshot to be smaller than {{ lineLimit }} lines but was {{ lineCount }} lines long"},type:"suggestion",schema:[{type:"object",properties:{maxSize:{type:"number"},inlineMaxSize:{type:"number"},allowedSnapshots:{type:"object",additionalProperties:{type:"array"}}},additionalProperties:!1}]},defaultOptions:[{}],create(q,[$]){return q.filename.endsWith(".snap")?{ExpressionStatement(Y){m$5(q,Y,$)}}:{CallExpression(Y){const B=parseVitestFnCall(Y,q);B?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(B.matcher))&&B.args.length&&m$5(q,B.args[0],{...$,maxSize:$.inlineMaxSize??$.maxSize})}}}}),RULE_NAME$K="no-interpolation-in-snapshots",Je=createEslintRule({name:RULE_NAME$K,meta:{type:"problem",docs:{description:"disallow string interpolation in snapshots",recommended:!1},fixable:"code",schema:[],messages:{noInterpolationInSnapshots:"Do not use string interpolation in snapshots"}},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);Y?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(Y.matcher))&&Y.args.forEach(B=>{B.type===utils.AST_NODE_TYPES.TemplateLiteral&&B.expressions.length>0&&q.report({messageId:"noInterpolationInSnapshots",node:B})})}}}}),t="__mocks__",p$2=q=>q.split(node_path.posix.sep).includes(t),s=q=>isStringNode(q)&&p$2(getStringValue(q)),RULE_NAME$J="no-mocks-import",Qe=createEslintRule({name:RULE_NAME$J,meta:{type:"problem",docs:{description:"disallow importing from __mocks__ directory",recommended:!1},messages:{noMocksImport:`Mocks should not be manually imported from a ${t} directory. Instead use \`vi.mock\` and import from the original module path`},schema:[]},defaultOptions:[],create(q){return{ImportDeclaration($){s($.source)&&q.report({node:$,messageId:"noMocksImport"})},'CallExpression[callee.name="require"]'($){const[Y]=$.arguments;Y&&s(Y)&&q.report({node:Y,messageId:"noMocksImport"})}}}}),RULE_NAME$I="no-restricted-matchers",l$3=(q,$)=>ModifierName.hasOwnProperty($)||$.endsWith(".not")?q.startsWith($):q===$,Xe=createEslintRule({name:RULE_NAME$I,meta:{docs:{description:"disallow the use of certain matchers",recommended:!1},type:"suggestion",schema:[{type:"object",additionalProperties:{type:["string","null"]}}],messages:{restrictedChain:"use of {{ restriction }} is disallowed",restrictedChainWithMessage:"{{ message }}"}},defaultOptions:[{}],create(q,[$]){return{CallExpression(Y){const B=parseVitestFnCall(Y,q);if(B?.type!=="expect")return;const F=B.members.map(W=>getAccessorValue(W)).join(".");for(const[W,V]of Object.entries($))if(l$3(F,W)){q.report({messageId:V?"restrictedChainWithMessage":"restrictedChain",data:{message:V,restriction:W},loc:{start:B.members[0].loc.start,end:B.members[B.members.length-1].loc.end}});break}}}}}),RULE_NAME$H="no-standalone-expect",a$5=(q,$)=>{const Y=q.parent;if(!Y)throw new Error("Unexpected block statement. If you feel like this is a bug report https://github.com/veritem/eslint-plugin-vitest/issues/new");if(Y.type===utils.AST_NODE_TYPES.FunctionDeclaration)return"function";if(isFunction(Y)&&Y.parent){const B=Y.parent;if(B.type===utils.AST_NODE_TYPES.VariableDeclarator)return"function";if(B.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(B,$,["describe"]))return"describe"}return null},Ye=createEslintRule({name:RULE_NAME$H,meta:{docs:{description:"disallow using `expect` outside of `it` or `test` blocks",recommended:!1},type:"suggestion",messages:{noStandaloneExpect:"Expect must be called inside a test block"},schema:[{type:"object",properties:{additionalTestBlockFunctions:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},defaultOptions:[{additionalTestBlockFunctions:[]}],create(q,[{additionalTestBlockFunctions:$=[]}]){const Y=[],B=F=>$.includes(getNodeName(F)||"");return{CallExpression(F){const W=parseVitestFnCall(F,q);if(W?.type==="expect"){if(W.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&W.members.length===1&&!["assertions","hasAssertions"].includes(getAccessorValue(W.members[0])))return;const V=Y[Y.length-1];(!V||V===DescribeAlias.describe)&&q.report({node:F,messageId:"noStandaloneExpect"});return}(W?.type==="test"||B(F))&&Y.push("test"),F.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&Y.push("template")},"CallExpression:exit"(F){const W=Y[Y.length-1];(W==="test"&&(isTypeOfVitestFnCall(F,q,["test"])||B(F))&&F.callee.type!==utils.AST_NODE_TYPES.MemberExpression||W==="template"&&F.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression)&&Y.pop()},BlockStatement(F){const W=a$5(F,q);W&&Y.push(W)},"BlockStatement:exit"(F){a$5(F,q)&&Y.pop()},ArrowFunctionExpression(F){F.parent?.type!==utils.AST_NODE_TYPES.CallExpression&&Y.push("arrow")},"ArrowFunctionExpression:exit"(){Y[Y.length-1]==="arrow"&&Y.pop()}}}}),RULE_NAME$G="no-test-prefixes",Ze=createEslintRule({name:RULE_NAME$G,meta:{docs:{description:"disallow using the `f` and `x` prefixes in favour of `.only` and `.skip`",recommended:!1},type:"suggestion",messages:{usePreferredName:'Use "{{ preferredNodeName }}" instead'},fixable:"code",schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="describe"&&Y?.type!=="test"||Y.name[0]!=="f"&&Y.name[0]!=="x")return;const B=[Y.name.slice(1),Y.name[0]==="f"?"only":"skip",...Y.members.map(W=>getAccessorValue(W))].join("."),F=$.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?$.callee.tag:$.callee.type===utils.AST_NODE_TYPES.CallExpression?$.callee.callee:$.callee;q.report({messageId:"usePreferredName",node:$.callee,data:{preferredNodeName:B},fix:W=>[W.replaceText(F,B)]})}}}}),RULE_NAME$F="no-test-return-statement",u$3=q=>{const[,$]=q;return $&&isFunction($)&&$.body.type===utils.AST_NODE_TYPES.BlockStatement?$.body.body:[]},er=createEslintRule({name:RULE_NAME$F,meta:{type:"problem",docs:{description:"disallow return statements in tests",recommended:!1},schema:[],messages:{noTestReturnStatement:"Return statements are not allowed in tests"}},defaultOptions:[],create(q){return{CallExpression($){if(!isTypeOfVitestFnCall($,q,["test"]))return;const Y=u$3($.arguments).find(B=>B.type===utils.AST_NODE_TYPES.ReturnStatement);Y&&q.report({messageId:"noTestReturnStatement",node:Y})},FunctionDeclaration($){const Y=q.sourceCode.getDeclaredVariables($);if(getTestCallExpressionsFromDeclaredVariables(Y,q).length===0)return;const B=$.body.body.find(F=>F.type===utils.AST_NODE_TYPES.ReturnStatement);B&&q.report({messageId:"noTestReturnStatement",node:B})}}}}),RULE_NAME$E="prefer-called-with",rr=createEslintRule({name:RULE_NAME$E,meta:{docs:{description:"enforce using `toBeCalledWith()` or `toHaveBeenCalledWith()`",recommended:!1},messages:{preferCalledWith:"Prefer {{ matcherName }}With(/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect"||Y.modifiers.some(W=>getAccessorValue(W)==="not"))return;const{matcher:B}=Y,F=getAccessorValue(B);["toBeCalled","toHaveBeenCalled"].includes(F)&&q.report({data:{matcherName:F},messageId:"preferCalledWith",node:B,fix:W=>[W.replaceText(B,`${F}With`)]})}}}}),RULE_NAME$D="valid-title",_=q=>["f","x"].includes(q.charAt(0))?q.substring(1):q,T$2=q=>q.type===utils.AST_NODE_TYPES.TemplateLiteral?`\`${q.quasis[0].value.raw}\``:q.raw,A$2={type:"array",items:{type:"string"},minItems:1,maxItems:2,additionalItems:!1},p$1=q=>{const[$,Y]=Array.isArray(q)?q:[q];return[new RegExp($,"u"),Y]};function j(q){return!!(q.flags&n__default.TypeFlags.StringLike)}const b=q=>{if(typeof q=="string"||Array.isArray(q)){const $=p$1(q);return{describe:$,test:$,it:$}}return{describe:q.describe?p$1(q.describe):null,test:q.test?p$1(q.test):null,it:q.it?p$1(q.it):null}},E$2=q=>isStringNode(q.right)?!0:q.left.type===utils.AST_NODE_TYPES.BinaryExpression?E$2(q.left):isStringNode(q.left),or=createEslintRule({name:RULE_NAME$D,meta:{docs:{description:"enforce valid titles",recommended:!1},messages:{titleMustBeString:"Test title must be a string, a function or class name",emptyTitle:"{{ functionName }} should not have an empty title",duplicatePrefix:"should not have duplicate prefix",accidentalSpace:"should not have leading or trailing spaces",disallowedWord:'"{{ word }}" is not allowed in test title',mustNotMatch:"{{ functionName }} should not match {{ pattern }}",mustMatch:"{{ functionName }} should match {{ pattern }}",mustNotMatchCustom:"{{ message }}",mustMatchCustom:"{{ message }}"},type:"suggestion",schema:[{type:"object",properties:{ignoreTypeOfDescribeName:{type:"boolean",default:!1},allowArguments:{type:"boolean",default:!1},disallowedWords:{type:"array",items:{type:"string"}}},patternProperties:{[/^must(?:Not)?Match$/u.source]:{oneOf:[{type:"string"},A$2,{type:"object",propertyNames:{type:"string",enum:["describe","test","it"]},additionalProperties:{oneOf:[{type:"string"},A$2]}}]}},additionalProperties:!1}],fixable:"code"},defaultOptions:[{ignoreTypeOfDescribeName:!1,allowArguments:!1,disallowedWords:[]}],create(q,[{ignoreTypeOfDescribeName:$,allowArguments:Y,disallowedWords:B=[],mustNotMatch:F,mustMatch:W}]){const V=new RegExp(`\\b(${B.join("|")})\\b`,"iu"),H=b(F??{}),G=b(W??{}),z=parsePluginSettings(q.settings);return{CallExpression(J){const X=parseVitestFnCall(J,q);if(X?.type!=="describe"&&X?.type!=="test"&&X?.type!=="it"||X.members&&X.members[0]&&X.members[0].type===utils.AST_NODE_TYPES.Identifier&&X.members[0].name==="extend")return;const te=ae=>{q.report({messageId:"emptyTitle",data:{functionName:X.type==="describe"?DescribeAlias.describe:TestCaseName.test},node:ae})},[Q]=J.arguments;if(z.typecheck){const ae=utils.ESLintUtils.getParserServices(q).getTypeAtLocation(Q);if(isClassOrFunctionType(ae))return;if(j(ae)){isStringNode(Q)&&!getStringValue(Q)&&te(J);return}}if(!Q||Y&&Q.type===utils.AST_NODE_TYPES.Identifier)return;if(!isStringNode(Q)){if(Q.type===utils.AST_NODE_TYPES.BinaryExpression&&E$2(Q))return;Q.type!==utils.AST_NODE_TYPES.TemplateLiteral&&!($&&X.type==="describe")&&q.report({messageId:"titleMustBeString",loc:Q.loc});return}const se=getStringValue(Q);if(!se){te(J);return}if(B.length>0){const ae=V.exec(se);if(ae){q.report({messageId:"disallowedWord",data:{word:ae[1]},node:Q});return}}se.trim().length!==se.length&&q.report({messageId:"accidentalSpace",node:Q,fix:ae=>[ae.replaceTextRange(Q.range,T$2(Q).replace(/^([`'"]) +?/u,"$1").replace(/ +?([`'"])$/u,"$1"))]});const Z=_(X.name),[ee]=se.split(" ");ee.toLowerCase()===Z&&q.report({messageId:"duplicatePrefix",node:Q,fix:ae=>[ae.replaceTextRange(Q.range,T$2(Q).replace(/^([`'"]).+? /u,"$1"))]});const oe=Z,[re,ne]=H[oe]??[];if(re&&re.test(se)){q.report({messageId:ne?"mustNotMatchCustom":"mustNotMatch",node:Q,data:{functionName:oe,pattern:re,message:ne}});return}const[ie,ce]=G[oe]??[];ie&&(ie.test(se)||q.report({messageId:ce?"mustMatchCustom":"mustMatch",node:Q,data:{functionName:oe,pattern:ie,message:ce}}))}}}}),RULE_NAME$C="valid-expect",h$1=["toReject","toResolve"],D=q=>(q.type===utils.AST_NODE_TYPES.ArrayExpression&&q.parent&&q.parent.type===utils.AST_NODE_TYPES.CallExpression&&(q=q.parent),q.type===utils.AST_NODE_TYPES.CallExpression&&q.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.callee.object,"Promise")&&q.parent?q:null),A$1=({start:q,end:$})=>`${q.line}:${q.column}-${$.line}:${$.column}`,O$1=q=>q.parent.type===utils.AST_NODE_TYPES.Property&&q.type===utils.AST_NODE_TYPES.FunctionExpression?q.parent:q;function M$2(q){const $=q.parent?.parent;return $&&$.type===utils.AST_NODE_TYPES.CallExpression&&$.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor($.callee.property)&&["then","catch"].includes(getAccessorValue($.callee.property))&&$.parent?M$2($):q}const U=q=>q.parent?.parent&&[utils.AST_NODE_TYPES.CallExpression,utils.AST_NODE_TYPES.ArrayExpression].includes(q.parent.type)?D(q.parent):null,N$2=({parent:q})=>q?isFunction(q)?q:N$2(q):null,w$1=(q,$)=>$&&q.type===utils.AST_NODE_TYPES.ReturnStatement?!0:q.type===utils.AST_NODE_TYPES.ConditionalExpression&&q.parent?w$1(q.parent,$):[utils.AST_NODE_TYPES.ArrowFunctionExpression,utils.AST_NODE_TYPES.AwaitExpression].includes(q.type),ar=createEslintRule({name:RULE_NAME$C,meta:{docs:{description:"enforce valid `expect()` usage",recommended:!1},messages:{tooManyArgs:"Expect takes at most {{ amount}} argument{{ s }}",notEnoughArgs:"Expect requires at least {{ amount }} argument{{ s }}",modifierUnknown:"Expect has an unknown modifier",matcherNotFound:"Expect must have a corresponding matcher call",matcherNotCalled:"Matchers must be called to assert",asyncMustBeAwaited:"Async assertions must be awaited{{ orReturned }}",promisesWithAsyncAssertionsMustBeAwaited:"Promises which return async assertions must be awaited{{ orReturned }}"},type:"suggestion",fixable:"code",schema:[{type:"object",properties:{alwaysAwait:{type:"boolean",default:!1},asyncMatchers:{type:"array",items:{type:"string"}},minArgs:{type:"number",minimum:1},maxArgs:{type:"number",minimum:1}},additionalProperties:!1}]},defaultOptions:[{alwaysAwait:!1,asyncMatchers:h$1,minArgs:1,maxArgs:1}],create:(q,[{alwaysAwait:$,asyncMatchers:Y=h$1,minArgs:B=1,maxArgs:F=1}])=>{const W=new Set,V=[],H=J=>W.add(A$1(J)),G=J=>W.has(A$1(J)),z=J=>{let X=J,{parent:te}=J;for(;te&&te.type===utils.AST_NODE_TYPES.MemberExpression;)X=te,te=te.parent;return X};return{CallExpression(J){const X=parseVitestFnCallWithReason(J,q),te=parsePluginSettings(q.settings);if(typeof X=="string"){const ie=J.parent?.type===utils.AST_NODE_TYPES.MemberExpression?z(J.parent).property:J;if(X==="matcher-not-found"){q.report({messageId:"matcherNotFound",node:ie});return}if(X==="matcher-not-called"&&q.report({messageId:isSupportedAccessor(ie)&&ModifierName.hasOwnProperty(getAccessorValue(ie))?"matcherNotFound":"matcherNotCalled",node:ie}),X==="modifier-unknown"){q.report({messageId:"modifierUnknown",node:ie});return}return}else if(X?.type==="expectTypeOf"&&te.typecheck||X?.type!=="expect"||X.modifiers.some(ie=>ie.type===utils.AST_NODE_TYPES.Identifier&&ie.name=="to"))return;const{parent:Q}=X.head.node;if(Q?.type!==utils.AST_NODE_TYPES.CallExpression)return;if(Q.arguments.length<B){const ie=getAccessorValue(X.head.node).length,ce={start:{column:Q.loc.start.column+ie,line:Q.loc.start.line},end:{column:Q.loc.start.column+ie+1,line:Q.loc.start.line}};q.report({messageId:"notEnoughArgs",data:{amount:B,s:B===1?"":"s"},node:Q,loc:ce})}if(Q.arguments.length>F){if(Q.arguments.length===2){const le=Q.arguments[1].type===utils.AST_NODE_TYPES.Literal&&typeof Q.arguments[1].value=="string",pe=Q.arguments[1].type===utils.AST_NODE_TYPES.TemplateLiteral;if(le||pe)return}const{start:ie}=Q.arguments[F].loc,{end:ce}=Q.arguments[Q.arguments.length-1].loc,ae={start:ie,end:{column:ce.column+1,line:ce.line}};q.report({messageId:"tooManyArgs",data:{amount:F,s:F===1?"":"s"},node:Q,loc:ae})}const{matcher:se}=X,Z=se.parent.parent,ee=X.modifiers.some(ie=>getAccessorValue(ie)!=="not")||Y.includes(getAccessorValue(se));if(!Z?.parent||!ee)return;const oe=Z.parent.type===utils.AST_NODE_TYPES.ArrayExpression,re=M$2(Z),ne=U(re)||re;ne.parent&&!w$1(ne.parent,!$)&&!G(ne.loc)&&(V.push({messageId:ne===re?"asyncMustBeAwaited":"promisesWithAsyncAssertionsMustBeAwaited",node:ne}),oe&&H(ne.loc))},"Program:exit"(){const J=[];V.forEach(({node:X,messageId:te},Q)=>{const se=$?"":" or returned";q.report({loc:X.loc,data:{orReturned:se},messageId:te,node:X,fix(Z){const ee=N$2(X);if(!ee)return null;const oe=J.some(ne=>ne.text==="async ");if(!ee.async&&!oe){const ne=O$1(ee);J.push(Z.insertTextBefore(ne,"async "))}const re=X.parent?.type===utils.AST_NODE_TYPES.ReturnStatement?X.parent:null;if($&&re){const ne=q.sourceCode.getText(re).replace("return","await");J.push(Z.replaceText(re,ne))}else J.push(Z.insertTextBefore(X,"await "));return Q===V.length-1?J:null}})})}}}}),isBooleanLiteral=q=>q.type===utils.AST_NODE_TYPES.Literal&&typeof q.value=="boolean",isBooleanEqualityMatcher=q=>{const $=getAccessorValue(q.matcher);if(["toBeTruthy","toBeFalsy"].includes($))return!0;if(q.args.length!==1)return!1;const Y=getFirstMatcherArg(q);return EqualityMatcher.hasOwnProperty($)&&isBooleanLiteral(Y)},isInstanceOfBinaryExpression=(q,$)=>q.type===utils.AST_NODE_TYPES.BinaryExpression&&q.operator==="instanceof"&&isSupportedAccessor(q.right,$),hasOnlyOneArgument=q=>q.arguments.length===1,RULE_NAME$B="prefer-to-be-object",tr=createEslintRule({name:RULE_NAME$B,meta:{type:"suggestion",docs:{description:"enforce using toBeObject()",recommended:!1},fixable:"code",messages:{preferToBeObject:"Prefer toBeObject() to test if a value is an object"},schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expectTypeOf")return;if(isParsedInstanceOfMatcherCall(Y,"Object")){q.report({node:Y.matcher,messageId:"preferToBeObject",fix:W=>[W.replaceTextRange([Y.matcher.range[0],Y.matcher.range[1]+8],"toBeObject()")]});return}const{parent:B}=Y.head.node;if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[F]=B.arguments;!F||!isBooleanEqualityMatcher(Y)||!isInstanceOfBinaryExpression(F,"Object")||q.report({node:Y.matcher,messageId:"preferToBeObject",fix(W){const V=[W.replaceText(Y.matcher,"toBeObject"),W.removeRange([F.left.range[1],F.range[1]])];let H=getAccessorValue(Y.matcher)==="toBeFalsy";if(Y.args.length){const[G]=Y.args;V.push(W.remove(G)),H=G.type===utils.AST_NODE_TYPES.Literal&&followTypeAssertionChain$1(G).value===!1}if(H){const G=Y.modifiers.find(z=>getAccessorValue(z)==="not");V.push(G?W.removeRange([G.range[0]-1,G.range[1]]):W.insertTextBefore(Y.matcher,"not."))}return V}})}}}}),RULE_NAME$A="prefer-to-be-truthy",n=q=>q.type===utils.AST_NODE_TYPES.Literal&&q.value===!0,nr=createEslintRule({name:RULE_NAME$A,meta:{type:"suggestion",docs:{description:"enforce using `toBeTruthy`",recommended:!1},messages:{preferToBeTruthy:"Prefer using `toBeTruthy` to test value is `true`"},fixable:"code",schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);(Y?.type==="expect"||Y?.type==="expectTypeOf")&&Y.args.length===1&&n(getFirstMatcherArg(Y))&&EqualityMatcher.hasOwnProperty(getAccessorValue(Y.matcher))&&q.report({node:Y.matcher,messageId:"preferToBeTruthy",fix:B=>[B.replaceText(Y.matcher,"toBeTruthy"),B.remove(Y.args[0])]})}}}}),RULE_NAME$z="prefer-to-be-falsy",c$2=q=>q.type===utils.AST_NODE_TYPES.Literal&&q.value===!1,sr=createEslintRule({name:RULE_NAME$z,meta:{type:"suggestion",docs:{description:"enforce using toBeFalsy()",recommended:!1},fixable:"code",schema:[],messages:{preferToBeFalsy:"Prefer using toBeFalsy()"}},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);(Y?.type==="expect"||Y?.type==="expectTypeOf")&&Y.args.length===1&&c$2(getFirstMatcherArg(Y))&&EqualityMatcher.hasOwnProperty(getAccessorValue(Y.matcher))&&q.report({node:Y.matcher,messageId:"preferToBeFalsy",fix:B=>[B.replaceText(Y.matcher,"toBeFalsy"),B.remove(Y.args[0])]})}}}}),RULE_NAME$y="prefer-to-have-length",ir=createEslintRule({name:RULE_NAME$y,meta:{type:"suggestion",docs:{description:"enforce using toHaveLength()",recommended:!1},fixable:"code",messages:{preferToHaveLength:"Prefer toHaveLength()"},schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect")return;const{parent:B}=Y.head.node;if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[F]=B.arguments,{matcher:W}=Y;!EqualityMatcher.hasOwnProperty(getAccessorValue(W))||F?.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor(F.property,"length")||q.report({node:W,messageId:"preferToHaveLength",fix(V){return[V.removeRange([F.property.range[0]-1,F.range[1]]),V.replaceTextRange([W.parent.object.range[1],W.parent.range[1]],".toHaveLength")]}})}}}}),RULE_NAME$x="prefer-equality-matcher",mr=createEslintRule({name:RULE_NAME$x,meta:{type:"suggestion",docs:{description:"enforce using the built-in quality matchers",recommended:!1},messages:{useEqualityMatcher:"Prefer using one of the equality matchers instead",suggestEqualityMatcher:"Use `{{ equalityMatcher }}`"},hasSuggestions:!0,schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect"||Y.args.length===0)return;const{parent:B}=Y.head.node;if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[F],range:[,W]}=B,{matcher:V}=Y,H=getFirstMatcherArg(Y);if(F?.type!==utils.AST_NODE_TYPES.BinaryExpression||F.operator!=="==="&&F.operator!=="!=="||!EqualityMatcher.hasOwnProperty(getAccessorValue(V))||!isBooleanLiteral(H))return;const G=H.value,[z]=Y.modifiers,J=Y.modifiers.some(Q=>getAccessorValue(Q)==="not"),X=(F.operator==="!=="?!G:G)===J,te=Q=>se=>{const{sourceCode:Z}=q;let ee=z&&getAccessorValue(z)!=="not"?`.${getAccessorValue(z)}`:"";return X&&(ee+=`.${ModifierName.not}`),[se.replaceText(F,Z.getText(F.left)),se.replaceTextRange([W,V.parent.range[1]],`${ee}.${Q}`),se.replaceText(H,Z.getText(F.right))]};q.report({messageId:"useEqualityMatcher",suggest:["toBe","toEqual","toStrictEqual"].map(Q=>({messageId:"suggestEqualityMatcher",data:{equalityMatcher:Q},fix:te(Q)})),node:V})}}}}),RULE_NAME$w="prefer-strict-equal",pr=createEslintRule({name:RULE_NAME$w,meta:{type:"suggestion",docs:{description:"enforce strict equal over equal",recommended:!1},messages:{useToStrictEqual:"Use `toStrictEqual()` instead",suggestReplaceWithStrictEqual:"Replace with `toStrictEqual()`"},schema:[],hasSuggestions:!0},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect")return;const{matcher:B}=Y;isSupportedAccessor(B,"toEqual")&&q.report({messageId:"useToStrictEqual",node:B,suggest:[{messageId:"suggestReplaceWithStrictEqual",fix:F=>[replaceAccessorFixer(F,B,EqualityMatcher.toStrictEqual)]}]})}}}}),RULE_NAME$v="prefer-expect-resolves",Er=createEslintRule({name:RULE_NAME$v,meta:{type:"suggestion",docs:{description:"enforce using `expect().resolves` over `expect(await ...)` syntax",recommended:!1},fixable:"code",messages:{expectResolves:"Use `expect().resolves` instead"},schema:[]},defaultOptions:[],create:q=>({CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect")return;const{parent:B}=Y.head.node;if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[F]=B.arguments;F?.type===utils.AST_NODE_TYPES.AwaitExpression&&q.report({node:F,messageId:"expectResolves",fix(W){return[W.insertTextBefore(B,"await "),W.removeRange([F.range[0],F.argument.range[0]]),W.insertTextAfter(B,".resolves")]}})}})}),RULE_NAME$u="prefer-each",lr=createEslintRule({name:RULE_NAME$u,meta:{type:"suggestion",docs:{description:"enforce using `each` rather than manual loops",recommended:!1},schema:[],messages:{preferEach:"Prefer using `{{ fn }}.each` rather than a manual loop"}},defaultOptions:[],create(q){const $=[];let Y=!1;const B=()=>$.length===1&&$[0]==="test"?"it":"describe",F=()=>{$.length===0||Y||($.length=0)},W=V=>{$.length===0||Y||(q.report({node:V,messageId:"preferEach",data:{fn:B()}}),$.length=0)};return{ForStatement:F,"ForStatement:exit":W,ForInStatement:F,"ForInStatement:exit":W,ForOfStatement:F,"ForOfStatement:exit":W,CallExpression(V){const{type:H}=parseVitestFnCall(V,q)??{};(H==="hook"||H==="describe"||H==="test")&&$.push(H),H==="test"&&(Y=!0)},"CallExpression:exit"(V){const{type:H}=parseVitestFnCall(V,q)??{};H==="test"&&(Y=!1)}}}}),RULE_NAME$t="prefer-hooks-on-top",fr=createEslintRule({name:RULE_NAME$t,meta:{type:"suggestion",docs:{description:"enforce having hooks before any test cases",recommended:!1},messages:{noHookOnTop:"Hooks should come before test cases"},schema:[]},defaultOptions:[],create(q){const $=[!1];return{CallExpression(Y){isTypeOfVitestFnCall(Y,q,["test"])&&($[$.length-1]=!0),$[$.length-1]&&isTypeOfVitestFnCall(Y,q,["hook"])&&q.report({messageId:"noHookOnTop",node:Y}),$.push(!1)},"CallExpression:exit"(){$.pop()}}}}),RULE_NAME$s="prefer-hooks-in-order",a$4=["beforeAll","beforeEach","afterEach","afterAll"],Nr=createEslintRule({name:RULE_NAME$s,meta:{type:"suggestion",docs:{description:"enforce having hooks in consistent order",recommended:!1},messages:{reorderHooks:"`{{ currentHook }}` hooks should be before any `{{ previousHook }}` hooks"},schema:[]},defaultOptions:[],create(q){let $=-1,Y=!1;return{CallExpression(B){if(Y)return;const F=parseVitestFnCall(B,q);if(F?.type!=="hook"){$=-1;return}Y=!0;const W=F.name,V=a$4.indexOf(W);if(V<$){q.report({messageId:"reorderHooks",data:{previousHook:a$4[$],currentHook:W},node:B}),Y=!1;return}$=V},"CallExpression:exit"(B){if(isTypeOfVitestFnCall(B,q,["hook"])){Y=!1;return}Y||($=-1)}}}}),RULE_NAME$r="prefer-mock-promise-shorthand",l$2=(q,$)=>`${q}${$?"Once":""}`,f=q=>q.body.type!==utils.AST_NODE_TYPES.BlockStatement?q.body:q.body.body[0]?.type===utils.AST_NODE_TYPES.ReturnStatement?q.body.body[0].argument:null,cr=createEslintRule({name:RULE_NAME$r,meta:{type:"suggestion",docs:{description:"enforce mock resolved/rejected shorthands for promises",recommended:!1},messages:{useMockShorthand:"Prefer {{ replacement }}"},schema:[],fixable:"code"},defaultOptions:[],create(q){const $=(Y,B,F,W=F)=>{if(W?.type!==utils.AST_NODE_TYPES.CallExpression)return;const V=getNodeName(W);if(V!=="Promise.resolve"&&V!=="Promise.reject")return;const H=l$2(V.endsWith("reject")?"mockRejectedValue":"mockResolvedValue",B);q.report({node:Y,messageId:"useMockShorthand",data:{replacement:H},fix(G){const{sourceCode:z}=q;return W.arguments.length>1?null:[G.replaceText(Y,H),G.replaceText(F,W.arguments.length===1?z.getText(W.arguments[0]):"undefined")]}})};return{CallExpression(Y){if(Y.callee.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor(Y.callee.property)||Y.arguments.length===0)return;const B=getAccessorValue(Y.callee.property),F=B.endsWith("Once");if(B===l$2("mockReturnValue",F))$(Y.callee.property,F,Y.arguments[0]);else if(B===l$2("mockImplementation",F)){const[W]=Y.arguments;if(!isFunction(W)||W.params.length!==0)return;$(Y.callee.property,F,W,f(W))}}}}}),a$3=node_module.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:_documentCurrentScript&&_documentCurrentScript.tagName.toUpperCase()==="SCRIPT"&&_documentCurrentScript.src||new URL("index.cjs",document.baseURI).href),c$1=node_module.createRequire(a$3.resolve("eslint"));c$1.resolve("espree");const p=new Set([utils.AST_NODE_TYPES.Program,utils.AST_NODE_TYPES.BlockStatement,utils.AST_NODE_TYPES.SwitchCase,utils.AST_NODE_TYPES.SwitchStatement]),isValidParent=q=>p.has(q),isTokenASemicolon=q=>q.value===";"&&q.type===utils.AST_TOKEN_TYPES.Punctuator,getActualLastToken=(q,$)=>{const Y=q.getLastToken($),B=q.getTokenBefore(Y),F=q.getTokenAfter(Y);return B&&F&&B.range[0]>=$.range[0]&&isTokenASemicolon(Y)&&Y.loc.start.line!==B.loc.end.line&&Y.loc.end.line===F.loc.start.line?B:Y},getPaddingLineSequences=(q,$,Y)=>{const B=[];let F=getActualLastToken(Y,q);if($.loc.start.line-q.loc.end.line>=2)do{const W=Y.getTokenAfter(F,{includeComments:!0});W.loc.start.line-F.loc.end.line>=2&&B.push([F,W]),F=W}while(F.range[0]<$.range[0]);return B},areTokensOnSameLine=(q,$)=>q.loc.end.line===$.loc.start.line,E$1=q=>q.type===utils.AST_NODE_TYPES.TSAsExpression||q.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain=q=>E$1(q)?followTypeAssertionChain(q.expression):q,RULE_NAME$q="prefer-vi-mocked",m$4=["Mock","MockedFunction","MockedClass","MockedObject"],dr=createEslintRule({name:RULE_NAME$q,meta:{type:"suggestion",docs:{description:"require `vi.mocked()` over `fn as Mock`",requiresTypeChecking:!0,recommended:!1},fixable:"code",messages:{useViMocked:"Prefer `vi.mocked()`"},schema:[]},defaultOptions:[],create(q){function $(Y){const{typeAnnotation:B}=Y;if(B.type!==utils.AST_NODE_TYPES.TSTypeReference)return;const{typeName:F}=B;if(F.type!==utils.AST_NODE_TYPES.Identifier||!m$4.includes(F.name))return;const W=q.sourceCode.text.slice(...followTypeAssertionChain(Y.expression).range);q.report({node:Y,messageId:"useViMocked",fix(V){return V.replaceText(Y,`vi.mocked(${W})`)}})}return{TSAsExpression(Y){Y.parent.type!==utils.AST_NODE_TYPES.TSAsExpression&&$(Y)},TSTypeAssertion(Y){$(Y)}}}}),RULE_NAME$p="prefer-snapshot-hint",E=["toMatchSnapshot","toThrowErrorMatchingSnapshot"],x$2=E,S$3=q=>{if(q.args.length===0)return!0;if(!isSupportedAccessor(q.matcher,"toMatchSnapshot"))return q.args.length!==1;if(q.args.length===2)return!1;const[$]=q.args;return!isStringNode($)},Ar=createEslintRule({name:RULE_NAME$p,meta:{type:"suggestion",docs:{description:"enforce including a hint with external snapshots",recommended:!1},messages:{missingHint:"You should provide a hint for this snapshot"},schema:[{type:"string",enum:["always","multi"]}]},defaultOptions:["multi"],create(q,[$]){const Y=[];let B=0;const F=[],W=()=>{for(const G of Y)S$3(G)&&q.report({messageId:"missingHint",node:G.matcher})},V=()=>{B++},H=()=>{B--,$==="always"&&(W(),Y.length=0),$==="multi"&&B===0&&(Y.length>1&&W(),Y.length=0)};return{"Program:exit"(){V(),H()},FunctionExpression:V,"FunctionExpression:exit":H,ArrowFunctionExpression:V,"ArrowFunctionExpression:exit":H,"CallExpression:exit"(G){isTypeOfVitestFnCall(G,q,["describe","test"])&&(B=F.pop()??0)},CallExpression(G){const z=parseVitestFnCall(G,q);if(z?.type!=="expect"){(z?.type==="describe"||z?.type==="test")&&(F.push(B),B=0);return}const J=getAccessorValue(z.matcher);x$2.includes(J)&&Y.push(z)}}}}),RULE_NAME$o="valid-describe-callback",o=q=>{const[$]=q,Y=q[q.length-1];return{start:$.loc.start,end:Y.loc.end}},i$1=(q,$)=>q.members.every(Y=>getAccessorValue(Y)!=="each")&&$.params.length,u$2=(q,$)=>{q.body.forEach(Y=>{Y.type===utils.AST_NODE_TYPES.ReturnStatement&&$.report({messageId:"unexpectedReturnInDescribe",node:Y})})},Mr=createEslintRule({name:RULE_NAME$o,meta:{type:"problem",docs:{description:"enforce valid describe callback",recommended:!1},messages:{nameAndCallback:"Describe requires a name and callback arguments",secondArgumentMustBeFunction:"Second argument must be a function",unexpectedDescribeArgument:"Unexpected argument in describe callback",unexpectedReturnInDescribe:"Unexpected return statement in describe callback"},schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="describe"||Y?.members[0]?.type===utils.AST_NODE_TYPES.Identifier&&Y.members[0].name==="todo")return;if($.arguments.length<1)return q.report({messageId:"nameAndCallback",loc:$.loc});const[,B,F]=$.arguments;if(!B){q.report({messageId:"nameAndCallback",loc:o($.arguments)});return}if(!isFunction(B)){if(F&&isFunction(F)){i$1(Y,F)&&q.report({messageId:"unexpectedDescribeArgument",node:F}),F.body.type===utils.AST_NODE_TYPES.CallExpression&&q.report({messageId:"unexpectedReturnInDescribe",node:F}),F.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2(F.body,q);return}q.report({messageId:"secondArgumentMustBeFunction",loc:o($.arguments)});return}i$1(Y,B)&&q.report({messageId:"unexpectedDescribeArgument",node:B}),B.body.type===utils.AST_NODE_TYPES.CallExpression&&q.report({messageId:"unexpectedReturnInDescribe",node:B}),B.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2(B.body,q)}}}}),RULE_NAME$n="require-top-level-describe",wr=createEslintRule({name:RULE_NAME$n,meta:{docs:{description:"enforce that all tests are in a top-level describe",recommended:!1},messages:{tooManyDescribes:"There should not be more than {{ max }} describe{{ s }} at the top level",unexpectedTestCase:"All test cases must be wrapped in a describe block",unexpectedHook:"All hooks must be wrapped in a describe block"},type:"suggestion",schema:[{type:"object",properties:{maxNumberOfTopLevelDescribes:{type:"number",minimum:1}},additionalProperties:!1}]},defaultOptions:[{}],create(q){const{maxNumberOfTopLevelDescribes:$=1/0}=q.options[0]??{};let Y=0,B=0;return{CallExpression(F){const W=parseVitestFnCall(F,q);if(W){if(W.type==="describe"){B++,B===1&&(Y++,Y>$&&q.report({node:F,messageId:"tooManyDescribes",data:{max:$,s:$===1?"":"s"}}));return}if(B===0){if(W.type==="test"){q.report({node:F,messageId:"unexpectedTestCase"});return}W.type==="hook"&&q.report({node:F,messageId:"unexpectedHook"})}}},"CallExpression:exit"(F){isTypeOfVitestFnCall(F,q,["describe"])&&B--}}}}),RULE_NAME$m="require-to-throw-message",Rr=createEslintRule({name:RULE_NAME$m,meta:{type:"suggestion",docs:{description:"require toThrow() to be called with an error message",recommended:!1},schema:[],messages:{addErrorMessage:"Add an error message to {{ matcherName }}()"}},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect")return;const{matcher:B}=Y,F=getAccessorValue(B);Y.args.length===0&&["toThrow","toThrowError"].includes(F)&&!Y.modifiers.some(W=>getAccessorValue(W)==="not")&&q.report({messageId:"addErrorMessage",data:{matcherName:F},node:B})}}}}),RULE_NAME$l="require-hook",S$2=(q,$)=>parseVitestFnCall(q,$)?!0:!!getNodeName(q)?.startsWith("vi"),m$3=q=>q.type===utils.AST_NODE_TYPES.Literal&&q.value===null||isIdentifier(q,"undefined"),a$2=(q,$,Y=[])=>{switch(q.type){case utils.AST_NODE_TYPES.ExpressionStatement:return a$2(q.expression,$,Y);case utils.AST_NODE_TYPES.CallExpression:return!(S$2(q,$)||Y.includes(getNodeName(q)));case utils.AST_NODE_TYPES.VariableDeclaration:return q.kind==="const"?!1:q.declarations.some(({init:B})=>B!==null&&!m$3(B));default:return!1}},ur=createEslintRule({name:RULE_NAME$l,meta:{docs:{description:"require setup and teardown to be within a hook",recommended:!1},messages:{useHook:"This should be done within a hook"},type:"suggestion",schema:[{type:"object",properties:{allowedFunctionCalls:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},defaultOptions:[{allowedFunctionCalls:[]}],create(q){const{allowedFunctionCalls:$}=q.options[0]??{},Y=B=>{for(const F of B)a$2(F,q,$)&&q.report({node:F,messageId:"useHook"})};return{Program(B){Y(B.body)},CallExpression(B){if(!isTypeOfVitestFnCall(B,q,["describe"])||B.arguments.length<2)return;const[,F]=B.arguments;!isFunction(F)||F.body.type!==utils.AST_NODE_TYPES.BlockStatement||Y(F.body.body)}}}}),RULE_NAME$k="require-local-test-context-for-concurrent-snapshots",Lr=createEslintRule({name:RULE_NAME$k,meta:{docs:{description:"require local Test Context for concurrent snapshot tests",recommended:!1},messages:{requireLocalTestContext:"Use local Test Context instead"},type:"problem",schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);Y===null||Y.type!=="expect"||Y.type==="expect"&&Y.head.type==="testContext"||!["toMatchSnapshot","toMatchInlineSnapshot","toMatchFileSnapshot","toThrowErrorMatchingSnapshot","toThrowErrorMatchingInlineSnapshot"].includes($.callee?.property.name)||!q.sourceCode.getAncestors($).some(B=>B.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(B,q,["describe","test"])?!1:B.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(B.callee.property,"concurrent"))||q.report({node:$,messageId:"requireLocalTestContext"})}}}}),RULE_NAME$j="prefer-todo",S$1=q=>q.members.some($=>getAccessorValue($)!=="skip")||q.name.startsWith("x")?!1:!q.name.startsWith("f");function T$1(q){return isFunction(q)?q.body.type===utils.AST_NODE_TYPES.BlockStatement&&!q.body.body.length:!1}function a$1(q,$){return q.members.length?replaceAccessorFixer($,q.members[0],"todo"):$.replaceText(q.head.node,`${q.head.local}.todo`)}const Ur=createEslintRule({name:RULE_NAME$j,meta:{type:"layout",docs:{description:"enforce using `test.todo`",recommended:!1},messages:{emptyTest:"Prefer todo test case over empty test case",unimplementedTest:"Prefer todo test case over unimplemented test case"},fixable:"code",schema:[]},defaultOptions:[],create(q){return{CallExpression($){const[Y,B]=$.arguments,F=parseVitestFnCall($,q);!Y||F?.type!=="test"||!S$1(F)||!isStringNode(Y)||(B&&T$1(B)&&q.report({messageId:"emptyTest",node:$,fix:W=>[W.removeRange([Y.range[1],B.range[1]]),a$1(F,W)]}),hasOnlyOneArgument($)&&q.report({messageId:"unimplementedTest",node:$,fix:W=>a$1(F,W)}))}}}}),RULE_NAME$i="prefer-spy-on",u$1=q=>"object"in q?q.object:q.callee.type===utils.AST_NODE_TYPES.MemberExpression?q.callee.object:null,a=q=>{if(q.type!==utils.AST_NODE_TYPES.CallExpression&&q.type!==utils.AST_NODE_TYPES.MemberExpression)return null;const $=u$1(q);return $?$.type===utils.AST_NODE_TYPES.Identifier?q.type===utils.AST_NODE_TYPES.CallExpression&&getNodeName(q.callee)==="vi.fn"?q:null:a($):null},S=(q,$)=>{if(q.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&q.parent.property.type===utils.AST_NODE_TYPES.Identifier&&q.parent.property.name==="mockImplementation")return"";const[Y]=q.arguments,B=Y&&$.sourceCode.getText(Y);return B?`.mockImplementation(${B})`:".mockImplementation()"},_r=createEslintRule({name:RULE_NAME$i,meta:{type:"suggestion",docs:{description:"enforce using `vi.spyOn`",recommended:!1},messages:{useViSpayOn:"Use `vi.spyOn` instead"},fixable:"code",schema:[]},defaultOptions:[],create(q){return{AssignmentExpression($){const{left:Y,right:B}=$;if(Y.type!==utils.AST_NODE_TYPES.MemberExpression)return;const F=a(B);F&&q.report({node:$,messageId:"useViSpayOn",fix(W){const V=Y.property.type===utils.AST_NODE_TYPES.Identifier&&!Y.computed?"'":"",H=S(F,q);return[W.insertTextBefore(Y,"vi.spyOn("),W.replaceTextRange([Y.object.range[1],Y.property.range[0]],`, ${V}`),W.replaceTextRange([Y.property.range[1],F.range[1]],`${V})${H}`)]}})}}}}),RULE_NAME$h="prefer-comparison-matcher",g=q=>isStringNode(q)||q?.type===utils.AST_NODE_TYPES.TemplateLiteral,C=q=>g(q.left)||g(q.right),M$1=q=>{switch(q){case">":return"<=";case"<":return">=";case">=":return"<";case"<=":return">"}return null},O=(q,$)=>{switch($?M$1(q):q){case">":return"toBeGreaterThan";case"<":return"toBeLessThan";case">=":return"toBeGreaterThanOrEqual";case"<=":return"toBeLessThanOrEqual"}return null},Tr=createEslintRule({name:RULE_NAME$h,meta:{type:"suggestion",docs:{description:"enforce using the built-in comparison matchers",recommended:!1},schema:[],fixable:"code",messages:{useToBeComparison:"Prefer using `{{ preferredMatcher }}` instead"}},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect"||Y.args.length===0)return;const{parent:B}=Y.head.node;if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[F],range:[,W]}=B,{matcher:V}=Y,H=getFirstMatcherArg(Y);if(F?.type!==utils.AST_NODE_TYPES.BinaryExpression||C(F)||!EqualityMatcher.hasOwnProperty(getAccessorValue(V))||!isBooleanLiteral(H))return;const[G]=Y.modifiers,z=Y.modifiers.some(X=>getAccessorValue(X)==="not"),J=O(F.operator,H.value===z);J&&q.report({fix(X){const{sourceCode:te}=q,Q=G&&getAccessorValue(G)!=="not"?`.${getAccessorValue(G)}`:"";return[X.replaceText(F,te.getText(F.left)),X.replaceTextRange([W,V.parent.range[1]],`${Q}.${J}`),X.replaceText(H,te.getText(F.right))]},messageId:"useToBeComparison",data:{preferredMatcher:J},node:V})}}}}),RULE_NAME$g="prefer-describe-function-title",br=createEslintRule({name:RULE_NAME$g,meta:{type:"problem",docs:{description:"enforce using a function as a describe title over an equivalent string",recommended:!1},fixable:"code",schema:[],messages:{preferFunction:"Enforce using a function over an equivalent string"}},defaultOptions:[],create(q){return{CallExpression($){if($.arguments.length<2)return;const[Y]=$.arguments;if(Y.type!==utils.AST_NODE_TYPES.Literal||typeof Y.value!="string")return;const B=Y.value;if(parseVitestFnCall($,q)?.type!=="describe")return;const F=getModuleScope(q,$)?.set.get(B)?.defs[0];if(F?.type==="ImportBinding"){if(parsePluginSettings(q.settings).typecheck){const W=utils.ESLintUtils.getParserServices(q).getTypeAtLocation(F.node);if(!isClassOrFunctionType(W))return}q.report({node:Y,messageId:"preferFunction",fix(W){return W.replaceText(Y,B)}})}}}}}),RULE_NAME$f="prefer-to-contain",T=q=>q.type===utils.AST_NODE_TYPES.CallExpression&&q.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.callee.property,"includes")&&hasOnlyOneArgument(q)&&q.arguments[0].type!==utils.AST_NODE_TYPES.SpreadElement,gr=createEslintRule({name:RULE_NAME$f,meta:{docs:{description:"enforce using toContain()",recommended:!1},messages:{useToContain:"Use toContain() instead"},fixable:"code",type:"suggestion",schema:[]},defaultOptions:[],create(q){return{CallExpression($){const Y=parseVitestFnCall($,q);if(Y?.type!=="expect"||Y.args.length===0)return;const{parent:B}=Y.head.node;if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[F],range:[,W]}=B,{matcher:V}=Y,H=getFirstMatcherArg(Y);if(!F||H.type===utils.AST_NODE_TYPES.SpreadElement||!EqualityMatcher.hasOwnProperty(getAccessorValue(V))||!isBooleanLiteral(H)||!T(F))return;const G=Y.modifiers.some(z=>getAccessorValue(z)==="not");q.report({fix(z){const{sourceCode:J}=q,X=H.value===G;return[z.removeRange([F.callee.property.range[0]-1,F.range[1]]),z.replaceTextRange([W,V.parent.range[1]],X?`.${ModifierName.not}.toContain`:".toContain"),z.replaceText(Y.args[0],J.getText(F.arguments[0]))]},messageId:"useToContain",node:V})}}}}),RULE_NAME$e="prefer-expect-assertions",L=q=>{let $=q;for(;$;){if($.parent?.type===utils.AST_NODE_TYPES.BlockStatement)return $.parent.body[0]===$;if($.parent?.type===utils.AST_NODE_TYPES.ArrowFunctionExpression)return!0;$=$.parent}throw new Error("Could not find parent block statement")},y$2=(q,$,Y)=>({messageId:"suggestRemovingExtraArguments",fix:B=>removeExtraArgumentsFixer(B,q,$,Y)}),hr=createEslintRule({name:"prefer-expect-assertions",meta:{docs:{description:"enforce using expect assertions instead of callbacks",recommended:!1},messages:{hasAssertionsTakesNoArguments:"`expect.hasAssertions` expects no arguments",assertionsRequiresOneArgument:"`expect.assertions` excepts a single argument of type number",assertionsRequiresNumberArgument:"This argument should be a number",haveExpectAssertions:"Every test should have either `expect.assertions(<number of assertions>)` or `expect.hasAssertions()` as its first expression",suggestAddingHasAssertions:"Add `expect.hasAssertions()`",suggestAddingAssertions:"Add `expect.assertions(<number of assertions>)`",suggestRemovingExtraArguments:"Remove extra arguments"},type:"suggestion",hasSuggestions:!0,schema:[{type:"object",properties:{onlyFunctionsWithAsyncKeyword:{type:"boolean"},onlyFunctionsWithExpectInLoop:{type:"boolean"},onlyFunctionsWithExpectInCallback:{type:"boolean"}},additionalProperties:!1}]},defaultOptions:[{onlyFunctionsWithAsyncKeyword:!1,onlyFunctionsWithExpectInCallback:!1,onlyFunctionsWithExpectInLoop:!1}],create(q,[$]){let Y=0,B=!1,F=!1,W=!1,V=null,H=!1,G=!1;const z=Z=>!!(!$.onlyFunctionsWithAsyncKeyword&&!$.onlyFunctionsWithExpectInCallback&&!$.onlyFunctionsWithExpectInLoop||$.onlyFunctionsWithAsyncKeyword&&Z.async||$.onlyFunctionsWithExpectInCallback&&B||$.onlyFunctionsWithExpectInLoop&&F);function J(Z,ee){if(getAccessorValue(Z.members[0])==="hasAssertions"){Z.args.length&&q.report({messageId:"hasAssertionsTakesNoArguments",node:Z.matcher,suggest:[y$2(q,ee,0)]});return}if(Z.args.length!==1){let{loc:re}=Z.matcher;const ne=[];Z.args.length&&(re=Z.args[1].loc,ne.push(y$2(q,ee,1))),q.report({messageId:"assertionsRequiresOneArgument",suggest:ne,loc:re});return}const[oe]=Z.args;oe.type===utils.AST_NODE_TYPES.Literal&&typeof oe.value=="number"&&Number.isInteger(oe.value)||q.report({messageId:"assertionsRequiresNumberArgument",node:oe})}const X=()=>H&&Y++,te=()=>H&&Y--,Q=()=>G=!0,se=()=>G=!1;return{FunctionExpression:X,"FunctionExpression:exit":te,ArrowFunctionExpression:X,"ArrowFunctionExpression:exit":te,ForStatement:Q,"ForStatement:exit":se,ForInStatement:Q,"ForInStatement:exit":se,ForOfStatement:Q,"ForOfStatement:exit":se,CallExpression(Z){const ee=parseVitestFnCall(Z,q);if(ee?.type==="test"){H=!0;return}ee?.head.type==="testContext"&&ee.members[0]&&ee.members[0].type===utils.AST_NODE_TYPES.Identifier&&ee.members[0].name==="expect"&&(V=`${ee.head.local}`),ee?.type==="expect"&&H&&(Y===1&&L(Z)&&ee.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&ee.members.length===1&&["assertions","hasAssertions"].includes(getAccessorValue(ee.members[0]))&&(J(ee,Z),W=!0),G&&(F=!0),Y>1&&(B=!0))},"CallExpression:exit"(Z){if(!isTypeOfVitestFnCall(Z,q,["test"])||(H=!1,Z.arguments.length<2))return;const[,ee]=Z.arguments;if(!isFunction(ee)||!z(ee))return;if(F=!1,B=!1,W){W=!1;return}const oe=[];if(ee.body.type===utils.AST_NODE_TYPES.BlockStatement){const re=V?`${V}.`:"";oe.push(["suggestAddingHasAssertions",`${re}expect.hasAssertions();`],["suggestAddingAssertions",`${re}expect.assertions();`])}q.report({messageId:"haveExpectAssertions",node:Z,suggest:oe.map(([re,ne])=>({messageId:re,fix:ie=>ie.insertTextBeforeRange([ee.body.range[0]+1,ee.body.range[1]],ne)}))})}}}});var PaddingType=(q=>(q[q.Any=0]="Any",q[q.Always=1]="Always",q))(PaddingType||{}),StatementType=(q=>(q[q.Any=0]="Any",q[q.AfterAllToken=1]="AfterAllToken",q[q.AfterEachToken=2]="AfterEachToken",q[q.BeforeAllToken=3]="BeforeAllToken",q[q.BeforeEachToken=4]="BeforeEachToken",q[q.DescribeToken=5]="DescribeToken",q[q.ExpectToken=6]="ExpectToken",q[q.ExpectTypeOfToken=7]="ExpectTypeOfToken",q[q.FdescribeToken=8]="FdescribeToken",q[q.FitToken=9]="FitToken",q[q.ItToken=10]="ItToken",q[q.TestToken=11]="TestToken",q[q.XdescribeToken=12]="XdescribeToken",q[q.XitToken=13]="XitToken",q[q.XtestToken=14]="XtestToken",q))(StatementType||{});const x$1=(q,$,Y)=>{const{sourceCode:B,ruleContext:F}=Y;getPaddingLineSequences(q,$,B).length>0||F.report({node:$,messageId:"missingPadding",fix(W){let V=getActualLastToken(B,q);const H=B.getFirstTokenBetween(V,$,{includeComments:!0,filter(z){return areTokensOnSameLine(V,z)?(V=z,!1):!0}})||$,G=areTokensOnSameLine(V,H)?`
|
|
4
4
|
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{ESLintUtils as ie,AST_NODE_TYPES as i,AST_TOKEN_TYPES as St}from"@typescript-eslint/utils";import U from"typescript";import{isAbsolute as Fs,posix as Ps}from"node:path";import{createRequire as Mt}from"node:module";const Us="1.3.0",p=ie.RuleCreator(e=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${e}.md`),js=(e,s)=>e&&s?`${e}.${s}`:null,M=e=>e.type===i.FunctionExpression||e.type===i.ArrowFunctionExpression;function R(e){if(v(e))return y(e);switch(e.type){case i.TaggedTemplateExpression:return R(e.tag);case i.MemberExpression:return js(R(e.object),R(e.property));case i.NewExpression:case i.CallExpression:return R(e.callee)}return null}const v=(e,s)=>L(e,s)||B(e,s),L=(e,s)=>e.type===i.Identifier&&(s===void 0||e.name===s),_s=(e,s)=>e.type===i.TemplateLiteral&&e.quasis.length===1&&(s===void 0||e.quasis[0].value.raw===s),Ds=(e,s)=>e.type===i.Literal&&typeof e.value=="string"&&(s===void 0||e.value===s),B=(e,s)=>Ds(e,s)||_s(e,s),y=e=>e.type===i.Identifier?e.name:j(e),j=e=>e?.type===i.TemplateLiteral?e.quasis[0].value.raw:e?.value,G=(e,s,t)=>e.replaceText(s,s.type===i.Identifier?t:`'${t}'`),$t=(e,s,t,n)=>{const r=t.arguments[n],o=t.arguments[t.arguments.length-1],{sourceCode:a}=s;let c=a.getTokenAfter(o);return c.value===","&&(c=a.getTokenAfter(c)),e.removeRange([r.range[0],c.range[0]])},Ws=(e,s)=>y(e.matcher)==="toBeInstanceOf"&&e.args.length===1&&v(e.args[0],s);var _=(e=>(e.vi="vi",e.vitest="vitest",e))(_||{}),V=(e=>(e.describe="describe",e.fdescribe="fdescribe",e.xdescribe="xdescribe",e))(V||{}),q=(e=>(e.fit="fit",e.it="it",e.test="test",e.xit="xit",e.xtest="xtest",e.bench="bench",e))(q||{}),Ot=(e=>(e.beforeAll="beforeAll",e.beforeEach="beforeEach",e.afterAll="afterAll",e.afterEach="afterEach",e))(Ot||{}),N=(e=>(e.to="to",e.have="have",e.not="not",e.rejects="rejects",e.resolves="resolves",e.returns="returns",e.branded="branded",e.asserts="asserts",e.constructorParameters="constructorParameters",e.parameters="parameters",e.thisParameter="thisParameter",e.guards="guards",e.instance="instance",e.items="items",e))(N||{}),F=(e=>(e.toBe="toBe",e.toEqual="toEqual",e.toStrictEqual="toStrictEqual",e))(F||{});function Rt(e){return e.getCallSignatures().length>0?!0:e.getSymbol()?.getDeclarations()?.some(s=>U.isArrowFunction(s)||U.isClassDeclaration(s)||U.isClassExpression(s)||U.isFunctionDeclaration(s)||U.isFunctionExpression(s)||U.isMethodDeclaration(s)||U.isFunctionTypeNode(s))??!1}const Vs=new Set(["beforeEach","beforeAll","afterEach","afterAll","it","it.skip","it.only","it.concurrent","it.sequential","it.todo","it.fails","it.extend","it.skipIf","it.runIf","it.each","it.skip.only","it.skip.concurrent","it.skip.sequential","it.skip.todo","it.skip.fails","it.only.skip","it.only.concurrent","it.only.sequential","it.only.todo","it.only.fails","it.concurrent.skip","it.concurrent.only","it.concurrent.sequential","it.concurrent.todo","it.concurrent.fails","it.sequential.skip","it.sequential.only","it.sequential.concurrent","it.sequential.todo","it.sequential.fails","it.todo.skip","it.todo.only","it.todo.concurrent","it.todo.sequential","it.todo.fails","it.fails.skip","it.fails.only","it.fails.concurrent","it.fails.sequential","it.fails.todo","it.extend.skip","it.extend.only","it.extend.concurrent","it.extend.sequential","it.extend.todo","it.extend.fails","it.skipIf.skip","it.skipIf.only","it.skipIf.concurrent","it.skipIf.sequential","it.skipIf.todo","it.skipIf.fails","it.runIf.skip","it.runIf.only","it.runIf.concurrent","it.runIf.sequential","it.runIf.todo","it.runIf.fails","it.skip.each","it.only.each","it.concurrent.each","it.sequential.each","it.todo.each","it.fails.each","it.extend.skipIf","it.extend.runIf","it.extend.each","it.skipIf.each","it.runIf.each","it.skip.only.concurrent","it.skip.only.sequential","it.skip.only.todo","it.skip.only.fails","it.skip.concurrent.only","it.skip.concurrent.sequential","it.skip.concurrent.todo","it.skip.concurrent.fails","it.skip.sequential.only","it.skip.sequential.concurrent","it.skip.sequential.todo","it.skip.sequential.fails","it.skip.todo.only","it.skip.todo.concurrent","it.skip.todo.sequential","it.skip.todo.fails","it.skip.fails.only","it.skip.fails.concurrent","it.skip.fails.sequential","it.skip.fails.todo","it.only.skip.concurrent","it.only.skip.sequential","it.only.skip.todo","it.only.skip.fails","it.only.concurrent.skip","it.only.concurrent.sequential","it.only.concurrent.todo","it.only.concurrent.fails","it.only.sequential.skip","it.only.sequential.concurrent","it.only.sequential.todo","it.only.sequential.fails","it.only.todo.skip","it.only.todo.concurrent","it.only.todo.sequential","it.only.todo.fails","it.only.fails.skip","it.only.fails.concurrent","it.only.fails.sequential","it.only.fails.todo","it.concurrent.skip.only","it.concurrent.skip.sequential","it.concurrent.skip.todo","it.concurrent.skip.fails","it.concurrent.only.skip","it.concurrent.only.sequential","it.concurrent.only.todo","it.concurrent.only.fails","it.concurrent.sequential.skip","it.concurrent.sequential.only","it.concurrent.sequential.todo","it.concurrent.sequential.fails","it.concurrent.todo.skip","it.concurrent.todo.only","it.concurrent.todo.sequential","it.concurrent.todo.fails","it.concurrent.fails.skip","it.concurrent.fails.only","it.concurrent.fails.sequential","it.concurrent.fails.todo","it.sequential.skip.only","it.sequential.skip.concurrent","it.sequential.skip.todo","it.sequential.skip.fails","it.sequential.only.skip","it.sequential.only.concurrent","it.sequential.only.todo","it.sequential.only.fails","it.sequential.concurrent.skip","it.sequential.concurrent.only","it.sequential.concurrent.todo","it.sequential.concurrent.fails","it.sequential.todo.skip","it.sequential.todo.only","it.sequential.todo.concurrent","it.sequential.todo.fails","it.sequential.fails.skip","it.sequential.fails.only","it.sequential.fails.concurrent","it.sequential.fails.todo","it.todo.skip.only","it.todo.skip.concurrent","it.todo.skip.sequential","it.todo.skip.fails","it.todo.only.skip","it.todo.only.concurrent","it.todo.only.sequential","it.todo.only.fails","it.todo.concurrent.skip","it.todo.concurrent.only","it.todo.concurrent.sequential","it.todo.concurrent.fails","it.todo.sequential.skip","it.todo.sequential.only","it.todo.sequential.concurrent","it.todo.sequential.fails","it.todo.fails.skip","it.todo.fails.only","it.todo.fails.concurrent","it.todo.fails.sequential","it.fails.skip.only","it.fails.skip.concurrent","it.fails.skip.sequential","it.fails.skip.todo","it.fails.only.skip","it.fails.only.concurrent","it.fails.only.sequential","it.fails.only.todo","it.fails.concurrent.skip","it.fails.concurrent.only","it.fails.concurrent.sequential","it.fails.concurrent.todo","it.fails.sequential.skip","it.fails.sequential.only","it.fails.sequential.concurrent","it.fails.sequential.todo","it.fails.todo.skip","it.fails.todo.only","it.fails.todo.concurrent","it.fails.todo.sequential","it.extend.skip.only","it.extend.skip.concurrent","it.extend.skip.sequential","it.extend.skip.todo","it.extend.skip.fails","it.extend.only.skip","it.extend.only.concurrent","it.extend.only.sequential","it.extend.only.todo","it.extend.only.fails","it.extend.concurrent.skip","it.extend.concurrent.only","it.extend.concurrent.sequential","it.extend.concurrent.todo","it.extend.concurrent.fails","it.extend.sequential.skip","it.extend.sequential.only","it.extend.sequential.concurrent","it.extend.sequential.todo","it.extend.sequential.fails","it.extend.todo.skip","it.extend.todo.only","it.extend.todo.concurrent","it.extend.todo.sequential","it.extend.todo.fails","it.extend.fails.skip","it.extend.fails.only","it.extend.fails.concurrent","it.extend.fails.sequential","it.extend.fails.todo","it.skipIf.skip.only","it.skipIf.skip.concurrent","it.skipIf.skip.sequential","it.skipIf.skip.todo","it.skipIf.skip.fails","it.skipIf.only.skip","it.skipIf.only.concurrent","it.skipIf.only.sequential","it.skipIf.only.todo","it.skipIf.only.fails","it.skipIf.concurrent.skip","it.skipIf.concurrent.only","it.skipIf.concurrent.sequential","it.skipIf.concurrent.todo","it.skipIf.concurrent.fails","it.skipIf.sequential.skip","it.skipIf.sequential.only","it.skipIf.sequential.concurrent","it.skipIf.sequential.todo","it.skipIf.sequential.fails","it.skipIf.todo.skip","it.skipIf.todo.only","it.skipIf.todo.concurrent","it.skipIf.todo.sequential","it.skipIf.todo.fails","it.skipIf.fails.skip","it.skipIf.fails.only","it.skipIf.fails.concurrent","it.skipIf.fails.sequential","it.skipIf.fails.todo","it.runIf.skip.only","it.runIf.skip.concurrent","it.runIf.skip.sequential","it.runIf.skip.todo","it.runIf.skip.fails","it.runIf.only.skip","it.runIf.only.concurrent","it.runIf.only.sequential","it.runIf.only.todo","it.runIf.only.fails","it.runIf.concurrent.skip","it.runIf.concurrent.only","it.runIf.concurrent.sequential","it.runIf.concurrent.todo","it.runIf.concurrent.fails","it.runIf.sequential.skip","it.runIf.sequential.only","it.runIf.sequential.concurrent","it.runIf.sequential.todo","it.runIf.sequential.fails","it.runIf.todo.skip","it.runIf.todo.only","it.runIf.todo.concurrent","it.runIf.todo.sequential","it.runIf.todo.fails","it.runIf.fails.skip","it.runIf.fails.only","it.runIf.fails.concurrent","it.runIf.fails.sequential","it.runIf.fails.todo","it.skip.only.each","it.skip.concurrent.each","it.skip.sequential.each","it.skip.todo.each","it.skip.fails.each","it.only.skip.each","it.only.concurrent.each","it.only.sequential.each","it.only.todo.each","it.only.fails.each","it.concurrent.skip.each","it.concurrent.only.each","it.concurrent.sequential.each","it.concurrent.todo.each","it.concurrent.fails.each","it.sequential.skip.each","it.sequential.only.each","it.sequential.concurrent.each","it.sequential.todo.each","it.sequential.fails.each","it.todo.skip.each","it.todo.only.each","it.todo.concurrent.each","it.todo.sequential.each","it.todo.fails.each","it.fails.skip.each","it.fails.only.each","it.fails.concurrent.each","it.fails.sequential.each","it.fails.todo.each","it.extend.skipIf.skip","it.extend.skipIf.only","it.extend.skipIf.concurrent","it.extend.skipIf.sequential","it.extend.skipIf.todo","it.extend.skipIf.fails","it.extend.runIf.skip","it.extend.runIf.only","it.extend.runIf.concurrent","it.extend.runIf.sequential","it.extend.runIf.todo","it.extend.runIf.fails","it.extend.skip.each","it.extend.only.each","it.extend.concurrent.each","it.extend.sequential.each","it.extend.todo.each","it.extend.fails.each","it.skipIf.skip.each","it.skipIf.only.each","it.skipIf.concurrent.each","it.skipIf.sequential.each","it.skipIf.todo.each","it.skipIf.fails.each","it.runIf.skip.each","it.runIf.only.each","it.runIf.concurrent.each","it.runIf.sequential.each","it.runIf.todo.each","it.runIf.fails.each","it.extend.skipIf.each","it.extend.runIf.each","test","test.skip","test.only","test.concurrent","test.sequential","test.todo","test.fails","test.extend","test.skipIf","test.runIf","test.each","test.skip.only","test.skip.concurrent","test.skip.sequential","test.skip.todo","test.skip.fails","test.only.skip","test.only.concurrent","test.only.sequential","test.only.todo","test.only.fails","test.concurrent.skip","test.concurrent.only","test.concurrent.sequential","test.concurrent.todo","test.concurrent.fails","test.sequential.skip","test.sequential.only","test.sequential.concurrent","test.sequential.todo","test.sequential.fails","test.todo.skip","test.todo.only","test.todo.concurrent","test.todo.sequential","test.todo.fails","test.fails.skip","test.fails.only","test.fails.concurrent","test.fails.sequential","test.fails.todo","test.extend.skip","test.extend.only","test.extend.concurrent","test.extend.sequential","test.extend.todo","test.extend.fails","test.skipIf.skip","test.skipIf.only","test.skipIf.concurrent","test.skipIf.sequential","test.skipIf.todo","test.skipIf.fails","test.runIf.skip","test.runIf.only","test.runIf.concurrent","test.runIf.sequential","test.runIf.todo","test.runIf.fails","test.skip.each","test.only.each","test.concurrent.each","test.sequential.each","test.todo.each","test.fails.each","test.extend.skipIf","test.extend.runIf","test.extend.each","test.skipIf.each","test.runIf.each","test.skip.only.concurrent","test.skip.only.sequential","test.skip.only.todo","test.skip.only.fails","test.skip.concurrent.only","test.skip.concurrent.sequential","test.skip.concurrent.todo","test.skip.concurrent.fails","test.skip.sequential.only","test.skip.sequential.concurrent","test.skip.sequential.todo","test.skip.sequential.fails","test.skip.todo.only","test.skip.todo.concurrent","test.skip.todo.sequential","test.skip.todo.fails","test.skip.fails.only","test.skip.fails.concurrent","test.skip.fails.sequential","test.skip.fails.todo","test.only.skip.concurrent","test.only.skip.sequential","test.only.skip.todo","test.only.skip.fails","test.only.concurrent.skip","test.only.concurrent.sequential","test.only.concurrent.todo","test.only.concurrent.fails","test.only.sequential.skip","test.only.sequential.concurrent","test.only.sequential.todo","test.only.sequential.fails","test.only.todo.skip","test.only.todo.concurrent","test.only.todo.sequential","test.only.todo.fails","test.only.fails.skip","test.only.fails.concurrent","test.only.fails.sequential","test.only.fails.todo","test.concurrent.skip.only","test.concurrent.skip.sequential","test.concurrent.skip.todo","test.concurrent.skip.fails","test.concurrent.only.skip","test.concurrent.only.sequential","test.concurrent.only.todo","test.concurrent.only.fails","test.concurrent.sequential.skip","test.concurrent.sequential.only","test.concurrent.sequential.todo","test.concurrent.sequential.fails","test.concurrent.todo.skip","test.concurrent.todo.only","test.concurrent.todo.sequential","test.concurrent.todo.fails","test.concurrent.fails.skip","test.concurrent.fails.only","test.concurrent.fails.sequential","test.concurrent.fails.todo","test.sequential.skip.only","test.sequential.skip.concurrent","test.sequential.skip.todo","test.sequential.skip.fails","test.sequential.only.skip","test.sequential.only.concurrent","test.sequential.only.todo","test.sequential.only.fails","test.sequential.concurrent.skip","test.sequential.concurrent.only","test.sequential.concurrent.todo","test.sequential.concurrent.fails","test.sequential.todo.skip","test.sequential.todo.only","test.sequential.todo.concurrent","test.sequential.todo.fails","test.sequential.fails.skip","test.sequential.fails.only","test.sequential.fails.concurrent","test.sequential.fails.todo","test.todo.skip.only","test.todo.skip.concurrent","test.todo.skip.sequential","test.todo.skip.fails","test.todo.only.skip","test.todo.only.concurrent","test.todo.only.sequential","test.todo.only.fails","test.todo.concurrent.skip","test.todo.concurrent.only","test.todo.concurrent.sequential","test.todo.concurrent.fails","test.todo.sequential.skip","test.todo.sequential.only","test.todo.sequential.concurrent","test.todo.sequential.fails","test.todo.fails.skip","test.todo.fails.only","test.todo.fails.concurrent","test.todo.fails.sequential","test.fails.skip.only","test.fails.skip.concurrent","test.fails.skip.sequential","test.fails.skip.todo","test.fails.only.skip","test.fails.only.concurrent","test.fails.only.sequential","test.fails.only.todo","test.fails.concurrent.skip","test.fails.concurrent.only","test.fails.concurrent.sequential","test.fails.concurrent.todo","test.fails.sequential.skip","test.fails.sequential.only","test.fails.sequential.concurrent","test.fails.sequential.todo","test.fails.todo.skip","test.fails.todo.only","test.fails.todo.concurrent","test.fails.todo.sequential","test.extend.skip.only","test.extend.skip.concurrent","test.extend.skip.sequential","test.extend.skip.todo","test.extend.skip.fails","test.extend.only.skip","test.extend.only.concurrent","test.extend.only.sequential","test.extend.only.todo","test.extend.only.fails","test.extend.concurrent.skip","test.extend.concurrent.only","test.extend.concurrent.sequential","test.extend.concurrent.todo","test.extend.concurrent.fails","test.extend.sequential.skip","test.extend.sequential.only","test.extend.sequential.concurrent","test.extend.sequential.todo","test.extend.sequential.fails","test.extend.todo.skip","test.extend.todo.only","test.extend.todo.concurrent","test.extend.todo.sequential","test.extend.todo.fails","test.extend.fails.skip","test.extend.fails.only","test.extend.fails.concurrent","test.extend.fails.sequential","test.extend.fails.todo","test.skipIf.skip.only","test.skipIf.skip.concurrent","test.skipIf.skip.sequential","test.skipIf.skip.todo","test.skipIf.skip.fails","test.skipIf.only.skip","test.skipIf.only.concurrent","test.skipIf.only.sequential","test.skipIf.only.todo","test.skipIf.only.fails","test.skipIf.concurrent.skip","test.skipIf.concurrent.only","test.skipIf.concurrent.sequential","test.skipIf.concurrent.todo","test.skipIf.concurrent.fails","test.skipIf.sequential.skip","test.skipIf.sequential.only","test.skipIf.sequential.concurrent","test.skipIf.sequential.todo","test.skipIf.sequential.fails","test.skipIf.todo.skip","test.skipIf.todo.only","test.skipIf.todo.concurrent","test.skipIf.todo.sequential","test.skipIf.todo.fails","test.skipIf.fails.skip","test.skipIf.fails.only","test.skipIf.fails.concurrent","test.skipIf.fails.sequential","test.skipIf.fails.todo","test.runIf.skip.only","test.runIf.skip.concurrent","test.runIf.skip.sequential","test.runIf.skip.todo","test.runIf.skip.fails","test.runIf.only.skip","test.runIf.only.concurrent","test.runIf.only.sequential","test.runIf.only.todo","test.runIf.only.fails","test.runIf.concurrent.skip","test.runIf.concurrent.only","test.runIf.concurrent.sequential","test.runIf.concurrent.todo","test.runIf.concurrent.fails","test.runIf.sequential.skip","test.runIf.sequential.only","test.runIf.sequential.concurrent","test.runIf.sequential.todo","test.runIf.sequential.fails","test.runIf.todo.skip","test.runIf.todo.only","test.runIf.todo.concurrent","test.runIf.todo.sequential","test.runIf.todo.fails","test.runIf.fails.skip","test.runIf.fails.only","test.runIf.fails.concurrent","test.runIf.fails.sequential","test.runIf.fails.todo","test.skip.only.each","test.skip.concurrent.each","test.skip.sequential.each","test.skip.todo.each","test.skip.fails.each","test.only.skip.each","test.only.concurrent.each","test.only.sequential.each","test.only.todo.each","test.only.fails.each","test.concurrent.skip.each","test.concurrent.only.each","test.concurrent.sequential.each","test.concurrent.todo.each","test.concurrent.fails.each","test.sequential.skip.each","test.sequential.only.each","test.sequential.concurrent.each","test.sequential.todo.each","test.sequential.fails.each","test.todo.skip.each","test.todo.only.each","test.todo.concurrent.each","test.todo.sequential.each","test.todo.fails.each","test.fails.skip.each","test.fails.only.each","test.fails.concurrent.each","test.fails.sequential.each","test.fails.todo.each","test.extend.skipIf.skip","test.extend.skipIf.only","test.extend.skipIf.concurrent","test.extend.skipIf.sequential","test.extend.skipIf.todo","test.extend.skipIf.fails","test.extend.runIf.skip","test.extend.runIf.only","test.extend.runIf.concurrent","test.extend.runIf.sequential","test.extend.runIf.todo","test.extend.runIf.fails","test.extend.skip.each","test.extend.only.each","test.extend.concurrent.each","test.extend.sequential.each","test.extend.todo.each","test.extend.fails.each","test.skipIf.skip.each","test.skipIf.only.each","test.skipIf.concurrent.each","test.skipIf.sequential.each","test.skipIf.todo.each","test.skipIf.fails.each","test.runIf.skip.each","test.runIf.only.each","test.runIf.concurrent.each","test.runIf.sequential.each","test.runIf.todo.each","test.runIf.fails.each","test.extend.skipIf.each","test.extend.runIf.each","bench","bench.skip","bench.only","bench.todo","bench.skipIf","bench.runIf","bench.skip.only","bench.skip.todo","bench.only.skip","bench.only.todo","bench.todo.skip","bench.todo.only","bench.skipIf.skip","bench.skipIf.only","bench.skipIf.todo","bench.runIf.skip","bench.runIf.only","bench.runIf.todo","bench.skip.only.todo","bench.skip.todo.only","bench.only.skip.todo","bench.only.todo.skip","bench.todo.skip.only","bench.todo.only.skip","bench.skipIf.skip.only","bench.skipIf.skip.todo","bench.skipIf.only.skip","bench.skipIf.only.todo","bench.skipIf.todo.skip","bench.skipIf.todo.only","bench.runIf.skip.only","bench.runIf.skip.todo","bench.runIf.only.skip","bench.runIf.only.todo","bench.runIf.todo.skip","bench.runIf.todo.only","describe","describe.skip","describe.only","describe.concurrent","describe.sequential","describe.shuffle","describe.todo","describe.skipIf","describe.runIf","describe.each","describe.skip.only","describe.skip.concurrent","describe.skip.sequential","describe.skip.shuffle","describe.skip.todo","describe.only.skip","describe.only.concurrent","describe.only.sequential","describe.only.shuffle","describe.only.todo","describe.concurrent.skip","describe.concurrent.only","describe.concurrent.sequential","describe.concurrent.shuffle","describe.concurrent.todo","describe.sequential.skip","describe.sequential.only","describe.sequential.concurrent","describe.sequential.shuffle","describe.sequential.todo","describe.shuffle.skip","describe.shuffle.only","describe.shuffle.concurrent","describe.shuffle.sequential","describe.shuffle.todo","describe.todo.skip","describe.todo.only","describe.todo.concurrent","describe.todo.sequential","describe.todo.shuffle","describe.skipIf.skip","describe.skipIf.only","describe.skipIf.concurrent","describe.skipIf.sequential","describe.skipIf.shuffle","describe.skipIf.todo","describe.runIf.skip","describe.runIf.only","describe.runIf.concurrent","describe.runIf.sequential","describe.runIf.shuffle","describe.runIf.todo","describe.skip.each","describe.only.each","describe.concurrent.each","describe.sequential.each","describe.shuffle.each","describe.todo.each","describe.skipIf.each","describe.runIf.each","describe.skip.only.concurrent","describe.skip.only.sequential","describe.skip.only.shuffle","describe.skip.only.todo","describe.skip.concurrent.only","describe.skip.concurrent.sequential","describe.skip.concurrent.shuffle","describe.skip.concurrent.todo","describe.skip.sequential.only","describe.skip.sequential.concurrent","describe.skip.sequential.shuffle","describe.skip.sequential.todo","describe.skip.shuffle.only","describe.skip.shuffle.concurrent","describe.skip.shuffle.sequential","describe.skip.shuffle.todo","describe.skip.todo.only","describe.skip.todo.concurrent","describe.skip.todo.sequential","describe.skip.todo.shuffle","describe.only.skip.concurrent","describe.only.skip.sequential","describe.only.skip.shuffle","describe.only.skip.todo","describe.only.concurrent.skip","describe.only.concurrent.sequential","describe.only.concurrent.shuffle","describe.only.concurrent.todo","describe.only.sequential.skip","describe.only.sequential.concurrent","describe.only.sequential.shuffle","describe.only.sequential.todo","describe.only.shuffle.skip","describe.only.shuffle.concurrent","describe.only.shuffle.sequential","describe.only.shuffle.todo","describe.only.todo.skip","describe.only.todo.concurrent","describe.only.todo.sequential","describe.only.todo.shuffle","describe.concurrent.skip.only","describe.concurrent.skip.sequential","describe.concurrent.skip.shuffle","describe.concurrent.skip.todo","describe.concurrent.only.skip","describe.concurrent.only.sequential","describe.concurrent.only.shuffle","describe.concurrent.only.todo","describe.concurrent.sequential.skip","describe.concurrent.sequential.only","describe.concurrent.sequential.shuffle","describe.concurrent.sequential.todo","describe.concurrent.shuffle.skip","describe.concurrent.shuffle.only","describe.concurrent.shuffle.sequential","describe.concurrent.shuffle.todo","describe.concurrent.todo.skip","describe.concurrent.todo.only","describe.concurrent.todo.sequential","describe.concurrent.todo.shuffle","describe.sequential.skip.only","describe.sequential.skip.concurrent","describe.sequential.skip.shuffle","describe.sequential.skip.todo","describe.sequential.only.skip","describe.sequential.only.concurrent","describe.sequential.only.shuffle","describe.sequential.only.todo","describe.sequential.concurrent.skip","describe.sequential.concurrent.only","describe.sequential.concurrent.shuffle","describe.sequential.concurrent.todo","describe.sequential.shuffle.skip","describe.sequential.shuffle.only","describe.sequential.shuffle.concurrent","describe.sequential.shuffle.todo","describe.sequential.todo.skip","describe.sequential.todo.only","describe.sequential.todo.concurrent","describe.sequential.todo.shuffle","describe.shuffle.skip.only","describe.shuffle.skip.concurrent","describe.shuffle.skip.sequential","describe.shuffle.skip.todo","describe.shuffle.only.skip","describe.shuffle.only.concurrent","describe.shuffle.only.sequential","describe.shuffle.only.todo","describe.shuffle.concurrent.skip","describe.shuffle.concurrent.only","describe.shuffle.concurrent.sequential","describe.shuffle.concurrent.todo","describe.shuffle.sequential.skip","describe.shuffle.sequential.only","describe.shuffle.sequential.concurrent","describe.shuffle.sequential.todo","describe.shuffle.todo.skip","describe.shuffle.todo.only","describe.shuffle.todo.concurrent","describe.shuffle.todo.sequential","describe.todo.skip.only","describe.todo.skip.concurrent","describe.todo.skip.sequential","describe.todo.skip.shuffle","describe.todo.only.skip","describe.todo.only.concurrent","describe.todo.only.sequential","describe.todo.only.shuffle","describe.todo.concurrent.skip","describe.todo.concurrent.only","describe.todo.concurrent.sequential","describe.todo.concurrent.shuffle","describe.todo.sequential.skip","describe.todo.sequential.only","describe.todo.sequential.concurrent","describe.todo.sequential.shuffle","describe.todo.shuffle.skip","describe.todo.shuffle.only","describe.todo.shuffle.concurrent","describe.todo.shuffle.sequential","describe.skipIf.skip.only","describe.skipIf.skip.concurrent","describe.skipIf.skip.sequential","describe.skipIf.skip.shuffle","describe.skipIf.skip.todo","describe.skipIf.only.skip","describe.skipIf.only.concurrent","describe.skipIf.only.sequential","describe.skipIf.only.shuffle","describe.skipIf.only.todo","describe.skipIf.concurrent.skip","describe.skipIf.concurrent.only","describe.skipIf.concurrent.sequential","describe.skipIf.concurrent.shuffle","describe.skipIf.concurrent.todo","describe.skipIf.sequential.skip","describe.skipIf.sequential.only","describe.skipIf.sequential.concurrent","describe.skipIf.sequential.shuffle","describe.skipIf.sequential.todo","describe.skipIf.shuffle.skip","describe.skipIf.shuffle.only","describe.skipIf.shuffle.concurrent","describe.skipIf.shuffle.sequential","describe.skipIf.shuffle.todo","describe.skipIf.todo.skip","describe.skipIf.todo.only","describe.skipIf.todo.concurrent","describe.skipIf.todo.sequential","describe.skipIf.todo.shuffle","describe.runIf.skip.only","describe.runIf.skip.concurrent","describe.runIf.skip.sequential","describe.runIf.skip.shuffle","describe.runIf.skip.todo","describe.runIf.only.skip","describe.runIf.only.concurrent","describe.runIf.only.sequential","describe.runIf.only.shuffle","describe.runIf.only.todo","describe.runIf.concurrent.skip","describe.runIf.concurrent.only","describe.runIf.concurrent.sequential","describe.runIf.concurrent.shuffle","describe.runIf.concurrent.todo","describe.runIf.sequential.skip","describe.runIf.sequential.only","describe.runIf.sequential.concurrent","describe.runIf.sequential.shuffle","describe.runIf.sequential.todo","describe.runIf.shuffle.skip","describe.runIf.shuffle.only","describe.runIf.shuffle.concurrent","describe.runIf.shuffle.sequential","describe.runIf.shuffle.todo","describe.runIf.todo.skip","describe.runIf.todo.only","describe.runIf.todo.concurrent","describe.runIf.todo.sequential","describe.runIf.todo.shuffle","describe.skip.only.each","describe.skip.concurrent.each","describe.skip.sequential.each","describe.skip.shuffle.each","describe.skip.todo.each","describe.only.skip.each","describe.only.concurrent.each","describe.only.sequential.each","describe.only.shuffle.each","describe.only.todo.each","describe.concurrent.skip.each","describe.concurrent.only.each","describe.concurrent.sequential.each","describe.concurrent.shuffle.each","describe.concurrent.todo.each","describe.sequential.skip.each","describe.sequential.only.each","describe.sequential.concurrent.each","describe.sequential.shuffle.each","describe.sequential.todo.each","describe.shuffle.skip.each","describe.shuffle.only.each","describe.shuffle.concurrent.each","describe.shuffle.sequential.each","describe.shuffle.todo.each","describe.todo.skip.each","describe.todo.only.each","describe.todo.concurrent.each","describe.todo.sequential.each","describe.todo.shuffle.each","describe.skipIf.skip.each","describe.skipIf.only.each","describe.skipIf.concurrent.each","describe.skipIf.sequential.each","describe.skipIf.shuffle.each","describe.skipIf.todo.each","describe.runIf.skip.each","describe.runIf.only.each","describe.runIf.concurrent.each","describe.runIf.sequential.each","describe.runIf.shuffle.each","describe.runIf.todo.each","suite","suite.skip","suite.only","suite.concurrent","suite.sequential","suite.shuffle","suite.todo","suite.skipIf","suite.runIf","suite.each","suite.skip.only","suite.skip.concurrent","suite.skip.sequential","suite.skip.shuffle","suite.skip.todo","suite.only.skip","suite.only.concurrent","suite.only.sequential","suite.only.shuffle","suite.only.todo","suite.concurrent.skip","suite.concurrent.only","suite.concurrent.sequential","suite.concurrent.shuffle","suite.concurrent.todo","suite.sequential.skip","suite.sequential.only","suite.sequential.concurrent","suite.sequential.shuffle","suite.sequential.todo","suite.shuffle.skip","suite.shuffle.only","suite.shuffle.concurrent","suite.shuffle.sequential","suite.shuffle.todo","suite.todo.skip","suite.todo.only","suite.todo.concurrent","suite.todo.sequential","suite.todo.shuffle","suite.skipIf.skip","suite.skipIf.only","suite.skipIf.concurrent","suite.skipIf.sequential","suite.skipIf.shuffle","suite.skipIf.todo","suite.runIf.skip","suite.runIf.only","suite.runIf.concurrent","suite.runIf.sequential","suite.runIf.shuffle","suite.runIf.todo","suite.skip.each","suite.only.each","suite.concurrent.each","suite.sequential.each","suite.shuffle.each","suite.todo.each","suite.skipIf.each","suite.runIf.each","suite.skip.only.concurrent","suite.skip.only.sequential","suite.skip.only.shuffle","suite.skip.only.todo","suite.skip.concurrent.only","suite.skip.concurrent.sequential","suite.skip.concurrent.shuffle","suite.skip.concurrent.todo","suite.skip.sequential.only","suite.skip.sequential.concurrent","suite.skip.sequential.shuffle","suite.skip.sequential.todo","suite.skip.shuffle.only","suite.skip.shuffle.concurrent","suite.skip.shuffle.sequential","suite.skip.shuffle.todo","suite.skip.todo.only","suite.skip.todo.concurrent","suite.skip.todo.sequential","suite.skip.todo.shuffle","suite.only.skip.concurrent","suite.only.skip.sequential","suite.only.skip.shuffle","suite.only.skip.todo","suite.only.concurrent.skip","suite.only.concurrent.sequential","suite.only.concurrent.shuffle","suite.only.concurrent.todo","suite.only.sequential.skip","suite.only.sequential.concurrent","suite.only.sequential.shuffle","suite.only.sequential.todo","suite.only.shuffle.skip","suite.only.shuffle.concurrent","suite.only.shuffle.sequential","suite.only.shuffle.todo","suite.only.todo.skip","suite.only.todo.concurrent","suite.only.todo.sequential","suite.only.todo.shuffle","suite.concurrent.skip.only","suite.concurrent.skip.sequential","suite.concurrent.skip.shuffle","suite.concurrent.skip.todo","suite.concurrent.only.skip","suite.concurrent.only.sequential","suite.concurrent.only.shuffle","suite.concurrent.only.todo","suite.concurrent.sequential.skip","suite.concurrent.sequential.only","suite.concurrent.sequential.shuffle","suite.concurrent.sequential.todo","suite.concurrent.shuffle.skip","suite.concurrent.shuffle.only","suite.concurrent.shuffle.sequential","suite.concurrent.shuffle.todo","suite.concurrent.todo.skip","suite.concurrent.todo.only","suite.concurrent.todo.sequential","suite.concurrent.todo.shuffle","suite.sequential.skip.only","suite.sequential.skip.concurrent","suite.sequential.skip.shuffle","suite.sequential.skip.todo","suite.sequential.only.skip","suite.sequential.only.concurrent","suite.sequential.only.shuffle","suite.sequential.only.todo","suite.sequential.concurrent.skip","suite.sequential.concurrent.only","suite.sequential.concurrent.shuffle","suite.sequential.concurrent.todo","suite.sequential.shuffle.skip","suite.sequential.shuffle.only","suite.sequential.shuffle.concurrent","suite.sequential.shuffle.todo","suite.sequential.todo.skip","suite.sequential.todo.only","suite.sequential.todo.concurrent","suite.sequential.todo.shuffle","suite.shuffle.skip.only","suite.shuffle.skip.concurrent","suite.shuffle.skip.sequential","suite.shuffle.skip.todo","suite.shuffle.only.skip","suite.shuffle.only.concurrent","suite.shuffle.only.sequential","suite.shuffle.only.todo","suite.shuffle.concurrent.skip","suite.shuffle.concurrent.only","suite.shuffle.concurrent.sequential","suite.shuffle.concurrent.todo","suite.shuffle.sequential.skip","suite.shuffle.sequential.only","suite.shuffle.sequential.concurrent","suite.shuffle.sequential.todo","suite.shuffle.todo.skip","suite.shuffle.todo.only","suite.shuffle.todo.concurrent","suite.shuffle.todo.sequential","suite.todo.skip.only","suite.todo.skip.concurrent","suite.todo.skip.sequential","suite.todo.skip.shuffle","suite.todo.only.skip","suite.todo.only.concurrent","suite.todo.only.sequential","suite.todo.only.shuffle","suite.todo.concurrent.skip","suite.todo.concurrent.only","suite.todo.concurrent.sequential","suite.todo.concurrent.shuffle","suite.todo.sequential.skip","suite.todo.sequential.only","suite.todo.sequential.concurrent","suite.todo.sequential.shuffle","suite.todo.shuffle.skip","suite.todo.shuffle.only","suite.todo.shuffle.concurrent","suite.todo.shuffle.sequential","suite.skipIf.skip.only","suite.skipIf.skip.concurrent","suite.skipIf.skip.sequential","suite.skipIf.skip.shuffle","suite.skipIf.skip.todo","suite.skipIf.only.skip","suite.skipIf.only.concurrent","suite.skipIf.only.sequential","suite.skipIf.only.shuffle","suite.skipIf.only.todo","suite.skipIf.concurrent.skip","suite.skipIf.concurrent.only","suite.skipIf.concurrent.sequential","suite.skipIf.concurrent.shuffle","suite.skipIf.concurrent.todo","suite.skipIf.sequential.skip","suite.skipIf.sequential.only","suite.skipIf.sequential.concurrent","suite.skipIf.sequential.shuffle","suite.skipIf.sequential.todo","suite.skipIf.shuffle.skip","suite.skipIf.shuffle.only","suite.skipIf.shuffle.concurrent","suite.skipIf.shuffle.sequential","suite.skipIf.shuffle.todo","suite.skipIf.todo.skip","suite.skipIf.todo.only","suite.skipIf.todo.concurrent","suite.skipIf.todo.sequential","suite.skipIf.todo.shuffle","suite.runIf.skip.only","suite.runIf.skip.concurrent","suite.runIf.skip.sequential","suite.runIf.skip.shuffle","suite.runIf.skip.todo","suite.runIf.only.skip","suite.runIf.only.concurrent","suite.runIf.only.sequential","suite.runIf.only.shuffle","suite.runIf.only.todo","suite.runIf.concurrent.skip","suite.runIf.concurrent.only","suite.runIf.concurrent.sequential","suite.runIf.concurrent.shuffle","suite.runIf.concurrent.todo","suite.runIf.sequential.skip","suite.runIf.sequential.only","suite.runIf.sequential.concurrent","suite.runIf.sequential.shuffle","suite.runIf.sequential.todo","suite.runIf.shuffle.skip","suite.runIf.shuffle.only","suite.runIf.shuffle.concurrent","suite.runIf.shuffle.sequential","suite.runIf.shuffle.todo","suite.runIf.todo.skip","suite.runIf.todo.only","suite.runIf.todo.concurrent","suite.runIf.todo.sequential","suite.runIf.todo.shuffle","suite.skip.only.each","suite.skip.concurrent.each","suite.skip.sequential.each","suite.skip.shuffle.each","suite.skip.todo.each","suite.only.skip.each","suite.only.concurrent.each","suite.only.sequential.each","suite.only.shuffle.each","suite.only.todo.each","suite.concurrent.skip.each","suite.concurrent.only.each","suite.concurrent.sequential.each","suite.concurrent.shuffle.each","suite.concurrent.todo.each","suite.sequential.skip.each","suite.sequential.only.each","suite.sequential.concurrent.each","suite.sequential.shuffle.each","suite.sequential.todo.each","suite.shuffle.skip.each","suite.shuffle.only.each","suite.shuffle.concurrent.each","suite.shuffle.sequential.each","suite.shuffle.todo.each","suite.todo.skip.each","suite.todo.only.each","suite.todo.concurrent.each","suite.todo.sequential.each","suite.todo.shuffle.each","suite.skipIf.skip.each","suite.skipIf.only.each","suite.skipIf.concurrent.each","suite.skipIf.sequential.each","suite.skipIf.shuffle.each","suite.skipIf.todo.each","suite.runIf.skip.each","suite.runIf.only.each","suite.runIf.concurrent.each","suite.runIf.sequential.each","suite.runIf.shuffle.each","suite.runIf.todo.each","xtest","xtest.each","xit","xit.each","fit","xdescribe","xdescribe.each","fdescribe"]);function ae(e,s){return e.sourceCode.getScope?e.sourceCode.getScope(s):e.getScope()}function Hs(e,s){let t=ae(e,s);for(;t;){if(t.type==="module")return t;t=t.upper}return t}const E=(e,s,t)=>{const n=h(e,s);return n!==null&&t.includes(n.type)},h=(e,s)=>{const t=Bt(e,s);return typeof t=="string"?null:t},Nt=new WeakMap,Bt=(e,s)=>{let t=Nt.get(e);return t||(t=zs(e,s),Nt.set(e,t),t)},Ks=e=>e==="expect"?"expect":e==="expectTypeOf"?"expectTypeOf":e==="vi"?"vi":e==="vitest"?"vitest":V.hasOwnProperty(e)?"describe":q.hasOwnProperty(e)?"test":Ot.hasOwnProperty(e)?"hook":"unknown",Gs=e=>{const s=[];for(const t of e){if(t.parent?.type===i.MemberExpression&&t.parent.parent?.type===i.CallExpression)return{matcher:t,args:t.parent.parent.arguments,modifiers:s};const n=y(t);if(s.length===0){if(!N.hasOwnProperty(n))return"modifier-unknown"}else if(s.length===1){if(n!==N.not&&n!=N.have)return"modifier-unknown";const r=y(s[0]);if(r!==N.resolves&&r!==N.rejects&&r!==N.to)return"modifier-unknown"}else return"modifier-unknown";s.push(t)}return"matcher-not-found"},Xs=(e,s)=>{const t=Gs(e.members);return typeof t=="string"?t:{...e,type:s,...t}},Lt=e=>{let s=e,{parent:t}=e;for(;t;){if(t.type===i.CallExpression){s=t,t=t.parent;continue}if(t.type!==i.MemberExpression)break;t=t.parent}return s},zs=(e,s)=>{const t=H(e);if(!t?.length)return null;const[n,...r]=t,o=y(t[t.length-1]);if(o==="each"&&e.callee.type!==i.CallExpression&&e.callee.type!==i.TaggedTemplateExpression||e.callee.type===i.TaggedTemplateExpression&&o!=="each")return null;const a=Js(s,e,y(n));if(!a)return null;const c=a.original??a.local,l=[c,...r.map(y)];if(a.type!=="testContext"&&c!=="vi"&&c!=="vitest"&&c!=="expect"&&c!=="expectTypeOf"&&!Vs.has(l.join(".")))return null;const d={name:c,head:{...a,node:n},members:r},f=Ks(c);if(f==="expect"||f==="expectTypeOf"){const u=Xs(d,f);return typeof u=="string"&&Lt(e)!==e?null:u==="matcher-not-found"&&e.parent?.type===i.MemberExpression?"matcher-not-called":u}return t.slice(0,t.length-1).some(u=>u.parent?.type!==i.MemberExpression)||e.parent?.type===i.CallExpression||e.parent?.type===i.MemberExpression?null:{...d,type:f}},Ys=(e,s)=>e&&s?[...e,...s]:null;function H(e){if(v(e))return[e];switch(e.type){case i.TaggedTemplateExpression:return H(e.tag);case i.MemberExpression:return Ys(H(e.object),H(e.property));case i.CallExpression:return H(e.callee)}return null}const Js=(e,s,t)=>{const n=ae(e,s),r=Ft(n,t);return r==="local"?null:r==="testContext"?{local:t,original:null,type:"testContext"}:r?r.source==="vitest"?{original:r.imported,local:r.local,type:"import"}:null:{original:Qs(t,e),local:t,type:"global"}},Qs=(e,s)=>{const t=s.settings.vitest?.globalAliases??{},n=Object.entries(t).find(([r,o])=>o.includes(e));return n?n[0]:null},Zs=({parent:e})=>{if(e?.type===i.CallExpression&&e.callee.type===i.Identifier)return q.hasOwnProperty(e.callee.name)},Ft=(e,s)=>{let t=e;for(;t!==null;){const n=t.set.get(s);if(n&&n.defs.length>0){const r=n.defs[n.defs.length-1],o=M(r.node)?r.node.params.find(l=>l.type===i.ObjectPattern):void 0;if(o){const l=o.properties.find(d=>d.type===i.Property);if((l?.key.type===i.Identifier?l.key:void 0)?.name===s)return"testContext"}const a=M(r.node)?r.node.params.find(l=>l.type===i.Identifier):void 0;if(a&&Zs(a.parent))return"testContext";const c=sn(r);return c?.local===s?c:"local"}t=t.upper}return null},en=e=>e.type===i.AwaitExpression?e.argument.type===i.ImportExpression?e.argument.source:null:e.type===i.CallExpression&&L(e.callee,"require")?e.arguments[0]??null:null,tn=e=>e.parent.type===i.TSImportEqualsDeclaration||e.node.type!==i.ImportSpecifier||e.node.imported.type!=i.Identifier||e.parent.importKind==="type"?null:{source:e.parent.source.value,imported:e.node.imported.name,local:e.node.local.name},sn=e=>e.type==="Variable"?nn(e):e.type==="ImportBinding"?tn(e):null,nn=e=>{if(!e.node.init)return null;const s=en(e.node.init);return!s||!B(s)||e.name.parent?.type!==i.Property||!v(e.name.parent.key)?null:{source:j(s),imported:y(e.name.parent.key),local:e.name.name}},ce=(e,s)=>e.reduce((t,{references:n})=>t.concat(n.map(({identifier:r})=>r.parent).filter(r=>r?.type===i.CallExpression&&E(r,s,["test"]))),[]),P=e=>{const[s]=e.args;return s.type===i.SpreadElement?s:le(s)},rn=e=>e.type===i.TSAsExpression||e.type===i.TSTypeAssertion,le=e=>rn(e)?le(e.expression):e,ue="prefer-lowercase-title",on=e=>e.arguments[0]&&B(e.arguments[0]),an=e=>{const s=[];return e.includes(V.describe)&&s.push(...Object.keys(V)),e.includes(q.test)&&s.push(...Object.keys(q).filter(t=>t.endsWith(q.test))),e.includes(q.it)&&s.push(...Object.keys(q).filter(t=>t.endsWith(q.it))),s},cn=p({name:ue,meta:{type:"problem",docs:{description:"enforce lowercase titles",recommended:!1},fixable:"code",messages:{lowerCaseTitle:"`{{ method }}`s should begin with lowercase",fullyLowerCaseTitle:"`{{ method }}`s should be lowercase"},schema:[{type:"object",properties:{ignore:{type:"array",items:{type:"string",enum:[V.describe,q.test,q.it]}},allowedPrefixes:{type:"array",items:{type:"string"},additionalItems:!1},ignoreTopLevelDescribe:{type:"boolean",default:!1},lowercaseFirstCharacterOnly:{type:"boolean",default:!0}},additionalProperties:!1}]},defaultOptions:[{ignore:[],allowedPrefixes:[],ignoreTopLevelDescribe:!1,lowercaseFirstCharacterOnly:!0}],create:(e,[{ignore:s=[],allowedPrefixes:t=[],ignoreTopLevelDescribe:n=!1,lowercaseFirstCharacterOnly:r=!1}])=>{const o=an(s);let a=0;return{CallExpression(c){const l=h(c,e);if(!l||!on)return;if(l?.type==="describe"){if(a++,n&&a===1)return}else if(l?.type!=="test")return;const[d]=c.arguments,f=j(d);if(typeof f!="string"||t.some(x=>f.startsWith(x)))return;const u=f.charAt(0);o.includes(l.name)||r&&(!u||u===u.toLowerCase())||!r&&f===f.toLowerCase()||e.report({messageId:r?"lowerCaseTitle":"fullyLowerCaseTitle",node:c.arguments[0],data:{method:l.name},fix:x=>{const m=j(d),I=[d.range[0]+1,d.range[1]-1],k=r?m.substring(0,1).toLowerCase()+m.substring(1):m.toLowerCase();return[x.replaceTextRange(I,k)]}})},"CallExpression:exit"(c){E(c,e,["describe"])&&a--}}}}),pe="max-nested-describe",ln=p({name:pe,meta:{type:"problem",docs:{description:"require describe block to be less than set max value or default value",recommended:!1},schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}],messages:{maxNestedDescribe:"Nested describe block should be less than set max value"}},defaultOptions:[{max:5}],create(e,[{max:s}]){const t=[];function n(o){o.parent?.type==="CallExpression"&&(o.parent.callee.type!=="Identifier"||o.parent.callee.name!=="describe"||(t.push(0),t.length>s&&e.report({node:o.parent,messageId:"maxNestedDescribe"})))}function r(o){o.parent?.type==="CallExpression"&&(o.parent.callee.type!=="Identifier"||o.parent.callee.name!=="describe"||t.pop())}return{FunctionExpression:n,"FunctionExpression:exit":r,ArrowFunctionExpression:n,"ArrowFunctionExpression:exit":r}}}),X="no-identical-title",Pt=()=>({describeTitles:[],testTitles:[]}),un=p({name:X,meta:{type:"problem",docs:{description:"disallow identical titles",recommended:!1},fixable:"code",schema:[],messages:{multipleTestTitle:"Test is used multiple times in the same describe(suite) block",multipleDescribeTitle:"Describe is used multiple times in the same describe(suite) block"}},defaultOptions:[],create(e){const s=[Pt()];return{CallExpression(t){const n=s[s.length-1],r=h(t,e);if(!r||((r.name==="describe"||r.name==="suite")&&s.push(Pt()),r.members.find(c=>v(c,"each"))))return;const[o]=t.arguments;if(!o||!B(o))return;const a=j(o);r.type==="test"&&(n?.testTitles.includes(a)&&e.report({node:t,messageId:"multipleTestTitle"}),n?.testTitles.push(a)),r.type==="describe"&&(n?.describeTitles.includes(a)&&e.report({node:t,messageId:"multipleDescribeTitle"}),n?.describeTitles.push(a))},"CallExpression:exit"(t){E(t,e,["describe"])&&s.pop()}}}}),de="no-focused-tests",fe=e=>e.type==="Identifier"&&["it","test","describe"].includes(e.name),me=e=>e.type==="Identifier"&&e.name==="only",pn=p({name:de,meta:{type:"problem",docs:{description:"disallow focused tests",recommended:!1},fixable:"code",schema:[{type:"object",properties:{fixable:{type:"boolean",default:!0}},additionalProperties:!1}],messages:{noFocusedTests:"Focused tests are not allowed"}},defaultOptions:[{fixable:!0}],create:e=>{const s=e.options[0]?.fixable;return{ExpressionStatement(t){if(t.expression.type==="CallExpression"){const{callee:n}=t.expression;if(n.type==="MemberExpression"&&fe(n.object)&&me(n.property)&&e.report({node:n.property,messageId:"noFocusedTests",fix:r=>s?r.removeRange([n.property.range[0]-1,n.property.range[1]]):null}),n.type==="TaggedTemplateExpression"){const r=n.tag.type==="MemberExpression"?n.tag.object:null;if(!r)return;r.type==="MemberExpression"&&fe(r.object)&&me(r.property)&&e.report({node:r.property,messageId:"noFocusedTests",fix:o=>s?o.removeRange([r.property.range[0]-1,r.property.range[1]]):null})}}},CallExpression(t){if(t.callee.type==="CallExpression"){const{callee:n}=t.callee;if(n.type==="MemberExpression"&&n.object.type==="MemberExpression"&&fe(n.object.object)&&me(n.object.property)&&n.property.type==="Identifier"&&n.property.name==="each"){const r=n.object.property;e.report({node:n.object.property,messageId:"noFocusedTests",fix:o=>s?o.removeRange([r.range[0]-1,r.range[1]]):null})}}}}}}),ye="no-conditional-tests",dn=p({name:ye,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(e){return{Identifier:function(s){["test","it","describe"].includes(s.name)&&s.parent?.parent?.parent?.parent?.type==="IfStatement"&&e.report({node:s,messageId:"noConditionalTests"})}}}}),fn={typecheck:!1};function z(e){const s=typeof e.vitest!="object"||e.vitest===null?{}:e.vitest;return{...fn,...s}}const Y="expect-expect",mn=p({name:Y,meta:{type:"suggestion",docs:{description:"enforce having expectation in test body",recommended:!1},schema:[{type:"object",properties:{assertFunctionNames:{type:"array",items:{type:"string"}},additionalTestBlockFunctions:{type:"array",items:{type:"string"}}},additionalProperties:!1}],messages:{noAssertions:"Test has no assertions"}},defaultOptions:[{assertFunctionNames:["expect","assert"],additionalTestBlockFunctions:[]}],create(e,[{assertFunctionNames:s=["expect"],additionalTestBlockFunctions:t=[]}]){const n=[];z(e.settings).typecheck&&s.push("expectTypeOf","assertType");const r=s.map(yn);function o(a){for(const c of a){const l=c.type===i.CallExpression?n.indexOf(c):-1;if(c.type===i.FunctionDeclaration){const d=e.sourceCode.getDeclaredVariables(c),f=ce(d,e);o(f)}if(l!==-1){n.splice(l,1);break}}}return{CallExpression(a){if(a.callee.type===i.Identifier&&a.callee.name==="bench"||a?.callee?.type===i.MemberExpression&&a.callee.property.type===i.Identifier&&a.callee.property.name==="extend"||a?.callee?.type===i.MemberExpression&&a.callee.property.type===i.Identifier&&a.callee.property.name==="skip")return;const c=R(a)??"";if(E(a,e,["test"])||t.includes(c)){if(a.callee.type===i.MemberExpression&&v(a.callee.property,"todo"))return;n.push(a)}else r.some(l=>l.test(c))&&o(e.sourceCode.getAncestors(a))},"Program:exit"(){n.forEach(a=>{e.report({node:a.callee,messageId:"noAssertions"})})}}}});function yn(e){const s=e.split(".").map(t=>t==="**"?"[_a-z\\d\\.]*":t.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${s.join("\\.")}(\\.|$)`,"ui")}const he="consistent-test-it",Ut=(e,s,t)=>n=>[n.replaceText(e.type===i.MemberExpression?e.object:e,hn(s,t))];function hn(e,s){return e===q.fit?"test.only":e.startsWith("f")||e.startsWith("x")?e.charAt(0)+s:s}function ge(e){return e===q.test?q.it:q.test}const gn=p({name:he,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using test or it but not both",recommended:!1},messages:{consistentMethod:"Prefer using {{ testFnKeyWork }} instead of {{ oppositeTestKeyword }}",consistentMethodWithinDescribe:"Prefer using {{ testKeywordWithinDescribe }} instead of {{ oppositeTestKeyword }} within describe"},schema:[{type:"object",properties:{fn:{type:"string",enum:[q.test,q.it]},withinDescribe:{type:"string",enum:[q.test,q.it]}},additionalProperties:!1}]},defaultOptions:[{fn:q.test,withinDescribe:q.it}],create(e){const s=e.options[0]??{},t=s.fn||q.test,n=s?.withinDescribe||s?.fn||q?.it,r=t===n?t:void 0;let o=0;return{ImportDeclaration(a){if(r==null||a.source.type!=="Literal"||a.source.value!=="vitest")return;const c=ge(r);for(const l of a.specifiers)l.type==="ImportSpecifier"&&l.imported.type==="Identifier"&&l.local.name===l.imported.name&&l.local.name===c&&e.report({node:l,data:{testFnKeyWork:t,oppositeTestKeyword:c},messageId:"consistentMethod",fix:d=>{const f=a.specifiers.filter(u=>u.local.name!==c);if(f.length>0){const u=f.map(m=>m.local.name).join(", "),x=a.specifiers.at(-1)?.range;return x?d.replaceTextRange([a.specifiers[0].range[0],x[1]],u):null}return d.replaceText(l.local,r)}})},CallExpression(a){if(a.callee.type===i.Identifier&&a.callee.name==="bench")return;const c=h(a,e);if(!c)return;if(c.type==="describe"){o++;return}const l=a.callee.type===i.TaggedTemplateExpression?a.callee.tag:a.callee.type===i.CallExpression?a.callee.callee:a.callee;if(c.type==="test"&&o===0&&!c.name.endsWith(t)){const d=ge(t);e.report({node:a.callee,data:{testFnKeyWork:t,oppositeTestKeyword:d},messageId:"consistentMethod",fix:Ut(l,c.name,t)})}else if(c.type==="test"&&o>0&&!c.name.endsWith(n)){const d=ge(n);e.report({messageId:"consistentMethodWithinDescribe",node:a.callee,data:{testKeywordWithinDescribe:n,oppositeTestKeyword:d},fix:Ut(l,c.name,n)})}},"CallExpression:exit"(a){E(a,e,["describe"])&&o--}}}}),ke="consistent-vitest-vi",kn=e=>e===_.vi?_.vitest:_.vi,bn=p({name:ke,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using vitest or vi but not both",recommended:!1},messages:{consistentUtil:"Prefer using {{ utilKeyword }} instead of {{ oppositeUtilKeyword }}"},schema:[{type:"object",properties:{fn:{type:"string",enum:[_.vi,_.vitest]}},additionalProperties:!1}]},defaultOptions:[{fn:_.vi}],create(e){const s=(e.options[0]??{}).fn||_.vi,t=kn(s);return{ImportDeclaration(n){if(!(n.source.type!==i.Literal||n.source.value!=="vitest"))for(const r of n.specifiers)r.type===i.ImportSpecifier&&r.imported.type===i.Identifier&&r.local.name===r.imported.name&&r.imported.name===t&&e.report({node:r,messageId:"consistentUtil",data:{utilKeyword:s,oppositeUtilKeyword:t},fix:o=>{const a=n.specifiers.filter(c=>c.local.name!==t);if(a.length>0){const c=a.map(d=>d.local.name).join(", "),l=n.specifiers.at(-1)?.range;return l?o.replaceTextRange([n.specifiers[0].range[0],l[1]],c):null}return o.replaceText(r.local,s)}})},CallExpression(n){if(h(n,e)?.type!==t)return;const r=n.callee.type===i.MemberExpression?n.callee.object:n.callee;e.report({node:r,data:{utilKeyword:s,oppositeUtilKeyword:t},messageId:"consistentUtil",fix:o=>o.replaceText(r,s)})}}}}),be="prefer-to-be",xn=e=>e.type===i.Literal&&e.value===null,In=e=>xn(P(e)),jt=(e,s)=>L(P(e),s),qn=e=>Math.floor(e)!==Math.ceil(e),En=e=>{let s=P(e);return s.type===i.Literal&&typeof s.value=="number"&&qn(s.value)?!1:(s.type===i.UnaryExpression&&s.operator==="-"&&(s=s.argument),s.type===i.Literal?!("regex"in s):s.type===i.TemplateLiteral)},K=(e,s,t,n,r)=>{e.report({messageId:`useToBe${s}`,fix(o){const a=[G(o,t.matcher,`toBe${s}`)];return t.args?.length&&s!==""&&a.push($t(o,e,n,0)),r&&a.push(o.removeRange([r.range[0]-1,r.range[1]])),a},node:t.matcher})},Tn=p({name:be,meta:{type:"suggestion",docs:{description:"enforce using toBe()",recommended:!1},schema:[],fixable:"code",messages:{useToBe:"Use `toBe` instead",useToBeUndefined:"Use `toBeUndefined()` instead",useToBeDefined:"Use `toBeDefined()` instead",useToBeNull:"Use `toBeNull()` instead",useToBeNaN:"Use `toBeNaN()` instead"}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const n=y(t.matcher),r=t.modifiers.find(o=>y(o)==="not");if(r&&["toBeUndefined","toBeDefined"].includes(n)){K(e,n==="toBeDefined"?"Undefined":"Defined",t,s,r);return}if(!(!F.hasOwnProperty(n)||t.args.length===0)){if(In(t)){K(e,"Null",t,s);return}if(jt(t,"undefined")){K(e,r?"Defined":"Undefined",t,s);return}if(jt(t,"NaN")){K(e,"NaN",t,s);return}En(t)&&n!==F.toBe&&K(e,"",t,s)}}}}}),xe="no-hooks",wn=p({name:xe,meta:{type:"suggestion",docs:{description:"disallow setup and teardown hooks",recommended:!1},schema:[{type:"object",properties:{allow:{type:"array",contains:["beforeAll","beforeEach","afterAll","afterEach"]}},additionalProperties:!1}],messages:{unexpectedHook:"Unexpected '{{ hookName }}' hook"}},defaultOptions:[{allow:[]}],create(e,[{allow:s=[]}]){return{CallExpression(t){const n=h(t,e);n?.type==="hook"&&!s.includes(n.name)&&e.report({node:t,messageId:"unexpectedHook",data:{hookName:n.name}})}}}}),Ie="no-restricted-vi-methods",An=p({name:Ie,meta:{type:"suggestion",docs:{description:"disallow specific `vi.` methods",recommended:!1},schema:[{type:"object",additionalProperties:{type:["string","null"]}}],messages:{restrictedViMethod:"Use of `{{ restriction }}` is disallowed",restrictedViMethodWithMessage:"{{ message }}"}},defaultOptions:[{}],create(e,[s]){return{CallExpression(t){const n=h(t,e);if(n?.type!=="vi"||n.members.length===0)return;const r=y(n.members[0]);if(r in s){const o=s[r];e.report({messageId:o?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:o,restriction:r},loc:{start:n.members[0].loc.start,end:n.members[n.members.length-1].loc.end}})}}}}}),qe="consistent-test-filename",_t=/.*\.test\.[tj]sx?$/,J=/.*\.(test|spec)\.[tj]sx?$/,Cn=p({name:qe,meta:{type:"problem",docs:{recommended:!1,requiresTypeChecking:!1,description:"require .spec test file pattern"},messages:{consistentTestFilename:"Use test file name pattern {{ pattern }}"},schema:[{type:"object",additionalProperties:!1,properties:{pattern:{format:"regex",default:_t.source},allTestPattern:{format:"regex",default:J.source}}}]},defaultOptions:[{pattern:J.source,allTestPattern:J.source}],create:e=>{const s=e.options[0]??{},{pattern:t=_t,allTestPattern:n=J}=s,r=typeof t=="string"?new RegExp(t):t,o=typeof n=="string"?new RegExp(n):n,{filename:a}=e;return o.test(a)?{Program:c=>{r.test(a)||e.report({node:c,messageId:"consistentTestFilename",data:{pattern:r.source}})}}:{}}}),Ee="max-expects",vn=p({name:Ee,meta:{docs:{requiresTypeChecking:!1,recommended:!1,description:"enforce a maximum number of expect per test"},messages:{maxExpect:"Too many assertion calls ({{ count }}) - maximum allowed is {{ max }}"},type:"suggestion",schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}]},defaultOptions:[{max:5}],create(e,[{max:s}]){let t=0;const n=r=>{(r.parent?.type!==i.CallExpression||E(r.parent,e,["test"]))&&(t=0)};return{FunctionExpression:n,"FunctionExpression:exit":n,ArrowFunctionExpression:n,"ArrowFunctionExpression:exit":n,CallExpression(r){const o=h(r,e);o?.type!=="expect"||o.head.node.parent?.type===i.MemberExpression||(t+=1,t>s&&e.report({node:r,messageId:"maxExpect",data:{count:t,max:s}}))}}}}),Te="no-alias-methods",Sn=p({name:Te,meta:{docs:{description:"disallow alias methods",requiresTypeChecking:!1,recommended:!1},messages:{noAliasMethods:"Replace {{ alias }}() with its canonical name {{ canonical }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){const s={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(t){const n=h(t,e);if(n?.type!=="expect")return;const{matcher:r}=n,o=y(r);if(o in s){const a=s[o];e.report({messageId:"noAliasMethods",data:{alias:o,canonical:a},node:r,fix:c=>[G(c,r,a)]})}}}}}),Q="no-commented-out-tests";function Mn(e){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(e.value)}const $n=p({name:Q,meta:{docs:{description:"disallow commented out tests",requiresTypeChecking:!1,recommended:!1},messages:{noCommentedOutTests:"Remove commented out tests - you may want to use `skip` or `only` instead"},schema:[],type:"suggestion"},defaultOptions:[],create(e){const{sourceCode:s}=e;function t(n){Mn(n)&&e.report({messageId:"noCommentedOutTests",node:n})}return{Program(){s.getAllComments().forEach(t)}}}}),we="no-conditional-expect",Dt=e=>e.callee.type===i.MemberExpression&&v(e.callee.property,"catch"),On=p({name:we,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(e){let s=0,t=!1,n=!1;const r=()=>t&&s++,o=()=>t&&s--;return{FunctionDeclaration(a){const c=e.sourceCode.getDeclaredVariables(a);ce(c,e).length>0&&(t=!0)},CallExpression(a){const{type:c}=h(a,e)??{};c==="test"&&(t=!0),Dt(a)&&(n=!0),t&&c==="expect"&&s>0&&e.report({messageId:"noConditionalExpect",node:a}),n&&c==="expect"&&e.report({messageId:"noConditionalExpect",node:a})},"CallExpression:exit"(a){E(a,e,["test"])&&(t=!1),Dt(a)&&(n=!1)},CatchClause:r,"CatchClause:exit":o,IfStatement:r,"IfStatement:exit":o,SwitchStatement:r,"SwitchStatement:exit":o,ConditionalExpression:r,"ConditionalExpression:exit":o,LogicalExpression:r,"LogicalExpression:exit":o}}}),Z="no-import-node-test",Rn=p({name:Z,meta:{docs:{description:"disallow importing `node:test`",recommended:!1},type:"suggestion",messages:{noImportNodeTest:"Import from `vitest` instead of `node:test`"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{ImportDeclaration(s){s.source.value==="node:test"&&e.report({messageId:"noImportNodeTest",node:s,fix:t=>t.replaceText(s.source,s.source.raw.replace("node:test","vitest"))})}}}}),Ae=new Set(["suite","test","chai","describe","it","expectTypeOf","assertType","expect","assert","vitest","vi","beforeAll","afterAll","beforeEach","afterEach","onTestFailed","onTestFinished"]),Wt=e=>e.source.value==="vitest",Ce=e=>e.type===i.ImportSpecifier&&e.imported.type===i.Identifier&&Ae.has(e.imported.name),ve=e=>e.type===i.Property&&e.key.type===i.Identifier&&Ae.has(e.key.name),Nn=e=>e.callee.type===i.Identifier&&Ae.has(e.callee.name),Se=e=>{if(e?.type!==i.CallExpression||e.callee.type!==i.Identifier||e.callee.name!=="require")return!1;const s=e.arguments;return s.length===1&&s[0].type===i.Literal&&s[0].value==="vitest"},Vt=e=>e.type===i.ObjectPattern,Bn=(e,s)=>{const t=s.parent,n=t.declarations;if(n.length===1)return e.remove(t);const r=n.findIndex(o=>o.range[0]===s.range[0]&&o.range[1]===s.range[1]);if(r===0){const o=n[1];return e.removeRange([s.range[0],o.range[0]])}else{const o=n[r-1];return e.removeRange([o.range[1],s.range[1]])}},Ht=(e,s,t)=>{const n=s.indexOf(t);if(n===-1)throw new Error("Target node not found in nodes array");if(n===0){const r=s[1];return e.removeRange([t.range[0],r.range[0]])}else{const r=s[n-1];return e.removeRange([r.range[1],t.range[1]])}},Me="no-importing-vitest-globals",Ln=p({name:Me,meta:{type:"suggestion",docs:{description:"disallow importing Vitest globals",recommended:!1},messages:{noImportingVitestGlobals:"Do not import '{{name}}' from 'vitest'. Use globals configuration instead.",noRequiringVitestGlobals:"Do not require '{{name}}' from 'vitest'. Use globals configuration instead."},fixable:"code",schema:[]},defaultOptions:[],create(e){return{ImportDeclaration(s){if(!Wt(s))return;const t=s.specifiers;for(const n of t)Ce(n)&&e.report({node:n,messageId:"noImportingVitestGlobals",data:{name:n.imported.name},fix(r){return t.every(o=>Ce(o))?r.remove(s):Ht(r,t,n)}})},VariableDeclarator(s){if(!Se(s.init)||!Vt(s.id))return;const t=s.id.properties;for(const n of t)ve(n)&&e.report({node:n,messageId:"noRequiringVitestGlobals",data:{name:n.key.name},fix(r){return t.every(o=>ve(o))?Bn(r,s):Ht(r,t,n)}})}}}}),$e="prefer-importing-vitest-globals",Fn=p({name:$e,meta:{type:"suggestion",docs:{description:"enforce importing Vitest globals",recommended:!1},messages:{preferImportingVitestGlobals:"Import '{{name}}' from 'vitest'"},schema:[],fixable:"code"},defaultOptions:[],create(e){const s=new Set;let t,n;return{ImportDeclaration(r){if(!Wt(r))return;const o=r.specifiers;for(const a of o)if(Ce(a)){const c=a.imported.name;s.add(c)}t=r.specifiers},VariableDeclarator(r){if(!Se(r.init)||!Vt(r.id))return;const o=r.id.properties;for(const a of o)if(ve(a)){const c=a.key.name;s.add(c)}n=o},CallExpression(r){if(!Nn(r))return;const o=r.callee.name;if(s.has(o))return;const a=e.sourceCode.getScope(r).set.get(o);a&&a.defs.length>0&&a.defs.some(c=>!(c.type==="ImportBinding"||c.type==="Variable"&&c.node.init&&Se(c.node.init)))||e.report({node:r.callee,messageId:"preferImportingVitestGlobals",data:{name:o},fix(c){const l=e.sourceCode.ast;if(!t)if(n){const u=n[n.length-1];return c.insertTextAfter(u,`, ${o}`)}else return c.insertTextBefore(l.body[0],`import { ${o} } from 'vitest';
|
|
1
|
+
import{ESLintUtils as ie,AST_NODE_TYPES as i,AST_TOKEN_TYPES as St}from"@typescript-eslint/utils";import U from"typescript";import{isAbsolute as Fs,posix as Ps}from"node:path";import{createRequire as Mt}from"node:module";const Us="1.3.2",p=ie.RuleCreator(e=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${e}.md`),js=(e,s)=>e&&s?`${e}.${s}`:null,M=e=>e.type===i.FunctionExpression||e.type===i.ArrowFunctionExpression;function R(e){if(v(e))return y(e);switch(e.type){case i.TaggedTemplateExpression:return R(e.tag);case i.MemberExpression:return js(R(e.object),R(e.property));case i.NewExpression:case i.CallExpression:return R(e.callee)}return null}const v=(e,s)=>L(e,s)||B(e,s),L=(e,s)=>e.type===i.Identifier&&(s===void 0||e.name===s),_s=(e,s)=>e.type===i.TemplateLiteral&&e.quasis.length===1&&(s===void 0||e.quasis[0].value.raw===s),Ds=(e,s)=>e.type===i.Literal&&typeof e.value=="string"&&(s===void 0||e.value===s),B=(e,s)=>Ds(e,s)||_s(e,s),y=e=>e.type===i.Identifier?e.name:j(e),j=e=>e?.type===i.TemplateLiteral?e.quasis[0].value.raw:e?.value,G=(e,s,t)=>e.replaceText(s,s.type===i.Identifier?t:`'${t}'`),$t=(e,s,t,n)=>{const r=t.arguments[n],o=t.arguments[t.arguments.length-1],{sourceCode:a}=s;let c=a.getTokenAfter(o);return c.value===","&&(c=a.getTokenAfter(c)),e.removeRange([r.range[0],c.range[0]])},Ws=(e,s)=>y(e.matcher)==="toBeInstanceOf"&&e.args.length===1&&v(e.args[0],s);var _=(e=>(e.vi="vi",e.vitest="vitest",e))(_||{}),V=(e=>(e.describe="describe",e.fdescribe="fdescribe",e.xdescribe="xdescribe",e))(V||{}),q=(e=>(e.fit="fit",e.it="it",e.test="test",e.xit="xit",e.xtest="xtest",e.bench="bench",e))(q||{}),Ot=(e=>(e.beforeAll="beforeAll",e.beforeEach="beforeEach",e.afterAll="afterAll",e.afterEach="afterEach",e))(Ot||{}),N=(e=>(e.to="to",e.have="have",e.not="not",e.rejects="rejects",e.resolves="resolves",e.returns="returns",e.branded="branded",e.asserts="asserts",e.constructorParameters="constructorParameters",e.parameters="parameters",e.thisParameter="thisParameter",e.guards="guards",e.instance="instance",e.items="items",e))(N||{}),F=(e=>(e.toBe="toBe",e.toEqual="toEqual",e.toStrictEqual="toStrictEqual",e))(F||{});function Rt(e){return e.getCallSignatures().length>0?!0:e.getSymbol()?.getDeclarations()?.some(s=>U.isArrowFunction(s)||U.isClassDeclaration(s)||U.isClassExpression(s)||U.isFunctionDeclaration(s)||U.isFunctionExpression(s)||U.isMethodDeclaration(s)||U.isFunctionTypeNode(s))??!1}const Vs=new Set(["beforeEach","beforeAll","afterEach","afterAll","it","it.skip","it.only","it.concurrent","it.sequential","it.todo","it.fails","it.extend","it.skipIf","it.runIf","it.each","it.skip.only","it.skip.concurrent","it.skip.sequential","it.skip.todo","it.skip.fails","it.only.skip","it.only.concurrent","it.only.sequential","it.only.todo","it.only.fails","it.concurrent.skip","it.concurrent.only","it.concurrent.sequential","it.concurrent.todo","it.concurrent.fails","it.sequential.skip","it.sequential.only","it.sequential.concurrent","it.sequential.todo","it.sequential.fails","it.todo.skip","it.todo.only","it.todo.concurrent","it.todo.sequential","it.todo.fails","it.fails.skip","it.fails.only","it.fails.concurrent","it.fails.sequential","it.fails.todo","it.extend.skip","it.extend.only","it.extend.concurrent","it.extend.sequential","it.extend.todo","it.extend.fails","it.skipIf.skip","it.skipIf.only","it.skipIf.concurrent","it.skipIf.sequential","it.skipIf.todo","it.skipIf.fails","it.runIf.skip","it.runIf.only","it.runIf.concurrent","it.runIf.sequential","it.runIf.todo","it.runIf.fails","it.skip.each","it.only.each","it.concurrent.each","it.sequential.each","it.todo.each","it.fails.each","it.extend.skipIf","it.extend.runIf","it.extend.each","it.skipIf.each","it.runIf.each","it.skip.only.concurrent","it.skip.only.sequential","it.skip.only.todo","it.skip.only.fails","it.skip.concurrent.only","it.skip.concurrent.sequential","it.skip.concurrent.todo","it.skip.concurrent.fails","it.skip.sequential.only","it.skip.sequential.concurrent","it.skip.sequential.todo","it.skip.sequential.fails","it.skip.todo.only","it.skip.todo.concurrent","it.skip.todo.sequential","it.skip.todo.fails","it.skip.fails.only","it.skip.fails.concurrent","it.skip.fails.sequential","it.skip.fails.todo","it.only.skip.concurrent","it.only.skip.sequential","it.only.skip.todo","it.only.skip.fails","it.only.concurrent.skip","it.only.concurrent.sequential","it.only.concurrent.todo","it.only.concurrent.fails","it.only.sequential.skip","it.only.sequential.concurrent","it.only.sequential.todo","it.only.sequential.fails","it.only.todo.skip","it.only.todo.concurrent","it.only.todo.sequential","it.only.todo.fails","it.only.fails.skip","it.only.fails.concurrent","it.only.fails.sequential","it.only.fails.todo","it.concurrent.skip.only","it.concurrent.skip.sequential","it.concurrent.skip.todo","it.concurrent.skip.fails","it.concurrent.only.skip","it.concurrent.only.sequential","it.concurrent.only.todo","it.concurrent.only.fails","it.concurrent.sequential.skip","it.concurrent.sequential.only","it.concurrent.sequential.todo","it.concurrent.sequential.fails","it.concurrent.todo.skip","it.concurrent.todo.only","it.concurrent.todo.sequential","it.concurrent.todo.fails","it.concurrent.fails.skip","it.concurrent.fails.only","it.concurrent.fails.sequential","it.concurrent.fails.todo","it.sequential.skip.only","it.sequential.skip.concurrent","it.sequential.skip.todo","it.sequential.skip.fails","it.sequential.only.skip","it.sequential.only.concurrent","it.sequential.only.todo","it.sequential.only.fails","it.sequential.concurrent.skip","it.sequential.concurrent.only","it.sequential.concurrent.todo","it.sequential.concurrent.fails","it.sequential.todo.skip","it.sequential.todo.only","it.sequential.todo.concurrent","it.sequential.todo.fails","it.sequential.fails.skip","it.sequential.fails.only","it.sequential.fails.concurrent","it.sequential.fails.todo","it.todo.skip.only","it.todo.skip.concurrent","it.todo.skip.sequential","it.todo.skip.fails","it.todo.only.skip","it.todo.only.concurrent","it.todo.only.sequential","it.todo.only.fails","it.todo.concurrent.skip","it.todo.concurrent.only","it.todo.concurrent.sequential","it.todo.concurrent.fails","it.todo.sequential.skip","it.todo.sequential.only","it.todo.sequential.concurrent","it.todo.sequential.fails","it.todo.fails.skip","it.todo.fails.only","it.todo.fails.concurrent","it.todo.fails.sequential","it.fails.skip.only","it.fails.skip.concurrent","it.fails.skip.sequential","it.fails.skip.todo","it.fails.only.skip","it.fails.only.concurrent","it.fails.only.sequential","it.fails.only.todo","it.fails.concurrent.skip","it.fails.concurrent.only","it.fails.concurrent.sequential","it.fails.concurrent.todo","it.fails.sequential.skip","it.fails.sequential.only","it.fails.sequential.concurrent","it.fails.sequential.todo","it.fails.todo.skip","it.fails.todo.only","it.fails.todo.concurrent","it.fails.todo.sequential","it.extend.skip.only","it.extend.skip.concurrent","it.extend.skip.sequential","it.extend.skip.todo","it.extend.skip.fails","it.extend.only.skip","it.extend.only.concurrent","it.extend.only.sequential","it.extend.only.todo","it.extend.only.fails","it.extend.concurrent.skip","it.extend.concurrent.only","it.extend.concurrent.sequential","it.extend.concurrent.todo","it.extend.concurrent.fails","it.extend.sequential.skip","it.extend.sequential.only","it.extend.sequential.concurrent","it.extend.sequential.todo","it.extend.sequential.fails","it.extend.todo.skip","it.extend.todo.only","it.extend.todo.concurrent","it.extend.todo.sequential","it.extend.todo.fails","it.extend.fails.skip","it.extend.fails.only","it.extend.fails.concurrent","it.extend.fails.sequential","it.extend.fails.todo","it.skipIf.skip.only","it.skipIf.skip.concurrent","it.skipIf.skip.sequential","it.skipIf.skip.todo","it.skipIf.skip.fails","it.skipIf.only.skip","it.skipIf.only.concurrent","it.skipIf.only.sequential","it.skipIf.only.todo","it.skipIf.only.fails","it.skipIf.concurrent.skip","it.skipIf.concurrent.only","it.skipIf.concurrent.sequential","it.skipIf.concurrent.todo","it.skipIf.concurrent.fails","it.skipIf.sequential.skip","it.skipIf.sequential.only","it.skipIf.sequential.concurrent","it.skipIf.sequential.todo","it.skipIf.sequential.fails","it.skipIf.todo.skip","it.skipIf.todo.only","it.skipIf.todo.concurrent","it.skipIf.todo.sequential","it.skipIf.todo.fails","it.skipIf.fails.skip","it.skipIf.fails.only","it.skipIf.fails.concurrent","it.skipIf.fails.sequential","it.skipIf.fails.todo","it.runIf.skip.only","it.runIf.skip.concurrent","it.runIf.skip.sequential","it.runIf.skip.todo","it.runIf.skip.fails","it.runIf.only.skip","it.runIf.only.concurrent","it.runIf.only.sequential","it.runIf.only.todo","it.runIf.only.fails","it.runIf.concurrent.skip","it.runIf.concurrent.only","it.runIf.concurrent.sequential","it.runIf.concurrent.todo","it.runIf.concurrent.fails","it.runIf.sequential.skip","it.runIf.sequential.only","it.runIf.sequential.concurrent","it.runIf.sequential.todo","it.runIf.sequential.fails","it.runIf.todo.skip","it.runIf.todo.only","it.runIf.todo.concurrent","it.runIf.todo.sequential","it.runIf.todo.fails","it.runIf.fails.skip","it.runIf.fails.only","it.runIf.fails.concurrent","it.runIf.fails.sequential","it.runIf.fails.todo","it.skip.only.each","it.skip.concurrent.each","it.skip.sequential.each","it.skip.todo.each","it.skip.fails.each","it.only.skip.each","it.only.concurrent.each","it.only.sequential.each","it.only.todo.each","it.only.fails.each","it.concurrent.skip.each","it.concurrent.only.each","it.concurrent.sequential.each","it.concurrent.todo.each","it.concurrent.fails.each","it.sequential.skip.each","it.sequential.only.each","it.sequential.concurrent.each","it.sequential.todo.each","it.sequential.fails.each","it.todo.skip.each","it.todo.only.each","it.todo.concurrent.each","it.todo.sequential.each","it.todo.fails.each","it.fails.skip.each","it.fails.only.each","it.fails.concurrent.each","it.fails.sequential.each","it.fails.todo.each","it.extend.skipIf.skip","it.extend.skipIf.only","it.extend.skipIf.concurrent","it.extend.skipIf.sequential","it.extend.skipIf.todo","it.extend.skipIf.fails","it.extend.runIf.skip","it.extend.runIf.only","it.extend.runIf.concurrent","it.extend.runIf.sequential","it.extend.runIf.todo","it.extend.runIf.fails","it.extend.skip.each","it.extend.only.each","it.extend.concurrent.each","it.extend.sequential.each","it.extend.todo.each","it.extend.fails.each","it.skipIf.skip.each","it.skipIf.only.each","it.skipIf.concurrent.each","it.skipIf.sequential.each","it.skipIf.todo.each","it.skipIf.fails.each","it.runIf.skip.each","it.runIf.only.each","it.runIf.concurrent.each","it.runIf.sequential.each","it.runIf.todo.each","it.runIf.fails.each","it.extend.skipIf.each","it.extend.runIf.each","test","test.skip","test.only","test.concurrent","test.sequential","test.todo","test.fails","test.extend","test.skipIf","test.runIf","test.each","test.skip.only","test.skip.concurrent","test.skip.sequential","test.skip.todo","test.skip.fails","test.only.skip","test.only.concurrent","test.only.sequential","test.only.todo","test.only.fails","test.concurrent.skip","test.concurrent.only","test.concurrent.sequential","test.concurrent.todo","test.concurrent.fails","test.sequential.skip","test.sequential.only","test.sequential.concurrent","test.sequential.todo","test.sequential.fails","test.todo.skip","test.todo.only","test.todo.concurrent","test.todo.sequential","test.todo.fails","test.fails.skip","test.fails.only","test.fails.concurrent","test.fails.sequential","test.fails.todo","test.extend.skip","test.extend.only","test.extend.concurrent","test.extend.sequential","test.extend.todo","test.extend.fails","test.skipIf.skip","test.skipIf.only","test.skipIf.concurrent","test.skipIf.sequential","test.skipIf.todo","test.skipIf.fails","test.runIf.skip","test.runIf.only","test.runIf.concurrent","test.runIf.sequential","test.runIf.todo","test.runIf.fails","test.skip.each","test.only.each","test.concurrent.each","test.sequential.each","test.todo.each","test.fails.each","test.extend.skipIf","test.extend.runIf","test.extend.each","test.skipIf.each","test.runIf.each","test.skip.only.concurrent","test.skip.only.sequential","test.skip.only.todo","test.skip.only.fails","test.skip.concurrent.only","test.skip.concurrent.sequential","test.skip.concurrent.todo","test.skip.concurrent.fails","test.skip.sequential.only","test.skip.sequential.concurrent","test.skip.sequential.todo","test.skip.sequential.fails","test.skip.todo.only","test.skip.todo.concurrent","test.skip.todo.sequential","test.skip.todo.fails","test.skip.fails.only","test.skip.fails.concurrent","test.skip.fails.sequential","test.skip.fails.todo","test.only.skip.concurrent","test.only.skip.sequential","test.only.skip.todo","test.only.skip.fails","test.only.concurrent.skip","test.only.concurrent.sequential","test.only.concurrent.todo","test.only.concurrent.fails","test.only.sequential.skip","test.only.sequential.concurrent","test.only.sequential.todo","test.only.sequential.fails","test.only.todo.skip","test.only.todo.concurrent","test.only.todo.sequential","test.only.todo.fails","test.only.fails.skip","test.only.fails.concurrent","test.only.fails.sequential","test.only.fails.todo","test.concurrent.skip.only","test.concurrent.skip.sequential","test.concurrent.skip.todo","test.concurrent.skip.fails","test.concurrent.only.skip","test.concurrent.only.sequential","test.concurrent.only.todo","test.concurrent.only.fails","test.concurrent.sequential.skip","test.concurrent.sequential.only","test.concurrent.sequential.todo","test.concurrent.sequential.fails","test.concurrent.todo.skip","test.concurrent.todo.only","test.concurrent.todo.sequential","test.concurrent.todo.fails","test.concurrent.fails.skip","test.concurrent.fails.only","test.concurrent.fails.sequential","test.concurrent.fails.todo","test.sequential.skip.only","test.sequential.skip.concurrent","test.sequential.skip.todo","test.sequential.skip.fails","test.sequential.only.skip","test.sequential.only.concurrent","test.sequential.only.todo","test.sequential.only.fails","test.sequential.concurrent.skip","test.sequential.concurrent.only","test.sequential.concurrent.todo","test.sequential.concurrent.fails","test.sequential.todo.skip","test.sequential.todo.only","test.sequential.todo.concurrent","test.sequential.todo.fails","test.sequential.fails.skip","test.sequential.fails.only","test.sequential.fails.concurrent","test.sequential.fails.todo","test.todo.skip.only","test.todo.skip.concurrent","test.todo.skip.sequential","test.todo.skip.fails","test.todo.only.skip","test.todo.only.concurrent","test.todo.only.sequential","test.todo.only.fails","test.todo.concurrent.skip","test.todo.concurrent.only","test.todo.concurrent.sequential","test.todo.concurrent.fails","test.todo.sequential.skip","test.todo.sequential.only","test.todo.sequential.concurrent","test.todo.sequential.fails","test.todo.fails.skip","test.todo.fails.only","test.todo.fails.concurrent","test.todo.fails.sequential","test.fails.skip.only","test.fails.skip.concurrent","test.fails.skip.sequential","test.fails.skip.todo","test.fails.only.skip","test.fails.only.concurrent","test.fails.only.sequential","test.fails.only.todo","test.fails.concurrent.skip","test.fails.concurrent.only","test.fails.concurrent.sequential","test.fails.concurrent.todo","test.fails.sequential.skip","test.fails.sequential.only","test.fails.sequential.concurrent","test.fails.sequential.todo","test.fails.todo.skip","test.fails.todo.only","test.fails.todo.concurrent","test.fails.todo.sequential","test.extend.skip.only","test.extend.skip.concurrent","test.extend.skip.sequential","test.extend.skip.todo","test.extend.skip.fails","test.extend.only.skip","test.extend.only.concurrent","test.extend.only.sequential","test.extend.only.todo","test.extend.only.fails","test.extend.concurrent.skip","test.extend.concurrent.only","test.extend.concurrent.sequential","test.extend.concurrent.todo","test.extend.concurrent.fails","test.extend.sequential.skip","test.extend.sequential.only","test.extend.sequential.concurrent","test.extend.sequential.todo","test.extend.sequential.fails","test.extend.todo.skip","test.extend.todo.only","test.extend.todo.concurrent","test.extend.todo.sequential","test.extend.todo.fails","test.extend.fails.skip","test.extend.fails.only","test.extend.fails.concurrent","test.extend.fails.sequential","test.extend.fails.todo","test.skipIf.skip.only","test.skipIf.skip.concurrent","test.skipIf.skip.sequential","test.skipIf.skip.todo","test.skipIf.skip.fails","test.skipIf.only.skip","test.skipIf.only.concurrent","test.skipIf.only.sequential","test.skipIf.only.todo","test.skipIf.only.fails","test.skipIf.concurrent.skip","test.skipIf.concurrent.only","test.skipIf.concurrent.sequential","test.skipIf.concurrent.todo","test.skipIf.concurrent.fails","test.skipIf.sequential.skip","test.skipIf.sequential.only","test.skipIf.sequential.concurrent","test.skipIf.sequential.todo","test.skipIf.sequential.fails","test.skipIf.todo.skip","test.skipIf.todo.only","test.skipIf.todo.concurrent","test.skipIf.todo.sequential","test.skipIf.todo.fails","test.skipIf.fails.skip","test.skipIf.fails.only","test.skipIf.fails.concurrent","test.skipIf.fails.sequential","test.skipIf.fails.todo","test.runIf.skip.only","test.runIf.skip.concurrent","test.runIf.skip.sequential","test.runIf.skip.todo","test.runIf.skip.fails","test.runIf.only.skip","test.runIf.only.concurrent","test.runIf.only.sequential","test.runIf.only.todo","test.runIf.only.fails","test.runIf.concurrent.skip","test.runIf.concurrent.only","test.runIf.concurrent.sequential","test.runIf.concurrent.todo","test.runIf.concurrent.fails","test.runIf.sequential.skip","test.runIf.sequential.only","test.runIf.sequential.concurrent","test.runIf.sequential.todo","test.runIf.sequential.fails","test.runIf.todo.skip","test.runIf.todo.only","test.runIf.todo.concurrent","test.runIf.todo.sequential","test.runIf.todo.fails","test.runIf.fails.skip","test.runIf.fails.only","test.runIf.fails.concurrent","test.runIf.fails.sequential","test.runIf.fails.todo","test.skip.only.each","test.skip.concurrent.each","test.skip.sequential.each","test.skip.todo.each","test.skip.fails.each","test.only.skip.each","test.only.concurrent.each","test.only.sequential.each","test.only.todo.each","test.only.fails.each","test.concurrent.skip.each","test.concurrent.only.each","test.concurrent.sequential.each","test.concurrent.todo.each","test.concurrent.fails.each","test.sequential.skip.each","test.sequential.only.each","test.sequential.concurrent.each","test.sequential.todo.each","test.sequential.fails.each","test.todo.skip.each","test.todo.only.each","test.todo.concurrent.each","test.todo.sequential.each","test.todo.fails.each","test.fails.skip.each","test.fails.only.each","test.fails.concurrent.each","test.fails.sequential.each","test.fails.todo.each","test.extend.skipIf.skip","test.extend.skipIf.only","test.extend.skipIf.concurrent","test.extend.skipIf.sequential","test.extend.skipIf.todo","test.extend.skipIf.fails","test.extend.runIf.skip","test.extend.runIf.only","test.extend.runIf.concurrent","test.extend.runIf.sequential","test.extend.runIf.todo","test.extend.runIf.fails","test.extend.skip.each","test.extend.only.each","test.extend.concurrent.each","test.extend.sequential.each","test.extend.todo.each","test.extend.fails.each","test.skipIf.skip.each","test.skipIf.only.each","test.skipIf.concurrent.each","test.skipIf.sequential.each","test.skipIf.todo.each","test.skipIf.fails.each","test.runIf.skip.each","test.runIf.only.each","test.runIf.concurrent.each","test.runIf.sequential.each","test.runIf.todo.each","test.runIf.fails.each","test.extend.skipIf.each","test.extend.runIf.each","bench","bench.skip","bench.only","bench.todo","bench.skipIf","bench.runIf","bench.skip.only","bench.skip.todo","bench.only.skip","bench.only.todo","bench.todo.skip","bench.todo.only","bench.skipIf.skip","bench.skipIf.only","bench.skipIf.todo","bench.runIf.skip","bench.runIf.only","bench.runIf.todo","bench.skip.only.todo","bench.skip.todo.only","bench.only.skip.todo","bench.only.todo.skip","bench.todo.skip.only","bench.todo.only.skip","bench.skipIf.skip.only","bench.skipIf.skip.todo","bench.skipIf.only.skip","bench.skipIf.only.todo","bench.skipIf.todo.skip","bench.skipIf.todo.only","bench.runIf.skip.only","bench.runIf.skip.todo","bench.runIf.only.skip","bench.runIf.only.todo","bench.runIf.todo.skip","bench.runIf.todo.only","describe","describe.skip","describe.only","describe.concurrent","describe.sequential","describe.shuffle","describe.todo","describe.skipIf","describe.runIf","describe.each","describe.skip.only","describe.skip.concurrent","describe.skip.sequential","describe.skip.shuffle","describe.skip.todo","describe.only.skip","describe.only.concurrent","describe.only.sequential","describe.only.shuffle","describe.only.todo","describe.concurrent.skip","describe.concurrent.only","describe.concurrent.sequential","describe.concurrent.shuffle","describe.concurrent.todo","describe.sequential.skip","describe.sequential.only","describe.sequential.concurrent","describe.sequential.shuffle","describe.sequential.todo","describe.shuffle.skip","describe.shuffle.only","describe.shuffle.concurrent","describe.shuffle.sequential","describe.shuffle.todo","describe.todo.skip","describe.todo.only","describe.todo.concurrent","describe.todo.sequential","describe.todo.shuffle","describe.skipIf.skip","describe.skipIf.only","describe.skipIf.concurrent","describe.skipIf.sequential","describe.skipIf.shuffle","describe.skipIf.todo","describe.runIf.skip","describe.runIf.only","describe.runIf.concurrent","describe.runIf.sequential","describe.runIf.shuffle","describe.runIf.todo","describe.skip.each","describe.only.each","describe.concurrent.each","describe.sequential.each","describe.shuffle.each","describe.todo.each","describe.skipIf.each","describe.runIf.each","describe.skip.only.concurrent","describe.skip.only.sequential","describe.skip.only.shuffle","describe.skip.only.todo","describe.skip.concurrent.only","describe.skip.concurrent.sequential","describe.skip.concurrent.shuffle","describe.skip.concurrent.todo","describe.skip.sequential.only","describe.skip.sequential.concurrent","describe.skip.sequential.shuffle","describe.skip.sequential.todo","describe.skip.shuffle.only","describe.skip.shuffle.concurrent","describe.skip.shuffle.sequential","describe.skip.shuffle.todo","describe.skip.todo.only","describe.skip.todo.concurrent","describe.skip.todo.sequential","describe.skip.todo.shuffle","describe.only.skip.concurrent","describe.only.skip.sequential","describe.only.skip.shuffle","describe.only.skip.todo","describe.only.concurrent.skip","describe.only.concurrent.sequential","describe.only.concurrent.shuffle","describe.only.concurrent.todo","describe.only.sequential.skip","describe.only.sequential.concurrent","describe.only.sequential.shuffle","describe.only.sequential.todo","describe.only.shuffle.skip","describe.only.shuffle.concurrent","describe.only.shuffle.sequential","describe.only.shuffle.todo","describe.only.todo.skip","describe.only.todo.concurrent","describe.only.todo.sequential","describe.only.todo.shuffle","describe.concurrent.skip.only","describe.concurrent.skip.sequential","describe.concurrent.skip.shuffle","describe.concurrent.skip.todo","describe.concurrent.only.skip","describe.concurrent.only.sequential","describe.concurrent.only.shuffle","describe.concurrent.only.todo","describe.concurrent.sequential.skip","describe.concurrent.sequential.only","describe.concurrent.sequential.shuffle","describe.concurrent.sequential.todo","describe.concurrent.shuffle.skip","describe.concurrent.shuffle.only","describe.concurrent.shuffle.sequential","describe.concurrent.shuffle.todo","describe.concurrent.todo.skip","describe.concurrent.todo.only","describe.concurrent.todo.sequential","describe.concurrent.todo.shuffle","describe.sequential.skip.only","describe.sequential.skip.concurrent","describe.sequential.skip.shuffle","describe.sequential.skip.todo","describe.sequential.only.skip","describe.sequential.only.concurrent","describe.sequential.only.shuffle","describe.sequential.only.todo","describe.sequential.concurrent.skip","describe.sequential.concurrent.only","describe.sequential.concurrent.shuffle","describe.sequential.concurrent.todo","describe.sequential.shuffle.skip","describe.sequential.shuffle.only","describe.sequential.shuffle.concurrent","describe.sequential.shuffle.todo","describe.sequential.todo.skip","describe.sequential.todo.only","describe.sequential.todo.concurrent","describe.sequential.todo.shuffle","describe.shuffle.skip.only","describe.shuffle.skip.concurrent","describe.shuffle.skip.sequential","describe.shuffle.skip.todo","describe.shuffle.only.skip","describe.shuffle.only.concurrent","describe.shuffle.only.sequential","describe.shuffle.only.todo","describe.shuffle.concurrent.skip","describe.shuffle.concurrent.only","describe.shuffle.concurrent.sequential","describe.shuffle.concurrent.todo","describe.shuffle.sequential.skip","describe.shuffle.sequential.only","describe.shuffle.sequential.concurrent","describe.shuffle.sequential.todo","describe.shuffle.todo.skip","describe.shuffle.todo.only","describe.shuffle.todo.concurrent","describe.shuffle.todo.sequential","describe.todo.skip.only","describe.todo.skip.concurrent","describe.todo.skip.sequential","describe.todo.skip.shuffle","describe.todo.only.skip","describe.todo.only.concurrent","describe.todo.only.sequential","describe.todo.only.shuffle","describe.todo.concurrent.skip","describe.todo.concurrent.only","describe.todo.concurrent.sequential","describe.todo.concurrent.shuffle","describe.todo.sequential.skip","describe.todo.sequential.only","describe.todo.sequential.concurrent","describe.todo.sequential.shuffle","describe.todo.shuffle.skip","describe.todo.shuffle.only","describe.todo.shuffle.concurrent","describe.todo.shuffle.sequential","describe.skipIf.skip.only","describe.skipIf.skip.concurrent","describe.skipIf.skip.sequential","describe.skipIf.skip.shuffle","describe.skipIf.skip.todo","describe.skipIf.only.skip","describe.skipIf.only.concurrent","describe.skipIf.only.sequential","describe.skipIf.only.shuffle","describe.skipIf.only.todo","describe.skipIf.concurrent.skip","describe.skipIf.concurrent.only","describe.skipIf.concurrent.sequential","describe.skipIf.concurrent.shuffle","describe.skipIf.concurrent.todo","describe.skipIf.sequential.skip","describe.skipIf.sequential.only","describe.skipIf.sequential.concurrent","describe.skipIf.sequential.shuffle","describe.skipIf.sequential.todo","describe.skipIf.shuffle.skip","describe.skipIf.shuffle.only","describe.skipIf.shuffle.concurrent","describe.skipIf.shuffle.sequential","describe.skipIf.shuffle.todo","describe.skipIf.todo.skip","describe.skipIf.todo.only","describe.skipIf.todo.concurrent","describe.skipIf.todo.sequential","describe.skipIf.todo.shuffle","describe.runIf.skip.only","describe.runIf.skip.concurrent","describe.runIf.skip.sequential","describe.runIf.skip.shuffle","describe.runIf.skip.todo","describe.runIf.only.skip","describe.runIf.only.concurrent","describe.runIf.only.sequential","describe.runIf.only.shuffle","describe.runIf.only.todo","describe.runIf.concurrent.skip","describe.runIf.concurrent.only","describe.runIf.concurrent.sequential","describe.runIf.concurrent.shuffle","describe.runIf.concurrent.todo","describe.runIf.sequential.skip","describe.runIf.sequential.only","describe.runIf.sequential.concurrent","describe.runIf.sequential.shuffle","describe.runIf.sequential.todo","describe.runIf.shuffle.skip","describe.runIf.shuffle.only","describe.runIf.shuffle.concurrent","describe.runIf.shuffle.sequential","describe.runIf.shuffle.todo","describe.runIf.todo.skip","describe.runIf.todo.only","describe.runIf.todo.concurrent","describe.runIf.todo.sequential","describe.runIf.todo.shuffle","describe.skip.only.each","describe.skip.concurrent.each","describe.skip.sequential.each","describe.skip.shuffle.each","describe.skip.todo.each","describe.only.skip.each","describe.only.concurrent.each","describe.only.sequential.each","describe.only.shuffle.each","describe.only.todo.each","describe.concurrent.skip.each","describe.concurrent.only.each","describe.concurrent.sequential.each","describe.concurrent.shuffle.each","describe.concurrent.todo.each","describe.sequential.skip.each","describe.sequential.only.each","describe.sequential.concurrent.each","describe.sequential.shuffle.each","describe.sequential.todo.each","describe.shuffle.skip.each","describe.shuffle.only.each","describe.shuffle.concurrent.each","describe.shuffle.sequential.each","describe.shuffle.todo.each","describe.todo.skip.each","describe.todo.only.each","describe.todo.concurrent.each","describe.todo.sequential.each","describe.todo.shuffle.each","describe.skipIf.skip.each","describe.skipIf.only.each","describe.skipIf.concurrent.each","describe.skipIf.sequential.each","describe.skipIf.shuffle.each","describe.skipIf.todo.each","describe.runIf.skip.each","describe.runIf.only.each","describe.runIf.concurrent.each","describe.runIf.sequential.each","describe.runIf.shuffle.each","describe.runIf.todo.each","suite","suite.skip","suite.only","suite.concurrent","suite.sequential","suite.shuffle","suite.todo","suite.skipIf","suite.runIf","suite.each","suite.skip.only","suite.skip.concurrent","suite.skip.sequential","suite.skip.shuffle","suite.skip.todo","suite.only.skip","suite.only.concurrent","suite.only.sequential","suite.only.shuffle","suite.only.todo","suite.concurrent.skip","suite.concurrent.only","suite.concurrent.sequential","suite.concurrent.shuffle","suite.concurrent.todo","suite.sequential.skip","suite.sequential.only","suite.sequential.concurrent","suite.sequential.shuffle","suite.sequential.todo","suite.shuffle.skip","suite.shuffle.only","suite.shuffle.concurrent","suite.shuffle.sequential","suite.shuffle.todo","suite.todo.skip","suite.todo.only","suite.todo.concurrent","suite.todo.sequential","suite.todo.shuffle","suite.skipIf.skip","suite.skipIf.only","suite.skipIf.concurrent","suite.skipIf.sequential","suite.skipIf.shuffle","suite.skipIf.todo","suite.runIf.skip","suite.runIf.only","suite.runIf.concurrent","suite.runIf.sequential","suite.runIf.shuffle","suite.runIf.todo","suite.skip.each","suite.only.each","suite.concurrent.each","suite.sequential.each","suite.shuffle.each","suite.todo.each","suite.skipIf.each","suite.runIf.each","suite.skip.only.concurrent","suite.skip.only.sequential","suite.skip.only.shuffle","suite.skip.only.todo","suite.skip.concurrent.only","suite.skip.concurrent.sequential","suite.skip.concurrent.shuffle","suite.skip.concurrent.todo","suite.skip.sequential.only","suite.skip.sequential.concurrent","suite.skip.sequential.shuffle","suite.skip.sequential.todo","suite.skip.shuffle.only","suite.skip.shuffle.concurrent","suite.skip.shuffle.sequential","suite.skip.shuffle.todo","suite.skip.todo.only","suite.skip.todo.concurrent","suite.skip.todo.sequential","suite.skip.todo.shuffle","suite.only.skip.concurrent","suite.only.skip.sequential","suite.only.skip.shuffle","suite.only.skip.todo","suite.only.concurrent.skip","suite.only.concurrent.sequential","suite.only.concurrent.shuffle","suite.only.concurrent.todo","suite.only.sequential.skip","suite.only.sequential.concurrent","suite.only.sequential.shuffle","suite.only.sequential.todo","suite.only.shuffle.skip","suite.only.shuffle.concurrent","suite.only.shuffle.sequential","suite.only.shuffle.todo","suite.only.todo.skip","suite.only.todo.concurrent","suite.only.todo.sequential","suite.only.todo.shuffle","suite.concurrent.skip.only","suite.concurrent.skip.sequential","suite.concurrent.skip.shuffle","suite.concurrent.skip.todo","suite.concurrent.only.skip","suite.concurrent.only.sequential","suite.concurrent.only.shuffle","suite.concurrent.only.todo","suite.concurrent.sequential.skip","suite.concurrent.sequential.only","suite.concurrent.sequential.shuffle","suite.concurrent.sequential.todo","suite.concurrent.shuffle.skip","suite.concurrent.shuffle.only","suite.concurrent.shuffle.sequential","suite.concurrent.shuffle.todo","suite.concurrent.todo.skip","suite.concurrent.todo.only","suite.concurrent.todo.sequential","suite.concurrent.todo.shuffle","suite.sequential.skip.only","suite.sequential.skip.concurrent","suite.sequential.skip.shuffle","suite.sequential.skip.todo","suite.sequential.only.skip","suite.sequential.only.concurrent","suite.sequential.only.shuffle","suite.sequential.only.todo","suite.sequential.concurrent.skip","suite.sequential.concurrent.only","suite.sequential.concurrent.shuffle","suite.sequential.concurrent.todo","suite.sequential.shuffle.skip","suite.sequential.shuffle.only","suite.sequential.shuffle.concurrent","suite.sequential.shuffle.todo","suite.sequential.todo.skip","suite.sequential.todo.only","suite.sequential.todo.concurrent","suite.sequential.todo.shuffle","suite.shuffle.skip.only","suite.shuffle.skip.concurrent","suite.shuffle.skip.sequential","suite.shuffle.skip.todo","suite.shuffle.only.skip","suite.shuffle.only.concurrent","suite.shuffle.only.sequential","suite.shuffle.only.todo","suite.shuffle.concurrent.skip","suite.shuffle.concurrent.only","suite.shuffle.concurrent.sequential","suite.shuffle.concurrent.todo","suite.shuffle.sequential.skip","suite.shuffle.sequential.only","suite.shuffle.sequential.concurrent","suite.shuffle.sequential.todo","suite.shuffle.todo.skip","suite.shuffle.todo.only","suite.shuffle.todo.concurrent","suite.shuffle.todo.sequential","suite.todo.skip.only","suite.todo.skip.concurrent","suite.todo.skip.sequential","suite.todo.skip.shuffle","suite.todo.only.skip","suite.todo.only.concurrent","suite.todo.only.sequential","suite.todo.only.shuffle","suite.todo.concurrent.skip","suite.todo.concurrent.only","suite.todo.concurrent.sequential","suite.todo.concurrent.shuffle","suite.todo.sequential.skip","suite.todo.sequential.only","suite.todo.sequential.concurrent","suite.todo.sequential.shuffle","suite.todo.shuffle.skip","suite.todo.shuffle.only","suite.todo.shuffle.concurrent","suite.todo.shuffle.sequential","suite.skipIf.skip.only","suite.skipIf.skip.concurrent","suite.skipIf.skip.sequential","suite.skipIf.skip.shuffle","suite.skipIf.skip.todo","suite.skipIf.only.skip","suite.skipIf.only.concurrent","suite.skipIf.only.sequential","suite.skipIf.only.shuffle","suite.skipIf.only.todo","suite.skipIf.concurrent.skip","suite.skipIf.concurrent.only","suite.skipIf.concurrent.sequential","suite.skipIf.concurrent.shuffle","suite.skipIf.concurrent.todo","suite.skipIf.sequential.skip","suite.skipIf.sequential.only","suite.skipIf.sequential.concurrent","suite.skipIf.sequential.shuffle","suite.skipIf.sequential.todo","suite.skipIf.shuffle.skip","suite.skipIf.shuffle.only","suite.skipIf.shuffle.concurrent","suite.skipIf.shuffle.sequential","suite.skipIf.shuffle.todo","suite.skipIf.todo.skip","suite.skipIf.todo.only","suite.skipIf.todo.concurrent","suite.skipIf.todo.sequential","suite.skipIf.todo.shuffle","suite.runIf.skip.only","suite.runIf.skip.concurrent","suite.runIf.skip.sequential","suite.runIf.skip.shuffle","suite.runIf.skip.todo","suite.runIf.only.skip","suite.runIf.only.concurrent","suite.runIf.only.sequential","suite.runIf.only.shuffle","suite.runIf.only.todo","suite.runIf.concurrent.skip","suite.runIf.concurrent.only","suite.runIf.concurrent.sequential","suite.runIf.concurrent.shuffle","suite.runIf.concurrent.todo","suite.runIf.sequential.skip","suite.runIf.sequential.only","suite.runIf.sequential.concurrent","suite.runIf.sequential.shuffle","suite.runIf.sequential.todo","suite.runIf.shuffle.skip","suite.runIf.shuffle.only","suite.runIf.shuffle.concurrent","suite.runIf.shuffle.sequential","suite.runIf.shuffle.todo","suite.runIf.todo.skip","suite.runIf.todo.only","suite.runIf.todo.concurrent","suite.runIf.todo.sequential","suite.runIf.todo.shuffle","suite.skip.only.each","suite.skip.concurrent.each","suite.skip.sequential.each","suite.skip.shuffle.each","suite.skip.todo.each","suite.only.skip.each","suite.only.concurrent.each","suite.only.sequential.each","suite.only.shuffle.each","suite.only.todo.each","suite.concurrent.skip.each","suite.concurrent.only.each","suite.concurrent.sequential.each","suite.concurrent.shuffle.each","suite.concurrent.todo.each","suite.sequential.skip.each","suite.sequential.only.each","suite.sequential.concurrent.each","suite.sequential.shuffle.each","suite.sequential.todo.each","suite.shuffle.skip.each","suite.shuffle.only.each","suite.shuffle.concurrent.each","suite.shuffle.sequential.each","suite.shuffle.todo.each","suite.todo.skip.each","suite.todo.only.each","suite.todo.concurrent.each","suite.todo.sequential.each","suite.todo.shuffle.each","suite.skipIf.skip.each","suite.skipIf.only.each","suite.skipIf.concurrent.each","suite.skipIf.sequential.each","suite.skipIf.shuffle.each","suite.skipIf.todo.each","suite.runIf.skip.each","suite.runIf.only.each","suite.runIf.concurrent.each","suite.runIf.sequential.each","suite.runIf.shuffle.each","suite.runIf.todo.each","xtest","xtest.each","xit","xit.each","fit","xdescribe","xdescribe.each","fdescribe"]);function ae(e,s){return e.sourceCode.getScope?e.sourceCode.getScope(s):e.getScope()}function Hs(e,s){let t=ae(e,s);for(;t;){if(t.type==="module")return t;t=t.upper}return t}const E=(e,s,t)=>{const n=h(e,s);return n!==null&&t.includes(n.type)},h=(e,s)=>{const t=Bt(e,s);return typeof t=="string"?null:t},Nt=new WeakMap,Bt=(e,s)=>{let t=Nt.get(e);return t||(t=zs(e,s),Nt.set(e,t),t)},Ks=e=>e==="expect"?"expect":e==="expectTypeOf"?"expectTypeOf":e==="vi"?"vi":e==="vitest"?"vitest":V.hasOwnProperty(e)?"describe":q.hasOwnProperty(e)?"test":Ot.hasOwnProperty(e)?"hook":"unknown",Gs=e=>{const s=[];for(const t of e){if(t.parent?.type===i.MemberExpression&&t.parent.parent?.type===i.CallExpression)return{matcher:t,args:t.parent.parent.arguments,modifiers:s};const n=y(t);if(s.length===0){if(!N.hasOwnProperty(n))return"modifier-unknown"}else if(s.length===1){if(n!==N.not&&n!=N.have)return"modifier-unknown";const r=y(s[0]);if(r!==N.resolves&&r!==N.rejects&&r!==N.to)return"modifier-unknown"}else return"modifier-unknown";s.push(t)}return"matcher-not-found"},Xs=(e,s)=>{const t=Gs(e.members);return typeof t=="string"?t:{...e,type:s,...t}},Lt=e=>{let s=e,{parent:t}=e;for(;t;){if(t.type===i.CallExpression){s=t,t=t.parent;continue}if(t.type!==i.MemberExpression)break;t=t.parent}return s},zs=(e,s)=>{const t=H(e);if(!t?.length)return null;const[n,...r]=t,o=y(t[t.length-1]);if(o==="each"&&e.callee.type!==i.CallExpression&&e.callee.type!==i.TaggedTemplateExpression||e.callee.type===i.TaggedTemplateExpression&&o!=="each")return null;const a=Js(s,e,y(n));if(!a)return null;const c=a.original??a.local,l=[c,...r.map(y)];if(a.type!=="testContext"&&c!=="vi"&&c!=="vitest"&&c!=="expect"&&c!=="expectTypeOf"&&!Vs.has(l.join(".")))return null;const d={name:c,head:{...a,node:n},members:r},f=Ks(c);if(f==="expect"||f==="expectTypeOf"){const u=Xs(d,f);return typeof u=="string"&&Lt(e)!==e?null:u==="matcher-not-found"&&e.parent?.type===i.MemberExpression?"matcher-not-called":u}return t.slice(0,t.length-1).some(u=>u.parent?.type!==i.MemberExpression)||e.parent?.type===i.CallExpression||e.parent?.type===i.MemberExpression?null:{...d,type:f}},Ys=(e,s)=>e&&s?[...e,...s]:null;function H(e){if(v(e))return[e];switch(e.type){case i.TaggedTemplateExpression:return H(e.tag);case i.MemberExpression:return Ys(H(e.object),H(e.property));case i.CallExpression:return H(e.callee)}return null}const Js=(e,s,t)=>{const n=ae(e,s),r=Ft(n,t);return r==="local"?null:r==="testContext"?{local:t,original:null,type:"testContext"}:r?r.source==="vitest"?{original:r.imported,local:r.local,type:"import"}:null:{original:Qs(t,e),local:t,type:"global"}},Qs=(e,s)=>{const t=s.settings.vitest?.globalAliases??{},n=Object.entries(t).find(([r,o])=>o.includes(e));return n?n[0]:null},Zs=({parent:e})=>{if(e?.type===i.CallExpression&&e.callee.type===i.Identifier)return q.hasOwnProperty(e.callee.name)},Ft=(e,s)=>{let t=e;for(;t!==null;){const n=t.set.get(s);if(n&&n.defs.length>0){const r=n.defs[n.defs.length-1],o=M(r.node)?r.node.params.find(l=>l.type===i.ObjectPattern):void 0;if(o){const l=o.properties.find(d=>d.type===i.Property);if((l?.key.type===i.Identifier?l.key:void 0)?.name===s)return"testContext"}const a=M(r.node)?r.node.params.find(l=>l.type===i.Identifier):void 0;if(a&&Zs(a.parent))return"testContext";const c=sn(r);return c?.local===s?c:"local"}t=t.upper}return null},en=e=>e.type===i.AwaitExpression?e.argument.type===i.ImportExpression?e.argument.source:null:e.type===i.CallExpression&&L(e.callee,"require")?e.arguments[0]??null:null,tn=e=>e.parent.type===i.TSImportEqualsDeclaration||e.node.type!==i.ImportSpecifier||e.node.imported.type!=i.Identifier||e.parent.importKind==="type"?null:{source:e.parent.source.value,imported:e.node.imported.name,local:e.node.local.name},sn=e=>e.type==="Variable"?nn(e):e.type==="ImportBinding"?tn(e):null,nn=e=>{if(!e.node.init)return null;const s=en(e.node.init);return!s||!B(s)||e.name.parent?.type!==i.Property||!v(e.name.parent.key)?null:{source:j(s),imported:y(e.name.parent.key),local:e.name.name}},ce=(e,s)=>e.reduce((t,{references:n})=>t.concat(n.map(({identifier:r})=>r.parent).filter(r=>r?.type===i.CallExpression&&E(r,s,["test"]))),[]),P=e=>{const[s]=e.args;return s.type===i.SpreadElement?s:le(s)},rn=e=>e.type===i.TSAsExpression||e.type===i.TSTypeAssertion,le=e=>rn(e)?le(e.expression):e,ue="prefer-lowercase-title",on=e=>e.arguments[0]&&B(e.arguments[0]),an=e=>{const s=[];return e.includes(V.describe)&&s.push(...Object.keys(V)),e.includes(q.test)&&s.push(...Object.keys(q).filter(t=>t.endsWith(q.test))),e.includes(q.it)&&s.push(...Object.keys(q).filter(t=>t.endsWith(q.it))),s},cn=p({name:ue,meta:{type:"problem",docs:{description:"enforce lowercase titles",recommended:!1},fixable:"code",messages:{lowerCaseTitle:"`{{ method }}`s should begin with lowercase",fullyLowerCaseTitle:"`{{ method }}`s should be lowercase"},schema:[{type:"object",properties:{ignore:{type:"array",items:{type:"string",enum:[V.describe,q.test,q.it]}},allowedPrefixes:{type:"array",items:{type:"string"},additionalItems:!1},ignoreTopLevelDescribe:{type:"boolean",default:!1},lowercaseFirstCharacterOnly:{type:"boolean",default:!0}},additionalProperties:!1}]},defaultOptions:[{ignore:[],allowedPrefixes:[],ignoreTopLevelDescribe:!1,lowercaseFirstCharacterOnly:!0}],create:(e,[{ignore:s=[],allowedPrefixes:t=[],ignoreTopLevelDescribe:n=!1,lowercaseFirstCharacterOnly:r=!1}])=>{const o=an(s);let a=0;return{CallExpression(c){const l=h(c,e);if(!l||!on)return;if(l?.type==="describe"){if(a++,n&&a===1)return}else if(l?.type!=="test")return;const[d]=c.arguments,f=j(d);if(typeof f!="string"||t.some(x=>f.startsWith(x)))return;const u=f.charAt(0);o.includes(l.name)||r&&(!u||u===u.toLowerCase())||!r&&f===f.toLowerCase()||e.report({messageId:r?"lowerCaseTitle":"fullyLowerCaseTitle",node:c.arguments[0],data:{method:l.name},fix:x=>{const m=j(d),I=[d.range[0]+1,d.range[1]-1],k=r?m.substring(0,1).toLowerCase()+m.substring(1):m.toLowerCase();return[x.replaceTextRange(I,k)]}})},"CallExpression:exit"(c){E(c,e,["describe"])&&a--}}}}),pe="max-nested-describe",ln=p({name:pe,meta:{type:"problem",docs:{description:"require describe block to be less than set max value or default value",recommended:!1},schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}],messages:{maxNestedDescribe:"Nested describe block should be less than set max value"}},defaultOptions:[{max:5}],create(e,[{max:s}]){const t=[];function n(o){o.parent?.type==="CallExpression"&&(o.parent.callee.type!=="Identifier"||o.parent.callee.name!=="describe"||(t.push(0),t.length>s&&e.report({node:o.parent,messageId:"maxNestedDescribe"})))}function r(o){o.parent?.type==="CallExpression"&&(o.parent.callee.type!=="Identifier"||o.parent.callee.name!=="describe"||t.pop())}return{FunctionExpression:n,"FunctionExpression:exit":r,ArrowFunctionExpression:n,"ArrowFunctionExpression:exit":r}}}),X="no-identical-title",Pt=()=>({describeTitles:[],testTitles:[]}),un=p({name:X,meta:{type:"problem",docs:{description:"disallow identical titles",recommended:!1},fixable:"code",schema:[],messages:{multipleTestTitle:"Test is used multiple times in the same describe(suite) block",multipleDescribeTitle:"Describe is used multiple times in the same describe(suite) block"}},defaultOptions:[],create(e){const s=[Pt()];return{CallExpression(t){const n=s[s.length-1],r=h(t,e);if(!r||((r.name==="describe"||r.name==="suite")&&s.push(Pt()),r.members.find(c=>v(c,"each"))))return;const[o]=t.arguments;if(!o||!B(o))return;const a=j(o);r.type==="test"&&(n?.testTitles.includes(a)&&e.report({node:t,messageId:"multipleTestTitle"}),n?.testTitles.push(a)),r.type==="describe"&&(n?.describeTitles.includes(a)&&e.report({node:t,messageId:"multipleDescribeTitle"}),n?.describeTitles.push(a))},"CallExpression:exit"(t){E(t,e,["describe"])&&s.pop()}}}}),de="no-focused-tests",fe=e=>e.type==="Identifier"&&["it","test","describe"].includes(e.name),me=e=>e.type==="Identifier"&&e.name==="only",pn=p({name:de,meta:{type:"problem",docs:{description:"disallow focused tests",recommended:!1},fixable:"code",schema:[{type:"object",properties:{fixable:{type:"boolean",default:!0}},additionalProperties:!1}],messages:{noFocusedTests:"Focused tests are not allowed"}},defaultOptions:[{fixable:!0}],create:e=>{const s=e.options[0]?.fixable;return{ExpressionStatement(t){if(t.expression.type==="CallExpression"){const{callee:n}=t.expression;if(n.type==="MemberExpression"&&fe(n.object)&&me(n.property)&&e.report({node:n.property,messageId:"noFocusedTests",fix:r=>s?r.removeRange([n.property.range[0]-1,n.property.range[1]]):null}),n.type==="TaggedTemplateExpression"){const r=n.tag.type==="MemberExpression"?n.tag.object:null;if(!r)return;r.type==="MemberExpression"&&fe(r.object)&&me(r.property)&&e.report({node:r.property,messageId:"noFocusedTests",fix:o=>s?o.removeRange([r.property.range[0]-1,r.property.range[1]]):null})}}},CallExpression(t){if(t.callee.type==="CallExpression"){const{callee:n}=t.callee;if(n.type==="MemberExpression"&&n.object.type==="MemberExpression"&&fe(n.object.object)&&me(n.object.property)&&n.property.type==="Identifier"&&n.property.name==="each"){const r=n.object.property;e.report({node:n.object.property,messageId:"noFocusedTests",fix:o=>s?o.removeRange([r.range[0]-1,r.range[1]]):null})}}}}}}),ye="no-conditional-tests",dn=p({name:ye,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(e){return{Identifier:function(s){["test","it","describe"].includes(s.name)&&s.parent?.parent?.parent?.parent?.type==="IfStatement"&&e.report({node:s,messageId:"noConditionalTests"})}}}}),fn={typecheck:!1};function z(e){const s=typeof e.vitest!="object"||e.vitest===null?{}:e.vitest;return{...fn,...s}}const Y="expect-expect",mn=p({name:Y,meta:{type:"suggestion",docs:{description:"enforce having expectation in test body",recommended:!1},schema:[{type:"object",properties:{assertFunctionNames:{type:"array",items:{type:"string"}},additionalTestBlockFunctions:{type:"array",items:{type:"string"}}},additionalProperties:!1}],messages:{noAssertions:"Test has no assertions"}},defaultOptions:[{assertFunctionNames:["expect","assert"],additionalTestBlockFunctions:[]}],create(e,[{assertFunctionNames:s=["expect"],additionalTestBlockFunctions:t=[]}]){const n=[];z(e.settings).typecheck&&s.push("expectTypeOf","assertType");const r=s.map(yn);function o(a){for(const c of a){const l=c.type===i.CallExpression?n.indexOf(c):-1;if(c.type===i.FunctionDeclaration){const d=e.sourceCode.getDeclaredVariables(c),f=ce(d,e);o(f)}if(l!==-1){n.splice(l,1);break}}}return{CallExpression(a){if(a.callee.type===i.Identifier&&a.callee.name==="bench"||a?.callee?.type===i.MemberExpression&&a.callee.property.type===i.Identifier&&a.callee.property.name==="extend"||a?.callee?.type===i.MemberExpression&&a.callee.property.type===i.Identifier&&a.callee.property.name==="skip")return;const c=R(a)??"";if(E(a,e,["test"])||t.includes(c)){if(a.callee.type===i.MemberExpression&&v(a.callee.property,"todo"))return;n.push(a)}else r.some(l=>l.test(c))&&o(e.sourceCode.getAncestors(a))},"Program:exit"(){n.forEach(a=>{e.report({node:a.callee,messageId:"noAssertions"})})}}}});function yn(e){const s=e.split(".").map(t=>t==="**"?"[_a-z\\d\\.]*":t.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${s.join("\\.")}(\\.|$)`,"ui")}const he="consistent-test-it",Ut=(e,s,t)=>n=>[n.replaceText(e.type===i.MemberExpression?e.object:e,hn(s,t))];function hn(e,s){return e===q.fit?"test.only":e.startsWith("f")||e.startsWith("x")?e.charAt(0)+s:s}function ge(e){return e===q.test?q.it:q.test}const gn=p({name:he,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using test or it but not both",recommended:!1},messages:{consistentMethod:"Prefer using {{ testFnKeyWork }} instead of {{ oppositeTestKeyword }}",consistentMethodWithinDescribe:"Prefer using {{ testKeywordWithinDescribe }} instead of {{ oppositeTestKeyword }} within describe"},schema:[{type:"object",properties:{fn:{type:"string",enum:[q.test,q.it]},withinDescribe:{type:"string",enum:[q.test,q.it]}},additionalProperties:!1}]},defaultOptions:[{fn:q.test,withinDescribe:q.it}],create(e){const s=e.options[0]??{},t=s.fn||q.test,n=s?.withinDescribe||s?.fn||q?.it,r=t===n?t:void 0;let o=0;return{ImportDeclaration(a){if(r==null||a.source.type!=="Literal"||a.source.value!=="vitest")return;const c=ge(r);for(const l of a.specifiers)l.type==="ImportSpecifier"&&l.imported.type==="Identifier"&&l.local.name===l.imported.name&&l.local.name===c&&e.report({node:l,data:{testFnKeyWork:t,oppositeTestKeyword:c},messageId:"consistentMethod",fix:d=>{const f=a.specifiers.filter(u=>u.local.name!==c);if(f.length>0){const u=f.map(m=>m.local.name).join(", "),x=a.specifiers.at(-1)?.range;return x?d.replaceTextRange([a.specifiers[0].range[0],x[1]],u):null}return d.replaceText(l.local,r)}})},CallExpression(a){if(a.callee.type===i.Identifier&&a.callee.name==="bench")return;const c=h(a,e);if(!c)return;if(c.type==="describe"){o++;return}const l=a.callee.type===i.TaggedTemplateExpression?a.callee.tag:a.callee.type===i.CallExpression?a.callee.callee:a.callee;if(c.type==="test"&&o===0&&!c.name.endsWith(t)){const d=ge(t);e.report({node:a.callee,data:{testFnKeyWork:t,oppositeTestKeyword:d},messageId:"consistentMethod",fix:Ut(l,c.name,t)})}else if(c.type==="test"&&o>0&&!c.name.endsWith(n)){const d=ge(n);e.report({messageId:"consistentMethodWithinDescribe",node:a.callee,data:{testKeywordWithinDescribe:n,oppositeTestKeyword:d},fix:Ut(l,c.name,n)})}},"CallExpression:exit"(a){E(a,e,["describe"])&&o--}}}}),ke="consistent-vitest-vi",kn=e=>e===_.vi?_.vitest:_.vi,bn=p({name:ke,meta:{type:"suggestion",fixable:"code",docs:{description:"enforce using vitest or vi but not both",recommended:!1},messages:{consistentUtil:"Prefer using {{ utilKeyword }} instead of {{ oppositeUtilKeyword }}"},schema:[{type:"object",properties:{fn:{type:"string",enum:[_.vi,_.vitest]}},additionalProperties:!1}]},defaultOptions:[{fn:_.vi}],create(e){const s=(e.options[0]??{}).fn||_.vi,t=kn(s);return{ImportDeclaration(n){if(!(n.source.type!==i.Literal||n.source.value!=="vitest"))for(const r of n.specifiers)r.type===i.ImportSpecifier&&r.imported.type===i.Identifier&&r.local.name===r.imported.name&&r.imported.name===t&&e.report({node:r,messageId:"consistentUtil",data:{utilKeyword:s,oppositeUtilKeyword:t},fix:o=>{const a=n.specifiers.filter(c=>c.local.name!==t);if(a.length>0){const c=a.map(d=>d.local.name).join(", "),l=n.specifiers.at(-1)?.range;return l?o.replaceTextRange([n.specifiers[0].range[0],l[1]],c):null}return o.replaceText(r.local,s)}})},CallExpression(n){if(h(n,e)?.type!==t)return;const r=n.callee.type===i.MemberExpression?n.callee.object:n.callee;e.report({node:r,data:{utilKeyword:s,oppositeUtilKeyword:t},messageId:"consistentUtil",fix:o=>o.replaceText(r,s)})}}}}),be="prefer-to-be",xn=e=>e.type===i.Literal&&e.value===null,In=e=>xn(P(e)),jt=(e,s)=>L(P(e),s),qn=e=>Math.floor(e)!==Math.ceil(e),En=e=>{let s=P(e);return s.type===i.Literal&&typeof s.value=="number"&&qn(s.value)?!1:(s.type===i.UnaryExpression&&s.operator==="-"&&(s=s.argument),s.type===i.Literal?!("regex"in s):s.type===i.TemplateLiteral)},K=(e,s,t,n,r)=>{e.report({messageId:`useToBe${s}`,fix(o){const a=[G(o,t.matcher,`toBe${s}`)];return t.args?.length&&s!==""&&a.push($t(o,e,n,0)),r&&a.push(o.removeRange([r.range[0]-1,r.range[1]])),a},node:t.matcher})},Tn=p({name:be,meta:{type:"suggestion",docs:{description:"enforce using toBe()",recommended:!1},schema:[],fixable:"code",messages:{useToBe:"Use `toBe` instead",useToBeUndefined:"Use `toBeUndefined()` instead",useToBeDefined:"Use `toBeDefined()` instead",useToBeNull:"Use `toBeNull()` instead",useToBeNaN:"Use `toBeNaN()` instead"}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const n=y(t.matcher),r=t.modifiers.find(o=>y(o)==="not");if(r&&["toBeUndefined","toBeDefined"].includes(n)){K(e,n==="toBeDefined"?"Undefined":"Defined",t,s,r);return}if(!(!F.hasOwnProperty(n)||t.args.length===0)){if(In(t)){K(e,"Null",t,s);return}if(jt(t,"undefined")){K(e,r?"Defined":"Undefined",t,s);return}if(jt(t,"NaN")){K(e,"NaN",t,s);return}En(t)&&n!==F.toBe&&K(e,"",t,s)}}}}}),xe="no-hooks",wn=p({name:xe,meta:{type:"suggestion",docs:{description:"disallow setup and teardown hooks",recommended:!1},schema:[{type:"object",properties:{allow:{type:"array",contains:["beforeAll","beforeEach","afterAll","afterEach"]}},additionalProperties:!1}],messages:{unexpectedHook:"Unexpected '{{ hookName }}' hook"}},defaultOptions:[{allow:[]}],create(e,[{allow:s=[]}]){return{CallExpression(t){const n=h(t,e);n?.type==="hook"&&!s.includes(n.name)&&e.report({node:t,messageId:"unexpectedHook",data:{hookName:n.name}})}}}}),Ie="no-restricted-vi-methods",An=p({name:Ie,meta:{type:"suggestion",docs:{description:"disallow specific `vi.` methods",recommended:!1},schema:[{type:"object",additionalProperties:{type:["string","null"]}}],messages:{restrictedViMethod:"Use of `{{ restriction }}` is disallowed",restrictedViMethodWithMessage:"{{ message }}"}},defaultOptions:[{}],create(e,[s]){return{CallExpression(t){const n=h(t,e);if(n?.type!=="vi"||n.members.length===0)return;const r=y(n.members[0]);if(r in s){const o=s[r];e.report({messageId:o?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:o,restriction:r},loc:{start:n.members[0].loc.start,end:n.members[n.members.length-1].loc.end}})}}}}}),qe="consistent-test-filename",_t=/.*\.test\.[tj]sx?$/,J=/.*\.(test|spec)\.[tj]sx?$/,Cn=p({name:qe,meta:{type:"problem",docs:{recommended:!1,requiresTypeChecking:!1,description:"require .spec test file pattern"},messages:{consistentTestFilename:"Use test file name pattern {{ pattern }}"},schema:[{type:"object",additionalProperties:!1,properties:{pattern:{format:"regex",default:_t.source},allTestPattern:{format:"regex",default:J.source}}}]},defaultOptions:[{pattern:J.source,allTestPattern:J.source}],create:e=>{const s=e.options[0]??{},{pattern:t=_t,allTestPattern:n=J}=s,r=typeof t=="string"?new RegExp(t):t,o=typeof n=="string"?new RegExp(n):n,{filename:a}=e;return o.test(a)?{Program:c=>{r.test(a)||e.report({node:c,messageId:"consistentTestFilename",data:{pattern:r.source}})}}:{}}}),Ee="max-expects",vn=p({name:Ee,meta:{docs:{requiresTypeChecking:!1,recommended:!1,description:"enforce a maximum number of expect per test"},messages:{maxExpect:"Too many assertion calls ({{ count }}) - maximum allowed is {{ max }}"},type:"suggestion",schema:[{type:"object",properties:{max:{type:"number"}},additionalProperties:!1}]},defaultOptions:[{max:5}],create(e,[{max:s}]){let t=0;const n=r=>{(r.parent?.type!==i.CallExpression||E(r.parent,e,["test"]))&&(t=0)};return{FunctionExpression:n,"FunctionExpression:exit":n,ArrowFunctionExpression:n,"ArrowFunctionExpression:exit":n,CallExpression(r){const o=h(r,e);o?.type!=="expect"||o.head.node.parent?.type===i.MemberExpression||(t+=1,t>s&&e.report({node:r,messageId:"maxExpect",data:{count:t,max:s}}))}}}}),Te="no-alias-methods",Sn=p({name:Te,meta:{docs:{description:"disallow alias methods",requiresTypeChecking:!1,recommended:!1},messages:{noAliasMethods:"Replace {{ alias }}() with its canonical name {{ canonical }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){const s={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(t){const n=h(t,e);if(n?.type!=="expect")return;const{matcher:r}=n,o=y(r);if(o in s){const a=s[o];e.report({messageId:"noAliasMethods",data:{alias:o,canonical:a},node:r,fix:c=>[G(c,r,a)]})}}}}}),Q="no-commented-out-tests";function Mn(e){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(e.value)}const $n=p({name:Q,meta:{docs:{description:"disallow commented out tests",requiresTypeChecking:!1,recommended:!1},messages:{noCommentedOutTests:"Remove commented out tests - you may want to use `skip` or `only` instead"},schema:[],type:"suggestion"},defaultOptions:[],create(e){const{sourceCode:s}=e;function t(n){Mn(n)&&e.report({messageId:"noCommentedOutTests",node:n})}return{Program(){s.getAllComments().forEach(t)}}}}),we="no-conditional-expect",Dt=e=>e.callee.type===i.MemberExpression&&v(e.callee.property,"catch"),On=p({name:we,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(e){let s=0,t=!1,n=!1;const r=()=>t&&s++,o=()=>t&&s--;return{FunctionDeclaration(a){const c=e.sourceCode.getDeclaredVariables(a);ce(c,e).length>0&&(t=!0)},CallExpression(a){const{type:c}=h(a,e)??{};c==="test"&&(t=!0),Dt(a)&&(n=!0),t&&c==="expect"&&s>0&&e.report({messageId:"noConditionalExpect",node:a}),n&&c==="expect"&&e.report({messageId:"noConditionalExpect",node:a})},"CallExpression:exit"(a){E(a,e,["test"])&&(t=!1),Dt(a)&&(n=!1)},CatchClause:r,"CatchClause:exit":o,IfStatement:r,"IfStatement:exit":o,SwitchStatement:r,"SwitchStatement:exit":o,ConditionalExpression:r,"ConditionalExpression:exit":o,LogicalExpression:r,"LogicalExpression:exit":o}}}),Z="no-import-node-test",Rn=p({name:Z,meta:{docs:{description:"disallow importing `node:test`",recommended:!1},type:"suggestion",messages:{noImportNodeTest:"Import from `vitest` instead of `node:test`"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{ImportDeclaration(s){s.source.value==="node:test"&&e.report({messageId:"noImportNodeTest",node:s,fix:t=>t.replaceText(s.source,s.source.raw.replace("node:test","vitest"))})}}}}),Ae=new Set(["suite","test","chai","describe","it","expectTypeOf","assertType","expect","assert","vitest","vi","beforeAll","afterAll","beforeEach","afterEach","onTestFailed","onTestFinished"]),Wt=e=>e.source.value==="vitest",Ce=e=>e.type===i.ImportSpecifier&&e.imported.type===i.Identifier&&Ae.has(e.imported.name),ve=e=>e.type===i.Property&&e.key.type===i.Identifier&&Ae.has(e.key.name),Nn=e=>e.callee.type===i.Identifier&&Ae.has(e.callee.name),Se=e=>{if(e?.type!==i.CallExpression||e.callee.type!==i.Identifier||e.callee.name!=="require")return!1;const s=e.arguments;return s.length===1&&s[0].type===i.Literal&&s[0].value==="vitest"},Vt=e=>e.type===i.ObjectPattern,Bn=(e,s)=>{const t=s.parent,n=t.declarations;if(n.length===1)return e.remove(t);const r=n.findIndex(o=>o.range[0]===s.range[0]&&o.range[1]===s.range[1]);if(r===0){const o=n[1];return e.removeRange([s.range[0],o.range[0]])}else{const o=n[r-1];return e.removeRange([o.range[1],s.range[1]])}},Ht=(e,s,t)=>{const n=s.indexOf(t);if(n===-1)throw new Error("Target node not found in nodes array");if(n===0){const r=s[1];return e.removeRange([t.range[0],r.range[0]])}else{const r=s[n-1];return e.removeRange([r.range[1],t.range[1]])}},Me="no-importing-vitest-globals",Ln=p({name:Me,meta:{type:"suggestion",docs:{description:"disallow importing Vitest globals",recommended:!1},messages:{noImportingVitestGlobals:"Do not import '{{name}}' from 'vitest'. Use globals configuration instead.",noRequiringVitestGlobals:"Do not require '{{name}}' from 'vitest'. Use globals configuration instead."},fixable:"code",schema:[]},defaultOptions:[],create(e){return{ImportDeclaration(s){if(!Wt(s))return;const t=s.specifiers;for(const n of t)Ce(n)&&e.report({node:n,messageId:"noImportingVitestGlobals",data:{name:n.imported.name},fix(r){return t.every(o=>Ce(o))?r.remove(s):Ht(r,t,n)}})},VariableDeclarator(s){if(!Se(s.init)||!Vt(s.id))return;const t=s.id.properties;for(const n of t)ve(n)&&e.report({node:n,messageId:"noRequiringVitestGlobals",data:{name:n.key.name},fix(r){return t.every(o=>ve(o))?Bn(r,s):Ht(r,t,n)}})}}}}),$e="prefer-importing-vitest-globals",Fn=p({name:$e,meta:{type:"suggestion",docs:{description:"enforce importing Vitest globals",recommended:!1},messages:{preferImportingVitestGlobals:"Import '{{name}}' from 'vitest'"},schema:[],fixable:"code"},defaultOptions:[],create(e){const s=new Set;let t,n;return{ImportDeclaration(r){if(!Wt(r))return;const o=r.specifiers;for(const a of o)if(Ce(a)){const c=a.imported.name;s.add(c)}t=r.specifiers},VariableDeclarator(r){if(!Se(r.init)||!Vt(r.id))return;const o=r.id.properties;for(const a of o)if(ve(a)){const c=a.key.name;s.add(c)}n=o},CallExpression(r){if(!Nn(r))return;const o=r.callee.name;if(s.has(o))return;const a=e.sourceCode.getScope(r).set.get(o);a&&a.defs.length>0&&a.defs.some(c=>!(c.type==="ImportBinding"||c.type==="Variable"&&c.node.init&&Se(c.node.init)))||e.report({node:r.callee,messageId:"preferImportingVitestGlobals",data:{name:o},fix(c){const l=e.sourceCode.ast;if(!t)if(n){const u=n[n.length-1];return c.insertTextAfter(u,`, ${o}`)}else return c.insertTextBefore(l.body[0],`import { ${o} } from 'vitest';
|
|
2
2
|
`);if(t.find(u=>u.type==="ImportNamespaceSpecifier"))return c.insertTextBefore(l.body[0],`import { ${o} } from 'vitest';
|
|
3
3
|
`);const d=t.find(u=>u.type==="ImportDefaultSpecifier");if(d)return c.insertTextAfter(d,`, { ${o} }`);const f=t[t.length-1];return c.insertTextAfter(f,`, ${o}`)}})}}}}),Oe="no-conditional-in-test",Pn=p({name:Oe,meta:{docs:{description:"disallow conditional tests",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalInTest:"Remove conditional tests"},schema:[],type:"problem"},defaultOptions:[],create(e){return{IfStatement(s){s.parent?.parent?.parent?.type==="CallExpression"&&E(s.parent?.parent?.parent,e,["test","it"])&&e.report({messageId:"noConditionalInTest",node:s})}}}}),Re="no-disabled-tests",Un=p({name:Re,meta:{type:"suggestion",docs:{description:"disallow disabled tests",recommended:!1},messages:{missingFunction:"Test is missing function argument",pending:"Call to pending()",pendingSuite:"Call to pending() within test suite",pendingTest:"Call to pending() within test",disabledSuite:"Disabled test suite - if you want to skip a test suite temporarily, use .todo() instead",disabledTest:"Disabled test - if you want to skip a test temporarily, use .todo() instead"},schema:[]},defaultOptions:[],create(e){let s=0,t=0;return{CallExpression(n){const r=h(n,e);if(!r)return;r.type==="describe"&&s++,r.type==="test"&&(t++,n.arguments.length<2&&r.members.every(a=>y(a)==="skip")&&e.report({messageId:"missingFunction",node:n}));const o=r.members.find(a=>y(a)==="skip");(r.name.startsWith("x")||o!==void 0)&&e.report({messageId:r.type==="describe"?"disabledSuite":"disabledTest",node:o??r.head.node})},"CallExpression:exit"(n){const r=h(n,e);r&&(r.type==="describe"&&s--,r.type==="test"&&t--)},'CallExpression[callee.name="pending"]'(n){const r=ae(e,n);Ft(r,"pending")||(t>0?e.report({messageId:"pendingTest",node:n}):s>0?e.report({messageId:"pendingSuite",node:n}):e.report({messageId:"pending",node:n}))}}}}),Ne="no-done-callback",jn=(e,s,t)=>{if(s)return e.arguments[1];const n=h(e,t);return n?.type==="hook"&&e.arguments.length>=1?e.arguments[0]:n?.type==="test"&&e.arguments.length>=2?e.arguments[1]:null},_n=p({name:Ne,meta:{type:"suggestion",docs:{description:"disallow using a callback in asynchronous tests and hooks",recommended:!1},deprecated:!0,schema:[],messages:{noDoneCallback:"Return a promise instead of relying on callback parameter",suggestWrappingInPromise:"Wrap in `new Promise({{ callback }} => ...`",useAwaitInsteadOfCallback:"Use `await` instead of callback in async function"},hasSuggestions:!0},defaultOptions:[],create(e){return{CallExpression(s){const t=/\.each$|\.concurrent$/.test(R(s.callee)??"");if(t&&s.callee.type!==i.TaggedTemplateExpression||e.sourceCode.getAncestors(s).some(a=>a.type!==i.CallExpression||!E(a,e,["describe","test"])?!1:a.callee.type===i.MemberExpression&&v(a.callee.property,"concurrent")))return;const n=jn(s,t,e),r=Number(t);if(!n||!M(n)||n.params.length!==1+r)return;const o=n.params[r];if(o.type!==i.Identifier){e.report({node:o,messageId:"noDoneCallback"});return}if(n.async){e.report({node:o,messageId:"useAwaitInsteadOfCallback"});return}e.report({node:s,messageId:"noDoneCallback",suggest:[{messageId:"suggestWrappingInPromise",data:{callback:o.name},fix(a){const{body:c,params:l}=n,{sourceCode:d}=e,f=d.getFirstToken(c),u=d.getLastToken(c),[x]=l,m=l[l.length-1],I=d.getTokenBefore(x);let k=d.getTokenAfter(m);if(k?.value===","&&(k=d.getTokenAfter(k)),!f||!u||!I||!k)throw new Error(`Unexpected null when attempting to fix ${e.filename} - please file an issue at https://github/veritem/eslint-plugin-vitest`);let b=a.replaceText(x,"()");I.value==="("&&k.value===")"&&(b=a.removeRange([I.range[1],k.range[0]]));let A=`new Promise(${o.name} => `,w=")",T=!0;return c.type===i.BlockStatement&&(A=`return ${A}{`,w+="}",T=!1),[b,T?a.insertTextBefore(f,A):a.insertTextAfter(f,A),a.insertTextAfter(u,w)]}}]})}}}}),Be="no-duplicate-hooks",Dn=p({name:Be,meta:{docs:{recommended:!1,description:"disallow duplicate hooks and teardown hooks",requiresTypeChecking:!1},messages:{noDuplicateHooks:"Duplicate {{ hook }} in describe block"},schema:[],type:"suggestion"},defaultOptions:[],create(e){const s=[{}];return{CallExpression(t){const n=h(t,e);if(n?.type==="describe"&&s.push({}),n?.type!=="hook")return;const r=s[s.length-1];r[n.name]||=0,r[n.name]+=1,r[n.name]>1&&e.report({messageId:"noDuplicateHooks",data:{hook:n.name},node:t})},"CallExpression:exit"(t){E(t,e,["describe"])&&s.pop()}}}}),Le="no-large-snapshots",Kt=(e,s,{maxSize:t=50,allowedSnapshots:n={}})=>{const r=s.loc.start.line,o=s.loc.end.line-r;if(!Object.keys(n).every(Fs))throw new Error("All paths for allowedSnapshots must be absolute. You can use JS config and `path.resolve`");let a=!1;if(s.type===i.ExpressionStatement&&"left"in s.expression&&s.expression.left.type===i.MemberExpression&&v(s.expression.left.property)){const c=e.filename,l=n[c];if(l){const d=y(s.expression.left.property);a=l.some(f=>f instanceof RegExp?f.test(d):d===f)}}!a&&o>t&&e.report({node:s,messageId:t===0?"noSnapShot":"tooLongSnapShot",data:{lineCount:o,lineLimit:t}})},Wn=p({name:Le,meta:{docs:{description:"disallow large snapshots",recommended:!1},messages:{noSnapShot:"`{{ lineCount }}`s should begin with lowercase",tooLongSnapShot:"Expected vitest snapshot to be smaller than {{ lineLimit }} lines but was {{ lineCount }} lines long"},type:"suggestion",schema:[{type:"object",properties:{maxSize:{type:"number"},inlineMaxSize:{type:"number"},allowedSnapshots:{type:"object",additionalProperties:{type:"array"}}},additionalProperties:!1}]},defaultOptions:[{}],create(e,[s]){return e.filename.endsWith(".snap")?{ExpressionStatement(t){Kt(e,t,s)}}:{CallExpression(t){const n=h(t,e);n?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(y(n.matcher))&&n.args.length&&Kt(e,n.args[0],{...s,maxSize:s.inlineMaxSize??s.maxSize})}}}}),Fe="no-interpolation-in-snapshots",Vn=p({name:Fe,meta:{type:"problem",docs:{description:"disallow string interpolation in snapshots",recommended:!1},fixable:"code",schema:[],messages:{noInterpolationInSnapshots:"Do not use string interpolation in snapshots"}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);t?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(y(t.matcher))&&t.args.forEach(n=>{n.type===i.TemplateLiteral&&n.expressions.length>0&&e.report({messageId:"noInterpolationInSnapshots",node:n})})}}}}),Gt="__mocks__",Hn=e=>e.split(Ps.sep).includes(Gt),Xt=e=>B(e)&&Hn(j(e)),Pe="no-mocks-import",Kn=p({name:Pe,meta:{type:"problem",docs:{description:"disallow importing from __mocks__ directory",recommended:!1},messages:{noMocksImport:`Mocks should not be manually imported from a ${Gt} directory. Instead use \`vi.mock\` and import from the original module path`},schema:[]},defaultOptions:[],create(e){return{ImportDeclaration(s){Xt(s.source)&&e.report({node:s,messageId:"noMocksImport"})},'CallExpression[callee.name="require"]'(s){const[t]=s.arguments;t&&Xt(t)&&e.report({node:t,messageId:"noMocksImport"})}}}}),Ue="no-restricted-matchers",Gn=(e,s)=>N.hasOwnProperty(s)||s.endsWith(".not")?e.startsWith(s):e===s,Xn=p({name:Ue,meta:{docs:{description:"disallow the use of certain matchers",recommended:!1},type:"suggestion",schema:[{type:"object",additionalProperties:{type:["string","null"]}}],messages:{restrictedChain:"use of {{ restriction }} is disallowed",restrictedChainWithMessage:"{{ message }}"}},defaultOptions:[{}],create(e,[s]){return{CallExpression(t){const n=h(t,e);if(n?.type!=="expect")return;const r=n.members.map(o=>y(o)).join(".");for(const[o,a]of Object.entries(s))if(Gn(r,o)){e.report({messageId:a?"restrictedChainWithMessage":"restrictedChain",data:{message:a,restriction:o},loc:{start:n.members[0].loc.start,end:n.members[n.members.length-1].loc.end}});break}}}}}),je="no-standalone-expect",zt=(e,s)=>{const t=e.parent;if(!t)throw new Error("Unexpected block statement. If you feel like this is a bug report https://github.com/veritem/eslint-plugin-vitest/issues/new");if(t.type===i.FunctionDeclaration)return"function";if(M(t)&&t.parent){const n=t.parent;if(n.type===i.VariableDeclarator)return"function";if(n.type===i.CallExpression&&E(n,s,["describe"]))return"describe"}return null},zn=p({name:je,meta:{docs:{description:"disallow using `expect` outside of `it` or `test` blocks",recommended:!1},type:"suggestion",messages:{noStandaloneExpect:"Expect must be called inside a test block"},schema:[{type:"object",properties:{additionalTestBlockFunctions:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},defaultOptions:[{additionalTestBlockFunctions:[]}],create(e,[{additionalTestBlockFunctions:s=[]}]){const t=[],n=r=>s.includes(R(r)||"");return{CallExpression(r){const o=h(r,e);if(o?.type==="expect"){if(o.head.node.parent?.type===i.MemberExpression&&o.members.length===1&&!["assertions","hasAssertions"].includes(y(o.members[0])))return;const a=t[t.length-1];(!a||a===V.describe)&&e.report({node:r,messageId:"noStandaloneExpect"});return}(o?.type==="test"||n(r))&&t.push("test"),r.callee.type===i.TaggedTemplateExpression&&t.push("template")},"CallExpression:exit"(r){const o=t[t.length-1];(o==="test"&&(E(r,e,["test"])||n(r))&&r.callee.type!==i.MemberExpression||o==="template"&&r.callee.type===i.TaggedTemplateExpression)&&t.pop()},BlockStatement(r){const o=zt(r,e);o&&t.push(o)},"BlockStatement:exit"(r){zt(r,e)&&t.pop()},ArrowFunctionExpression(r){r.parent?.type!==i.CallExpression&&t.push("arrow")},"ArrowFunctionExpression:exit"(){t[t.length-1]==="arrow"&&t.pop()}}}}),_e="no-test-prefixes",Yn=p({name:_e,meta:{docs:{description:"disallow using the `f` and `x` prefixes in favour of `.only` and `.skip`",recommended:!1},type:"suggestion",messages:{usePreferredName:'Use "{{ preferredNodeName }}" instead'},fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="describe"&&t?.type!=="test"||t.name[0]!=="f"&&t.name[0]!=="x")return;const n=[t.name.slice(1),t.name[0]==="f"?"only":"skip",...t.members.map(o=>y(o))].join("."),r=s.callee.type===i.TaggedTemplateExpression?s.callee.tag:s.callee.type===i.CallExpression?s.callee.callee:s.callee;e.report({messageId:"usePreferredName",node:s.callee,data:{preferredNodeName:n},fix:o=>[o.replaceText(r,n)]})}}}}),De="no-test-return-statement",Jn=e=>{const[,s]=e;return s&&M(s)&&s.body.type===i.BlockStatement?s.body.body:[]},Qn=p({name:De,meta:{type:"problem",docs:{description:"disallow return statements in tests",recommended:!1},schema:[],messages:{noTestReturnStatement:"Return statements are not allowed in tests"}},defaultOptions:[],create(e){return{CallExpression(s){if(!E(s,e,["test"]))return;const t=Jn(s.arguments).find(n=>n.type===i.ReturnStatement);t&&e.report({messageId:"noTestReturnStatement",node:t})},FunctionDeclaration(s){const t=e.sourceCode.getDeclaredVariables(s);if(ce(t,e).length===0)return;const n=s.body.body.find(r=>r.type===i.ReturnStatement);n&&e.report({messageId:"noTestReturnStatement",node:n})}}}}),We="prefer-called-with",Zn=p({name:We,meta:{docs:{description:"enforce using `toBeCalledWith()` or `toHaveBeenCalledWith()`",recommended:!1},messages:{preferCalledWith:"Prefer {{ matcherName }}With(/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect"||t.modifiers.some(o=>y(o)==="not"))return;const{matcher:n}=t,r=y(n);["toBeCalled","toHaveBeenCalled"].includes(r)&&e.report({data:{matcherName:r},messageId:"preferCalledWith",node:n,fix:o=>[o.replaceText(n,`${r}With`)]})}}}}),ee="valid-title",er=e=>["f","x"].includes(e.charAt(0))?e.substring(1):e,Yt=e=>e.type===i.TemplateLiteral?`\`${e.quasis[0].value.raw}\``:e.raw,Jt={type:"array",items:{type:"string"},minItems:1,maxItems:2,additionalItems:!1},te=e=>{const[s,t]=Array.isArray(e)?e:[e];return[new RegExp(s,"u"),t]};function tr(e){return!!(e.flags&U.TypeFlags.StringLike)}const Qt=e=>{if(typeof e=="string"||Array.isArray(e)){const s=te(e);return{describe:s,test:s,it:s}}return{describe:e.describe?te(e.describe):null,test:e.test?te(e.test):null,it:e.it?te(e.it):null}},Zt=e=>B(e.right)?!0:e.left.type===i.BinaryExpression?Zt(e.left):B(e.left),sr=p({name:ee,meta:{docs:{description:"enforce valid titles",recommended:!1},messages:{titleMustBeString:"Test title must be a string, a function or class name",emptyTitle:"{{ functionName }} should not have an empty title",duplicatePrefix:"should not have duplicate prefix",accidentalSpace:"should not have leading or trailing spaces",disallowedWord:'"{{ word }}" is not allowed in test title',mustNotMatch:"{{ functionName }} should not match {{ pattern }}",mustMatch:"{{ functionName }} should match {{ pattern }}",mustNotMatchCustom:"{{ message }}",mustMatchCustom:"{{ message }}"},type:"suggestion",schema:[{type:"object",properties:{ignoreTypeOfDescribeName:{type:"boolean",default:!1},allowArguments:{type:"boolean",default:!1},disallowedWords:{type:"array",items:{type:"string"}}},patternProperties:{[/^must(?:Not)?Match$/u.source]:{oneOf:[{type:"string"},Jt,{type:"object",propertyNames:{type:"string",enum:["describe","test","it"]},additionalProperties:{oneOf:[{type:"string"},Jt]}}]}},additionalProperties:!1}],fixable:"code"},defaultOptions:[{ignoreTypeOfDescribeName:!1,allowArguments:!1,disallowedWords:[]}],create(e,[{ignoreTypeOfDescribeName:s,allowArguments:t,disallowedWords:n=[],mustNotMatch:r,mustMatch:o}]){const a=new RegExp(`\\b(${n.join("|")})\\b`,"iu"),c=Qt(r??{}),l=Qt(o??{}),d=z(e.settings);return{CallExpression(f){const u=h(f,e);if(u?.type!=="describe"&&u?.type!=="test"&&u?.type!=="it"||u.members&&u.members[0]&&u.members[0].type===i.Identifier&&u.members[0].name==="extend")return;const x=O=>{e.report({messageId:"emptyTitle",data:{functionName:u.type==="describe"?V.describe:q.test},node:O})},[m]=f.arguments;if(d.typecheck){const O=ie.getParserServices(e).getTypeAtLocation(m);if(Rt(O))return;if(tr(O)){B(m)&&!j(m)&&x(f);return}}if(!m||t&&m.type===i.Identifier)return;if(!B(m)){if(m.type===i.BinaryExpression&&Zt(m))return;m.type!==i.TemplateLiteral&&!(s&&u.type==="describe")&&e.report({messageId:"titleMustBeString",loc:m.loc});return}const I=j(m);if(!I){x(f);return}if(n.length>0){const O=a.exec(I);if(O){e.report({messageId:"disallowedWord",data:{word:O[1]},node:m});return}}I.trim().length!==I.length&&e.report({messageId:"accidentalSpace",node:m,fix:O=>[O.replaceTextRange(m.range,Yt(m).replace(/^([`'"]) +?/u,"$1").replace(/ +?([`'"])$/u,"$1"))]});const k=er(u.name),[b]=I.split(" ");b.toLowerCase()===k&&e.report({messageId:"duplicatePrefix",node:m,fix:O=>[O.replaceTextRange(m.range,Yt(m).replace(/^([`'"]).+? /u,"$1"))]});const A=k,[w,T]=c[A]??[];if(w&&w.test(I)){e.report({messageId:T?"mustNotMatchCustom":"mustNotMatch",node:m,data:{functionName:A,pattern:w,message:T}});return}const[C,W]=l[A]??[];C&&(C.test(I)||e.report({messageId:W?"mustMatchCustom":"mustMatch",node:m,data:{functionName:A,pattern:C,message:W}}))}}}}),se="valid-expect",es=["toReject","toResolve"],nr=e=>(e.type===i.ArrayExpression&&e.parent&&e.parent.type===i.CallExpression&&(e=e.parent),e.type===i.CallExpression&&e.callee.type===i.MemberExpression&&v(e.callee.object,"Promise")&&e.parent?e:null),ts=({start:e,end:s})=>`${e.line}:${e.column}-${s.line}:${s.column}`,rr=e=>e.parent.type===i.Property&&e.type===i.FunctionExpression?e.parent:e;function ss(e){const s=e.parent?.parent;return s&&s.type===i.CallExpression&&s.callee.type===i.MemberExpression&&v(s.callee.property)&&["then","catch"].includes(y(s.callee.property))&&s.parent?ss(s):e}const or=e=>e.parent?.parent&&[i.CallExpression,i.ArrayExpression].includes(e.parent.type)?nr(e.parent):null,ns=({parent:e})=>e?M(e)?e:ns(e):null,rs=(e,s)=>s&&e.type===i.ReturnStatement?!0:e.type===i.ConditionalExpression&&e.parent?rs(e.parent,s):[i.ArrowFunctionExpression,i.AwaitExpression].includes(e.type),ir=p({name:se,meta:{docs:{description:"enforce valid `expect()` usage",recommended:!1},messages:{tooManyArgs:"Expect takes at most {{ amount}} argument{{ s }}",notEnoughArgs:"Expect requires at least {{ amount }} argument{{ s }}",modifierUnknown:"Expect has an unknown modifier",matcherNotFound:"Expect must have a corresponding matcher call",matcherNotCalled:"Matchers must be called to assert",asyncMustBeAwaited:"Async assertions must be awaited{{ orReturned }}",promisesWithAsyncAssertionsMustBeAwaited:"Promises which return async assertions must be awaited{{ orReturned }}"},type:"suggestion",fixable:"code",schema:[{type:"object",properties:{alwaysAwait:{type:"boolean",default:!1},asyncMatchers:{type:"array",items:{type:"string"}},minArgs:{type:"number",minimum:1},maxArgs:{type:"number",minimum:1}},additionalProperties:!1}]},defaultOptions:[{alwaysAwait:!1,asyncMatchers:es,minArgs:1,maxArgs:1}],create:(e,[{alwaysAwait:s,asyncMatchers:t=es,minArgs:n=1,maxArgs:r=1}])=>{const o=new Set,a=[],c=f=>o.add(ts(f)),l=f=>o.has(ts(f)),d=f=>{let u=f,{parent:x}=f;for(;x&&x.type===i.MemberExpression;)u=x,x=x.parent;return u};return{CallExpression(f){const u=Bt(f,e),x=z(e.settings);if(typeof u=="string"){const C=f.parent?.type===i.MemberExpression?d(f.parent).property:f;if(u==="matcher-not-found"){e.report({messageId:"matcherNotFound",node:C});return}if(u==="matcher-not-called"&&e.report({messageId:v(C)&&N.hasOwnProperty(y(C))?"matcherNotFound":"matcherNotCalled",node:C}),u==="modifier-unknown"){e.report({messageId:"modifierUnknown",node:C});return}return}else if(u?.type==="expectTypeOf"&&x.typecheck||u?.type!=="expect"||u.modifiers.some(C=>C.type===i.Identifier&&C.name=="to"))return;const{parent:m}=u.head.node;if(m?.type!==i.CallExpression)return;if(m.arguments.length<n){const C=y(u.head.node).length,W={start:{column:m.loc.start.column+C,line:m.loc.start.line},end:{column:m.loc.start.column+C+1,line:m.loc.start.line}};e.report({messageId:"notEnoughArgs",data:{amount:n,s:n===1?"":"s"},node:m,loc:W})}if(m.arguments.length>r){if(m.arguments.length===2){const Bs=m.arguments[1].type===i.Literal&&typeof m.arguments[1].value=="string",Ls=m.arguments[1].type===i.TemplateLiteral;if(Bs||Ls)return}const{start:C}=m.arguments[r].loc,{end:W}=m.arguments[m.arguments.length-1].loc,O={start:C,end:{column:W.column+1,line:W.line}};e.report({messageId:"tooManyArgs",data:{amount:r,s:r===1?"":"s"},node:m,loc:O})}const{matcher:I}=u,k=I.parent.parent,b=u.modifiers.some(C=>y(C)!=="not")||t.includes(y(I));if(!k?.parent||!b)return;const A=k.parent.type===i.ArrayExpression,w=ss(k),T=or(w)||w;T.parent&&!rs(T.parent,!s)&&!l(T.loc)&&(a.push({messageId:T===w?"asyncMustBeAwaited":"promisesWithAsyncAssertionsMustBeAwaited",node:T}),A&&c(T.loc))},"Program:exit"(){const f=[];a.forEach(({node:u,messageId:x},m)=>{const I=s?"":" or returned";e.report({loc:u.loc,data:{orReturned:I},messageId:x,node:u,fix(k){const b=ns(u);if(!b)return null;const A=f.some(T=>T.text==="async ");if(!b.async&&!A){const T=rr(b);f.push(k.insertTextBefore(T,"async "))}const w=u.parent?.type===i.ReturnStatement?u.parent:null;if(s&&w){const T=e.sourceCode.getText(w).replace("return","await");f.push(k.replaceText(w,T))}else f.push(k.insertTextBefore(u,"await "));return m===a.length-1?f:null}})})}}}}),ne=e=>e.type===i.Literal&&typeof e.value=="boolean",ar=e=>{const s=y(e.matcher);if(["toBeTruthy","toBeFalsy"].includes(s))return!0;if(e.args.length!==1)return!1;const t=P(e);return F.hasOwnProperty(s)&&ne(t)},cr=(e,s)=>e.type===i.BinaryExpression&&e.operator==="instanceof"&&v(e.right,s),os=e=>e.arguments.length===1,Ve="prefer-to-be-object",lr=p({name:Ve,meta:{type:"suggestion",docs:{description:"enforce using toBeObject()",recommended:!1},fixable:"code",messages:{preferToBeObject:"Prefer toBeObject() to test if a value is an object"},schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expectTypeOf")return;if(Ws(t,"Object")){e.report({node:t.matcher,messageId:"preferToBeObject",fix:o=>[o.replaceTextRange([t.matcher.range[0],t.matcher.range[1]+8],"toBeObject()")]});return}const{parent:n}=t.head.node;if(n?.type!==i.CallExpression)return;const[r]=n.arguments;!r||!ar(t)||!cr(r,"Object")||e.report({node:t.matcher,messageId:"preferToBeObject",fix(o){const a=[o.replaceText(t.matcher,"toBeObject"),o.removeRange([r.left.range[1],r.range[1]])];let c=y(t.matcher)==="toBeFalsy";if(t.args.length){const[l]=t.args;a.push(o.remove(l)),c=l.type===i.Literal&&le(l).value===!1}if(c){const l=t.modifiers.find(d=>y(d)==="not");a.push(l?o.removeRange([l.range[0]-1,l.range[1]]):o.insertTextBefore(t.matcher,"not."))}return a}})}}}}),He="prefer-to-be-truthy",ur=e=>e.type===i.Literal&&e.value===!0,pr=p({name:He,meta:{type:"suggestion",docs:{description:"enforce using `toBeTruthy`",recommended:!1},messages:{preferToBeTruthy:"Prefer using `toBeTruthy` to test value is `true`"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);(t?.type==="expect"||t?.type==="expectTypeOf")&&t.args.length===1&&ur(P(t))&&F.hasOwnProperty(y(t.matcher))&&e.report({node:t.matcher,messageId:"preferToBeTruthy",fix:n=>[n.replaceText(t.matcher,"toBeTruthy"),n.remove(t.args[0])]})}}}}),Ke="prefer-to-be-falsy",dr=e=>e.type===i.Literal&&e.value===!1,fr=p({name:Ke,meta:{type:"suggestion",docs:{description:"enforce using toBeFalsy()",recommended:!1},fixable:"code",schema:[],messages:{preferToBeFalsy:"Prefer using toBeFalsy()"}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);(t?.type==="expect"||t?.type==="expectTypeOf")&&t.args.length===1&&dr(P(t))&&F.hasOwnProperty(y(t.matcher))&&e.report({node:t.matcher,messageId:"preferToBeFalsy",fix:n=>[n.replaceText(t.matcher,"toBeFalsy"),n.remove(t.args[0])]})}}}}),Ge="prefer-to-have-length",mr=p({name:Ge,meta:{type:"suggestion",docs:{description:"enforce using toHaveLength()",recommended:!1},fixable:"code",messages:{preferToHaveLength:"Prefer toHaveLength()"},schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{parent:n}=t.head.node;if(n?.type!==i.CallExpression)return;const[r]=n.arguments,{matcher:o}=t;!F.hasOwnProperty(y(o))||r?.type!==i.MemberExpression||!v(r.property,"length")||e.report({node:o,messageId:"preferToHaveLength",fix(a){return[a.removeRange([r.property.range[0]-1,r.range[1]]),a.replaceTextRange([o.parent.object.range[1],o.parent.range[1]],".toHaveLength")]}})}}}}),Xe="prefer-equality-matcher",yr=p({name:Xe,meta:{type:"suggestion",docs:{description:"enforce using the built-in quality matchers",recommended:!1},messages:{useEqualityMatcher:"Prefer using one of the equality matchers instead",suggestEqualityMatcher:"Use `{{ equalityMatcher }}`"},hasSuggestions:!0,schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect"||t.args.length===0)return;const{parent:n}=t.head.node;if(n?.type!==i.CallExpression)return;const{arguments:[r],range:[,o]}=n,{matcher:a}=t,c=P(t);if(r?.type!==i.BinaryExpression||r.operator!=="==="&&r.operator!=="!=="||!F.hasOwnProperty(y(a))||!ne(c))return;const l=c.value,[d]=t.modifiers,f=t.modifiers.some(m=>y(m)==="not"),u=(r.operator==="!=="?!l:l)===f,x=m=>I=>{const{sourceCode:k}=e;let b=d&&y(d)!=="not"?`.${y(d)}`:"";return u&&(b+=`.${N.not}`),[I.replaceText(r,k.getText(r.left)),I.replaceTextRange([o,a.parent.range[1]],`${b}.${m}`),I.replaceText(c,k.getText(r.right))]};e.report({messageId:"useEqualityMatcher",suggest:["toBe","toEqual","toStrictEqual"].map(m=>({messageId:"suggestEqualityMatcher",data:{equalityMatcher:m},fix:x(m)})),node:a})}}}}),ze="prefer-strict-equal",hr=p({name:ze,meta:{type:"suggestion",docs:{description:"enforce strict equal over equal",recommended:!1},messages:{useToStrictEqual:"Use `toStrictEqual()` instead",suggestReplaceWithStrictEqual:"Replace with `toStrictEqual()`"},schema:[],hasSuggestions:!0},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{matcher:n}=t;v(n,"toEqual")&&e.report({messageId:"useToStrictEqual",node:n,suggest:[{messageId:"suggestReplaceWithStrictEqual",fix:r=>[G(r,n,F.toStrictEqual)]}]})}}}}),Ye="prefer-expect-resolves",gr=p({name:Ye,meta:{type:"suggestion",docs:{description:"enforce using `expect().resolves` over `expect(await ...)` syntax",recommended:!1},fixable:"code",messages:{expectResolves:"Use `expect().resolves` instead"},schema:[]},defaultOptions:[],create:e=>({CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{parent:n}=t.head.node;if(n?.type!==i.CallExpression)return;const[r]=n.arguments;r?.type===i.AwaitExpression&&e.report({node:r,messageId:"expectResolves",fix(o){return[o.insertTextBefore(n,"await "),o.removeRange([r.range[0],r.argument.range[0]]),o.insertTextAfter(n,".resolves")]}})}})}),Je="prefer-each",kr=p({name:Je,meta:{type:"suggestion",docs:{description:"enforce using `each` rather than manual loops",recommended:!1},schema:[],messages:{preferEach:"Prefer using `{{ fn }}.each` rather than a manual loop"}},defaultOptions:[],create(e){const s=[];let t=!1;const n=()=>s.length===1&&s[0]==="test"?"it":"describe",r=()=>{s.length===0||t||(s.length=0)},o=a=>{s.length===0||t||(e.report({node:a,messageId:"preferEach",data:{fn:n()}}),s.length=0)};return{ForStatement:r,"ForStatement:exit":o,ForInStatement:r,"ForInStatement:exit":o,ForOfStatement:r,"ForOfStatement:exit":o,CallExpression(a){const{type:c}=h(a,e)??{};(c==="hook"||c==="describe"||c==="test")&&s.push(c),c==="test"&&(t=!0)},"CallExpression:exit"(a){const{type:c}=h(a,e)??{};c==="test"&&(t=!1)}}}}),Qe="prefer-hooks-on-top",br=p({name:Qe,meta:{type:"suggestion",docs:{description:"enforce having hooks before any test cases",recommended:!1},messages:{noHookOnTop:"Hooks should come before test cases"},schema:[]},defaultOptions:[],create(e){const s=[!1];return{CallExpression(t){E(t,e,["test"])&&(s[s.length-1]=!0),s[s.length-1]&&E(t,e,["hook"])&&e.report({messageId:"noHookOnTop",node:t}),s.push(!1)},"CallExpression:exit"(){s.pop()}}}}),Ze="prefer-hooks-in-order",is=["beforeAll","beforeEach","afterEach","afterAll"],xr=p({name:Ze,meta:{type:"suggestion",docs:{description:"enforce having hooks in consistent order",recommended:!1},messages:{reorderHooks:"`{{ currentHook }}` hooks should be before any `{{ previousHook }}` hooks"},schema:[]},defaultOptions:[],create(e){let s=-1,t=!1;return{CallExpression(n){if(t)return;const r=h(n,e);if(r?.type!=="hook"){s=-1;return}t=!0;const o=r.name,a=is.indexOf(o);if(a<s){e.report({messageId:"reorderHooks",data:{previousHook:is[s],currentHook:o},node:n}),t=!1;return}s=a},"CallExpression:exit"(n){if(E(n,e,["hook"])){t=!1;return}t||(s=-1)}}}}),et="prefer-mock-promise-shorthand",tt=(e,s)=>`${e}${s?"Once":""}`,Ir=e=>e.body.type!==i.BlockStatement?e.body:e.body.body[0]?.type===i.ReturnStatement?e.body.body[0].argument:null,qr=p({name:et,meta:{type:"suggestion",docs:{description:"enforce mock resolved/rejected shorthands for promises",recommended:!1},messages:{useMockShorthand:"Prefer {{ replacement }}"},schema:[],fixable:"code"},defaultOptions:[],create(e){const s=(t,n,r,o=r)=>{if(o?.type!==i.CallExpression)return;const a=R(o);if(a!=="Promise.resolve"&&a!=="Promise.reject")return;const c=tt(a.endsWith("reject")?"mockRejectedValue":"mockResolvedValue",n);e.report({node:t,messageId:"useMockShorthand",data:{replacement:c},fix(l){const{sourceCode:d}=e;return o.arguments.length>1?null:[l.replaceText(t,c),l.replaceText(r,o.arguments.length===1?d.getText(o.arguments[0]):"undefined")]}})};return{CallExpression(t){if(t.callee.type!==i.MemberExpression||!v(t.callee.property)||t.arguments.length===0)return;const n=y(t.callee.property),r=n.endsWith("Once");if(n===tt("mockReturnValue",r))s(t.callee.property,r,t.arguments[0]);else if(n===tt("mockImplementation",r)){const[o]=t.arguments;if(!M(o)||o.params.length!==0)return;s(t.callee.property,r,o,Ir(o))}}}}}),Er=Mt(import.meta.url),Tr=Mt(Er.resolve("eslint"));Tr.resolve("espree");const wr=new Set([i.Program,i.BlockStatement,i.SwitchCase,i.SwitchStatement]),Ar=e=>wr.has(e),Cr=e=>e.value===";"&&e.type===St.Punctuator,as=(e,s)=>{const t=e.getLastToken(s),n=e.getTokenBefore(t),r=e.getTokenAfter(t);return n&&r&&n.range[0]>=s.range[0]&&Cr(t)&&t.loc.start.line!==n.loc.end.line&&t.loc.end.line===r.loc.start.line?n:t},vr=(e,s,t)=>{const n=[];let r=as(t,e);if(s.loc.start.line-e.loc.end.line>=2)do{const o=t.getTokenAfter(r,{includeComments:!0});o.loc.start.line-r.loc.end.line>=2&&n.push([r,o]),r=o}while(r.range[0]<s.range[0]);return n},cs=(e,s)=>e.loc.end.line===s.loc.start.line,Sr=e=>e.type===i.TSAsExpression||e.type===i.TSTypeAssertion,ls=e=>Sr(e)?ls(e.expression):e,st="prefer-vi-mocked",Mr=["Mock","MockedFunction","MockedClass","MockedObject"],$r=p({name:st,meta:{type:"suggestion",docs:{description:"require `vi.mocked()` over `fn as Mock`",requiresTypeChecking:!0,recommended:!1},fixable:"code",messages:{useViMocked:"Prefer `vi.mocked()`"},schema:[]},defaultOptions:[],create(e){function s(t){const{typeAnnotation:n}=t;if(n.type!==i.TSTypeReference)return;const{typeName:r}=n;if(r.type!==i.Identifier||!Mr.includes(r.name))return;const o=e.sourceCode.text.slice(...ls(t.expression).range);e.report({node:t,messageId:"useViMocked",fix(a){return a.replaceText(t,`vi.mocked(${o})`)}})}return{TSAsExpression(t){t.parent.type!==i.TSAsExpression&&s(t)},TSTypeAssertion(t){s(t)}}}}),nt="prefer-snapshot-hint",Or=["toMatchSnapshot","toThrowErrorMatchingSnapshot"],Rr=Or,Nr=e=>{if(e.args.length===0)return!0;if(!v(e.matcher,"toMatchSnapshot"))return e.args.length!==1;if(e.args.length===2)return!1;const[s]=e.args;return!B(s)},Br=p({name:nt,meta:{type:"suggestion",docs:{description:"enforce including a hint with external snapshots",recommended:!1},messages:{missingHint:"You should provide a hint for this snapshot"},schema:[{type:"string",enum:["always","multi"]}]},defaultOptions:["multi"],create(e,[s]){const t=[];let n=0;const r=[],o=()=>{for(const l of t)Nr(l)&&e.report({messageId:"missingHint",node:l.matcher})},a=()=>{n++},c=()=>{n--,s==="always"&&(o(),t.length=0),s==="multi"&&n===0&&(t.length>1&&o(),t.length=0)};return{"Program:exit"(){a(),c()},FunctionExpression:a,"FunctionExpression:exit":c,ArrowFunctionExpression:a,"ArrowFunctionExpression:exit":c,"CallExpression:exit"(l){E(l,e,["describe","test"])&&(n=r.pop()??0)},CallExpression(l){const d=h(l,e);if(d?.type!=="expect"){(d?.type==="describe"||d?.type==="test")&&(r.push(n),n=0);return}const f=y(d.matcher);Rr.includes(f)&&t.push(d)}}}}),re="valid-describe-callback",us=e=>{const[s]=e,t=e[e.length-1];return{start:s.loc.start,end:t.loc.end}},ps=(e,s)=>e.members.every(t=>y(t)!=="each")&&s.params.length,ds=(e,s)=>{e.body.forEach(t=>{t.type===i.ReturnStatement&&s.report({messageId:"unexpectedReturnInDescribe",node:t})})},Lr=p({name:re,meta:{type:"problem",docs:{description:"enforce valid describe callback",recommended:!1},messages:{nameAndCallback:"Describe requires a name and callback arguments",secondArgumentMustBeFunction:"Second argument must be a function",unexpectedDescribeArgument:"Unexpected argument in describe callback",unexpectedReturnInDescribe:"Unexpected return statement in describe callback"},schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="describe"||t?.members[0]?.type===i.Identifier&&t.members[0].name==="todo")return;if(s.arguments.length<1)return e.report({messageId:"nameAndCallback",loc:s.loc});const[,n,r]=s.arguments;if(!n){e.report({messageId:"nameAndCallback",loc:us(s.arguments)});return}if(!M(n)){if(r&&M(r)){ps(t,r)&&e.report({messageId:"unexpectedDescribeArgument",node:r}),r.body.type===i.CallExpression&&e.report({messageId:"unexpectedReturnInDescribe",node:r}),r.body.type===i.BlockStatement&&ds(r.body,e);return}e.report({messageId:"secondArgumentMustBeFunction",loc:us(s.arguments)});return}ps(t,n)&&e.report({messageId:"unexpectedDescribeArgument",node:n}),n.body.type===i.CallExpression&&e.report({messageId:"unexpectedReturnInDescribe",node:n}),n.body.type===i.BlockStatement&&ds(n.body,e)}}}}),rt="require-top-level-describe",Fr=p({name:rt,meta:{docs:{description:"enforce that all tests are in a top-level describe",recommended:!1},messages:{tooManyDescribes:"There should not be more than {{ max }} describe{{ s }} at the top level",unexpectedTestCase:"All test cases must be wrapped in a describe block",unexpectedHook:"All hooks must be wrapped in a describe block"},type:"suggestion",schema:[{type:"object",properties:{maxNumberOfTopLevelDescribes:{type:"number",minimum:1}},additionalProperties:!1}]},defaultOptions:[{}],create(e){const{maxNumberOfTopLevelDescribes:s=1/0}=e.options[0]??{};let t=0,n=0;return{CallExpression(r){const o=h(r,e);if(o){if(o.type==="describe"){n++,n===1&&(t++,t>s&&e.report({node:r,messageId:"tooManyDescribes",data:{max:s,s:s===1?"":"s"}}));return}if(n===0){if(o.type==="test"){e.report({node:r,messageId:"unexpectedTestCase"});return}o.type==="hook"&&e.report({node:r,messageId:"unexpectedHook"})}}},"CallExpression:exit"(r){E(r,e,["describe"])&&n--}}}}),ot="require-to-throw-message",Pr=p({name:ot,meta:{type:"suggestion",docs:{description:"require toThrow() to be called with an error message",recommended:!1},schema:[],messages:{addErrorMessage:"Add an error message to {{ matcherName }}()"}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{matcher:n}=t,r=y(n);t.args.length===0&&["toThrow","toThrowError"].includes(r)&&!t.modifiers.some(o=>y(o)==="not")&&e.report({messageId:"addErrorMessage",data:{matcherName:r},node:n})}}}}),it="require-hook",Ur=(e,s)=>h(e,s)?!0:!!R(e)?.startsWith("vi"),jr=e=>e.type===i.Literal&&e.value===null||L(e,"undefined"),fs=(e,s,t=[])=>{switch(e.type){case i.ExpressionStatement:return fs(e.expression,s,t);case i.CallExpression:return!(Ur(e,s)||t.includes(R(e)));case i.VariableDeclaration:return e.kind==="const"?!1:e.declarations.some(({init:n})=>n!==null&&!jr(n));default:return!1}},_r=p({name:it,meta:{docs:{description:"require setup and teardown to be within a hook",recommended:!1},messages:{useHook:"This should be done within a hook"},type:"suggestion",schema:[{type:"object",properties:{allowedFunctionCalls:{type:"array",items:{type:"string"}}},additionalProperties:!1}]},defaultOptions:[{allowedFunctionCalls:[]}],create(e){const{allowedFunctionCalls:s}=e.options[0]??{},t=n=>{for(const r of n)fs(r,e,s)&&e.report({node:r,messageId:"useHook"})};return{Program(n){t(n.body)},CallExpression(n){if(!E(n,e,["describe"])||n.arguments.length<2)return;const[,r]=n.arguments;!M(r)||r.body.type!==i.BlockStatement||t(r.body.body)}}}}),oe="require-local-test-context-for-concurrent-snapshots",Dr=p({name:oe,meta:{docs:{description:"require local Test Context for concurrent snapshot tests",recommended:!1},messages:{requireLocalTestContext:"Use local Test Context instead"},type:"problem",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);t===null||t.type!=="expect"||t.type==="expect"&&t.head.type==="testContext"||!["toMatchSnapshot","toMatchInlineSnapshot","toMatchFileSnapshot","toThrowErrorMatchingSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(s.callee?.property.name)||!e.sourceCode.getAncestors(s).some(n=>n.type!==i.CallExpression||!E(n,e,["describe","test"])?!1:n.callee.type===i.MemberExpression&&v(n.callee.property,"concurrent"))||e.report({node:s,messageId:"requireLocalTestContext"})}}}}),at="prefer-todo",Wr=e=>e.members.some(s=>y(s)!=="skip")||e.name.startsWith("x")?!1:!e.name.startsWith("f");function Vr(e){return M(e)?e.body.type===i.BlockStatement&&!e.body.body.length:!1}function ms(e,s){return e.members.length?G(s,e.members[0],"todo"):s.replaceText(e.head.node,`${e.head.local}.todo`)}const Hr=p({name:at,meta:{type:"layout",docs:{description:"enforce using `test.todo`",recommended:!1},messages:{emptyTest:"Prefer todo test case over empty test case",unimplementedTest:"Prefer todo test case over unimplemented test case"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const[t,n]=s.arguments,r=h(s,e);!t||r?.type!=="test"||!Wr(r)||!B(t)||(n&&Vr(n)&&e.report({messageId:"emptyTest",node:s,fix:o=>[o.removeRange([t.range[1],n.range[1]]),ms(r,o)]}),os(s)&&e.report({messageId:"unimplementedTest",node:s,fix:o=>ms(r,o)}))}}}}),ct="prefer-spy-on",Kr=e=>"object"in e?e.object:e.callee.type===i.MemberExpression?e.callee.object:null,ys=e=>{if(e.type!==i.CallExpression&&e.type!==i.MemberExpression)return null;const s=Kr(e);return s?s.type===i.Identifier?e.type===i.CallExpression&&R(e.callee)==="vi.fn"?e:null:ys(s):null},Gr=(e,s)=>{if(e.parent?.type===i.MemberExpression&&e.parent.property.type===i.Identifier&&e.parent.property.name==="mockImplementation")return"";const[t]=e.arguments,n=t&&s.sourceCode.getText(t);return n?`.mockImplementation(${n})`:".mockImplementation()"},Xr=p({name:ct,meta:{type:"suggestion",docs:{description:"enforce using `vi.spyOn`",recommended:!1},messages:{useViSpayOn:"Use `vi.spyOn` instead"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{AssignmentExpression(s){const{left:t,right:n}=s;if(t.type!==i.MemberExpression)return;const r=ys(n);r&&e.report({node:s,messageId:"useViSpayOn",fix(o){const a=t.property.type===i.Identifier&&!t.computed?"'":"",c=Gr(r,e);return[o.insertTextBefore(t,"vi.spyOn("),o.replaceTextRange([t.object.range[1],t.property.range[0]],`, ${a}`),o.replaceTextRange([t.property.range[1],r.range[1]],`${a})${c}`)]}})}}}}),lt="prefer-comparison-matcher",hs=e=>B(e)||e?.type===i.TemplateLiteral,zr=e=>hs(e.left)||hs(e.right),Yr=e=>{switch(e){case">":return"<=";case"<":return">=";case">=":return"<";case"<=":return">"}return null},Jr=(e,s)=>{switch(s?Yr(e):e){case">":return"toBeGreaterThan";case"<":return"toBeLessThan";case">=":return"toBeGreaterThanOrEqual";case"<=":return"toBeLessThanOrEqual"}return null},Qr=p({name:lt,meta:{type:"suggestion",docs:{description:"enforce using the built-in comparison matchers",recommended:!1},schema:[],fixable:"code",messages:{useToBeComparison:"Prefer using `{{ preferredMatcher }}` instead"}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect"||t.args.length===0)return;const{parent:n}=t.head.node;if(n?.type!==i.CallExpression)return;const{arguments:[r],range:[,o]}=n,{matcher:a}=t,c=P(t);if(r?.type!==i.BinaryExpression||zr(r)||!F.hasOwnProperty(y(a))||!ne(c))return;const[l]=t.modifiers,d=t.modifiers.some(u=>y(u)==="not"),f=Jr(r.operator,c.value===d);f&&e.report({fix(u){const{sourceCode:x}=e,m=l&&y(l)!=="not"?`.${y(l)}`:"";return[u.replaceText(r,x.getText(r.left)),u.replaceTextRange([o,a.parent.range[1]],`${m}.${f}`),u.replaceText(c,x.getText(r.right))]},messageId:"useToBeComparison",data:{preferredMatcher:f},node:a})}}}}),ut="prefer-describe-function-title",Zr=p({name:ut,meta:{type:"problem",docs:{description:"enforce using a function as a describe title over an equivalent string",recommended:!1},fixable:"code",schema:[],messages:{preferFunction:"Enforce using a function over an equivalent string"}},defaultOptions:[],create(e){return{CallExpression(s){if(s.arguments.length<2)return;const[t]=s.arguments;if(t.type!==i.Literal||typeof t.value!="string")return;const n=t.value;if(h(s,e)?.type!=="describe")return;const r=Hs(e,s)?.set.get(n)?.defs[0];if(r?.type==="ImportBinding"){if(z(e.settings).typecheck){const o=ie.getParserServices(e).getTypeAtLocation(r.node);if(!Rt(o))return}e.report({node:t,messageId:"preferFunction",fix(o){return o.replaceText(t,n)}})}}}}}),pt="prefer-to-contain",eo=e=>e.type===i.CallExpression&&e.callee.type===i.MemberExpression&&v(e.callee.property,"includes")&&os(e)&&e.arguments[0].type!==i.SpreadElement,to=p({name:pt,meta:{docs:{description:"enforce using toContain()",recommended:!1},messages:{useToContain:"Use toContain() instead"},fixable:"code",type:"suggestion",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect"||t.args.length===0)return;const{parent:n}=t.head.node;if(n?.type!==i.CallExpression)return;const{arguments:[r],range:[,o]}=n,{matcher:a}=t,c=P(t);if(!r||c.type===i.SpreadElement||!F.hasOwnProperty(y(a))||!ne(c)||!eo(r))return;const l=t.modifiers.some(d=>y(d)==="not");e.report({fix(d){const{sourceCode:f}=e,u=c.value===l;return[d.removeRange([r.callee.property.range[0]-1,r.range[1]]),d.replaceTextRange([o,a.parent.range[1]],u?`.${N.not}.toContain`:".toContain"),d.replaceText(t.args[0],f.getText(r.arguments[0]))]},messageId:"useToContain",node:a})}}}}),gs="prefer-expect-assertions",so=e=>{let s=e;for(;s;){if(s.parent?.type===i.BlockStatement)return s.parent.body[0]===s;if(s.parent?.type===i.ArrowFunctionExpression)return!0;s=s.parent}throw new Error("Could not find parent block statement")},ks=(e,s,t)=>({messageId:"suggestRemovingExtraArguments",fix:n=>$t(n,e,s,t)}),no=p({name:"prefer-expect-assertions",meta:{docs:{description:"enforce using expect assertions instead of callbacks",recommended:!1},messages:{hasAssertionsTakesNoArguments:"`expect.hasAssertions` expects no arguments",assertionsRequiresOneArgument:"`expect.assertions` excepts a single argument of type number",assertionsRequiresNumberArgument:"This argument should be a number",haveExpectAssertions:"Every test should have either `expect.assertions(<number of assertions>)` or `expect.hasAssertions()` as its first expression",suggestAddingHasAssertions:"Add `expect.hasAssertions()`",suggestAddingAssertions:"Add `expect.assertions(<number of assertions>)`",suggestRemovingExtraArguments:"Remove extra arguments"},type:"suggestion",hasSuggestions:!0,schema:[{type:"object",properties:{onlyFunctionsWithAsyncKeyword:{type:"boolean"},onlyFunctionsWithExpectInLoop:{type:"boolean"},onlyFunctionsWithExpectInCallback:{type:"boolean"}},additionalProperties:!1}]},defaultOptions:[{onlyFunctionsWithAsyncKeyword:!1,onlyFunctionsWithExpectInCallback:!1,onlyFunctionsWithExpectInLoop:!1}],create(e,[s]){let t=0,n=!1,r=!1,o=!1,a=null,c=!1,l=!1;const d=k=>!!(!s.onlyFunctionsWithAsyncKeyword&&!s.onlyFunctionsWithExpectInCallback&&!s.onlyFunctionsWithExpectInLoop||s.onlyFunctionsWithAsyncKeyword&&k.async||s.onlyFunctionsWithExpectInCallback&&n||s.onlyFunctionsWithExpectInLoop&&r);function f(k,b){if(y(k.members[0])==="hasAssertions"){k.args.length&&e.report({messageId:"hasAssertionsTakesNoArguments",node:k.matcher,suggest:[ks(e,b,0)]});return}if(k.args.length!==1){let{loc:w}=k.matcher;const T=[];k.args.length&&(w=k.args[1].loc,T.push(ks(e,b,1))),e.report({messageId:"assertionsRequiresOneArgument",suggest:T,loc:w});return}const[A]=k.args;A.type===i.Literal&&typeof A.value=="number"&&Number.isInteger(A.value)||e.report({messageId:"assertionsRequiresNumberArgument",node:A})}const u=()=>c&&t++,x=()=>c&&t--,m=()=>l=!0,I=()=>l=!1;return{FunctionExpression:u,"FunctionExpression:exit":x,ArrowFunctionExpression:u,"ArrowFunctionExpression:exit":x,ForStatement:m,"ForStatement:exit":I,ForInStatement:m,"ForInStatement:exit":I,ForOfStatement:m,"ForOfStatement:exit":I,CallExpression(k){const b=h(k,e);if(b?.type==="test"){c=!0;return}b?.head.type==="testContext"&&b.members[0]&&b.members[0].type===i.Identifier&&b.members[0].name==="expect"&&(a=`${b.head.local}`),b?.type==="expect"&&c&&(t===1&&so(k)&&b.head.node.parent?.type===i.MemberExpression&&b.members.length===1&&["assertions","hasAssertions"].includes(y(b.members[0]))&&(f(b,k),o=!0),l&&(r=!0),t>1&&(n=!0))},"CallExpression:exit"(k){if(!E(k,e,["test"])||(c=!1,k.arguments.length<2))return;const[,b]=k.arguments;if(!M(b)||!d(b))return;if(r=!1,n=!1,o){o=!1;return}const A=[];if(b.body.type===i.BlockStatement){const w=a?`${a}.`:"";A.push(["suggestAddingHasAssertions",`${w}expect.hasAssertions();`],["suggestAddingAssertions",`${w}expect.assertions();`])}e.report({messageId:"haveExpectAssertions",node:k,suggest:A.map(([w,T])=>({messageId:w,fix:C=>C.insertTextBeforeRange([b.body.range[0]+1,b.body.range[1]],T)}))})}}}});var S=(e=>(e[e.Any=0]="Any",e[e.Always=1]="Always",e))(S||{}),g=(e=>(e[e.Any=0]="Any",e[e.AfterAllToken=1]="AfterAllToken",e[e.AfterEachToken=2]="AfterEachToken",e[e.BeforeAllToken=3]="BeforeAllToken",e[e.BeforeEachToken=4]="BeforeEachToken",e[e.DescribeToken=5]="DescribeToken",e[e.ExpectToken=6]="ExpectToken",e[e.ExpectTypeOfToken=7]="ExpectTypeOfToken",e[e.FdescribeToken=8]="FdescribeToken",e[e.FitToken=9]="FitToken",e[e.ItToken=10]="ItToken",e[e.TestToken=11]="TestToken",e[e.XdescribeToken=12]="XdescribeToken",e[e.XitToken=13]="XitToken",e[e.XtestToken=14]="XtestToken",e))(g||{});const ro=(e,s,t)=>{const{sourceCode:n,ruleContext:r}=t;vr(e,s,n).length>0||r.report({node:s,messageId:"missingPadding",fix(o){let a=as(n,e);const c=n.getFirstTokenBetween(a,s,{includeComments:!0,filter(d){return cs(a,d)?(a=d,!1):!0}})||s,l=cs(a,c)?`
|
|
4
4
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitest/eslint-plugin",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Eslint plugin for vitest",
|
|
6
6
|
"repository": "vitest-dev/eslint-plugin-vitest",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"@typescript-eslint/eslint-plugin": "^8.24.1",
|
|
49
49
|
"@typescript-eslint/parser": "^8.24.1",
|
|
50
50
|
"@typescript-eslint/rule-tester": "^8.24.1",
|
|
51
|
-
"@vitest/eslint-plugin": "
|
|
51
|
+
"@vitest/eslint-plugin": "^1.3.1",
|
|
52
52
|
"bumpp": "^9.11.1",
|
|
53
53
|
"concurrently": "^9.1.2",
|
|
54
54
|
"eslint": "^9.20.0",
|