@vitest/eslint-plugin 1.3.15 → 1.3.16

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 CHANGED
@@ -1,8 +1,8 @@
1
- "use strict";const utils=require("@typescript-eslint/utils"),n$3=require("typescript"),node_path=require("node:path"),node_module=require("node:module"),scopeManager=require("@typescript-eslint/scope-manager");var _documentCurrentScript=typeof document<"u"?document.currentScript:null;function _interopDefaultCompat(b){return b&&typeof b=="object"&&"default"in b?b.default:b}const n__default=_interopDefaultCompat(n$3),version="1.3.15",createEslintRule=utils.ESLintUtils.RuleCreator(b=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${b}.md`),joinNames=(b,Y)=>b&&Y?`${b}.${Y}`:null,isFunction=b=>b.type===utils.AST_NODE_TYPES.FunctionExpression||b.type===utils.AST_NODE_TYPES.ArrowFunctionExpression;function getNodeName(b){if(isSupportedAccessor(b))return getAccessorValue(b);switch(b.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeName(b.tag);case utils.AST_NODE_TYPES.MemberExpression:return joinNames(getNodeName(b.object),getNodeName(b.property));case utils.AST_NODE_TYPES.NewExpression:case utils.AST_NODE_TYPES.CallExpression:return getNodeName(b.callee)}return null}const isSupportedAccessor=(b,Y)=>isIdentifier(b,Y)||isStringNode(b,Y),isIdentifier=(b,Y)=>b.type===utils.AST_NODE_TYPES.Identifier&&(Y===void 0||b.name===Y),S$5=(b,Y)=>b.type===utils.AST_NODE_TYPES.TemplateLiteral&&b.quasis.length===1&&(Y===void 0||b.quasis[0].value.raw===Y),g$3=(b,Y)=>b.type===utils.AST_NODE_TYPES.Literal&&typeof b.value=="string"&&(Y===void 0||b.value===Y),isStringNode=(b,Y)=>g$3(b,Y)||S$5(b,Y),getAccessorValue=b=>b.type===utils.AST_NODE_TYPES.Identifier?b.name:getStringValue(b),getStringValue=b=>b?.type===utils.AST_NODE_TYPES.TemplateLiteral?b.quasis[0].value.raw:b?.value,replaceAccessorFixer=(b,Y,q)=>b.replaceText(Y,Y.type===utils.AST_NODE_TYPES.Identifier?q:`'${q}'`),removeExtraArgumentsFixer=(b,Y,q,$)=>{const B=q.arguments[$],F=q.arguments[q.arguments.length-1],{sourceCode:W}=Y;let H=W.getTokenAfter(F);return H.value===","&&(H=W.getTokenAfter(H)),b.removeRange([B.range[0],H.range[0]])},isParsedInstanceOfMatcherCall=(b,Y)=>getAccessorValue(b.matcher)==="toBeInstanceOf"&&b.args.length===1&&isSupportedAccessor(b.args[0],Y);var UtilName=(b=>(b.vi="vi",b.vitest="vitest",b))(UtilName||{}),DescribeAlias=(b=>(b.describe="describe",b.fdescribe="fdescribe",b.xdescribe="xdescribe",b))(DescribeAlias||{}),TestCaseName=(b=>(b.fit="fit",b.it="it",b.test="test",b.xit="xit",b.xtest="xtest",b.bench="bench",b))(TestCaseName||{}),HookName=(b=>(b.beforeAll="beforeAll",b.beforeEach="beforeEach",b.afterAll="afterAll",b.afterEach="afterEach",b))(HookName||{}),ModifierName=(b=>(b.to="to",b.have="have",b.not="not",b.rejects="rejects",b.resolves="resolves",b.returns="returns",b.branded="branded",b.asserts="asserts",b.constructorParameters="constructorParameters",b.parameters="parameters",b.thisParameter="thisParameter",b.guards="guards",b.instance="instance",b.items="items",b))(ModifierName||{}),EqualityMatcher=(b=>(b.toBe="toBe",b.toEqual="toEqual",b.toStrictEqual="toStrictEqual",b))(EqualityMatcher||{});function isClassOrFunctionType(b){return b.getCallSignatures().length>0?!0:b.getSymbol()?.getDeclarations()?.some(Y=>n__default.isArrowFunction(Y)||n__default.isClassDeclaration(Y)||n__default.isClassExpression(Y)||n__default.isFunctionDeclaration(Y)||n__default.isFunctionExpression(Y)||n__default.isMethodDeclaration(Y)||n__default.isFunctionTypeNode(Y))??!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(b,Y){return b.sourceCode.getScope?b.sourceCode.getScope(Y):b.getScope()}function getModuleScope(b,Y){let q=getScope(b,Y);for(;q;){if(q.type==="module")return q;q=q.upper}return q}const isTypeOfVitestFnCall=(b,Y,q)=>{const $=parseVitestFnCall(b,Y);return $!==null&&q.includes($.type)},parseVitestFnCall=(b,Y)=>{const q=parseVitestFnCallWithReason(b,Y);return typeof q=="string"?null:q},m$6=new WeakMap,parseVitestFnCallWithReason=(b,Y)=>{let q=m$6.get(b);return q||(q=M$3(b,Y),m$6.set(b,q),q)},w$2=b=>b==="expect"?"expect":b==="expectTypeOf"?"expectTypeOf":b==="vi"?"vi":b==="vitest"?"vitest":DescribeAlias.hasOwnProperty(b)?"describe":TestCaseName.hasOwnProperty(b)?"test":HookName.hasOwnProperty(b)?"hook":"unknown",A$3=b=>{const Y=[];for(const q of b){if(q.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&q.parent.parent?.type===utils.AST_NODE_TYPES.CallExpression)return{matcher:q,args:q.parent.parent.arguments,modifiers:Y};const $=getAccessorValue(q);if(Y.length===0){if(!ModifierName.hasOwnProperty($))return"modifier-unknown"}else if(Y.length===1){if($!==ModifierName.not&&$!=ModifierName.have)return"modifier-unknown";const B=getAccessorValue(Y[0]);if(B!==ModifierName.resolves&&B!==ModifierName.rejects&&B!==ModifierName.to)return"modifier-unknown"}else return"modifier-unknown";Y.push(q)}return"matcher-not-found"},P$2=(b,Y)=>{const q=A$3(b.members);return typeof q=="string"?q:{...b,type:Y,...q}},findTopMostCallExpression=b=>{let Y=b,{parent:q}=b;for(;q;){if(q.type===utils.AST_NODE_TYPES.CallExpression){Y=q,q=q.parent;continue}if(q.type!==utils.AST_NODE_TYPES.MemberExpression)break;q=q.parent}return Y},M$3=(b,Y)=>{const q=getNodeChain(b);if(!q?.length)return null;const[$,...B]=q,F=getAccessorValue(q[q.length-1]);if(F==="each"&&b.callee.type!==utils.AST_NODE_TYPES.CallExpression&&b.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||b.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&F!=="each")return null;const W=v(Y,b,getAccessorValue($));if(!W)return null;const H=W.original??W.local,V=[H,...B.map(getAccessorValue)];if(W.type!=="testContext"&&H!=="vi"&&H!=="vitest"&&H!=="expect"&&H!=="expectTypeOf"&&!ValidVitestFnCallChains.has(V.join(".")))return null;const X={name:H,head:{...W,node:$},members:B},z=w$2(H);if(z==="expect"||z==="expectTypeOf"){const G=P$2(X,z);return typeof G=="string"&&findTopMostCallExpression(b)!==b?null:G==="matcher-not-found"&&b.parent?.type===utils.AST_NODE_TYPES.MemberExpression?"matcher-not-called":G}return q.slice(0,q.length-1).some(G=>G.parent?.type!==utils.AST_NODE_TYPES.MemberExpression)||b.parent?.type===utils.AST_NODE_TYPES.CallExpression||b.parent?.type===utils.AST_NODE_TYPES.MemberExpression?null:{...X,type:z}},k$1=(b,Y)=>b&&Y?[...b,...Y]:null;function getNodeChain(b){if(isSupportedAccessor(b))return[b];switch(b.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeChain(b.tag);case utils.AST_NODE_TYPES.MemberExpression:return k$1(getNodeChain(b.object),getNodeChain(b.property));case utils.AST_NODE_TYPES.CallExpression:return getNodeChain(b.callee)}return null}const v=(b,Y,q)=>{const $=getScope(b,Y),B=resolveScope($,q);return B==="local"?null:B==="testContext"?{local:q,original:null,type:"testContext"}:B?B.source==="vitest"?{original:B.imported,local:B.local,type:"import"}:null:{original:N$5(q,b),local:q,type:"global"}},N$5=(b,Y)=>{const q=Y.settings.vitest?.globalAliases??{},$=Object.entries(q).find(([B,F])=>F.includes(b));return $?$[0]:null},I$1=({parent:b})=>b?.type===utils.AST_NODE_TYPES.CallExpression&&b.callee.type===utils.AST_NODE_TYPES.Identifier&&TestCaseName.hasOwnProperty(b.callee.name),resolveScope=(b,Y)=>{let q=b;for(;q!==null;){const $=q.set.get(Y);if($&&$.defs.length>0){const B=$.defs[$.defs.length-1],F=isFunction(B.node)?B.node.params.find(V=>V.type===utils.AST_NODE_TYPES.ObjectPattern):void 0;if(F){const V=F.properties.find(X=>X.type===utils.AST_NODE_TYPES.Property);if((V?.key.type===utils.AST_NODE_TYPES.Identifier?V.key:void 0)?.name===Y)return"testContext"}if(B.node.type===utils.AST_NODE_TYPES.VariableDeclarator&&B.node.id.type===utils.AST_NODE_TYPES.Identifier&&TestCaseName.hasOwnProperty(B.node.id.name)&&B.node.init?.type===utils.AST_NODE_TYPES.CallExpression&&B.node.init.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isIdentifier(B.node.init.callee.property,"extend"))return"testContext";const W=isFunction(B.node)?B.node.params.find(V=>V.type===utils.AST_NODE_TYPES.Identifier):void 0;if(W&&I$1(W.parent))return"testContext";const H=D$1(B);return H?.local===Y?H:"local"}q=q.upper}return null},O$2=b=>b.type===utils.AST_NODE_TYPES.AwaitExpression?b.argument.type===utils.AST_NODE_TYPES.ImportExpression?b.argument.source:null:b.type===utils.AST_NODE_TYPES.CallExpression&&isIdentifier(b.callee,"require")?b.arguments[0]??null:null,R=b=>b.parent.type===utils.AST_NODE_TYPES.TSImportEqualsDeclaration||b.node.type!==utils.AST_NODE_TYPES.ImportSpecifier||b.node.imported.type!=utils.AST_NODE_TYPES.Identifier||b.parent.importKind==="type"?null:{source:b.parent.source.value,imported:b.node.imported.name,local:b.node.local.name},D$1=b=>b.type==="Variable"?L$1(b):b.type==="ImportBinding"?R(b):null,L$1=b=>{if(!b.node.init)return null;const Y=O$2(b.node.init);return!Y||!isStringNode(Y)||b.name.parent?.type!==utils.AST_NODE_TYPES.Property||!isSupportedAccessor(b.name.parent.key)?null:{source:getStringValue(Y),imported:getAccessorValue(b.name.parent.key),local:b.name.name}},getTestCallExpressionsFromDeclaredVariables=(b,Y)=>b.reduce((q,{references:$})=>q.concat($.map(({identifier:B})=>B.parent).filter(B=>B?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(B,Y,["test"]))),[]),getFirstMatcherArg=b=>{const[Y]=b.args;return Y.type===utils.AST_NODE_TYPES.SpreadElement?Y:followTypeAssertionChain$1(Y)},K=b=>b.type===utils.AST_NODE_TYPES.TSAsExpression||b.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain$1=b=>K(b)?followTypeAssertionChain$1(b.expression):b,RULE_NAME$1a="prefer-lowercase-title",E$4=b=>b.arguments[0]&&isStringNode(b.arguments[0]),x$4=b=>{const Y=[];return b.includes(DescribeAlias.describe)&&Y.push(...Object.keys(DescribeAlias)),b.includes(TestCaseName.test)&&Y.push(...Object.keys(TestCaseName).filter(q=>q.endsWith(TestCaseName.test))),b.includes(TestCaseName.it)&&Y.push(...Object.keys(TestCaseName).filter(q=>q.endsWith(TestCaseName.it))),Y},xe=createEslintRule({name:RULE_NAME$1a,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:(b,[{ignore:Y=[],allowedPrefixes:q=[],ignoreTopLevelDescribe:$=!1,lowercaseFirstCharacterOnly:B=!1}])=>{const F=x$4(Y);let W=0;return{CallExpression(H){const V=parseVitestFnCall(H,b);if(!V||!E$4)return;if(V?.type==="describe"){if(W++,$&&W===1)return}else if(V?.type!=="test")return;const[X]=H.arguments,z=getStringValue(X);if(typeof z!="string"||q.some(ee=>z.startsWith(ee)))return;const G=z.charAt(0);F.includes(V.name)||B&&(!G||G===G.toLowerCase())||!B&&z===z.toLowerCase()||b.report({messageId:B?"lowerCaseTitle":"fullyLowerCaseTitle",node:H.arguments[0],data:{method:V.name},fix:ee=>{const J=getStringValue(X),se=[X.range[0]+1,X.range[1]-1],Q=B?J.substring(0,1).toLowerCase()+J.substring(1):J.toLowerCase();return[ee.replaceTextRange(se,Q)]}})},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,b,["describe"])&&W--}}}}),RULE_NAME$19="max-nested-describe",Ce=createEslintRule({name:RULE_NAME$19,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(b,[{max:Y}]){const q=[];function $(F){F.parent?.type==="CallExpression"&&(F.parent.callee.type!=="Identifier"||F.parent.callee.name!=="describe"||(q.push(0),q.length>Y&&b.report({node:F.parent,messageId:"maxNestedDescribe"})))}function B(F){F.parent?.type==="CallExpression"&&(F.parent.callee.type!=="Identifier"||F.parent.callee.name!=="describe"||q.pop())}return{FunctionExpression:$,"FunctionExpression:exit":B,ArrowFunctionExpression:$,"ArrowFunctionExpression:exit":B}}}),RULE_NAME$18="no-identical-title",c$6=()=>({describeTitles:[],testTitles:[]}),ve=createEslintRule({name:RULE_NAME$18,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(b){const Y=[c$6()];return{CallExpression(q){const $=Y[Y.length-1],B=parseVitestFnCall(q,b);if(!B||((B.name==="describe"||B.name==="suite")&&Y.push(c$6()),B.members.find(H=>isSupportedAccessor(H,"each"))))return;const[F]=q.arguments;if(!F||!isStringNode(F))return;const W=getStringValue(F);B.type==="test"&&($?.testTitles.includes(W)&&b.report({node:q,messageId:"multipleTestTitle"}),$?.testTitles.push(W)),B.type==="describe"&&($?.describeTitles.includes(W)&&b.report({node:q,messageId:"multipleDescribeTitle"}),$?.describeTitles.push(W))},"CallExpression:exit"(q){isTypeOfVitestFnCall(q,b,["describe"])&&Y.pop()}}}}),RULE_NAME$17="no-focused-tests",n$2=b=>b.type==="Identifier"&&["it","test","describe"].includes(b.name),a$6=b=>b.type==="Identifier"&&b.name==="only",Be=createEslintRule({name:RULE_NAME$17,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:b=>{const Y=b.options[0]?.fixable;return{ExpressionStatement(q){if(q.expression.type==="CallExpression"){const{callee:$}=q.expression;if($.type==="MemberExpression"&&n$2($.object)&&a$6($.property)&&b.report({node:$.property,messageId:"noFocusedTests",fix:B=>Y?B.removeRange([$.property.range[0]-1,$.property.range[1]]):null}),$.type==="TaggedTemplateExpression"){const B=$.tag.type==="MemberExpression"?$.tag.object:null;if(!B)return;B.type==="MemberExpression"&&n$2(B.object)&&a$6(B.property)&&b.report({node:B.property,messageId:"noFocusedTests",fix:F=>Y?F.removeRange([B.property.range[0]-1,B.property.range[1]]):null})}}},CallExpression(q){if(q.callee.type==="CallExpression"){const{callee:$}=q.callee;if($.type==="MemberExpression"&&$.object.type==="MemberExpression"&&n$2($.object.object)&&a$6($.object.property)&&$.property.type==="Identifier"&&$.property.name==="each"){const B=$.object.property;b.report({node:$.object.property,messageId:"noFocusedTests",fix:F=>Y?F.removeRange([B.range[0]-1,B.range[1]]):null})}}}}}}),RULE_NAME$16="no-conditional-tests",Ie=createEslintRule({name:RULE_NAME$16,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(b){return{Identifier:function(Y){["test","it","describe"].includes(Y.name)&&Y.parent?.parent?.parent?.parent?.type==="IfStatement"&&b.report({node:Y,messageId:"noConditionalTests"})}}}}),i$2={typecheck:!1};function parsePluginSettings(b){const Y=typeof b.vitest!="object"||b.vitest===null?{}:b.vitest;return{...i$2,...Y}}const RULE_NAME$15="expect-expect",ye=createEslintRule({name:RULE_NAME$15,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(b,[{assertFunctionNames:Y=["expect"],additionalTestBlockFunctions:q=[]}]){const $=[];parsePluginSettings(b.settings).typecheck&&Y.push("expectTypeOf","assertType");const B=Y.map(x$3);function F(W){for(const H of W){const V=H.type===utils.AST_NODE_TYPES.CallExpression?$.indexOf(H):-1;if(H.type===utils.AST_NODE_TYPES.FunctionDeclaration){const X=b.sourceCode.getDeclaredVariables(H),z=getTestCallExpressionsFromDeclaredVariables(X,b);F(z)}if(V!==-1){$.splice(V,1);break}}}return{CallExpression(W){if(W.callee.type===utils.AST_NODE_TYPES.Identifier&&W.callee.name==="bench"||W?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&W.callee.property.type===utils.AST_NODE_TYPES.Identifier&&W.callee.property.name==="extend"||W?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&W.callee.property.type===utils.AST_NODE_TYPES.Identifier&&W.callee.property.name==="skip")return;const H=getNodeName(W)??"";if(isTypeOfVitestFnCall(W,b,["test"])||q.includes(H)){if(W.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(W.callee.property,"todo"))return;$.push(W)}else B.some(V=>V.test(H))&&F(b.sourceCode.getAncestors(W))},"Program:exit"(){$.forEach(W=>{b.report({node:W.callee,messageId:"noAssertions"})})}}}});function x$3(b){const Y=b.split(".").map(q=>q==="**"?"[_a-z\\d\\.]*":q.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${Y.join("\\.")}(\\.|$)`,"ui")}const RULE_NAME$14="hoisted-apis-on-top",c$5=["mock","hoisted","unmock"],Oe=createEslintRule({name:RULE_NAME$14,meta:{hasSuggestions:!0,type:"suggestion",docs:{description:"enforce hoisted APIs to be on top of the file"},messages:{hoistedApisOnTop:"Hoisted API is used in a runtime location in this file, but it is actually executed before this file is loaded.",suggestMoveHoistedApiToTop:"Move this hoisted API to the top of the file to better reflect its behavior.",suggestReplaceMockWithDoMock:"Replace 'vi.mock()' with 'vi.doMock()', which is not hoisted."},schema:[]},defaultOptions:[],create(b){let Y=null;const q=[];return{ImportDeclaration($){$.parent.type===utils.AST_NODE_TYPES.Program&&(Y=$.range[1])},CallExpression($){if($.callee.type!==utils.AST_NODE_TYPES.MemberExpression)return;const{object:B,property:F}=$.callee;if(B.type!==utils.AST_NODE_TYPES.Identifier||B.name!=="vi"||F.type!==utils.AST_NODE_TYPES.Identifier)return;const W=F.name;if(c$5.includes(W)){if(W==="hoisted"){let H=$.parent;if(H?.type===utils.AST_NODE_TYPES.AwaitExpression&&(H=H.parent),H?.type===utils.AST_NODE_TYPES.VariableDeclarator&&(H=H.parent),(H?.type===utils.AST_NODE_TYPES.ExpressionStatement||H?.type===utils.AST_NODE_TYPES.VariableDeclaration)&&H.parent?.type===utils.AST_NODE_TYPES.Program)return}else if($.parent?.type===utils.AST_NODE_TYPES.ExpressionStatement&&$.parent.parent?.type===utils.AST_NODE_TYPES.Program)return;q.push($)}},"Program:exit"(){for(const $ of q){const B=[];B.push({messageId:"suggestMoveHoistedApiToTop",*fix(W){$.parent.type===utils.AST_NODE_TYPES.ExpressionStatement?yield W.remove($):yield W.replaceText($,"undefined"),Y!=null?yield W.insertTextAfterRange([Y,Y],`
1
+ "use strict";const utils=require("@typescript-eslint/utils"),n$3=require("typescript"),node_path=require("node:path"),node_module=require("node:module"),scopeManager=require("@typescript-eslint/scope-manager");var _documentCurrentScript=typeof document<"u"?document.currentScript:null;function _interopDefaultCompat(b){return b&&typeof b=="object"&&"default"in b?b.default:b}const n__default=_interopDefaultCompat(n$3),version="1.3.16",createEslintRule=utils.ESLintUtils.RuleCreator(b=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${b}.md`),joinNames=(b,Y)=>b&&Y?`${b}.${Y}`:null,isFunction=b=>b.type===utils.AST_NODE_TYPES.FunctionExpression||b.type===utils.AST_NODE_TYPES.ArrowFunctionExpression;function getNodeName(b){if(isSupportedAccessor(b))return getAccessorValue(b);switch(b.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeName(b.tag);case utils.AST_NODE_TYPES.MemberExpression:return joinNames(getNodeName(b.object),getNodeName(b.property));case utils.AST_NODE_TYPES.NewExpression:case utils.AST_NODE_TYPES.CallExpression:return getNodeName(b.callee)}return null}const isSupportedAccessor=(b,Y)=>isIdentifier(b,Y)||isStringNode(b,Y),isIdentifier=(b,Y)=>b.type===utils.AST_NODE_TYPES.Identifier&&(Y===void 0||b.name===Y),S$5=(b,Y)=>b.type===utils.AST_NODE_TYPES.TemplateLiteral&&b.quasis.length===1&&(Y===void 0||b.quasis[0].value.raw===Y),g$3=(b,Y)=>b.type===utils.AST_NODE_TYPES.Literal&&typeof b.value=="string"&&(Y===void 0||b.value===Y),isStringNode=(b,Y)=>g$3(b,Y)||S$5(b,Y),getAccessorValue=b=>b.type===utils.AST_NODE_TYPES.Identifier?b.name:getStringValue(b),getStringValue=b=>b?.type===utils.AST_NODE_TYPES.TemplateLiteral?b.quasis[0].value.raw:b?.value,replaceAccessorFixer=(b,Y,q)=>b.replaceText(Y,Y.type===utils.AST_NODE_TYPES.Identifier?q:`'${q}'`),removeExtraArgumentsFixer=(b,Y,q,$)=>{const B=q.arguments[$],F=q.arguments[q.arguments.length-1],{sourceCode:W}=Y;let H=W.getTokenAfter(F);return H.value===","&&(H=W.getTokenAfter(H)),b.removeRange([B.range[0],H.range[0]])},isParsedInstanceOfMatcherCall=(b,Y)=>getAccessorValue(b.matcher)==="toBeInstanceOf"&&b.args.length===1&&isSupportedAccessor(b.args[0],Y);var UtilName=(b=>(b.vi="vi",b.vitest="vitest",b))(UtilName||{}),DescribeAlias=(b=>(b.describe="describe",b.fdescribe="fdescribe",b.xdescribe="xdescribe",b))(DescribeAlias||{}),TestCaseName=(b=>(b.fit="fit",b.it="it",b.test="test",b.xit="xit",b.xtest="xtest",b.bench="bench",b))(TestCaseName||{}),HookName=(b=>(b.beforeAll="beforeAll",b.beforeEach="beforeEach",b.afterAll="afterAll",b.afterEach="afterEach",b))(HookName||{}),ModifierName=(b=>(b.to="to",b.have="have",b.not="not",b.rejects="rejects",b.resolves="resolves",b.returns="returns",b.branded="branded",b.asserts="asserts",b.constructorParameters="constructorParameters",b.parameters="parameters",b.thisParameter="thisParameter",b.guards="guards",b.instance="instance",b.items="items",b))(ModifierName||{}),EqualityMatcher=(b=>(b.toBe="toBe",b.toEqual="toEqual",b.toStrictEqual="toStrictEqual",b))(EqualityMatcher||{});function isClassOrFunctionType(b){return b.getCallSignatures().length>0?!0:b.getSymbol()?.getDeclarations()?.some(Y=>n__default.isArrowFunction(Y)||n__default.isClassDeclaration(Y)||n__default.isClassExpression(Y)||n__default.isFunctionDeclaration(Y)||n__default.isFunctionExpression(Y)||n__default.isMethodDeclaration(Y)||n__default.isFunctionTypeNode(Y))??!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(b,Y){return b.sourceCode.getScope?b.sourceCode.getScope(Y):b.getScope()}function getModuleScope(b,Y){let q=getScope(b,Y);for(;q;){if(q.type==="module")return q;q=q.upper}return q}const isTypeOfVitestFnCall=(b,Y,q)=>{const $=parseVitestFnCall(b,Y);return $!==null&&q.includes($.type)},parseVitestFnCall=(b,Y)=>{const q=parseVitestFnCallWithReason(b,Y);return typeof q=="string"?null:q},m$6=new WeakMap,parseVitestFnCallWithReason=(b,Y)=>{let q=m$6.get(b);return q||(q=M$3(b,Y),m$6.set(b,q),q)},w$2=b=>b==="expect"?"expect":b==="expectTypeOf"?"expectTypeOf":b==="vi"?"vi":b==="vitest"?"vitest":DescribeAlias.hasOwnProperty(b)?"describe":TestCaseName.hasOwnProperty(b)?"test":HookName.hasOwnProperty(b)?"hook":"unknown",A$3=b=>{const Y=[];for(const q of b){if(q.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&q.parent.parent?.type===utils.AST_NODE_TYPES.CallExpression)return{matcher:q,args:q.parent.parent.arguments,modifiers:Y};const $=getAccessorValue(q);if(Y.length===0){if(!ModifierName.hasOwnProperty($))return"modifier-unknown"}else if(Y.length===1){if($!==ModifierName.not&&$!=ModifierName.have)return"modifier-unknown";const B=getAccessorValue(Y[0]);if(B!==ModifierName.resolves&&B!==ModifierName.rejects&&B!==ModifierName.to)return"modifier-unknown"}else return"modifier-unknown";Y.push(q)}return"matcher-not-found"},P$2=(b,Y)=>{const q=A$3(b.members);return typeof q=="string"?q:{...b,type:Y,...q}},findTopMostCallExpression=b=>{let Y=b,{parent:q}=b;for(;q;){if(q.type===utils.AST_NODE_TYPES.CallExpression){Y=q,q=q.parent;continue}if(q.type!==utils.AST_NODE_TYPES.MemberExpression)break;q=q.parent}return Y},M$3=(b,Y)=>{const q=getNodeChain(b);if(!q?.length)return null;const[$,...B]=q,F=getAccessorValue(q[q.length-1]);if(F==="each"&&b.callee.type!==utils.AST_NODE_TYPES.CallExpression&&b.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||b.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&F!=="each")return null;const W=v(Y,b,getAccessorValue($));if(!W)return null;const H=W.original??W.local,V=[H,...B.map(getAccessorValue)];if(W.type!=="testContext"&&H!=="vi"&&H!=="vitest"&&H!=="expect"&&H!=="expectTypeOf"&&!ValidVitestFnCallChains.has(V.join(".")))return null;const X={name:H,head:{...W,node:$},members:B},z=w$2(H);if(z==="expect"||z==="expectTypeOf"){const G=P$2(X,z);return typeof G=="string"&&findTopMostCallExpression(b)!==b?null:G==="matcher-not-found"&&b.parent?.type===utils.AST_NODE_TYPES.MemberExpression?"matcher-not-called":G}return q.slice(0,q.length-1).some(G=>G.parent?.type!==utils.AST_NODE_TYPES.MemberExpression)||b.parent?.type===utils.AST_NODE_TYPES.CallExpression||b.parent?.type===utils.AST_NODE_TYPES.MemberExpression?null:{...X,type:z}},k$1=(b,Y)=>b&&Y?[...b,...Y]:null;function getNodeChain(b){if(isSupportedAccessor(b))return[b];switch(b.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeChain(b.tag);case utils.AST_NODE_TYPES.MemberExpression:return k$1(getNodeChain(b.object),getNodeChain(b.property));case utils.AST_NODE_TYPES.CallExpression:return getNodeChain(b.callee)}return null}const v=(b,Y,q)=>{const $=getScope(b,Y),B=resolveScope($,q);return B==="local"?null:B==="testContext"?{local:q,original:null,type:"testContext"}:B?B.source==="vitest"?{original:B.imported,local:B.local,type:"import"}:null:{original:N$5(q,b),local:q,type:"global"}},N$5=(b,Y)=>{const q=Y.settings.vitest?.globalAliases??{},$=Object.entries(q).find(([B,F])=>F.includes(b));return $?$[0]:null},I$1=({parent:b})=>b?.type===utils.AST_NODE_TYPES.CallExpression&&b.callee.type===utils.AST_NODE_TYPES.Identifier&&TestCaseName.hasOwnProperty(b.callee.name),resolveScope=(b,Y)=>{let q=b;for(;q!==null;){const $=q.set.get(Y);if($&&$.defs.length>0){const B=$.defs[$.defs.length-1],F=isFunction(B.node)?B.node.params.find(V=>V.type===utils.AST_NODE_TYPES.ObjectPattern):void 0;if(F){const V=F.properties.find(X=>X.type===utils.AST_NODE_TYPES.Property);if((V?.key.type===utils.AST_NODE_TYPES.Identifier?V.key:void 0)?.name===Y)return"testContext"}if(B.node.type===utils.AST_NODE_TYPES.VariableDeclarator&&B.node.id.type===utils.AST_NODE_TYPES.Identifier&&TestCaseName.hasOwnProperty(B.node.id.name)&&B.node.init?.type===utils.AST_NODE_TYPES.CallExpression&&B.node.init.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isIdentifier(B.node.init.callee.property,"extend"))return"testContext";const W=isFunction(B.node)?B.node.params.find(V=>V.type===utils.AST_NODE_TYPES.Identifier):void 0;if(W&&I$1(W.parent))return"testContext";const H=D$1(B);return H?.local===Y?H:"local"}q=q.upper}return null},O$2=b=>b.type===utils.AST_NODE_TYPES.AwaitExpression?b.argument.type===utils.AST_NODE_TYPES.ImportExpression?b.argument.source:null:b.type===utils.AST_NODE_TYPES.CallExpression&&isIdentifier(b.callee,"require")?b.arguments[0]??null:null,R=b=>b.parent.type===utils.AST_NODE_TYPES.TSImportEqualsDeclaration||b.node.type!==utils.AST_NODE_TYPES.ImportSpecifier||b.node.imported.type!=utils.AST_NODE_TYPES.Identifier||b.parent.importKind==="type"?null:{source:b.parent.source.value,imported:b.node.imported.name,local:b.node.local.name},D$1=b=>b.type==="Variable"?L$1(b):b.type==="ImportBinding"?R(b):null,L$1=b=>{if(!b.node.init)return null;const Y=O$2(b.node.init);return!Y||!isStringNode(Y)||b.name.parent?.type!==utils.AST_NODE_TYPES.Property||!isSupportedAccessor(b.name.parent.key)?null:{source:getStringValue(Y),imported:getAccessorValue(b.name.parent.key),local:b.name.name}},getTestCallExpressionsFromDeclaredVariables=(b,Y)=>b.reduce((q,{references:$})=>q.concat($.map(({identifier:B})=>B.parent).filter(B=>B?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(B,Y,["test"]))),[]),getFirstMatcherArg=b=>{const[Y]=b.args;return Y.type===utils.AST_NODE_TYPES.SpreadElement?Y:followTypeAssertionChain$1(Y)},K=b=>b.type===utils.AST_NODE_TYPES.TSAsExpression||b.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain$1=b=>K(b)?followTypeAssertionChain$1(b.expression):b,RULE_NAME$1a="prefer-lowercase-title",E$4=b=>b.arguments[0]&&isStringNode(b.arguments[0]),x$4=b=>{const Y=[];return b.includes(DescribeAlias.describe)&&Y.push(...Object.keys(DescribeAlias)),b.includes(TestCaseName.test)&&Y.push(...Object.keys(TestCaseName).filter(q=>q.endsWith(TestCaseName.test))),b.includes(TestCaseName.it)&&Y.push(...Object.keys(TestCaseName).filter(q=>q.endsWith(TestCaseName.it))),Y},xe=createEslintRule({name:RULE_NAME$1a,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:(b,[{ignore:Y=[],allowedPrefixes:q=[],ignoreTopLevelDescribe:$=!1,lowercaseFirstCharacterOnly:B=!1}])=>{const F=x$4(Y);let W=0;return{CallExpression(H){const V=parseVitestFnCall(H,b);if(!V||!E$4)return;if(V?.type==="describe"){if(W++,$&&W===1)return}else if(V?.type!=="test")return;const[X]=H.arguments,z=getStringValue(X);if(typeof z!="string"||q.some(ee=>z.startsWith(ee)))return;const G=z.charAt(0);F.includes(V.name)||B&&(!G||G===G.toLowerCase())||!B&&z===z.toLowerCase()||b.report({messageId:B?"lowerCaseTitle":"fullyLowerCaseTitle",node:H.arguments[0],data:{method:V.name},fix:ee=>{const J=getStringValue(X),se=[X.range[0]+1,X.range[1]-1],Q=B?J.substring(0,1).toLowerCase()+J.substring(1):J.toLowerCase();return[ee.replaceTextRange(se,Q)]}})},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,b,["describe"])&&W--}}}}),RULE_NAME$19="max-nested-describe",Ce=createEslintRule({name:RULE_NAME$19,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(b,[{max:Y}]){const q=[];function $(F){F.parent?.type==="CallExpression"&&(F.parent.callee.type!=="Identifier"||F.parent.callee.name!=="describe"||(q.push(0),q.length>Y&&b.report({node:F.parent,messageId:"maxNestedDescribe"})))}function B(F){F.parent?.type==="CallExpression"&&(F.parent.callee.type!=="Identifier"||F.parent.callee.name!=="describe"||q.pop())}return{FunctionExpression:$,"FunctionExpression:exit":B,ArrowFunctionExpression:$,"ArrowFunctionExpression:exit":B}}}),RULE_NAME$18="no-identical-title",c$6=()=>({describeTitles:[],testTitles:[]}),ve=createEslintRule({name:RULE_NAME$18,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(b){const Y=[c$6()];return{CallExpression(q){const $=Y[Y.length-1],B=parseVitestFnCall(q,b);if(!B||((B.name==="describe"||B.name==="suite")&&Y.push(c$6()),B.members.find(H=>isSupportedAccessor(H,"each"))))return;const[F]=q.arguments;if(!F||!isStringNode(F))return;const W=getStringValue(F);B.type==="test"&&($?.testTitles.includes(W)&&b.report({node:q,messageId:"multipleTestTitle"}),$?.testTitles.push(W)),B.type==="describe"&&($?.describeTitles.includes(W)&&b.report({node:q,messageId:"multipleDescribeTitle"}),$?.describeTitles.push(W))},"CallExpression:exit"(q){isTypeOfVitestFnCall(q,b,["describe"])&&Y.pop()}}}}),RULE_NAME$17="no-focused-tests",n$2=b=>b.type==="Identifier"&&["it","test","describe"].includes(b.name),a$6=b=>b.type==="Identifier"&&b.name==="only",Be=createEslintRule({name:RULE_NAME$17,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:b=>{const Y=b.options[0]?.fixable;return{ExpressionStatement(q){if(q.expression.type==="CallExpression"){const{callee:$}=q.expression;if($.type==="MemberExpression"&&n$2($.object)&&a$6($.property)&&b.report({node:$.property,messageId:"noFocusedTests",fix:B=>Y?B.removeRange([$.property.range[0]-1,$.property.range[1]]):null}),$.type==="TaggedTemplateExpression"){const B=$.tag.type==="MemberExpression"?$.tag.object:null;if(!B)return;B.type==="MemberExpression"&&n$2(B.object)&&a$6(B.property)&&b.report({node:B.property,messageId:"noFocusedTests",fix:F=>Y?F.removeRange([B.property.range[0]-1,B.property.range[1]]):null})}}},CallExpression(q){if(q.callee.type==="CallExpression"){const{callee:$}=q.callee;if($.type==="MemberExpression"&&$.object.type==="MemberExpression"&&n$2($.object.object)&&a$6($.object.property)&&$.property.type==="Identifier"&&$.property.name==="each"){const B=$.object.property;b.report({node:$.object.property,messageId:"noFocusedTests",fix:F=>Y?F.removeRange([B.range[0]-1,B.range[1]]):null})}}}}}}),RULE_NAME$16="no-conditional-tests",Ie=createEslintRule({name:RULE_NAME$16,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(b){return{Identifier:function(Y){["test","it","describe"].includes(Y.name)&&Y.parent?.parent?.parent?.parent?.type==="IfStatement"&&b.report({node:Y,messageId:"noConditionalTests"})}}}}),i$2={typecheck:!1};function parsePluginSettings(b){const Y=typeof b.vitest!="object"||b.vitest===null?{}:b.vitest;return{...i$2,...Y}}const RULE_NAME$15="expect-expect",ye=createEslintRule({name:RULE_NAME$15,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(b,[{assertFunctionNames:Y=["expect"],additionalTestBlockFunctions:q=[]}]){const $=[];parsePluginSettings(b.settings).typecheck&&Y.push("expectTypeOf","assertType");const B=Y.map(x$3);function F(W){for(const H of W){const V=H.type===utils.AST_NODE_TYPES.CallExpression?$.indexOf(H):-1;if(H.type===utils.AST_NODE_TYPES.FunctionDeclaration){const X=b.sourceCode.getDeclaredVariables(H),z=getTestCallExpressionsFromDeclaredVariables(X,b);F(z)}if(V!==-1){$.splice(V,1);break}}}return{CallExpression(W){if(W.callee.type===utils.AST_NODE_TYPES.Identifier&&W.callee.name==="bench"||W?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&W.callee.property.type===utils.AST_NODE_TYPES.Identifier&&W.callee.property.name==="extend"||W?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&W.callee.property.type===utils.AST_NODE_TYPES.Identifier&&W.callee.property.name==="skip")return;const H=getNodeName(W)??"";if(isTypeOfVitestFnCall(W,b,["test"])||q.includes(H)){if(W.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(W.callee.property,"todo"))return;$.push(W)}else B.some(V=>V.test(H))&&F(b.sourceCode.getAncestors(W))},"Program:exit"(){$.forEach(W=>{b.report({node:W.callee,messageId:"noAssertions"})})}}}});function x$3(b){const Y=b.split(".").map(q=>q==="**"?"[_a-z\\d\\.]*":q.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${Y.join("\\.")}(\\.|$)`,"ui")}const RULE_NAME$14="hoisted-apis-on-top",c$5=["mock","hoisted","unmock"],Oe=createEslintRule({name:RULE_NAME$14,meta:{hasSuggestions:!0,type:"suggestion",docs:{description:"enforce hoisted APIs to be on top of the file"},messages:{hoistedApisOnTop:"Hoisted API is used in a runtime location in this file, but it is actually executed before this file is loaded.",suggestMoveHoistedApiToTop:"Move this hoisted API to the top of the file to better reflect its behavior.",suggestReplaceMockWithDoMock:"Replace 'vi.mock()' with 'vi.doMock()', which is not hoisted."},schema:[]},defaultOptions:[],create(b){let Y=null;const q=[];return{ImportDeclaration($){$.parent.type===utils.AST_NODE_TYPES.Program&&(Y=$.range[1])},CallExpression($){if($.callee.type!==utils.AST_NODE_TYPES.MemberExpression)return;const{object:B,property:F}=$.callee;if(B.type!==utils.AST_NODE_TYPES.Identifier||B.name!=="vi"||F.type!==utils.AST_NODE_TYPES.Identifier)return;const W=F.name;if(c$5.includes(W)){if(W==="hoisted"){let H=$.parent;if(H?.type===utils.AST_NODE_TYPES.AwaitExpression&&(H=H.parent),H?.type===utils.AST_NODE_TYPES.VariableDeclarator&&(H=H.parent),(H?.type===utils.AST_NODE_TYPES.ExpressionStatement||H?.type===utils.AST_NODE_TYPES.VariableDeclaration)&&H.parent?.type===utils.AST_NODE_TYPES.Program)return}else if($.parent?.type===utils.AST_NODE_TYPES.ExpressionStatement&&$.parent.parent?.type===utils.AST_NODE_TYPES.Program)return;q.push($)}},"Program:exit"(){for(const $ of q){const B=[];B.push({messageId:"suggestMoveHoistedApiToTop",*fix(W){$.parent.type===utils.AST_NODE_TYPES.ExpressionStatement?yield W.remove($):yield W.replaceText($,"undefined"),Y!=null?yield W.insertTextAfterRange([Y,Y],`
2
2
  `+b.sourceCode.getText($)+";"):yield W.insertTextAfterRange([0,0],b.sourceCode.getText($)+`;
3
3
  `)}});const F=$.callee.property;F.name==="mock"&&B.push({messageId:"suggestReplaceMockWithDoMock",fix(W){return W.replaceText(F,"doMock")}}),b.report({node:$,messageId:"hoistedApisOnTop",suggest:B})}}}}}),RULE_NAME$13="consistent-test-it",g$2=(b,Y,q)=>$=>[$.replaceText(b.type===utils.AST_NODE_TYPES.MemberExpression?b.object:b,E$3(Y,q))];function E$3(b,Y){return b===TestCaseName.fit?"test.only":b.startsWith("f")||b.startsWith("x")?b.charAt(0)+Y:Y}function u$4(b){return b===TestCaseName.test?TestCaseName.it:TestCaseName.test}const Se=createEslintRule({name:RULE_NAME$13,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(b){const Y=b.options[0]??{},q=Y.fn||TestCaseName.test,$=Y?.withinDescribe||Y?.fn||TestCaseName?.it,B=q===$?q:void 0;let F=0;return{ImportDeclaration(W){if(B==null||W.source.type!=="Literal"||W.source.value!=="vitest")return;const H=u$4(B);for(const V of W.specifiers)V.type==="ImportSpecifier"&&V.imported.type==="Identifier"&&V.local.name===V.imported.name&&V.local.name===H&&b.report({node:V,data:{testFnKeyWork:q,oppositeTestKeyword:H},messageId:"consistentMethod",fix:X=>{const z=W.specifiers.filter(G=>G.local.name!==H);if(z.length>0){const G=z.map(J=>J.local.name).join(", "),ee=W.specifiers.at(-1)?.range;return ee?X.replaceTextRange([W.specifiers[0].range[0],ee[1]],G):null}return X.replaceText(V.local,B)}})},CallExpression(W){if(W.callee.type===utils.AST_NODE_TYPES.Identifier&&W.callee.name==="bench")return;const H=parseVitestFnCall(W,b);if(!H)return;if(H.type==="describe"){F++;return}const V=W.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?W.callee.tag:W.callee.type===utils.AST_NODE_TYPES.CallExpression?W.callee.callee:W.callee;if(H.type==="test"&&F===0&&!H.name.endsWith(q)){const X=u$4(q);b.report({node:W.callee,data:{testFnKeyWork:q,oppositeTestKeyword:X},messageId:"consistentMethod",fix:g$2(V,H.name,q)})}else if(H.type==="test"&&F>0&&!H.name.endsWith($)){const X=u$4($);b.report({messageId:"consistentMethodWithinDescribe",node:W.callee,data:{testKeywordWithinDescribe:$,oppositeTestKeyword:X},fix:g$2(V,H.name,$)})}},"CallExpression:exit"(W){isTypeOfVitestFnCall(W,b,["describe"])&&F--}}}}),RULE_NAME$12="consistent-vitest-vi",d=b=>b===UtilName.vi?UtilName.vitest:UtilName.vi,De=createEslintRule({name:RULE_NAME$12,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(b){const Y=(b.options[0]??{}).fn||UtilName.vi,q=d(Y);return{ImportDeclaration($){if(!($.source.type!==utils.AST_NODE_TYPES.Literal||$.source.value!=="vitest"))for(const B of $.specifiers)B.type===utils.AST_NODE_TYPES.ImportSpecifier&&B.imported.type===utils.AST_NODE_TYPES.Identifier&&B.local.name===B.imported.name&&B.imported.name===q&&b.report({node:B,messageId:"consistentUtil",data:{utilKeyword:Y,oppositeUtilKeyword:q},fix:F=>{const W=$.specifiers.filter(H=>H.local.name!==q);if(W.length>0){const H=W.map(X=>X.local.name).join(", "),V=$.specifiers.at(-1)?.range;return V?F.replaceTextRange([$.specifiers[0].range[0],V[1]],H):null}return F.replaceText(B.local,Y)}})},CallExpression($){if(parseVitestFnCall($,b)?.type!==q)return;const B=$.callee.type===utils.AST_NODE_TYPES.MemberExpression?$.callee.object:$.callee;b.report({node:B,data:{utilKeyword:Y,oppositeUtilKeyword:q},messageId:"consistentUtil",fix:F=>F.replaceText(B,Y)})}}}}),RULE_NAME$11="prefer-to-be",E$2=b=>b.type===utils.AST_NODE_TYPES.Literal&&b.value===null,N$4=b=>E$2(getFirstMatcherArg(b)),c$4=(b,Y)=>isIdentifier(getFirstMatcherArg(b),Y),h$2=b=>Math.floor(b)!==Math.ceil(b),y$3=b=>{let Y=getFirstMatcherArg(b);return Y.type===utils.AST_NODE_TYPES.Literal&&typeof Y.value=="number"&&h$2(Y.value)?!1:(Y.type===utils.AST_NODE_TYPES.UnaryExpression&&Y.operator==="-"&&(Y=Y.argument),Y.type===utils.AST_NODE_TYPES.Literal?!("regex"in Y):Y.type===utils.AST_NODE_TYPES.TemplateLiteral)},o$2=(b,Y,q,$,B)=>{b.report({messageId:`useToBe${Y}`,fix(F){const W=[replaceAccessorFixer(F,q.matcher,`toBe${Y}`)];return q.args?.length&&Y!==""&&W.push(removeExtraArgumentsFixer(F,b,$,0)),B&&W.push(F.removeRange([B.range[0]-1,B.range[1]])),W},node:q.matcher})},He=createEslintRule({name:RULE_NAME$11,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const $=getAccessorValue(q.matcher),B=q.modifiers.find(F=>getAccessorValue(F)==="not");if(B&&["toBeUndefined","toBeDefined"].includes($)){o$2(b,$==="toBeDefined"?"Undefined":"Defined",q,Y,B);return}if(!(!EqualityMatcher.hasOwnProperty($)||q.args.length===0)){if(N$4(q)){o$2(b,"Null",q,Y);return}if(c$4(q,"undefined")){o$2(b,B?"Defined":"Undefined",q,Y);return}if(c$4(q,"NaN")){o$2(b,"NaN",q,Y);return}y$3(q)&&$!==EqualityMatcher.toBe&&o$2(b,"",q,Y)}}}}}),RULE_NAME$10="no-hooks",qe=createEslintRule({name:RULE_NAME$10,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(b,[{allow:Y=[]}]){return{CallExpression(q){const $=parseVitestFnCall(q,b);$?.type==="hook"&&!Y.includes($.name)&&b.report({node:q,messageId:"unexpectedHook",data:{hookName:$.name}})}}}}),RULE_NAME$$="no-restricted-vi-methods",Fe=createEslintRule({name:RULE_NAME$$,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(b,[Y]){return{CallExpression(q){const $=parseVitestFnCall(q,b);if($?.type!=="vi"||$.members.length===0)return;const B=getAccessorValue($.members[0]);if(B in Y){const F=Y[B];b.report({messageId:F?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:F,restriction:B},loc:{start:$.members[0].loc.start,end:$.members[$.members.length-1].loc.end}})}}}}}),RULE_NAME$_="consistent-test-filename",o$1=/.*\.test\.[tj]sx?$/,e=/.*\.(test|spec)\.[tj]sx?$/,Ve=createEslintRule({name:RULE_NAME$_,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:b=>{const Y=b.options[0]??{},{pattern:q=o$1,allTestPattern:$=e}=Y,B=typeof q=="string"?new RegExp(q):q,F=typeof $=="string"?new RegExp($):$,{filename:W}=b;return F.test(W)?{Program:H=>{B.test(W)||b.report({node:H,messageId:"consistentTestFilename",data:{pattern:B.source}})}}:{}}}),RULE_NAME$Z="max-expects",Pe=createEslintRule({name:RULE_NAME$Z,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(b,[{max:Y}]){let q=0;const $=B=>{(B.parent?.type!==utils.AST_NODE_TYPES.CallExpression||isTypeOfVitestFnCall(B.parent,b,["test"]))&&(q=0)};return{FunctionExpression:$,"FunctionExpression:exit":$,ArrowFunctionExpression:$,"ArrowFunctionExpression:exit":$,CallExpression(B){const F=parseVitestFnCall(B,b);F?.type!=="expect"||F.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression||(q+=1,q>Y&&b.report({node:B,messageId:"maxExpect",data:{count:q,max:Y}}))}}}}),RULE_NAME$Y="no-alias-methods",Ge=createEslintRule({name:RULE_NAME$Y,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(b){const Y={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(q){const $=parseVitestFnCall(q,b);if($?.type!=="expect")return;const{matcher:B}=$,F=getAccessorValue(B);if(F in Y){const W=Y[F];b.report({messageId:"noAliasMethods",data:{alias:F,canonical:W},node:B,fix:H=>[replaceAccessorFixer(H,B,W)]})}}}}}),RULE_NAME$X="no-commented-out-tests";function n$1(b){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(b.value)}const je=createEslintRule({name:RULE_NAME$X,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(b){const{sourceCode:Y}=b;function q($){n$1($)&&b.report({messageId:"noCommentedOutTests",node:$})}return{Program(){Y.getAllComments().forEach(q)}}}}),RULE_NAME$W="no-conditional-expect",r=b=>b.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(b.callee.property,"catch"),We=createEslintRule({name:RULE_NAME$W,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(b){let Y=0,q=!1,$=!1;const B=()=>q&&Y++,F=()=>q&&Y--;return{FunctionDeclaration(W){const H=b.sourceCode.getDeclaredVariables(W);getTestCallExpressionsFromDeclaredVariables(H,b).length>0&&(q=!0)},CallExpression(W){const{type:H}=parseVitestFnCall(W,b)??{};H==="test"&&(q=!0),r(W)&&($=!0),q&&H==="expect"&&Y>0&&b.report({messageId:"noConditionalExpect",node:W}),$&&H==="expect"&&b.report({messageId:"noConditionalExpect",node:W})},"CallExpression:exit"(W){isTypeOfVitestFnCall(W,b,["test"])&&(q=!1),r(W)&&($=!1)},CatchClause:B,"CatchClause:exit":F,IfStatement:B,"IfStatement:exit":F,SwitchStatement:B,"SwitchStatement:exit":F,ConditionalExpression:B,"ConditionalExpression:exit":F,LogicalExpression:B,"LogicalExpression:exit":F}}}),RULE_NAME$V="no-import-node-test",Ke=createEslintRule({name:RULE_NAME$V,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(b){return{ImportDeclaration(Y){Y.source.value==="node:test"&&b.report({messageId:"noImportNodeTest",node:Y,fix:q=>q.replaceText(Y.source,Y.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=b=>b.source.value==="vitest",isVitestGlobalsImportSpecifier=b=>b.type===utils.AST_NODE_TYPES.ImportSpecifier&&b.imported.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(b.imported.name),isVitestGlobalsProperty=b=>b.type===utils.AST_NODE_TYPES.Property&&b.key.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(b.key.name),isVitestGlobalsFunction=b=>b.callee.type===utils.AST_NODE_TYPES.Identifier&&VITEST_GLOBALS.has(b.callee.name),isRequireVitestCall=b=>{if(b?.type!==utils.AST_NODE_TYPES.CallExpression||b.callee.type!==utils.AST_NODE_TYPES.Identifier||b.callee.name!=="require")return!1;const Y=b.arguments;return Y.length===1&&Y[0].type===utils.AST_NODE_TYPES.Literal&&Y[0].value==="vitest"},isObjectPattern=b=>b.type===utils.AST_NODE_TYPES.ObjectPattern,removeVariableDeclarator=(b,Y)=>{const q=Y.parent,$=q.declarations;if($.length===1)return b.remove(q);const B=$.findIndex(F=>F.range[0]===Y.range[0]&&F.range[1]===Y.range[1]);if(B===0){const F=$[1];return b.removeRange([Y.range[0],F.range[0]])}else{const F=$[B-1];return b.removeRange([F.range[1],Y.range[1]])}},removeNodeFromArray=(b,Y,q)=>{const $=Y.indexOf(q);if($===-1)throw new Error("Target node not found in nodes array");if($===0){const B=Y[1];return b.removeRange([q.range[0],B.range[0]])}else{const B=Y[$-1];return b.removeRange([B.range[1],q.range[1]])}},RULE_NAME$U="no-importing-vitest-globals",$e=createEslintRule({name:RULE_NAME$U,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(b){return{ImportDeclaration(Y){if(!isVitestImport(Y))return;const q=Y.specifiers;for(const $ of q)isVitestGlobalsImportSpecifier($)&&b.report({node:$,messageId:"noImportingVitestGlobals",data:{name:$.imported.name},fix(B){return q.every(F=>isVitestGlobalsImportSpecifier(F))?B.remove(Y):removeNodeFromArray(B,q,$)}})},VariableDeclarator(Y){if(!isRequireVitestCall(Y.init)||!isObjectPattern(Y.id))return;const q=Y.id.properties;for(const $ of q)isVitestGlobalsProperty($)&&b.report({node:$,messageId:"noRequiringVitestGlobals",data:{name:$.key.name},fix(B){return q.every(F=>isVitestGlobalsProperty(F))?removeVariableDeclarator(B,Y):removeNodeFromArray(B,q,$)}})}}}}),RULE_NAME$T="prefer-importing-vitest-globals",ze=createEslintRule({name:RULE_NAME$T,meta:{type:"suggestion",docs:{description:"enforce importing Vitest globals",recommended:!1},messages:{preferImportingVitestGlobals:"Import '{{name}}' from 'vitest'"},schema:[],fixable:"code"},defaultOptions:[],create(b){const Y=new Set;let q,$;return{ImportDeclaration(B){if(!isVitestImport(B))return;const F=B.specifiers;for(const W of F)if(isVitestGlobalsImportSpecifier(W)){const H=W.imported.name;Y.add(H)}q=B.specifiers},VariableDeclarator(B){if(!isRequireVitestCall(B.init)||!isObjectPattern(B.id))return;const F=B.id.properties;for(const W of F)if(isVitestGlobalsProperty(W)){const H=W.key.name;Y.add(H)}$=F},CallExpression(B){if(!isVitestGlobalsFunction(B))return;const F=B.callee.name;if(Y.has(F))return;const W=b.sourceCode.getScope(B).set.get(F);W&&W.defs.length>0&&W.defs.some(H=>!(H.type==="ImportBinding"||H.type==="Variable"&&H.node.init&&isRequireVitestCall(H.node.init)))||b.report({node:B.callee,messageId:"preferImportingVitestGlobals",data:{name:F},fix(H){const V=b.sourceCode.ast;if(!q)if($){const G=$[$.length-1];return H.insertTextAfter(G,`, ${F}`)}else return H.insertTextBefore(V.body[0],`import { ${F} } from 'vitest';
4
4
  `);if(q.find(G=>G.type==="ImportNamespaceSpecifier"))return H.insertTextBefore(V.body[0],`import { ${F} } from 'vitest';
5
5
  `);const X=q.find(G=>G.type==="ImportDefaultSpecifier");if(X)return H.insertTextAfter(X,`, { ${F} }`);const z=q[q.length-1];return H.insertTextAfter(z,`, ${F}`)}})}}}}),RULE_NAME$S="no-conditional-in-test",Je=createEslintRule({name:RULE_NAME$S,meta:{docs:{description:"disallow conditional tests",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalInTest:"Remove conditional tests"},schema:[],type:"problem"},defaultOptions:[],create(b){return{IfStatement(Y){Y.parent?.parent?.parent?.type==="CallExpression"&&isTypeOfVitestFnCall(Y.parent?.parent?.parent,b,["test","it"])&&b.report({messageId:"noConditionalInTest",node:Y})}}}}),RULE_NAME$R="no-disabled-tests",Qe=createEslintRule({name:RULE_NAME$R,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(b){let Y=0,q=0;return{CallExpression($){const B=parseVitestFnCall($,b);if(!B)return;B.type==="describe"&&Y++,B.type==="test"&&(q++,$.arguments.length<2&&B.members.every(W=>getAccessorValue(W)==="skip")&&b.report({messageId:"missingFunction",node:$}));const F=B.members.find(W=>getAccessorValue(W)==="skip");(B.name.startsWith("x")||F!==void 0)&&b.report({messageId:B.type==="describe"?"disabledSuite":"disabledTest",node:F??B.head.node})},"CallExpression:exit"($){const B=parseVitestFnCall($,b);B&&(B.type==="describe"&&Y--,B.type==="test"&&q--)},'CallExpression[callee.name="pending"]'($){const B=getScope(b,$);resolveScope(B,"pending")||(q>0?b.report({messageId:"pendingTest",node:$}):Y>0?b.report({messageId:"pendingSuite",node:$}):b.report({messageId:"pending",node:$}))}}}}),RULE_NAME$Q="no-done-callback",P$1=(b,Y,q)=>{if(Y)return b.arguments[1];const $=parseVitestFnCall(b,q);return $?.type==="hook"&&b.arguments.length>=1?b.arguments[0]:$?.type==="test"&&b.arguments.length>=2?b.arguments[1]:null},Xe=createEslintRule({name:RULE_NAME$Q,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(b){return{CallExpression(Y){const q=/\.each$|\.concurrent$/.test(getNodeName(Y.callee)??"");if(q&&Y.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||b.sourceCode.getAncestors(Y).some(W=>W.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(W,b,["describe","test"])?!1:W.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(W.callee.property,"concurrent")))return;const $=P$1(Y,q,b),B=Number(q);if(!$||!isFunction($)||$.params.length!==1+B)return;const F=$.params[B];if(F.type!==utils.AST_NODE_TYPES.Identifier){b.report({node:F,messageId:"noDoneCallback"});return}if($.async){b.report({node:F,messageId:"useAwaitInsteadOfCallback"});return}b.report({node:Y,messageId:"noDoneCallback",suggest:[{messageId:"suggestWrappingInPromise",data:{callback:F.name},fix(W){const{body:H,params:V}=$,{sourceCode:X}=b,z=X.getFirstToken(H),G=X.getLastToken(H),[ee]=V,J=V[V.length-1],se=X.getTokenBefore(ee);let Q=X.getTokenAfter(J);if(Q?.value===","&&(Q=X.getTokenAfter(Q)),!z||!G||!se||!Q)throw new Error(`Unexpected null when attempting to fix ${b.filename} - please file an issue at https://github/veritem/eslint-plugin-vitest`);let Z=W.replaceText(ee,"()");se.value==="("&&Q.value===")"&&(Z=W.removeRange([se.range[1],Q.range[0]]));let oe=`new Promise(${F.name} => `,ne=")",te=!0;return H.type===utils.AST_NODE_TYPES.BlockStatement&&(oe=`return ${oe}{`,ne+="}",te=!1),[Z,te?W.insertTextBefore(z,oe):W.insertTextAfter(z,oe),W.insertTextAfter(G,ne)]}}]})}}}}),RULE_NAME$P="no-duplicate-hooks",Ye=createEslintRule({name:RULE_NAME$P,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(b){const Y=[{}];return{CallExpression(q){const $=parseVitestFnCall(q,b);if($?.type==="describe"&&Y.push({}),$?.type!=="hook")return;const B=Y[Y.length-1];B[$.name]||=0,B[$.name]+=1,B[$.name]>1&&b.report({messageId:"noDuplicateHooks",data:{hook:$.name},node:q})},"CallExpression:exit"(q){isTypeOfVitestFnCall(q,b,["describe"])&&Y.pop()}}}}),RULE_NAME$O="no-large-snapshots",m$5=(b,Y,{maxSize:q=50,allowedSnapshots:$={}})=>{const B=Y.loc.start.line,F=Y.loc.end.line-B;if(!Object.keys($).every(node_path.isAbsolute))throw new Error("All paths for allowedSnapshots must be absolute. You can use JS config and `path.resolve`");let W=!1;if(Y.type===utils.AST_NODE_TYPES.ExpressionStatement&&"left"in Y.expression&&Y.expression.left.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(Y.expression.left.property)){const H=b.filename,V=$[H];if(V){const X=getAccessorValue(Y.expression.left.property);W=V.some(z=>z instanceof RegExp?z.test(X):X===z)}}!W&&F>q&&b.report({node:Y,messageId:q===0?"noSnapShot":"tooLongSnapShot",data:{lineCount:F,lineLimit:q}})},Ze=createEslintRule({name:RULE_NAME$O,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(b,[Y]){return b.filename.endsWith(".snap")?{ExpressionStatement(q){m$5(b,q,Y)}}:{CallExpression(q){const $=parseVitestFnCall(q,b);$?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue($.matcher))&&$.args.length&&m$5(b,$.args[0],{...Y,maxSize:Y.inlineMaxSize??Y.maxSize})}}}}),RULE_NAME$N="no-interpolation-in-snapshots",er=createEslintRule({name:RULE_NAME$N,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);q?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(q.matcher))&&q.args.forEach($=>{$.type===utils.AST_NODE_TYPES.TemplateLiteral&&$.expressions.length>0&&b.report({messageId:"noInterpolationInSnapshots",node:$})})}}}}),t="__mocks__",p$1=b=>b.split(node_path.posix.sep).includes(t),s=b=>isStringNode(b)&&p$1(getStringValue(b)),RULE_NAME$M="no-mocks-import",rr=createEslintRule({name:RULE_NAME$M,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(b){return{ImportDeclaration(Y){s(Y.source)&&b.report({node:Y,messageId:"noMocksImport"})},'CallExpression[callee.name="require"]'(Y){const[q]=Y.arguments;q&&s(q)&&b.report({node:q,messageId:"noMocksImport"})}}}}),RULE_NAME$L="no-restricted-matchers",l$3=(b,Y)=>ModifierName.hasOwnProperty(Y)||Y.endsWith(".not")?b.startsWith(Y):b===Y,or=createEslintRule({name:RULE_NAME$L,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(b,[Y]){return{CallExpression(q){const $=parseVitestFnCall(q,b);if($?.type!=="expect")return;const B=$.members.map(F=>getAccessorValue(F)).join(".");for(const[F,W]of Object.entries(Y))if(l$3(B,F)){b.report({messageId:W?"restrictedChainWithMessage":"restrictedChain",data:{message:W,restriction:F},loc:{start:$.members[0].loc.start,end:$.members[$.members.length-1].loc.end}});break}}}}}),RULE_NAME$K="no-standalone-expect",a$5=(b,Y)=>{const q=b.parent;if(!q)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(q.type===utils.AST_NODE_TYPES.FunctionDeclaration)return"function";if(isFunction(q)&&q.parent){const $=q.parent;if($.type===utils.AST_NODE_TYPES.VariableDeclarator)return"function";if($.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall($,Y,["describe"]))return"describe"}return null},ar=createEslintRule({name:RULE_NAME$K,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(b,[{additionalTestBlockFunctions:Y=[]}]){const q=[],$=B=>Y.includes(getNodeName(B)||"");return{CallExpression(B){const F=parseVitestFnCall(B,b);if(F?.type==="expect"){if(F.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&F.members.length===1&&!["assertions","hasAssertions"].includes(getAccessorValue(F.members[0])))return;const W=q[q.length-1];(!W||W===DescribeAlias.describe)&&b.report({node:B,messageId:"noStandaloneExpect"});return}(F?.type==="test"||$(B))&&q.push("test"),B.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&q.push("template")},"CallExpression:exit"(B){const F=q[q.length-1];(F==="test"&&(isTypeOfVitestFnCall(B,b,["test"])||$(B))&&B.callee.type!==utils.AST_NODE_TYPES.MemberExpression||F==="template"&&B.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression)&&q.pop()},BlockStatement(B){const F=a$5(B,b);F&&q.push(F)},"BlockStatement:exit"(B){a$5(B,b)&&q.pop()},ArrowFunctionExpression(B){B.parent?.type!==utils.AST_NODE_TYPES.CallExpression&&q.push("arrow")},"ArrowFunctionExpression:exit"(){q[q.length-1]==="arrow"&&q.pop()}}}}),RULE_NAME$J="no-test-prefixes",tr=createEslintRule({name:RULE_NAME$J,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="describe"&&q?.type!=="test"||q.name[0]!=="f"&&q.name[0]!=="x")return;const $=[q.name.slice(1),q.name[0]==="f"?"only":"skip",...q.members.map(F=>getAccessorValue(F))].join("."),B=Y.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?Y.callee.tag:Y.callee.type===utils.AST_NODE_TYPES.CallExpression?Y.callee.callee:Y.callee;b.report({messageId:"usePreferredName",node:Y.callee,data:{preferredNodeName:$},fix:F=>[F.replaceText(B,$)]})}}}}),RULE_NAME$I="no-test-return-statement",u$3=b=>{const[,Y]=b;return Y&&isFunction(Y)&&Y.body.type===utils.AST_NODE_TYPES.BlockStatement?Y.body.body:[]},nr=createEslintRule({name:RULE_NAME$I,meta:{type:"problem",docs:{description:"disallow return statements in tests",recommended:!1},schema:[],messages:{noTestReturnStatement:"Return statements are not allowed in tests"}},defaultOptions:[],create(b){return{CallExpression(Y){if(!isTypeOfVitestFnCall(Y,b,["test"]))return;const q=u$3(Y.arguments).find($=>$.type===utils.AST_NODE_TYPES.ReturnStatement);q&&b.report({messageId:"noTestReturnStatement",node:q})},FunctionDeclaration(Y){const q=b.sourceCode.getDeclaredVariables(Y);if(getTestCallExpressionsFromDeclaredVariables(q,b).length===0)return;const $=Y.body.body.find(B=>B.type===utils.AST_NODE_TYPES.ReturnStatement);$&&b.report({messageId:"noTestReturnStatement",node:$})}}}}),RULE_NAME$H="prefer-called-with",sr=createEslintRule({name:RULE_NAME$H,meta:{docs:{description:"enforce using `toBeCalledWith()` or `toHaveBeenCalledWith()`",recommended:!1},messages:{preferCalledWith:"Prefer {{ matcherName }}With(/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.modifiers.some(F=>getAccessorValue(F)==="not"))return;const{matcher:$}=q,B=getAccessorValue($);["toBeCalled","toHaveBeenCalled"].includes(B)&&b.report({data:{matcherName:B},messageId:"preferCalledWith",node:$,fix:F=>[F.replaceText($,`${B}With`)]})}}}}),RULE_NAME$G="valid-title",_=b=>["f","x"].includes(b.charAt(0))?b.substring(1):b,S$4=b=>b.type===utils.AST_NODE_TYPES.TemplateLiteral?`\`${b.quasis[0].value.raw}\``:b.raw,N$3={type:"array",items:{type:"string"},minItems:1,maxItems:2,additionalItems:!1},c$3=b=>{const[Y,q]=Array.isArray(b)?b:[b];return[new RegExp(Y,"u"),q]};function j(b){return!!(b.flags&n__default.TypeFlags.StringLike)}const T$2=b=>{if(typeof b=="string"||Array.isArray(b)){const Y=c$3(b);return{describe:Y,test:Y,it:Y}}return{describe:b.describe?c$3(b.describe):null,test:b.test?c$3(b.test):null,it:b.it?c$3(b.it):null}},A$2=b=>isStringNode(b.right)?!0:b.left.type===utils.AST_NODE_TYPES.BinaryExpression?A$2(b.left):isStringNode(b.left),ir=createEslintRule({name:RULE_NAME$G,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"},N$3,{type:"object",propertyNames:{type:"string",enum:["describe","test","it"]},additionalProperties:{oneOf:[{type:"string"},N$3]}}]}},additionalProperties:!1}],fixable:"code"},defaultOptions:[{ignoreTypeOfDescribeName:!1,allowArguments:!1,disallowedWords:[]}],create(b,[{ignoreTypeOfDescribeName:Y,allowArguments:q,disallowedWords:$=[],mustNotMatch:B,mustMatch:F}]){const W=new RegExp(`\\b(${$.join("|")})\\b`,"iu"),H=T$2(B??{}),V=T$2(F??{}),X=parsePluginSettings(b.settings);return{CallExpression(z){const G=parseVitestFnCall(z,b);if(G?.type!=="describe"&&G?.type!=="test"&&G?.type!=="it"||G.members&&G.members[0]&&G.members[0].type===utils.AST_NODE_TYPES.Identifier&&G.members[0].name==="extend")return;const ee=ie=>{b.report({messageId:"emptyTitle",data:{functionName:G.type==="describe"?DescribeAlias.describe:TestCaseName.test},node:ie})},[J]=z.arguments,se=X.typecheck?utils.ESLintUtils.getParserServices(b).getTypeAtLocation(J):null;if(se&&isClassOrFunctionType(se)||!J||q&&J.type===utils.AST_NODE_TYPES.Identifier)return;if(!isStringNode(J)){if(J.type===utils.AST_NODE_TYPES.BinaryExpression&&A$2(J)||se&&j(se))return;J.type!==utils.AST_NODE_TYPES.TemplateLiteral&&!(Y&&G.type==="describe")&&b.report({messageId:"titleMustBeString",loc:J.loc});return}const Q=getStringValue(J);if(!Q){ee(z);return}if($.length>0){const ie=W.exec(Q);if(ie){b.report({messageId:"disallowedWord",data:{word:ie[1]},node:J});return}}Q.trim().length!==Q.length&&b.report({messageId:"accidentalSpace",node:J,fix:ie=>[ie.replaceTextRange(J.range,S$4(J).replace(/^([`'"]) +?/u,"$1").replace(/ +?([`'"])$/u,"$1"))]});const Z=_(G.name),[oe]=Q.split(" ");oe.toLowerCase()===Z&&b.report({messageId:"duplicatePrefix",node:J,fix:ie=>[ie.replaceTextRange(J.range,S$4(J).replace(/^([`'"]).+? /u,"$1"))]});const ne=Z,[te,re]=H[ne]??[];if(te&&te.test(Q)){b.report({messageId:re?"mustNotMatchCustom":"mustNotMatch",node:J,data:{functionName:ne,pattern:te,message:re}});return}const[ae,ce]=V[ne]??[];ae&&(ae.test(Q)||b.report({messageId:ce?"mustMatchCustom":"mustMatch",node:J,data:{functionName:ne,pattern:ae,message:ce}}))}}}}),RULE_NAME$F="valid-expect",h$1=["toReject","toResolve"],D=b=>(b.type===utils.AST_NODE_TYPES.ArrayExpression&&b.parent&&b.parent.type===utils.AST_NODE_TYPES.CallExpression&&(b=b.parent),b.type===utils.AST_NODE_TYPES.CallExpression&&b.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(b.callee.object,"Promise")&&b.parent?b:null),A$1=({start:b,end:Y})=>`${b.line}:${b.column}-${Y.line}:${Y.column}`,O$1=b=>b.parent.type===utils.AST_NODE_TYPES.Property&&b.type===utils.AST_NODE_TYPES.FunctionExpression?b.parent:b;function M$2(b){const Y=b.parent?.parent;return Y&&Y.type===utils.AST_NODE_TYPES.CallExpression&&Y.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(Y.callee.property)&&["then","catch"].includes(getAccessorValue(Y.callee.property))&&Y.parent?M$2(Y):b}const U=b=>b.parent?.parent&&[utils.AST_NODE_TYPES.CallExpression,utils.AST_NODE_TYPES.ArrayExpression].includes(b.parent.type)?D(b.parent):null,N$2=({parent:b})=>b?isFunction(b)?b:N$2(b):null,w$1=(b,Y)=>Y&&b.type===utils.AST_NODE_TYPES.ReturnStatement?!0:b.type===utils.AST_NODE_TYPES.ConditionalExpression&&b.parent?w$1(b.parent,Y):[utils.AST_NODE_TYPES.ArrowFunctionExpression,utils.AST_NODE_TYPES.AwaitExpression].includes(b.type),mr=createEslintRule({name:RULE_NAME$F,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:(b,[{alwaysAwait:Y,asyncMatchers:q=h$1,minArgs:$=1,maxArgs:B=1}])=>{const F=new Set,W=[],H=z=>F.add(A$1(z)),V=z=>F.has(A$1(z)),X=z=>{let G=z,{parent:ee}=z;for(;ee&&ee.type===utils.AST_NODE_TYPES.MemberExpression;)G=ee,ee=ee.parent;return G};return{CallExpression(z){const G=parseVitestFnCallWithReason(z,b),ee=parsePluginSettings(b.settings);if(typeof G=="string"){const re=z.parent?.type===utils.AST_NODE_TYPES.MemberExpression?X(z.parent).property:z;if(G==="matcher-not-found"){b.report({messageId:"matcherNotFound",node:re});return}if(G==="matcher-not-called"&&b.report({messageId:isSupportedAccessor(re)&&ModifierName.hasOwnProperty(getAccessorValue(re))?"matcherNotFound":"matcherNotCalled",node:re}),G==="modifier-unknown"){b.report({messageId:"modifierUnknown",node:re});return}return}else if(G?.type==="expectTypeOf"&&ee.typecheck||G?.type!=="expect"||G.modifiers.some(re=>re.type===utils.AST_NODE_TYPES.Identifier&&re.name=="to"))return;const{parent:J}=G.head.node;if(J?.type!==utils.AST_NODE_TYPES.CallExpression)return;if(J.arguments.length<$){const re=getAccessorValue(G.head.node).length,ae={start:{column:J.loc.start.column+re,line:J.loc.start.line},end:{column:J.loc.start.column+re+1,line:J.loc.start.line}};b.report({messageId:"notEnoughArgs",data:{amount:$,s:$===1?"":"s"},node:J,loc:ae})}if(J.arguments.length>B){if(J.arguments.length===2){const ie=J.arguments[1].type===utils.AST_NODE_TYPES.Literal&&typeof J.arguments[1].value=="string",le=J.arguments[1].type===utils.AST_NODE_TYPES.TemplateLiteral;if(ie||le)return}const{start:re}=J.arguments[B].loc,{end:ae}=J.arguments[J.arguments.length-1].loc,ce={start:re,end:{column:ae.column+1,line:ae.line}};b.report({messageId:"tooManyArgs",data:{amount:B,s:B===1?"":"s"},node:J,loc:ce})}const{matcher:se}=G,Q=se.parent.parent,Z=G.modifiers.some(re=>getAccessorValue(re)!=="not")||q.includes(getAccessorValue(se));if(!Q?.parent||!Z)return;const oe=Q.parent.type===utils.AST_NODE_TYPES.ArrayExpression,ne=M$2(Q),te=U(ne)||ne;te.parent&&!w$1(te.parent,!Y)&&!V(te.loc)&&(W.push({messageId:te===ne?"asyncMustBeAwaited":"promisesWithAsyncAssertionsMustBeAwaited",node:te}),oe&&H(te.loc))},"Program:exit"(){const z=[];W.forEach(({node:G,messageId:ee},J)=>{const se=Y?"":" or returned";b.report({loc:G.loc,data:{orReturned:se},messageId:ee,node:G,fix(Q){const Z=N$2(G);if(!Z)return null;const oe=z.some(te=>te.text==="async ");if(!Z.async&&!oe){const te=O$1(Z);z.push(Q.insertTextBefore(te,"async "))}const ne=G.parent?.type===utils.AST_NODE_TYPES.ReturnStatement?G.parent:null;if(Y&&ne){const te=b.sourceCode.getText(ne).replace("return","await");z.push(Q.replaceText(ne,te))}else z.push(Q.insertTextBefore(G,"await "));return J===W.length-1?z:null}})})}}}}),isBooleanLiteral=b=>b.type===utils.AST_NODE_TYPES.Literal&&typeof b.value=="boolean",isBooleanEqualityMatcher=b=>{const Y=getAccessorValue(b.matcher);if(["toBeTruthy","toBeFalsy"].includes(Y))return!0;if(b.args.length!==1)return!1;const q=getFirstMatcherArg(b);return EqualityMatcher.hasOwnProperty(Y)&&isBooleanLiteral(q)},isInstanceOfBinaryExpression=(b,Y)=>b.type===utils.AST_NODE_TYPES.BinaryExpression&&b.operator==="instanceof"&&isSupportedAccessor(b.right,Y),hasOnlyOneArgument=b=>b.arguments.length===1,RULE_NAME$E="prefer-to-be-object",pr=createEslintRule({name:RULE_NAME$E,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expectTypeOf")return;if(isParsedInstanceOfMatcherCall(q,"Object")){b.report({node:q.matcher,messageId:"preferToBeObject",fix:F=>[F.replaceTextRange([q.matcher.range[0],q.matcher.range[1]+8],"toBeObject()")]});return}const{parent:$}=q.head.node;if($?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[B]=$.arguments;!B||!isBooleanEqualityMatcher(q)||!isInstanceOfBinaryExpression(B,"Object")||b.report({node:q.matcher,messageId:"preferToBeObject",fix(F){const W=[F.replaceText(q.matcher,"toBeObject"),F.removeRange([B.left.range[1],B.range[1]])];let H=getAccessorValue(q.matcher)==="toBeFalsy";if(q.args.length){const[V]=q.args;W.push(F.remove(V)),H=V.type===utils.AST_NODE_TYPES.Literal&&followTypeAssertionChain$1(V).value===!1}if(H){const V=q.modifiers.find(X=>getAccessorValue(X)==="not");W.push(V?F.removeRange([V.range[0]-1,V.range[1]]):F.insertTextBefore(q.matcher,"not."))}return W}})}}}}),RULE_NAME$D="prefer-to-be-truthy",n=b=>b.type===utils.AST_NODE_TYPES.Literal&&b.value===!0,Er=createEslintRule({name:RULE_NAME$D,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);(q?.type==="expect"||q?.type==="expectTypeOf")&&q.args.length===1&&n(getFirstMatcherArg(q))&&EqualityMatcher.hasOwnProperty(getAccessorValue(q.matcher))&&b.report({node:q.matcher,messageId:"preferToBeTruthy",fix:$=>[$.replaceText(q.matcher,"toBeTruthy"),$.remove(q.args[0])]})}}}}),RULE_NAME$C="prefer-to-be-falsy",c$2=b=>b.type===utils.AST_NODE_TYPES.Literal&&b.value===!1,fr=createEslintRule({name:RULE_NAME$C,meta:{type:"suggestion",docs:{description:"enforce using toBeFalsy()",recommended:!1},fixable:"code",schema:[],messages:{preferToBeFalsy:"Prefer using toBeFalsy()"}},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);(q?.type==="expect"||q?.type==="expectTypeOf")&&q.args.length===1&&c$2(getFirstMatcherArg(q))&&EqualityMatcher.hasOwnProperty(getAccessorValue(q.matcher))&&b.report({node:q.matcher,messageId:"preferToBeFalsy",fix:$=>[$.replaceText(q.matcher,"toBeFalsy"),$.remove(q.args[0])]})}}}}),RULE_NAME$B="prefer-to-have-length",lr=createEslintRule({name:RULE_NAME$B,meta:{type:"suggestion",docs:{description:"enforce using toHaveLength()",recommended:!1},fixable:"code",messages:{preferToHaveLength:"Prefer toHaveLength()"},schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{parent:$}=q.head.node;if($?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[B]=$.arguments,{matcher:F}=q;!EqualityMatcher.hasOwnProperty(getAccessorValue(F))||B?.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor(B.property,"length")||b.report({node:F,messageId:"preferToHaveLength",fix(W){return[W.removeRange([B.property.range[0]-1,B.range[1]]),W.replaceTextRange([F.parent.object.range[1],F.parent.range[1]],".toHaveLength")]}})}}}}),RULE_NAME$A="prefer-equality-matcher",Nr=createEslintRule({name:RULE_NAME$A,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.args.length===0)return;const{parent:$}=q.head.node;if($?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[B],range:[,F]}=$,{matcher:W}=q,H=getFirstMatcherArg(q);if(B?.type!==utils.AST_NODE_TYPES.BinaryExpression||B.operator!=="==="&&B.operator!=="!=="||!EqualityMatcher.hasOwnProperty(getAccessorValue(W))||!isBooleanLiteral(H))return;const V=H.value,[X]=q.modifiers,z=q.modifiers.some(J=>getAccessorValue(J)==="not"),G=(B.operator==="!=="?!V:V)===z,ee=J=>se=>{const{sourceCode:Q}=b;let Z=X&&getAccessorValue(X)!=="not"?`.${getAccessorValue(X)}`:"";return G&&(Z+=`.${ModifierName.not}`),[se.replaceText(B,Q.getText(B.left)),se.replaceTextRange([F,W.parent.range[1]],`${Z}.${J}`),se.replaceText(H,Q.getText(B.right))]};b.report({messageId:"useEqualityMatcher",suggest:["toBe","toEqual","toStrictEqual"].map(J=>({messageId:"suggestEqualityMatcher",data:{equalityMatcher:J},fix:ee(J)})),node:W})}}}}),RULE_NAME$z="prefer-strict-equal",cr=createEslintRule({name:RULE_NAME$z,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{matcher:$}=q;isSupportedAccessor($,"toEqual")&&b.report({messageId:"useToStrictEqual",node:$,suggest:[{messageId:"suggestReplaceWithStrictEqual",fix:B=>[replaceAccessorFixer(B,$,EqualityMatcher.toStrictEqual)]}]})}}}}),RULE_NAME$y="prefer-expect-resolves",dr=createEslintRule({name:RULE_NAME$y,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:b=>({CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{parent:$}=q.head.node;if($?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[B]=$.arguments;B?.type===utils.AST_NODE_TYPES.AwaitExpression&&b.report({node:B,messageId:"expectResolves",fix(F){return[F.insertTextBefore($,"await "),F.removeRange([B.range[0],B.argument.range[0]]),F.insertTextAfter($,".resolves")]}})}})}),RULE_NAME$x="prefer-each",Ar=createEslintRule({name:RULE_NAME$x,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(b){const Y=[];let q=!1;const $=()=>Y.length===1&&Y[0]==="test"?"it":"describe",B=()=>{Y.length===0||q||(Y.length=0)},F=W=>{Y.length===0||q||(b.report({node:W,messageId:"preferEach",data:{fn:$()}}),Y.length=0)};return{ForStatement:B,"ForStatement:exit":F,ForInStatement:B,"ForInStatement:exit":F,ForOfStatement:B,"ForOfStatement:exit":F,CallExpression(W){const{type:H}=parseVitestFnCall(W,b)??{};(H==="hook"||H==="describe"||H==="test")&&Y.push(H),H==="test"&&(q=!0)},"CallExpression:exit"(W){const{type:H}=parseVitestFnCall(W,b)??{};H==="test"&&(q=!1)}}}}),RULE_NAME$w="prefer-hooks-on-top",Mr=createEslintRule({name:RULE_NAME$w,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(b){const Y=[!1];return{CallExpression(q){isTypeOfVitestFnCall(q,b,["test"])&&(Y[Y.length-1]=!0),Y[Y.length-1]&&isTypeOfVitestFnCall(q,b,["hook"])&&b.report({messageId:"noHookOnTop",node:q}),Y.push(!1)},"CallExpression:exit"(){Y.pop()}}}}),RULE_NAME$v="prefer-hooks-in-order",a$4=["beforeAll","beforeEach","afterEach","afterAll"],wr=createEslintRule({name:RULE_NAME$v,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(b){let Y=-1,q=!1;return{CallExpression($){if(q)return;const B=parseVitestFnCall($,b);if(B?.type!=="hook"){Y=-1;return}q=!0;const F=B.name,W=a$4.indexOf(F);if(W<Y){b.report({messageId:"reorderHooks",data:{previousHook:a$4[Y],currentHook:F},node:$}),q=!1;return}Y=W},"CallExpression:exit"($){if(isTypeOfVitestFnCall($,b,["hook"])){q=!1;return}q||(Y=-1)}}}}),RULE_NAME$u="prefer-mock-promise-shorthand",l$2=(b,Y)=>`${b}${Y?"Once":""}`,f=b=>b.body.type!==utils.AST_NODE_TYPES.BlockStatement?b.body:b.body.body[0]?.type===utils.AST_NODE_TYPES.ReturnStatement?b.body.body[0].argument:null,Rr=createEslintRule({name:RULE_NAME$u,meta:{type:"suggestion",docs:{description:"enforce mock resolved/rejected shorthands for promises",recommended:!1},messages:{useMockShorthand:"Prefer {{ replacement }}"},schema:[],fixable:"code"},defaultOptions:[],create(b){const Y=(q,$,B,F=B)=>{if(F?.type!==utils.AST_NODE_TYPES.CallExpression)return;const W=getNodeName(F);if(W!=="Promise.resolve"&&W!=="Promise.reject")return;const H=l$2(W.endsWith("reject")?"mockRejectedValue":"mockResolvedValue",$);b.report({node:q,messageId:"useMockShorthand",data:{replacement:H},fix(V){const{sourceCode:X}=b;return F.arguments.length>1?null:[V.replaceText(q,H),V.replaceText(B,F.arguments.length===1?X.getText(F.arguments[0]):"undefined")]}})};return{CallExpression(q){if(q.callee.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor(q.callee.property)||q.arguments.length===0)return;const $=getAccessorValue(q.callee.property),B=$.endsWith("Once");if($===l$2("mockReturnValue",B))Y(q.callee.property,B,q.arguments[0]);else if($===l$2("mockImplementation",B)){const[F]=q.arguments;if(!isFunction(F)||F.params.length!==0)return;Y(q.callee.property,B,F,f(F))}}}}}),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=b=>p.has(b),isTokenASemicolon=b=>b.value===";"&&b.type===utils.AST_TOKEN_TYPES.Punctuator,getActualLastToken=(b,Y)=>{const q=b.getLastToken(Y),$=b.getTokenBefore(q),B=b.getTokenAfter(q);return $&&B&&$.range[0]>=Y.range[0]&&isTokenASemicolon(q)&&q.loc.start.line!==$.loc.end.line&&q.loc.end.line===B.loc.start.line?$:q},getPaddingLineSequences=(b,Y,q)=>{const $=[];let B=getActualLastToken(q,b);if(Y.loc.start.line-b.loc.end.line>=2)do{const F=q.getTokenAfter(B,{includeComments:!0});F.loc.start.line-B.loc.end.line>=2&&$.push([B,F]),B=F}while(B.range[0]<Y.range[0]);return $},areTokensOnSameLine=(b,Y)=>b.loc.end.line===Y.loc.start.line,E$1=b=>b.type===utils.AST_NODE_TYPES.TSAsExpression||b.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain=b=>E$1(b)?followTypeAssertionChain(b.expression):b,RULE_NAME$t="prefer-vi-mocked",m$4=["Mock","MockedFunction","MockedClass","MockedObject"],Lr=createEslintRule({name:RULE_NAME$t,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(b){function Y(q){const{typeAnnotation:$}=q;if($.type!==utils.AST_NODE_TYPES.TSTypeReference)return;const{typeName:B}=$;if(B.type!==utils.AST_NODE_TYPES.Identifier||!m$4.includes(B.name))return;const F=b.sourceCode.text.slice(...followTypeAssertionChain(q.expression).range);b.report({node:q,messageId:"useViMocked",fix(W){return W.replaceText(q,`vi.mocked(${F})`)}})}return{TSAsExpression(q){q.parent.type!==utils.AST_NODE_TYPES.TSAsExpression&&Y(q)},TSTypeAssertion(q){Y(q)}}}}),RULE_NAME$s="prefer-snapshot-hint",E=["toMatchSnapshot","toThrowErrorMatchingSnapshot"],x$2=E,S$3=b=>{if(b.args.length===0)return!0;if(!isSupportedAccessor(b.matcher,"toMatchSnapshot"))return b.args.length!==1;if(b.args.length===2)return!1;const[Y]=b.args;return!isStringNode(Y)},ur=createEslintRule({name:RULE_NAME$s,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(b,[Y]){const q=[];let $=0;const B=[],F=()=>{for(const V of q)S$3(V)&&b.report({messageId:"missingHint",node:V.matcher})},W=()=>{$++},H=()=>{$--,Y==="always"&&(F(),q.length=0),Y==="multi"&&$===0&&(q.length>1&&F(),q.length=0)};return{"Program:exit"(){W(),H()},FunctionExpression:W,"FunctionExpression:exit":H,ArrowFunctionExpression:W,"ArrowFunctionExpression:exit":H,"CallExpression:exit"(V){isTypeOfVitestFnCall(V,b,["describe","test"])&&($=B.pop()??0)},CallExpression(V){const X=parseVitestFnCall(V,b);if(X?.type!=="expect"){(X?.type==="describe"||X?.type==="test")&&(B.push($),$=0);return}const z=getAccessorValue(X.matcher);x$2.includes(z)&&q.push(X)}}}}),RULE_NAME$r="valid-describe-callback",o=b=>{const[Y]=b,q=b[b.length-1];return{start:Y.loc.start,end:q.loc.end}},i$1=(b,Y)=>b.members.every(q=>getAccessorValue(q)!=="each")&&Y.params.length,u$2=(b,Y)=>{b.body.forEach(q=>{q.type===utils.AST_NODE_TYPES.ReturnStatement&&Y.report({messageId:"unexpectedReturnInDescribe",node:q})})},Ur=createEslintRule({name:RULE_NAME$r,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="describe"||q?.members[0]?.type===utils.AST_NODE_TYPES.Identifier&&q.members[0].name==="todo")return;if(Y.arguments.length<1)return b.report({messageId:"nameAndCallback",loc:Y.loc});const[,$,B]=Y.arguments;if(!$){b.report({messageId:"nameAndCallback",loc:o(Y.arguments)});return}if(!isFunction($)){if(B&&isFunction(B)){i$1(q,B)&&b.report({messageId:"unexpectedDescribeArgument",node:B}),B.body.type===utils.AST_NODE_TYPES.CallExpression&&b.report({messageId:"unexpectedReturnInDescribe",node:B}),B.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2(B.body,b);return}b.report({messageId:"secondArgumentMustBeFunction",loc:o(Y.arguments)});return}i$1(q,$)&&b.report({messageId:"unexpectedDescribeArgument",node:$}),$.body.type===utils.AST_NODE_TYPES.CallExpression&&b.report({messageId:"unexpectedReturnInDescribe",node:$}),$.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2($.body,b)}}}}),RULE_NAME$q="require-top-level-describe",_r=createEslintRule({name:RULE_NAME$q,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(b){const{maxNumberOfTopLevelDescribes:Y=1/0}=b.options[0]??{};let q=0,$=0;return{CallExpression(B){const F=parseVitestFnCall(B,b);if(F){if(F.type==="describe"){$++,$===1&&(q++,q>Y&&b.report({node:B,messageId:"tooManyDescribes",data:{max:Y,s:Y===1?"":"s"}}));return}if($===0){if(F.type==="test"&&(F.members.length===0||!F.members.every(W=>"name"in W&&W.name==="extend"))){b.report({node:B,messageId:"unexpectedTestCase"});return}F.type==="hook"&&b.report({node:B,messageId:"unexpectedHook"})}}},"CallExpression:exit"(B){isTypeOfVitestFnCall(B,b,["describe"])&&$--}}}}),RULE_NAME$p="require-to-throw-message",Tr=createEslintRule({name:RULE_NAME$p,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{matcher:$}=q,B=getAccessorValue($);q.args.length===0&&["toThrow","toThrowError"].includes(B)&&!q.modifiers.some(F=>getAccessorValue(F)==="not")&&b.report({messageId:"addErrorMessage",data:{matcherName:B},node:$})}}}}),RULE_NAME$o="require-hook",S$2=(b,Y)=>parseVitestFnCall(b,Y)?!0:!!getNodeName(b)?.startsWith("vi"),m$3=b=>b.type===utils.AST_NODE_TYPES.Literal&&b.value===null||isIdentifier(b,"undefined"),a$2=(b,Y,q=[])=>{switch(b.type){case utils.AST_NODE_TYPES.ExpressionStatement:return a$2(b.expression,Y,q);case utils.AST_NODE_TYPES.CallExpression:return!(S$2(b,Y)||q.includes(getNodeName(b)));case utils.AST_NODE_TYPES.VariableDeclaration:return b.kind==="const"?!1:b.declarations.some(({init:$})=>$!==null&&!m$3($));default:return!1}},br=createEslintRule({name:RULE_NAME$o,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(b){const{allowedFunctionCalls:Y}=b.options[0]??{},q=$=>{for(const B of $)a$2(B,b,Y)&&b.report({node:B,messageId:"useHook"})};return{Program($){q($.body)},CallExpression($){if(!isTypeOfVitestFnCall($,b,["describe"])||$.arguments.length<2)return;const[,B]=$.arguments;!isFunction(B)||B.body.type!==utils.AST_NODE_TYPES.BlockStatement||q(B.body.body)}}}}),RULE_NAME$n="require-local-test-context-for-concurrent-snapshots",hr=createEslintRule({name:RULE_NAME$n,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);q===null||q.type!=="expect"||q.type==="expect"&&q.head.type==="testContext"||!["toMatchSnapshot","toMatchInlineSnapshot","toMatchFileSnapshot","toThrowErrorMatchingSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(Y.callee?.property.name)||!b.sourceCode.getAncestors(Y).some($=>$.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall($,b,["describe","test"])?!1:$.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor($.callee.property,"concurrent"))||b.report({node:Y,messageId:"requireLocalTestContext"})}}}}),RULE_NAME$m="prefer-todo",S$1=b=>b.members.some(Y=>getAccessorValue(Y)!=="skip")||b.name.startsWith("x")?!1:!b.name.startsWith("f");function T$1(b){return isFunction(b)?b.body.type===utils.AST_NODE_TYPES.BlockStatement&&!b.body.body.length:!1}function a$1(b,Y){return b.members.length?replaceAccessorFixer(Y,b.members[0],"todo"):Y.replaceText(b.head.node,`${b.head.local}.todo`)}const gr=createEslintRule({name:RULE_NAME$m,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(b){return{CallExpression(Y){const[q,$]=Y.arguments,B=parseVitestFnCall(Y,b);!q||B?.type!=="test"||!S$1(B)||!isStringNode(q)||($&&T$1($)&&b.report({messageId:"emptyTest",node:Y,fix:F=>[F.removeRange([q.range[1],$.range[1]]),a$1(B,F)]}),hasOnlyOneArgument(Y)&&b.report({messageId:"unimplementedTest",node:Y,fix:F=>a$1(B,F)}))}}}}),RULE_NAME$l="prefer-spy-on",u$1=b=>"object"in b?b.object:b.callee.type===utils.AST_NODE_TYPES.MemberExpression?b.callee.object:null,a=b=>{if(b.type!==utils.AST_NODE_TYPES.CallExpression&&b.type!==utils.AST_NODE_TYPES.MemberExpression)return null;const Y=u$1(b);return Y?Y.type===utils.AST_NODE_TYPES.Identifier?b.type===utils.AST_NODE_TYPES.CallExpression&&getNodeName(b.callee)==="vi.fn"?b:null:a(Y):null},S=(b,Y)=>{if(b.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&b.parent.property.type===utils.AST_NODE_TYPES.Identifier&&b.parent.property.name==="mockImplementation")return"";const[q]=b.arguments,$=q&&Y.sourceCode.getText(q);return $?`.mockImplementation(${$})`:".mockImplementation()"},kr=createEslintRule({name:RULE_NAME$l,meta:{type:"suggestion",docs:{description:"enforce using `vi.spyOn`",recommended:!1},messages:{useViSpayOn:"Use `vi.spyOn` instead"},fixable:"code",schema:[]},defaultOptions:[],create(b){return{AssignmentExpression(Y){const{left:q,right:$}=Y;if(q.type!==utils.AST_NODE_TYPES.MemberExpression)return;const B=a($);B&&b.report({node:Y,messageId:"useViSpayOn",fix(F){const W=q.property.type===utils.AST_NODE_TYPES.Identifier&&!q.computed?"'":"",H=S(B,b);return[F.insertTextBefore(q,"vi.spyOn("),F.replaceTextRange([q.object.range[1],q.property.range[0]],`, ${W}`),F.replaceTextRange([q.property.range[1],B.range[1]],`${W})${H}`)]}})}}}}),RULE_NAME$k="prefer-comparison-matcher",g$1=b=>isStringNode(b)||b?.type===utils.AST_NODE_TYPES.TemplateLiteral,C=b=>g$1(b.left)||g$1(b.right),M$1=b=>{switch(b){case">":return"<=";case"<":return">=";case">=":return"<";case"<=":return">"}return null},O=(b,Y)=>{switch(Y?M$1(b):b){case">":return"toBeGreaterThan";case"<":return"toBeLessThan";case">=":return"toBeGreaterThanOrEqual";case"<=":return"toBeLessThanOrEqual"}return null},xr=createEslintRule({name:RULE_NAME$k,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(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.args.length===0)return;const{parent:$}=q.head.node;if($?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[B],range:[,F]}=$,{matcher:W}=q,H=getFirstMatcherArg(q);if(B?.type!==utils.AST_NODE_TYPES.BinaryExpression||C(B)||!EqualityMatcher.hasOwnProperty(getAccessorValue(W))||!isBooleanLiteral(H))return;const[V]=q.modifiers,X=q.modifiers.some(G=>getAccessorValue(G)==="not"),z=O(B.operator,H.value===X);z&&b.report({fix(G){const{sourceCode:ee}=b,J=V&&getAccessorValue(V)!=="not"?`.${getAccessorValue(V)}`:"";return[G.replaceText(B,ee.getText(B.left)),G.replaceTextRange([F,W.parent.range[1]],`${J}.${z}`),G.replaceText(H,ee.getText(B.right))]},messageId:"useToBeComparison",data:{preferredMatcher:z},node:W})}}}}),RULE_NAME$j="prefer-describe-function-title",Cr=createEslintRule({name:RULE_NAME$j,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(b){return{CallExpression(Y){if(Y.arguments.length<2)return;const q=getModuleScope(b,Y),[$]=Y.arguments;if($.type===utils.AST_NODE_TYPES.MemberExpression&&$.object.type===utils.AST_NODE_TYPES.Identifier&&$.property.type===utils.AST_NODE_TYPES.Identifier){const W=$.object.name;if(q?.set.get(W)?.defs[0]?.type!==scopeManager.DefinitionType.ImportBinding||$.property.name!=="name")return;b.report({node:$,messageId:"preferFunction",fix(H){return H.replaceText($,W)}});return}if($.type!==utils.AST_NODE_TYPES.Literal||typeof $.value!="string")return;const B=$.value;if(parseVitestFnCall(Y,b)?.type!=="describe")return;const F=q?.set.get(B)?.defs[0];if(F?.type===scopeManager.DefinitionType.ImportBinding){if(parsePluginSettings(b.settings).typecheck){const W=utils.ESLintUtils.getParserServices(b).getTypeAtLocation(F.node);if(!isClassOrFunctionType(W))return}b.report({node:$,messageId:"preferFunction",fix(W){return W.replaceText($,B)}})}}}}}),RULE_NAME$i="prefer-to-contain",T=b=>b.type===utils.AST_NODE_TYPES.CallExpression&&b.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(b.callee.property,"includes")&&hasOnlyOneArgument(b)&&b.arguments[0].type!==utils.AST_NODE_TYPES.SpreadElement,vr=createEslintRule({name:RULE_NAME$i,meta:{docs:{description:"enforce using toContain()",recommended:!1},messages:{useToContain:"Use toContain() instead"},fixable:"code",type:"suggestion",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.args.length===0)return;const{parent:$}=q.head.node;if($?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[B],range:[,F]}=$,{matcher:W}=q,H=getFirstMatcherArg(q);if(!B||H.type===utils.AST_NODE_TYPES.SpreadElement||!EqualityMatcher.hasOwnProperty(getAccessorValue(W))||!isBooleanLiteral(H)||!T(B))return;const V=q.modifiers.some(X=>getAccessorValue(X)==="not");b.report({fix(X){const{sourceCode:z}=b,G=H.value===V;return[X.removeRange([B.callee.property.range[0]-1,B.range[1]]),X.replaceTextRange([F,W.parent.range[1]],G?`.${ModifierName.not}.toContain`:".toContain"),X.replaceText(q.args[0],z.getText(B.arguments[0]))]},messageId:"useToContain",node:W})}}}}),RULE_NAME$h="prefer-expect-assertions",L=b=>{let Y=b;for(;Y;){if(Y.parent?.type===utils.AST_NODE_TYPES.BlockStatement)return Y.parent.body[0]===Y;if(Y.parent?.type===utils.AST_NODE_TYPES.ArrowFunctionExpression)return!0;Y=Y.parent}throw new Error("Could not find parent block statement")},y$2=(b,Y,q)=>({messageId:"suggestRemovingExtraArguments",fix:$=>removeExtraArgumentsFixer($,b,Y,q)}),Br=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(b,[Y]){let q=0,$=!1,B=!1,F=!1,W=null,H=!1,V=!1;const X=Q=>!!(!Y.onlyFunctionsWithAsyncKeyword&&!Y.onlyFunctionsWithExpectInCallback&&!Y.onlyFunctionsWithExpectInLoop||Y.onlyFunctionsWithAsyncKeyword&&Q.async||Y.onlyFunctionsWithExpectInCallback&&$||Y.onlyFunctionsWithExpectInLoop&&B);function z(Q,Z){if(getAccessorValue(Q.members[0])==="hasAssertions"){Q.args.length&&b.report({messageId:"hasAssertionsTakesNoArguments",node:Q.matcher,suggest:[y$2(b,Z,0)]});return}if(Q.args.length!==1){let{loc:ne}=Q.matcher;const te=[];Q.args.length&&(ne=Q.args[1].loc,te.push(y$2(b,Z,1))),b.report({messageId:"assertionsRequiresOneArgument",suggest:te,loc:ne});return}const[oe]=Q.args;oe.type===utils.AST_NODE_TYPES.Literal&&typeof oe.value=="number"&&Number.isInteger(oe.value)||b.report({messageId:"assertionsRequiresNumberArgument",node:oe})}const G=()=>H&&q++,ee=()=>H&&q--,J=()=>V=!0,se=()=>V=!1;return{FunctionExpression:G,"FunctionExpression:exit":ee,ArrowFunctionExpression:G,"ArrowFunctionExpression:exit":ee,ForStatement:J,"ForStatement:exit":se,ForInStatement:J,"ForInStatement:exit":se,ForOfStatement:J,"ForOfStatement:exit":se,CallExpression(Q){const Z=parseVitestFnCall(Q,b);if(Z?.type==="test"){H=!0;return}Z?.head.type==="testContext"&&Z.members[0]&&Z.members[0].type===utils.AST_NODE_TYPES.Identifier&&Z.members[0].name==="expect"&&(W=`${Z.head.local}`),Z?.type==="expect"&&H&&(q===1&&L(Q)&&Z.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&Z.members.length===1&&["assertions","hasAssertions"].includes(getAccessorValue(Z.members[0]))&&(z(Z,Q),F=!0),V&&(B=!0),q>1&&($=!0))},"CallExpression:exit"(Q){if(!isTypeOfVitestFnCall(Q,b,["test"])||(H=!1,Q.arguments.length<2))return;const[,Z]=Q.arguments;if(!isFunction(Z)||!X(Z))return;if(B=!1,$=!1,F){F=!1;return}const oe=[];if(Z.body.type===utils.AST_NODE_TYPES.BlockStatement){const ne=W?`${W}.`:"";oe.push(["suggestAddingHasAssertions",`${ne}expect.hasAssertions();`],["suggestAddingAssertions",`${ne}expect.assertions();`])}b.report({messageId:"haveExpectAssertions",node:Q,suggest:oe.map(([ne,te])=>({messageId:ne,fix:re=>re.insertTextBeforeRange([Z.body.range[0]+1,Z.body.range[1]],te)}))})}}}});var PaddingType=(b=>(b[b.Any=0]="Any",b[b.Always=1]="Always",b))(PaddingType||{}),StatementType=(b=>(b[b.Any=0]="Any",b[b.AfterAllToken=1]="AfterAllToken",b[b.AfterEachToken=2]="AfterEachToken",b[b.BeforeAllToken=3]="BeforeAllToken",b[b.BeforeEachToken=4]="BeforeEachToken",b[b.DescribeToken=5]="DescribeToken",b[b.ExpectToken=6]="ExpectToken",b[b.ExpectTypeOfToken=7]="ExpectTypeOfToken",b[b.FdescribeToken=8]="FdescribeToken",b[b.FitToken=9]="FitToken",b[b.ItToken=10]="ItToken",b[b.TestToken=11]="TestToken",b[b.XdescribeToken=12]="XdescribeToken",b[b.XitToken=13]="XitToken",b[b.XtestToken=14]="XtestToken",b))(StatementType||{});const x$1=(b,Y,q)=>{const{sourceCode:$,ruleContext:B}=q;getPaddingLineSequences(b,Y,$).length>0||B.report({node:Y,messageId:"missingPadding",fix(F){let W=getActualLastToken($,b);const H=$.getFirstTokenBetween(W,Y,{includeComments:!0,filter(X){return areTokensOnSameLine(W,X)?(W=X,!1):!0}})||Y,V=areTokensOnSameLine(W,H)?`
6
6
 
7
7
  `:`
8
- `;return F.insertTextAfter(W,V)}})},m$2={0:()=>!0,1:x$1},y$1=()=>{let b=null;return{get prevNode(){return b.prevNode},set prevNode(Y){b.prevNode=Y},enter(){b={upper:b,prevNode:null}},exit(){b=b.upper}}},i=b=>(Y,q)=>{let $=Y;if($.type===utils.AST_NODE_TYPES.ExpressionStatement){$.expression.type===utils.AST_NODE_TYPES.AwaitExpression&&($=$.expression.argument);const B=q.getFirstToken($);return B?.type===utils.AST_TOKEN_TYPES.Identifier&&B.value===b}return!1},A={0:()=>!0,1:i("afterAll"),2:i("afterEach"),3:i("beforeAll"),4:i("beforeEach"),5:i("describe"),6:i("expect"),7:i("expectTypeOf"),8:i("fdescribe"),9:i("fit"),10:i("it"),11:i("test"),12:i("xdescribe"),13:i("xit"),14:i("xtest")},l$1=(b,Y,q)=>{let $=b;const{sourceCode:B}=q;for(;$.type===utils.AST_NODE_TYPES.LabeledStatement;)$=$.body;return Array.isArray(Y)?Y.some(F=>l$1($,F,q)):A[Y]($,B)},N$1=(b,Y,q)=>{const{configs:$}=q,B=F=>m$2[F](b,Y,q);for(let F=$.length-1;F>=0;--F){const{prevStatementType:W,nextStatementType:H,paddingType:V}=$[F];if(l$1(b,W,q)&&l$1(Y,H,q))return B(V)}return B(0)},u=(b,Y)=>{const{scopeInfo:q}=Y;isValidParent(b?.parent.type)&&(q.prevNode&&N$1(q.prevNode,b,Y),q.prevNode=b)},createPaddingRule=(b,Y,q,$=!1)=>createEslintRule({name:b,meta:{docs:{description:Y},fixable:"whitespace",deprecated:$,messages:{missingPadding:"expect blank line before this statement"},schema:[],type:"suggestion"},defaultOptions:[],create(B){const F={ruleContext:B,sourceCode:B.sourceCode??B.getSourceCode(),scopeInfo:y$1(),configs:q},{scopeInfo:W}=F;return{Program:W.enter,"Program:exit":W.exit,BlockStatement:W.enter,"BlockStatement:exit":W.exit,SwitchStatement:W.enter,"SwitchStatement:exit":W.exit,":statement":H=>u(H,F),SwitchCase(H){u(H,F),W.enter()},"SwitchCase:exit":W.exit}}}),RULE_NAME$g="padding-around-after-all-blocks",config$6=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.AfterAllToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.AfterAllToken,nextStatementType:StatementType.Any}],Ir=createPaddingRule(RULE_NAME$g,"Enforce padding around `afterAll` blocks",config$6),RULE_NAME$f="padding-around-after-each-blocks",config$5=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.AfterEachToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.AfterEachToken,nextStatementType:StatementType.Any}],yr=createPaddingRule(RULE_NAME$f,"Enforce padding around `afterEach` blocks",config$5),RULE_NAME$e="padding-around-before-all-blocks",config$4=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.BeforeAllToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.BeforeAllToken,nextStatementType:StatementType.Any}],Sr=createPaddingRule(RULE_NAME$e,"Enforce padding around `beforeAll` blocks",config$4),RULE_NAME$d="padding-around-before-each-blocks",config$3=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.BeforeEachToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.BeforeEachToken,nextStatementType:StatementType.Any}],Dr=createPaddingRule(RULE_NAME$d,"Enforce padding around `beforeEach` blocks",config$3),RULE_NAME$c="padding-around-describe-blocks",config$2=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:[StatementType.DescribeToken,StatementType.FdescribeToken,StatementType.XdescribeToken]},{paddingType:PaddingType.Always,prevStatementType:[StatementType.DescribeToken,StatementType.FdescribeToken,StatementType.XdescribeToken],nextStatementType:StatementType.Any}],Hr=createPaddingRule(RULE_NAME$c,"Enforce padding around `describe` blocks",config$2),RULE_NAME$b="padding-around-expect-groups",config$1=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.ExpectToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.ExpectToken,nextStatementType:StatementType.Any},{paddingType:PaddingType.Any,prevStatementType:StatementType.ExpectToken,nextStatementType:StatementType.ExpectToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.ExpectTypeOfToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.ExpectTypeOfToken,nextStatementType:StatementType.Any},{paddingType:PaddingType.Any,prevStatementType:StatementType.ExpectTypeOfToken,nextStatementType:StatementType.ExpectTypeOfToken}],qr=createPaddingRule(RULE_NAME$b,"Enforce padding around `expect` groups",config$1),RULE_NAME$a="padding-around-test-blocks",config=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:[StatementType.TestToken,StatementType.ItToken,StatementType.FitToken,StatementType.XitToken,StatementType.XtestToken]},{paddingType:PaddingType.Always,prevStatementType:[StatementType.TestToken,StatementType.ItToken,StatementType.FitToken,StatementType.XitToken,StatementType.XtestToken],nextStatementType:StatementType.Any}],Fr=createPaddingRule(RULE_NAME$a,"Enforce padding around `test` blocks",config),RULE_NAME$9="padding-around-all",Or=createPaddingRule(RULE_NAME$9,"Enforce padding around vitest functions",[...config$6,...config$5,...config$4,...config$3,...config$2,...config$1,...config]),RULE_NAME$8="valid-expect-in-promise",w=["toRejectWith","toResolveWith"],c=b=>{if(b.type===utils.AST_NODE_TYPES.CallExpression&&b.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(b.callee.property)){if(b.arguments.length===0)return!1;switch(getAccessorValue(b.callee.property)){case"then":return b.arguments.length<3;case"catch":case"finally":return b.arguments.length<2}}return!1},k=(b,Y)=>{const q=parseVitestFnCall(b,Y);if(q?.type!=="test")return!1;const $=q.members.some(W=>getAccessorValue(W)==="each");if($&&b.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression)return!0;const[,B]=b.arguments,F=Number($);return B&&isFunction(B)&&B.params.length===1+F},x=(b,Y)=>{const{name:q}=Y;if(b.argument===null)return!1;if(b.argument.type===utils.AST_NODE_TYPES.CallExpression&&b.argument.arguments.length>0){const $=getNodeName(b.argument);if(["Promise.all","Promise.allSettled"].includes($)){const[B]=b.argument.arguments;if(B.type===utils.AST_NODE_TYPES.ArrayExpression&&B.elements.some(F=>F&&isIdentifier(F,q)))return!0}if(["Promise.resolve","Promise.reject"].includes($)&&b.argument.arguments.length===1)return isIdentifier(b.argument.arguments[0],q)}return isIdentifier(b.argument,q)},h=(b,Y)=>{for(const q of Y)if(q?.type===utils.AST_NODE_TYPES.AwaitExpression&&isIdentifier(q.argument,b)||q?.type===utils.AST_NODE_TYPES.ArrayExpression&&h(b,q.elements))return!0;return!1},M=(b,Y)=>{let q=Y;for(;q;){if(q.type===utils.AST_NODE_TYPES.CallExpression){if(h(b,q.arguments))return!0;q=q.callee}if(q.type!==utils.AST_NODE_TYPES.MemberExpression)break;q=q.object}return!1},N=b=>{let Y=b,q=b;for(;q&&(q.type===utils.AST_NODE_TYPES.CallExpression&&(Y=q,q=q.callee),q.type===utils.AST_NODE_TYPES.MemberExpression);)q=q.object;return Y},m$1=(b,Y,q)=>{const{name:$}=b;for(const B of Y)if(!(B.range[0]<=b.range[0])){if(B.type===utils.AST_NODE_TYPES.ReturnStatement)return x(B,b);if(B.type===utils.AST_NODE_TYPES.ExpressionStatement){if(B.expression.type===utils.AST_NODE_TYPES.CallExpression){if(M($,B.expression))return!0;const F=N(B.expression),W=parseVitestFnCall(B.expression,q);if(W?.type==="expect"&&F.arguments.length>0&&isIdentifier(F.arguments[0],$)&&W.members.some(H=>{const V=getAccessorValue(H);return V===ModifierName.resolves||V===ModifierName.rejects}))return!0}if(B.expression.type===utils.AST_NODE_TYPES.AwaitExpression&&x(B.expression,b))return!0;if(B.expression.type===utils.AST_NODE_TYPES.AssignmentExpression){if(isIdentifier(B.expression.left,$)&&getNodeName(B.expression.right)?.startsWith(`${$}.`)&&c(B.expression.right))continue;break}}if(B.type===utils.AST_NODE_TYPES.BlockStatement&&m$1(b,B.body,q))return!0}return!1},y=b=>{let Y=b;for(;Y;){if(Y.type===utils.AST_NODE_TYPES.BlockStatement)return Y.body;Y=Y.parent}throw new Error("Could not find BlockStatement - please file a github issue at https://github.com/vitest-dev/eslint-plugin-vitest")},I=(b,Y)=>{let q=b;for(;q;){if(isFunction(q))return q=q.parent,q?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(q,Y,["test"]);q=q.parent}return!1},P=(b,Y)=>{const q=y(b);return isIdentifier(b.id)?m$1(b.id,q,Y):!0},Vr=createEslintRule({name:RULE_NAME$8,meta:{docs:{description:"require promises that have expectations in their chain to be valid"},messages:{expectInFloatingPromise:"This promise should either be returned or awaited to ensure the expects in its chain are called"},type:"suggestion",schema:[]},defaultOptions:[{alwaysAwait:!1,asyncMatchers:w,minArgs:1,maxArgs:1}],create(b){let Y=!1;const q=[];return{CallExpression($){if(k($,b)){Y=!0;return}if(c($)){q.unshift(!1);return}q.length>0&&isTypeOfVitestFnCall($,b,["expect"])&&(q[0]=!0)},"CallExpression:exit"($){if(Y){isTypeOfVitestFnCall($,b,["test"])&&(Y=!1);return}if(!c($)||!q.shift())return;const{parent:B}=findTopMostCallExpression($);if(!(!B||!I(B,b))){switch(B.type){case utils.AST_NODE_TYPES.VariableDeclarator:{if(P(B,b))return;break}case utils.AST_NODE_TYPES.AssignmentExpression:{if(B.left.type===utils.AST_NODE_TYPES.Identifier&&m$1(B.left,y(B),b))return;break}case utils.AST_NODE_TYPES.ExpressionStatement:break;case utils.AST_NODE_TYPES.ReturnStatement:case utils.AST_NODE_TYPES.AwaitExpression:default:return}b.report({messageId:"expectInFloatingPromise",node:B})}}}}}),RULE_NAME$7="prefer-strict-boolean-matchers",Pr=createEslintRule({name:RULE_NAME$7,meta:{type:"suggestion",docs:{description:"enforce using `toBe(true)` and `toBe(false)` over matchers that coerce types to boolean",recommended:!1},messages:{preferToBeTrue:"Prefer using `toBe(true)` to test value is `true`",preferToBeFalse:"Prefer using `toBe(false)` to test value is `false`"},fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(!(q?.type==="expect"||q?.type==="expectTypeOf"))return;const $=getAccessorValue(q.matcher);$==="toBeFalsy"&&b.report({node:q.matcher,messageId:"preferToBeFalse",fix:B=>[B.replaceText(q.matcher,"toBe"),B.insertTextAfterRange([q.matcher.range[0],q.matcher.range[1]+1],"false")]}),$==="toBeTruthy"&&b.report({node:q.matcher,messageId:"preferToBeTrue",fix:B=>[B.replaceText(q.matcher,"toBe"),B.insertTextAfterRange([q.matcher.range[0],q.matcher.range[1]+1],"true")]})}}}}),RULE_NAME$6="require-mock-type-parameters",Gr=createEslintRule({name:RULE_NAME$6,meta:{type:"suggestion",docs:{description:"enforce using type parameters with vitest mock functions",recommended:!1},messages:{noTypeParameter:"Missing type parameters"},fixable:"code",schema:[{type:"object",properties:{checkImportFunctions:{type:"boolean"}},additionalProperties:!1}]},defaultOptions:[{checkImportFunctions:!1}],create(b,[Y]){return{CallExpression(q){const $=parseVitestFnCall(q,b);if($?.type==="vi")for(const B of $?.members)!("name"in B)||B.parent.parent.typeArguments!==void 0||(B.name==="fn"&&b.report({node:B,messageId:"noTypeParameter"}),Y.checkImportFunctions&&["importActual","importMock"].includes(B.name)&&b.report({node:B,messageId:"noTypeParameter"}))}}}}),RULE_NAME$5="prefer-called-once",m=b=>b.type===utils.AST_NODE_TYPES.Literal&&b.value===1,jr=createEslintRule({name:RULE_NAME$5,meta:{docs:{description:"enforce using `toBeCalledOnce()` or `toHaveBeenCalledOnce()`",recommended:!1},messages:{preferCalledOnce:"Prefer {{ replacedMatcherName }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{matcher:$}=q,B=getAccessorValue($);if(["toBeCalledTimes","toHaveBeenCalledTimes"].includes(B)&&q.args.length===1&&m(getFirstMatcherArg(q))){const F=B.replace("Times","Once");b.report({data:{replacedMatcherName:F},messageId:"preferCalledOnce",node:$,fix:W=>[W.replaceText($,F),W.remove(q.args[0])]})}}}}}),RULE_NAME$4="prefer-called-times",Wr=createEslintRule({name:RULE_NAME$4,meta:{docs:{description:"enforce using `toBeCalledTimes(1)` or `toHaveBeenCalledTimes(1)`",recommended:!1},messages:{preferCalledTimes:"Prefer {{ replacedMatcherName }}(1)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{matcher:$}=q,B=getAccessorValue($);if(["toBeCalledOnce","toHaveBeenCalledOnce"].includes(B)){const F=B.replace("Once","Times");b.report({data:{replacedMatcherName:F},messageId:"preferCalledTimes",node:$,fix:W=>[W.replaceText($,F),W.insertTextAfterRange([q.matcher.range[0],q.matcher.range[1]+1],"1")]})}}}}}),RULE_NAME$3="prefer-expect-type-of",g={string:"toBeString",number:"toBeNumber",boolean:"toBeBoolean",object:"toBeObject",function:"toBeFunction",symbol:"toBeSymbol",bigint:"toBeBigInt",undefined:"toBeUndefined"},Kr=createEslintRule({name:RULE_NAME$3,meta:{type:"suggestion",docs:{description:"enforce using `expectTypeOf` instead of `expect(typeof ...)`",recommended:!1},schema:[],fixable:"code",messages:{preferExpectTypeOf:'Use `expectTypeOf({{ value }}).{{ matcher }}()` instead of `expect(typeof {{ value }}).toBe("{{ type }}")`'}},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.head.node.parent?.type!==utils.AST_NODE_TYPES.CallExpression)return;const $=q.head.node.parent,[B]=$.arguments;if(!B||B.type!==utils.AST_NODE_TYPES.UnaryExpression||B.operator!=="typeof")return;const F=getAccessorValue(q.matcher);if(F!=="toBe"&&F!=="toEqual")return;const[W]=q.args;if(!W||W.type!==utils.AST_NODE_TYPES.Literal||typeof W.value!="string")return;const H=W.value,V=g[H];if(!V)return;const X=b.sourceCode.getText(B.argument),z=q.modifiers.map(ee=>getAccessorValue(ee)).join("."),G=z?`.${z}`:"";b.report({node:Y,messageId:"preferExpectTypeOf",data:{value:X,matcher:V,type:H},fix(ee){return ee.replaceText(Y,`expectTypeOf(${X})${G}.${V}()`)}})}}}}),RULE_NAME$2="warn-todo",$r=createEslintRule({name:RULE_NAME$2,meta:{docs:{description:"disallow `.todo` usage",recommended:!1},messages:{warnTodo:"The use of `.todo` is not recommended."},type:"suggestion",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="describe"&&q?.type!=="test"&&q?.type!=="it")return;const $=q.members.find(B=>B.type==="Identifier"&&B.name==="todo");$&&b.report({messageId:"warnTodo",node:$})}}}}),RULE_NAME$1="prefer-import-in-mock",Jr=createEslintRule({name:RULE_NAME$1,meta:{fixable:"code",type:"suggestion",docs:{description:"prefer dynamic import in mock"},messages:{preferImport:"Replace '{{path}}' with import('{{path}}')"},schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){if(Y.callee.type!==utils.AST_NODE_TYPES.MemberExpression)return;const{object:q,property:$}=Y.callee;if(q.type!==utils.AST_NODE_TYPES.Identifier||q.name!=="vi"||$.type!==utils.AST_NODE_TYPES.Identifier)return;const B=$.name,F=Y.arguments[0];B==="mock"&&F&&F.type===utils.AST_NODE_TYPES.Literal&&b.report({messageId:"preferImport",data:{path:F.value},node:Y,fix(W){return W.replaceText(F,`import('${F.value}')`)}})}}}}),RULE_NAME="prefer-called-exactly-once-with",Qr=createEslintRule({name:RULE_NAME,meta:{docs:{description:"Prefer `toHaveBeenCalledExactlyOnceWith` over `toHaveBeenCalledOnce` and `toHaveBeenCalledWith`"},messages:{preferCalledExactlyOnceWith:"Prefer {{matcherName}} (/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.modifiers.some(F=>getAccessorValue(F)==="not"))return;const{matcher:$}=q,B=getAccessorValue($);["toHaveBeenCalledOnce","toHaveBeenCalledWith"].includes(B)&&b.report({data:{matcherName:B},messageId:"preferCalledExactlyOnceWith",node:$,fix:F=>[F.replaceText($,`${B}ExactlyOnceWith`)]})}}}}),Te=b=>Object.keys(b).reduce((Y,q)=>({...Y,[`vitest/${q}`]:b[q]}),{}),be=b=>({plugins:["@vitest"],rules:Object.keys(b).reduce((Y,q)=>({...Y,[`@vitest/${q}`]:b[q]}),{})}),he={[RULE_NAME$1a]:"warn",[RULE_NAME$19]:"warn",[RULE_NAME$17]:"warn",[RULE_NAME$16]:"warn",[RULE_NAME$13]:"warn",[RULE_NAME$12]:"warn",[RULE_NAME$10]:"warn",[RULE_NAME$$]:"warn",[RULE_NAME$_]:"warn",[RULE_NAME$Z]:"warn",[RULE_NAME$Y]:"warn",[RULE_NAME$W]:"warn",[RULE_NAME$S]:"warn",[RULE_NAME$R]:"warn",[RULE_NAME$Q]:"warn",[RULE_NAME$P]:"warn",[RULE_NAME$O]:"warn",[RULE_NAME$N]:"warn",[RULE_NAME$M]:"warn",[RULE_NAME$L]:"warn",[RULE_NAME$K]:"warn",[RULE_NAME$J]:"warn",[RULE_NAME$I]:"warn",[RULE_NAME$H]:"warn",[RULE_NAME$C]:"off",[RULE_NAME$E]:"warn",[RULE_NAME$D]:"off",[RULE_NAME$B]:"warn",[RULE_NAME$A]:"warn",[RULE_NAME$z]:"warn",[RULE_NAME$y]:"warn",[RULE_NAME$x]:"warn",[RULE_NAME$w]:"warn",[RULE_NAME$v]:"warn",[RULE_NAME$u]:"warn",[RULE_NAME$t]:"warn",[RULE_NAME$s]:"warn",[RULE_NAME$q]:"warn",[RULE_NAME$p]:"warn",[RULE_NAME$o]:"warn",[RULE_NAME$m]:"warn",[RULE_NAME$l]:"warn",[RULE_NAME$k]:"warn",[RULE_NAME$j]:"warn",[RULE_NAME$i]:"warn",[RULE_NAME$h]:"warn",[RULE_NAME$11]:"warn",[RULE_NAME$g]:"warn",[RULE_NAME$f]:"warn",[RULE_NAME$9]:"warn",[RULE_NAME$e]:"warn",[RULE_NAME$d]:"warn",[RULE_NAME$c]:"warn",[RULE_NAME$b]:"warn",[RULE_NAME$a]:"warn",[RULE_NAME$8]:"warn",[RULE_NAME$15]:"warn",[RULE_NAME$18]:"warn",[RULE_NAME$X]:"warn",[RULE_NAME$G]:"warn",[RULE_NAME$F]:"warn",[RULE_NAME$r]:"warn",[RULE_NAME$n]:"warn",[RULE_NAME$V]:"warn",[RULE_NAME$7]:"warn",[RULE_NAME$6]:"warn",[RULE_NAME$U]:"off",[RULE_NAME$T]:"warn",[RULE_NAME$5]:"off",[RULE_NAME$4]:"warn",[RULE_NAME$3]:"warn",[RULE_NAME$14]:"warn",[RULE_NAME$1]:"warn",[RULE_NAME]:"warn"},ge={[RULE_NAME$15]:"error",[RULE_NAME$18]:"error",[RULE_NAME$X]:"error",[RULE_NAME$G]:"error",[RULE_NAME$F]:"error",[RULE_NAME$r]:"error",[RULE_NAME$n]:"error",[RULE_NAME$V]:"error",[RULE_NAME]:"error"},Xr={[RULE_NAME$1a]:xe,[RULE_NAME$19]:Ce,[RULE_NAME$18]:ve,[RULE_NAME$17]:Be,[RULE_NAME$16]:Ie,[RULE_NAME$15]:ye,[RULE_NAME$14]:Oe,[RULE_NAME$13]:Se,[RULE_NAME$12]:De,[RULE_NAME$11]:He,[RULE_NAME$10]:qe,[RULE_NAME$$]:Fe,[RULE_NAME$_]:Ve,[RULE_NAME$Z]:Pe,[RULE_NAME$Y]:Ge,[RULE_NAME$X]:je,[RULE_NAME$W]:We,[RULE_NAME$S]:Je,[RULE_NAME$R]:Qe,[RULE_NAME$Q]:Xe,[RULE_NAME$P]:Ye,[RULE_NAME$O]:Ze,[RULE_NAME$N]:er,[RULE_NAME$M]:rr,[RULE_NAME$L]:or,[RULE_NAME$K]:ar,[RULE_NAME$J]:tr,[RULE_NAME$I]:nr,[RULE_NAME$V]:Ke,[RULE_NAME$H]:sr,[RULE_NAME$G]:ir,[RULE_NAME$F]:mr,[RULE_NAME$C]:fr,[RULE_NAME$E]:pr,[RULE_NAME$D]:Er,[RULE_NAME$B]:lr,[RULE_NAME$A]:Nr,[RULE_NAME$z]:cr,[RULE_NAME$y]:dr,[RULE_NAME$x]:Ar,[RULE_NAME$w]:Mr,[RULE_NAME$v]:wr,[RULE_NAME$n]:hr,[RULE_NAME$u]:Rr,[RULE_NAME$t]:Lr,[RULE_NAME$s]:ur,[RULE_NAME$r]:Ur,[RULE_NAME$q]:_r,[RULE_NAME$p]:Tr,[RULE_NAME$o]:br,[RULE_NAME$m]:gr,[RULE_NAME$l]:kr,[RULE_NAME$k]:xr,[RULE_NAME$j]:Cr,[RULE_NAME$i]:vr,[RULE_NAME$h]:Br,[RULE_NAME$g]:Ir,[RULE_NAME$f]:yr,[RULE_NAME$9]:Or,[RULE_NAME$e]:Sr,[RULE_NAME$d]:Dr,[RULE_NAME$c]:Hr,[RULE_NAME$b]:qr,[RULE_NAME$a]:Fr,[RULE_NAME$8]:Vr,[RULE_NAME$7]:Pr,[RULE_NAME$6]:Gr,[RULE_NAME$U]:$e,[RULE_NAME$T]:ze,[RULE_NAME$5]:jr,[RULE_NAME$4]:Wr,[RULE_NAME$3]:Kr,[RULE_NAME$2]:$r,[RULE_NAME$1]:Jr,[RULE_NAME]:Qr},l={meta:{name:"vitest",version},rules:Xr,environments:{env:{globals:{suite:!0,test:!0,describe:!0,it:!0,expectTypeOf:!0,assertType:!0,expect:!0,assert:!0,chai:!0,vitest:!0,vi:!0,beforeAll:!0,afterAll:!0,beforeEach:!0,afterEach:!0,onTestFailed:!0,onTestFinished:!0}}},configs:{"legacy-recommended":be(ge),"legacy-all":be(he),recommended:{name:"vitest/recommended",plugins:{get vitest(){return l}},rules:Te(ge)},all:{name:"vitest/all",plugins:{get vitest(){return l}},rules:Te(he)},env:{name:"vitest/env",languageOptions:{globals:{suite:"writable",test:"writable",describe:"writable",it:"writable",expectTypeOf:"writable",assertType:"writable",expect:"writable",assert:"writable",chai:"writable",vitest:"writable",vi:"writable",beforeAll:"writable",afterAll:"writable",beforeEach:"writable",afterEach:"writable",onTestFailed:"writable",onTestFinished:"writable"}}}}};module.exports=l;
8
+ `;return F.insertTextAfter(W,V)}})},m$2={0:()=>!0,1:x$1},y$1=()=>{let b=null;return{get prevNode(){return b.prevNode},set prevNode(Y){b.prevNode=Y},enter(){b={upper:b,prevNode:null}},exit(){b=b.upper}}},i=b=>(Y,q)=>{let $=Y;if($.type===utils.AST_NODE_TYPES.ExpressionStatement){$.expression.type===utils.AST_NODE_TYPES.AwaitExpression&&($=$.expression.argument);const B=q.getFirstToken($);return B?.type===utils.AST_TOKEN_TYPES.Identifier&&B.value===b}return!1},A={0:()=>!0,1:i("afterAll"),2:i("afterEach"),3:i("beforeAll"),4:i("beforeEach"),5:i("describe"),6:i("expect"),7:i("expectTypeOf"),8:i("fdescribe"),9:i("fit"),10:i("it"),11:i("test"),12:i("xdescribe"),13:i("xit"),14:i("xtest")},l$1=(b,Y,q)=>{let $=b;const{sourceCode:B}=q;for(;$.type===utils.AST_NODE_TYPES.LabeledStatement;)$=$.body;return Array.isArray(Y)?Y.some(F=>l$1($,F,q)):A[Y]($,B)},N$1=(b,Y,q)=>{const{configs:$}=q,B=F=>m$2[F](b,Y,q);for(let F=$.length-1;F>=0;--F){const{prevStatementType:W,nextStatementType:H,paddingType:V}=$[F];if(l$1(b,W,q)&&l$1(Y,H,q))return B(V)}return B(0)},u=(b,Y)=>{const{scopeInfo:q}=Y;isValidParent(b?.parent.type)&&(q.prevNode&&N$1(q.prevNode,b,Y),q.prevNode=b)},createPaddingRule=(b,Y,q,$=!1)=>createEslintRule({name:b,meta:{docs:{description:Y},fixable:"whitespace",deprecated:$,messages:{missingPadding:"expect blank line before this statement"},schema:[],type:"suggestion"},defaultOptions:[],create(B){const F={ruleContext:B,sourceCode:B.sourceCode??B.getSourceCode(),scopeInfo:y$1(),configs:q},{scopeInfo:W}=F;return{Program:W.enter,"Program:exit":W.exit,BlockStatement:W.enter,"BlockStatement:exit":W.exit,SwitchStatement:W.enter,"SwitchStatement:exit":W.exit,":statement":H=>u(H,F),SwitchCase(H){u(H,F),W.enter()},"SwitchCase:exit":W.exit}}}),RULE_NAME$g="padding-around-after-all-blocks",config$6=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.AfterAllToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.AfterAllToken,nextStatementType:StatementType.Any}],Ir=createPaddingRule(RULE_NAME$g,"Enforce padding around `afterAll` blocks",config$6),RULE_NAME$f="padding-around-after-each-blocks",config$5=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.AfterEachToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.AfterEachToken,nextStatementType:StatementType.Any}],yr=createPaddingRule(RULE_NAME$f,"Enforce padding around `afterEach` blocks",config$5),RULE_NAME$e="padding-around-before-all-blocks",config$4=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.BeforeAllToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.BeforeAllToken,nextStatementType:StatementType.Any}],Sr=createPaddingRule(RULE_NAME$e,"Enforce padding around `beforeAll` blocks",config$4),RULE_NAME$d="padding-around-before-each-blocks",config$3=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.BeforeEachToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.BeforeEachToken,nextStatementType:StatementType.Any}],Dr=createPaddingRule(RULE_NAME$d,"Enforce padding around `beforeEach` blocks",config$3),RULE_NAME$c="padding-around-describe-blocks",config$2=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:[StatementType.DescribeToken,StatementType.FdescribeToken,StatementType.XdescribeToken]},{paddingType:PaddingType.Always,prevStatementType:[StatementType.DescribeToken,StatementType.FdescribeToken,StatementType.XdescribeToken],nextStatementType:StatementType.Any}],Hr=createPaddingRule(RULE_NAME$c,"Enforce padding around `describe` blocks",config$2),RULE_NAME$b="padding-around-expect-groups",config$1=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.ExpectToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.ExpectToken,nextStatementType:StatementType.Any},{paddingType:PaddingType.Any,prevStatementType:StatementType.ExpectToken,nextStatementType:StatementType.ExpectToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:StatementType.ExpectTypeOfToken},{paddingType:PaddingType.Always,prevStatementType:StatementType.ExpectTypeOfToken,nextStatementType:StatementType.Any},{paddingType:PaddingType.Any,prevStatementType:StatementType.ExpectTypeOfToken,nextStatementType:StatementType.ExpectTypeOfToken}],qr=createPaddingRule(RULE_NAME$b,"Enforce padding around `expect` groups",config$1),RULE_NAME$a="padding-around-test-blocks",config=[{paddingType:PaddingType.Always,prevStatementType:StatementType.Any,nextStatementType:[StatementType.TestToken,StatementType.ItToken,StatementType.FitToken,StatementType.XitToken,StatementType.XtestToken]},{paddingType:PaddingType.Always,prevStatementType:[StatementType.TestToken,StatementType.ItToken,StatementType.FitToken,StatementType.XitToken,StatementType.XtestToken],nextStatementType:StatementType.Any}],Fr=createPaddingRule(RULE_NAME$a,"Enforce padding around `test` blocks",config),RULE_NAME$9="padding-around-all",Or=createPaddingRule(RULE_NAME$9,"Enforce padding around vitest functions",[...config$6,...config$5,...config$4,...config$3,...config$2,...config$1,...config]),RULE_NAME$8="valid-expect-in-promise",w=["toRejectWith","toResolveWith"],c=b=>{if(b.type===utils.AST_NODE_TYPES.CallExpression&&b.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(b.callee.property)){if(b.arguments.length===0)return!1;switch(getAccessorValue(b.callee.property)){case"then":return b.arguments.length<3;case"catch":case"finally":return b.arguments.length<2}}return!1},k=(b,Y)=>{const q=parseVitestFnCall(b,Y);if(q?.type!=="test")return!1;const $=q.members.some(W=>getAccessorValue(W)==="each");if($&&b.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression)return!0;const[,B]=b.arguments,F=Number($);return B&&isFunction(B)&&B.params.length===1+F},x=(b,Y)=>{const{name:q}=Y;if(b.argument===null)return!1;if(b.argument.type===utils.AST_NODE_TYPES.CallExpression&&b.argument.arguments.length>0){const $=getNodeName(b.argument);if(["Promise.all","Promise.allSettled"].includes($)){const[B]=b.argument.arguments;if(B.type===utils.AST_NODE_TYPES.ArrayExpression&&B.elements.some(F=>F&&isIdentifier(F,q)))return!0}if(["Promise.resolve","Promise.reject"].includes($)&&b.argument.arguments.length===1)return isIdentifier(b.argument.arguments[0],q)}return isIdentifier(b.argument,q)},h=(b,Y)=>{for(const q of Y)if(q?.type===utils.AST_NODE_TYPES.AwaitExpression&&isIdentifier(q.argument,b)||q?.type===utils.AST_NODE_TYPES.ArrayExpression&&h(b,q.elements))return!0;return!1},M=(b,Y)=>{let q=Y;for(;q;){if(q.type===utils.AST_NODE_TYPES.CallExpression){if(h(b,q.arguments))return!0;q=q.callee}if(q.type!==utils.AST_NODE_TYPES.MemberExpression)break;q=q.object}return!1},N=b=>{let Y=b,q=b;for(;q&&(q.type===utils.AST_NODE_TYPES.CallExpression&&(Y=q,q=q.callee),q.type===utils.AST_NODE_TYPES.MemberExpression);)q=q.object;return Y},m$1=(b,Y,q)=>{const{name:$}=b;for(const B of Y)if(!(B.range[0]<=b.range[0])){if(B.type===utils.AST_NODE_TYPES.ReturnStatement)return x(B,b);if(B.type===utils.AST_NODE_TYPES.ExpressionStatement){if(B.expression.type===utils.AST_NODE_TYPES.CallExpression){if(M($,B.expression))return!0;const F=N(B.expression),W=parseVitestFnCall(B.expression,q);if(W?.type==="expect"&&F.arguments.length>0&&isIdentifier(F.arguments[0],$)&&W.members.some(H=>{const V=getAccessorValue(H);return V===ModifierName.resolves||V===ModifierName.rejects}))return!0}if(B.expression.type===utils.AST_NODE_TYPES.AwaitExpression&&x(B.expression,b))return!0;if(B.expression.type===utils.AST_NODE_TYPES.AssignmentExpression){if(isIdentifier(B.expression.left,$)&&getNodeName(B.expression.right)?.startsWith(`${$}.`)&&c(B.expression.right))continue;break}}if(B.type===utils.AST_NODE_TYPES.BlockStatement&&m$1(b,B.body,q))return!0}return!1},y=b=>{let Y=b;for(;Y;){if(Y.type===utils.AST_NODE_TYPES.BlockStatement)return Y.body;Y=Y.parent}throw new Error("Could not find BlockStatement - please file a github issue at https://github.com/vitest-dev/eslint-plugin-vitest")},I=(b,Y)=>{let q=b;for(;q;){if(isFunction(q))return q=q.parent,q?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(q,Y,["test"]);q=q.parent}return!1},P=(b,Y)=>{const q=y(b);return isIdentifier(b.id)?m$1(b.id,q,Y):!0},Vr=createEslintRule({name:RULE_NAME$8,meta:{docs:{description:"require promises that have expectations in their chain to be valid"},messages:{expectInFloatingPromise:"This promise should either be returned or awaited to ensure the expects in its chain are called"},type:"suggestion",schema:[]},defaultOptions:[{alwaysAwait:!1,asyncMatchers:w,minArgs:1,maxArgs:1}],create(b){let Y=!1;const q=[];return{CallExpression($){if(k($,b)){Y=!0;return}if(c($)){q.unshift(!1);return}q.length>0&&isTypeOfVitestFnCall($,b,["expect"])&&(q[0]=!0)},"CallExpression:exit"($){if(Y){isTypeOfVitestFnCall($,b,["test"])&&(Y=!1);return}if(!c($)||!q.shift())return;const{parent:B}=findTopMostCallExpression($);if(!(!B||!I(B,b))){switch(B.type){case utils.AST_NODE_TYPES.VariableDeclarator:{if(P(B,b))return;break}case utils.AST_NODE_TYPES.AssignmentExpression:{if(B.left.type===utils.AST_NODE_TYPES.Identifier&&m$1(B.left,y(B),b))return;break}case utils.AST_NODE_TYPES.ExpressionStatement:break;case utils.AST_NODE_TYPES.ReturnStatement:case utils.AST_NODE_TYPES.AwaitExpression:default:return}b.report({messageId:"expectInFloatingPromise",node:B})}}}}}),RULE_NAME$7="prefer-strict-boolean-matchers",Pr=createEslintRule({name:RULE_NAME$7,meta:{type:"suggestion",docs:{description:"enforce using `toBe(true)` and `toBe(false)` over matchers that coerce types to boolean",recommended:!1},messages:{preferToBeTrue:"Prefer using `toBe(true)` to test value is `true`",preferToBeFalse:"Prefer using `toBe(false)` to test value is `false`"},fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(!(q?.type==="expect"||q?.type==="expectTypeOf"))return;const $=getAccessorValue(q.matcher);$==="toBeFalsy"&&b.report({node:q.matcher,messageId:"preferToBeFalse",fix:B=>[B.replaceText(q.matcher,"toBe"),B.insertTextAfterRange([q.matcher.range[0],q.matcher.range[1]+1],"false")]}),$==="toBeTruthy"&&b.report({node:q.matcher,messageId:"preferToBeTrue",fix:B=>[B.replaceText(q.matcher,"toBe"),B.insertTextAfterRange([q.matcher.range[0],q.matcher.range[1]+1],"true")]})}}}}),RULE_NAME$6="require-mock-type-parameters",Gr=createEslintRule({name:RULE_NAME$6,meta:{type:"suggestion",docs:{description:"enforce using type parameters with vitest mock functions",recommended:!1},messages:{noTypeParameter:"Missing type parameters"},fixable:"code",schema:[{type:"object",properties:{checkImportFunctions:{type:"boolean"}},additionalProperties:!1}]},defaultOptions:[{checkImportFunctions:!1}],create(b,[Y]){return{CallExpression(q){const $=parseVitestFnCall(q,b);if($?.type==="vi")for(const B of $?.members)!("name"in B)||B.parent.parent.typeArguments!==void 0||(B.name==="fn"&&b.report({node:B,messageId:"noTypeParameter"}),Y.checkImportFunctions&&["importActual","importMock"].includes(B.name)&&b.report({node:B,messageId:"noTypeParameter"}))}}}}),RULE_NAME$5="prefer-called-once",m=b=>b.type===utils.AST_NODE_TYPES.Literal&&b.value===1,jr=createEslintRule({name:RULE_NAME$5,meta:{docs:{description:"enforce using `toBeCalledOnce()` or `toHaveBeenCalledOnce()`",recommended:!1},messages:{preferCalledOnce:"Prefer {{ replacedMatcherName }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{matcher:$}=q,B=getAccessorValue($);if(["toBeCalledTimes","toHaveBeenCalledTimes"].includes(B)&&q.args.length===1&&m(getFirstMatcherArg(q))){const F=B.replace("Times","Once");b.report({data:{replacedMatcherName:F},messageId:"preferCalledOnce",node:$,fix:W=>[W.replaceText($,F),W.remove(q.args[0])]})}}}}}),RULE_NAME$4="prefer-called-times",Wr=createEslintRule({name:RULE_NAME$4,meta:{docs:{description:"enforce using `toBeCalledTimes(1)` or `toHaveBeenCalledTimes(1)`",recommended:!1},messages:{preferCalledTimes:"Prefer {{ replacedMatcherName }}(1)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect")return;const{matcher:$}=q,B=getAccessorValue($);if(["toBeCalledOnce","toHaveBeenCalledOnce"].includes(B)){const F=B.replace("Once","Times");b.report({data:{replacedMatcherName:F},messageId:"preferCalledTimes",node:$,fix:W=>[W.replaceText($,F),W.insertTextAfterRange([q.matcher.range[0],q.matcher.range[1]+1],"1")]})}}}}}),RULE_NAME$3="prefer-expect-type-of",g={string:"toBeString",number:"toBeNumber",boolean:"toBeBoolean",object:"toBeObject",function:"toBeFunction",symbol:"toBeSymbol",bigint:"toBeBigInt",undefined:"toBeUndefined"},Kr=createEslintRule({name:RULE_NAME$3,meta:{type:"suggestion",docs:{description:"enforce using `expectTypeOf` instead of `expect(typeof ...)`",recommended:!1},schema:[],fixable:"code",messages:{preferExpectTypeOf:'Use `expectTypeOf({{ value }}).{{ matcher }}()` instead of `expect(typeof {{ value }}).toBe("{{ type }}")`'}},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.head.node.parent?.type!==utils.AST_NODE_TYPES.CallExpression)return;const $=q.head.node.parent,[B]=$.arguments;if(!B||B.type!==utils.AST_NODE_TYPES.UnaryExpression||B.operator!=="typeof")return;const F=getAccessorValue(q.matcher);if(F!=="toBe"&&F!=="toEqual")return;const[W]=q.args;if(!W||W.type!==utils.AST_NODE_TYPES.Literal||typeof W.value!="string")return;const H=W.value,V=g[H];if(!V)return;const X=b.sourceCode.getText(B.argument),z=q.modifiers.map(ee=>getAccessorValue(ee)).join("."),G=z?`.${z}`:"";b.report({node:Y,messageId:"preferExpectTypeOf",data:{value:X,matcher:V,type:H},fix(ee){return ee.replaceText(Y,`expectTypeOf(${X})${G}.${V}()`)}})}}}}),RULE_NAME$2="warn-todo",$r=createEslintRule({name:RULE_NAME$2,meta:{docs:{description:"disallow `.todo` usage",recommended:!1},messages:{warnTodo:"The use of `.todo` is not recommended."},type:"suggestion",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="describe"&&q?.type!=="test"&&q?.type!=="it")return;const $=q.members.find(B=>B.type==="Identifier"&&B.name==="todo");$&&b.report({messageId:"warnTodo",node:$})}}}}),RULE_NAME$1="prefer-import-in-mock",Jr=createEslintRule({name:RULE_NAME$1,meta:{fixable:"code",type:"suggestion",docs:{description:"prefer dynamic import in mock"},messages:{preferImport:"Replace '{{path}}' with import('{{path}}')"},schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){if(Y.callee.type!==utils.AST_NODE_TYPES.MemberExpression)return;const{object:q,property:$}=Y.callee;if(q.type!==utils.AST_NODE_TYPES.Identifier||q.name!=="vi"||$.type!==utils.AST_NODE_TYPES.Identifier)return;const B=$.name,F=Y.arguments[0];B==="mock"&&F&&F.type===utils.AST_NODE_TYPES.Literal&&b.report({messageId:"preferImport",data:{path:F.value},node:Y,fix(W){return W.replaceText(F,`import('${F.value}')`)}})}}}}),RULE_NAME="prefer-called-exactly-once-with",Qr=createEslintRule({name:RULE_NAME,meta:{docs:{description:"Prefer `toHaveBeenCalledExactlyOnceWith` over `toHaveBeenCalledOnce` and `toHaveBeenCalledWith`"},messages:{preferCalledExactlyOnceWith:"Prefer {{matcherName}} (/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(b){return{CallExpression(Y){const q=parseVitestFnCall(Y,b);if(q?.type!=="expect"||q.modifiers.some(F=>getAccessorValue(F)==="not"))return;const{matcher:$}=q,B=getAccessorValue($);["toHaveBeenCalledOnce","toHaveBeenCalledWith"].includes(B)&&b.report({data:{matcherName:B},messageId:"preferCalledExactlyOnceWith",node:$,fix:F=>[F.replaceText($,"toHaveBeenCalledExactlyOnceWith")]})}}}}),Te=b=>Object.keys(b).reduce((Y,q)=>({...Y,[`vitest/${q}`]:b[q]}),{}),be=b=>({plugins:["@vitest"],rules:Object.keys(b).reduce((Y,q)=>({...Y,[`@vitest/${q}`]:b[q]}),{})}),he={[RULE_NAME$1a]:"warn",[RULE_NAME$19]:"warn",[RULE_NAME$17]:"warn",[RULE_NAME$16]:"warn",[RULE_NAME$13]:"warn",[RULE_NAME$12]:"warn",[RULE_NAME$10]:"warn",[RULE_NAME$$]:"warn",[RULE_NAME$_]:"warn",[RULE_NAME$Z]:"warn",[RULE_NAME$Y]:"warn",[RULE_NAME$W]:"warn",[RULE_NAME$S]:"warn",[RULE_NAME$R]:"warn",[RULE_NAME$Q]:"warn",[RULE_NAME$P]:"warn",[RULE_NAME$O]:"warn",[RULE_NAME$N]:"warn",[RULE_NAME$M]:"warn",[RULE_NAME$L]:"warn",[RULE_NAME$K]:"warn",[RULE_NAME$J]:"warn",[RULE_NAME$I]:"warn",[RULE_NAME$H]:"warn",[RULE_NAME$C]:"off",[RULE_NAME$E]:"warn",[RULE_NAME$D]:"off",[RULE_NAME$B]:"warn",[RULE_NAME$A]:"warn",[RULE_NAME$z]:"warn",[RULE_NAME$y]:"warn",[RULE_NAME$x]:"warn",[RULE_NAME$w]:"warn",[RULE_NAME$v]:"warn",[RULE_NAME$u]:"warn",[RULE_NAME$t]:"warn",[RULE_NAME$s]:"warn",[RULE_NAME$q]:"warn",[RULE_NAME$p]:"warn",[RULE_NAME$o]:"warn",[RULE_NAME$m]:"warn",[RULE_NAME$l]:"warn",[RULE_NAME$k]:"warn",[RULE_NAME$j]:"warn",[RULE_NAME$i]:"warn",[RULE_NAME$h]:"warn",[RULE_NAME$11]:"warn",[RULE_NAME$g]:"warn",[RULE_NAME$f]:"warn",[RULE_NAME$9]:"warn",[RULE_NAME$e]:"warn",[RULE_NAME$d]:"warn",[RULE_NAME$c]:"warn",[RULE_NAME$b]:"warn",[RULE_NAME$a]:"warn",[RULE_NAME$8]:"warn",[RULE_NAME$15]:"warn",[RULE_NAME$18]:"warn",[RULE_NAME$X]:"warn",[RULE_NAME$G]:"warn",[RULE_NAME$F]:"warn",[RULE_NAME$r]:"warn",[RULE_NAME$n]:"warn",[RULE_NAME$V]:"warn",[RULE_NAME$7]:"warn",[RULE_NAME$6]:"warn",[RULE_NAME$U]:"off",[RULE_NAME$T]:"warn",[RULE_NAME$5]:"off",[RULE_NAME$4]:"warn",[RULE_NAME$3]:"warn",[RULE_NAME$14]:"warn",[RULE_NAME$1]:"warn",[RULE_NAME]:"warn"},ge={[RULE_NAME$15]:"error",[RULE_NAME$18]:"error",[RULE_NAME$X]:"error",[RULE_NAME$G]:"error",[RULE_NAME$F]:"error",[RULE_NAME$r]:"error",[RULE_NAME$n]:"error",[RULE_NAME$V]:"error",[RULE_NAME]:"error"},Xr={[RULE_NAME$1a]:xe,[RULE_NAME$19]:Ce,[RULE_NAME$18]:ve,[RULE_NAME$17]:Be,[RULE_NAME$16]:Ie,[RULE_NAME$15]:ye,[RULE_NAME$14]:Oe,[RULE_NAME$13]:Se,[RULE_NAME$12]:De,[RULE_NAME$11]:He,[RULE_NAME$10]:qe,[RULE_NAME$$]:Fe,[RULE_NAME$_]:Ve,[RULE_NAME$Z]:Pe,[RULE_NAME$Y]:Ge,[RULE_NAME$X]:je,[RULE_NAME$W]:We,[RULE_NAME$S]:Je,[RULE_NAME$R]:Qe,[RULE_NAME$Q]:Xe,[RULE_NAME$P]:Ye,[RULE_NAME$O]:Ze,[RULE_NAME$N]:er,[RULE_NAME$M]:rr,[RULE_NAME$L]:or,[RULE_NAME$K]:ar,[RULE_NAME$J]:tr,[RULE_NAME$I]:nr,[RULE_NAME$V]:Ke,[RULE_NAME$H]:sr,[RULE_NAME$G]:ir,[RULE_NAME$F]:mr,[RULE_NAME$C]:fr,[RULE_NAME$E]:pr,[RULE_NAME$D]:Er,[RULE_NAME$B]:lr,[RULE_NAME$A]:Nr,[RULE_NAME$z]:cr,[RULE_NAME$y]:dr,[RULE_NAME$x]:Ar,[RULE_NAME$w]:Mr,[RULE_NAME$v]:wr,[RULE_NAME$n]:hr,[RULE_NAME$u]:Rr,[RULE_NAME$t]:Lr,[RULE_NAME$s]:ur,[RULE_NAME$r]:Ur,[RULE_NAME$q]:_r,[RULE_NAME$p]:Tr,[RULE_NAME$o]:br,[RULE_NAME$m]:gr,[RULE_NAME$l]:kr,[RULE_NAME$k]:xr,[RULE_NAME$j]:Cr,[RULE_NAME$i]:vr,[RULE_NAME$h]:Br,[RULE_NAME$g]:Ir,[RULE_NAME$f]:yr,[RULE_NAME$9]:Or,[RULE_NAME$e]:Sr,[RULE_NAME$d]:Dr,[RULE_NAME$c]:Hr,[RULE_NAME$b]:qr,[RULE_NAME$a]:Fr,[RULE_NAME$8]:Vr,[RULE_NAME$7]:Pr,[RULE_NAME$6]:Gr,[RULE_NAME$U]:$e,[RULE_NAME$T]:ze,[RULE_NAME$5]:jr,[RULE_NAME$4]:Wr,[RULE_NAME$3]:Kr,[RULE_NAME$2]:$r,[RULE_NAME$1]:Jr,[RULE_NAME]:Qr},l={meta:{name:"vitest",version},rules:Xr,environments:{env:{globals:{suite:!0,test:!0,describe:!0,it:!0,expectTypeOf:!0,assertType:!0,expect:!0,assert:!0,chai:!0,vitest:!0,vi:!0,beforeAll:!0,afterAll:!0,beforeEach:!0,afterEach:!0,onTestFailed:!0,onTestFinished:!0}}},configs:{"legacy-recommended":be(ge),"legacy-all":be(he),recommended:{name:"vitest/recommended",plugins:{get vitest(){return l}},rules:Te(ge)},all:{name:"vitest/all",plugins:{get vitest(){return l}},rules:Te(he)},env:{name:"vitest/env",languageOptions:{globals:{suite:"writable",test:"writable",describe:"writable",it:"writable",expectTypeOf:"writable",assertType:"writable",expect:"writable",assert:"writable",chai:"writable",vitest:"writable",vi:"writable",beforeAll:"writable",afterAll:"writable",beforeEach:"writable",afterEach:"writable",onTestFailed:"writable",onTestFinished:"writable"}}}}};module.exports=l;
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
- import{ESLintUtils as ce,AST_NODE_TYPES as i,AST_TOKEN_TYPES as Nt}from"@typescript-eslint/utils";import j from"typescript";import{isAbsolute as Ds,posix as Ws}from"node:path";import{createRequire as Bt}from"node:module";import{DefinitionType as Lt}from"@typescript-eslint/scope-manager";const Hs="1.3.15",p=ce.RuleCreator(e=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${e}.md`),Vs=(e,s)=>e&&s?`${e}.${s}`:null,M=e=>e.type===i.FunctionExpression||e.type===i.ArrowFunctionExpression;function O(e){if(v(e))return m(e);switch(e.type){case i.TaggedTemplateExpression:return O(e.tag);case i.MemberExpression:return Vs(O(e.object),O(e.property));case i.NewExpression:case i.CallExpression:return O(e.callee)}return null}const v=(e,s)=>N(e,s)||B(e,s),N=(e,s)=>e.type===i.Identifier&&(s===void 0||e.name===s),Ks=(e,s)=>e.type===i.TemplateLiteral&&e.quasis.length===1&&(s===void 0||e.quasis[0].value.raw===s),Gs=(e,s)=>e.type===i.Literal&&typeof e.value=="string"&&(s===void 0||e.value===s),B=(e,s)=>Gs(e,s)||Ks(e,s),m=e=>e.type===i.Identifier?e.name:W(e),W=e=>e?.type===i.TemplateLiteral?e.quasis[0].value.raw:e?.value,X=(e,s,t)=>e.replaceText(s,s.type===i.Identifier?t:`'${t}'`),Ft=(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]])},Xs=(e,s)=>m(e.matcher)==="toBeInstanceOf"&&e.args.length===1&&v(e.args[0],s);var _=(e=>(e.vi="vi",e.vitest="vitest",e))(_||{}),H=(e=>(e.describe="describe",e.fdescribe="fdescribe",e.xdescribe="xdescribe",e))(H||{}),I=(e=>(e.fit="fit",e.it="it",e.test="test",e.xit="xit",e.xtest="xtest",e.bench="bench",e))(I||{}),Pt=(e=>(e.beforeAll="beforeAll",e.beforeEach="beforeEach",e.afterAll="afterAll",e.afterEach="afterEach",e))(Pt||{}),R=(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))(R||{}),L=(e=>(e.toBe="toBe",e.toEqual="toEqual",e.toStrictEqual="toStrictEqual",e))(L||{});function Ut(e){return e.getCallSignatures().length>0?!0:e.getSymbol()?.getDeclarations()?.some(s=>j.isArrowFunction(s)||j.isClassDeclaration(s)||j.isClassExpression(s)||j.isFunctionDeclaration(s)||j.isFunctionExpression(s)||j.isMethodDeclaration(s)||j.isFunctionTypeNode(s))??!1}const zs=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 le(e,s){return e.sourceCode.getScope?e.sourceCode.getScope(s):e.getScope()}function Ys(e,s){let t=le(e,s);for(;t;){if(t.type==="module")return t;t=t.upper}return t}const q=(e,s,t)=>{const n=h(e,s);return n!==null&&t.includes(n.type)},h=(e,s)=>{const t=_t(e,s);return typeof t=="string"?null:t},jt=new WeakMap,_t=(e,s)=>{let t=jt.get(e);return t||(t=en(e,s),jt.set(e,t),t)},Js=e=>e==="expect"?"expect":e==="expectTypeOf"?"expectTypeOf":e==="vi"?"vi":e==="vitest"?"vitest":H.hasOwnProperty(e)?"describe":I.hasOwnProperty(e)?"test":Pt.hasOwnProperty(e)?"hook":"unknown",Qs=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=m(t);if(s.length===0){if(!R.hasOwnProperty(n))return"modifier-unknown"}else if(s.length===1){if(n!==R.not&&n!=R.have)return"modifier-unknown";const r=m(s[0]);if(r!==R.resolves&&r!==R.rejects&&r!==R.to)return"modifier-unknown"}else return"modifier-unknown";s.push(t)}return"matcher-not-found"},Zs=(e,s)=>{const t=Qs(e.members);return typeof t=="string"?t:{...e,type:s,...t}},Dt=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},en=(e,s)=>{const t=V(e);if(!t?.length)return null;const[n,...r]=t,o=m(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=sn(s,e,m(n));if(!a)return null;const c=a.original??a.local,l=[c,...r.map(m)];if(a.type!=="testContext"&&c!=="vi"&&c!=="vitest"&&c!=="expect"&&c!=="expectTypeOf"&&!zs.has(l.join(".")))return null;const d={name:c,head:{...a,node:n},members:r},f=Js(c);if(f==="expect"||f==="expectTypeOf"){const u=Zs(d,f);return typeof u=="string"&&Dt(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}},tn=(e,s)=>e&&s?[...e,...s]:null;function V(e){if(v(e))return[e];switch(e.type){case i.TaggedTemplateExpression:return V(e.tag);case i.MemberExpression:return tn(V(e.object),V(e.property));case i.CallExpression:return V(e.callee)}return null}const sn=(e,s,t)=>{const n=le(e,s),r=Wt(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:nn(t,e),local:t,type:"global"}},nn=(e,s)=>{const t=s.settings.vitest?.globalAliases??{},n=Object.entries(t).find(([r,o])=>o.includes(e));return n?n[0]:null},rn=({parent:e})=>e?.type===i.CallExpression&&e.callee.type===i.Identifier&&I.hasOwnProperty(e.callee.name),Wt=(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"}if(r.node.type===i.VariableDeclarator&&r.node.id.type===i.Identifier&&I.hasOwnProperty(r.node.id.name)&&r.node.init?.type===i.CallExpression&&r.node.init.callee.type===i.MemberExpression&&N(r.node.init.callee.property,"extend"))return"testContext";const a=M(r.node)?r.node.params.find(l=>l.type===i.Identifier):void 0;if(a&&rn(a.parent))return"testContext";const c=cn(r);return c?.local===s?c:"local"}t=t.upper}return null},on=e=>e.type===i.AwaitExpression?e.argument.type===i.ImportExpression?e.argument.source:null:e.type===i.CallExpression&&N(e.callee,"require")?e.arguments[0]??null:null,an=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},cn=e=>e.type==="Variable"?ln(e):e.type==="ImportBinding"?an(e):null,ln=e=>{if(!e.node.init)return null;const s=on(e.node.init);return!s||!B(s)||e.name.parent?.type!==i.Property||!v(e.name.parent.key)?null:{source:W(s),imported:m(e.name.parent.key),local:e.name.name}},ue=(e,s)=>e.reduce((t,{references:n})=>t.concat(n.map(({identifier:r})=>r.parent).filter(r=>r?.type===i.CallExpression&&q(r,s,["test"]))),[]),P=e=>{const[s]=e.args;return s.type===i.SpreadElement?s:pe(s)},un=e=>e.type===i.TSAsExpression||e.type===i.TSTypeAssertion,pe=e=>un(e)?pe(e.expression):e,de="prefer-lowercase-title",pn=e=>e.arguments[0]&&B(e.arguments[0]),dn=e=>{const s=[];return e.includes(H.describe)&&s.push(...Object.keys(H)),e.includes(I.test)&&s.push(...Object.keys(I).filter(t=>t.endsWith(I.test))),e.includes(I.it)&&s.push(...Object.keys(I).filter(t=>t.endsWith(I.it))),s},fn=p({name:de,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:[H.describe,I.test,I.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=dn(s);let a=0;return{CallExpression(c){const l=h(c,e);if(!l||!pn)return;if(l?.type==="describe"){if(a++,n&&a===1)return}else if(l?.type!=="test")return;const[d]=c.arguments,f=W(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 y=W(d),T=[d.range[0]+1,d.range[1]-1],k=r?y.substring(0,1).toLowerCase()+y.substring(1):y.toLowerCase();return[x.replaceTextRange(T,k)]}})},"CallExpression:exit"(c){q(c,e,["describe"])&&a--}}}}),fe="max-nested-describe",mn=p({name:fe,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}}}),z="no-identical-title",Ht=()=>({describeTitles:[],testTitles:[]}),yn=p({name:z,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=[Ht()];return{CallExpression(t){const n=s[s.length-1],r=h(t,e);if(!r||((r.name==="describe"||r.name==="suite")&&s.push(Ht()),r.members.find(c=>v(c,"each"))))return;const[o]=t.arguments;if(!o||!B(o))return;const a=W(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){q(t,e,["describe"])&&s.pop()}}}}),me="no-focused-tests",ye=e=>e.type==="Identifier"&&["it","test","describe"].includes(e.name),he=e=>e.type==="Identifier"&&e.name==="only",hn=p({name:me,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"&&ye(n.object)&&he(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"&&ye(r.object)&&he(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"&&ye(n.object.object)&&he(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})}}}}}}),ge="no-conditional-tests",gn=p({name:ge,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"})}}}}),kn={typecheck:!1};function Y(e){const s=typeof e.vitest!="object"||e.vitest===null?{}:e.vitest;return{...kn,...s}}const J="expect-expect",bn=p({name:J,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=[];Y(e.settings).typecheck&&s.push("expectTypeOf","assertType");const r=s.map(xn);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=ue(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=O(a)??"";if(q(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 xn(e){const s=e.split(".").map(t=>t==="**"?"[_a-z\\d\\.]*":t.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${s.join("\\.")}(\\.|$)`,"ui")}const ke="hoisted-apis-on-top",In=["mock","hoisted","unmock"],En=p({name:ke,meta:{hasSuggestions:!0,type:"suggestion",docs:{description:"enforce hoisted APIs to be on top of the file"},messages:{hoistedApisOnTop:"Hoisted API is used in a runtime location in this file, but it is actually executed before this file is loaded.",suggestMoveHoistedApiToTop:"Move this hoisted API to the top of the file to better reflect its behavior.",suggestReplaceMockWithDoMock:"Replace 'vi.mock()' with 'vi.doMock()', which is not hoisted."},schema:[]},defaultOptions:[],create(e){let s=null;const t=[];return{ImportDeclaration(n){n.parent.type===i.Program&&(s=n.range[1])},CallExpression(n){if(n.callee.type!==i.MemberExpression)return;const{object:r,property:o}=n.callee;if(r.type!==i.Identifier||r.name!=="vi"||o.type!==i.Identifier)return;const a=o.name;if(In.includes(a)){if(a==="hoisted"){let c=n.parent;if(c?.type===i.AwaitExpression&&(c=c.parent),c?.type===i.VariableDeclarator&&(c=c.parent),(c?.type===i.ExpressionStatement||c?.type===i.VariableDeclaration)&&c.parent?.type===i.Program)return}else if(n.parent?.type===i.ExpressionStatement&&n.parent.parent?.type===i.Program)return;t.push(n)}},"Program:exit"(){for(const n of t){const r=[];r.push({messageId:"suggestMoveHoistedApiToTop",*fix(a){n.parent.type===i.ExpressionStatement?yield a.remove(n):yield a.replaceText(n,"undefined"),s!=null?yield a.insertTextAfterRange([s,s],`
1
+ import{ESLintUtils as ce,AST_NODE_TYPES as i,AST_TOKEN_TYPES as Nt}from"@typescript-eslint/utils";import j from"typescript";import{isAbsolute as Ds,posix as Ws}from"node:path";import{createRequire as Bt}from"node:module";import{DefinitionType as Lt}from"@typescript-eslint/scope-manager";const Hs="1.3.16",p=ce.RuleCreator(e=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${e}.md`),Vs=(e,s)=>e&&s?`${e}.${s}`:null,M=e=>e.type===i.FunctionExpression||e.type===i.ArrowFunctionExpression;function O(e){if(v(e))return m(e);switch(e.type){case i.TaggedTemplateExpression:return O(e.tag);case i.MemberExpression:return Vs(O(e.object),O(e.property));case i.NewExpression:case i.CallExpression:return O(e.callee)}return null}const v=(e,s)=>N(e,s)||B(e,s),N=(e,s)=>e.type===i.Identifier&&(s===void 0||e.name===s),Ks=(e,s)=>e.type===i.TemplateLiteral&&e.quasis.length===1&&(s===void 0||e.quasis[0].value.raw===s),Gs=(e,s)=>e.type===i.Literal&&typeof e.value=="string"&&(s===void 0||e.value===s),B=(e,s)=>Gs(e,s)||Ks(e,s),m=e=>e.type===i.Identifier?e.name:W(e),W=e=>e?.type===i.TemplateLiteral?e.quasis[0].value.raw:e?.value,X=(e,s,t)=>e.replaceText(s,s.type===i.Identifier?t:`'${t}'`),Ft=(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]])},Xs=(e,s)=>m(e.matcher)==="toBeInstanceOf"&&e.args.length===1&&v(e.args[0],s);var _=(e=>(e.vi="vi",e.vitest="vitest",e))(_||{}),H=(e=>(e.describe="describe",e.fdescribe="fdescribe",e.xdescribe="xdescribe",e))(H||{}),I=(e=>(e.fit="fit",e.it="it",e.test="test",e.xit="xit",e.xtest="xtest",e.bench="bench",e))(I||{}),Pt=(e=>(e.beforeAll="beforeAll",e.beforeEach="beforeEach",e.afterAll="afterAll",e.afterEach="afterEach",e))(Pt||{}),R=(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))(R||{}),L=(e=>(e.toBe="toBe",e.toEqual="toEqual",e.toStrictEqual="toStrictEqual",e))(L||{});function Ut(e){return e.getCallSignatures().length>0?!0:e.getSymbol()?.getDeclarations()?.some(s=>j.isArrowFunction(s)||j.isClassDeclaration(s)||j.isClassExpression(s)||j.isFunctionDeclaration(s)||j.isFunctionExpression(s)||j.isMethodDeclaration(s)||j.isFunctionTypeNode(s))??!1}const zs=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 le(e,s){return e.sourceCode.getScope?e.sourceCode.getScope(s):e.getScope()}function Ys(e,s){let t=le(e,s);for(;t;){if(t.type==="module")return t;t=t.upper}return t}const q=(e,s,t)=>{const n=h(e,s);return n!==null&&t.includes(n.type)},h=(e,s)=>{const t=_t(e,s);return typeof t=="string"?null:t},jt=new WeakMap,_t=(e,s)=>{let t=jt.get(e);return t||(t=en(e,s),jt.set(e,t),t)},Js=e=>e==="expect"?"expect":e==="expectTypeOf"?"expectTypeOf":e==="vi"?"vi":e==="vitest"?"vitest":H.hasOwnProperty(e)?"describe":I.hasOwnProperty(e)?"test":Pt.hasOwnProperty(e)?"hook":"unknown",Qs=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=m(t);if(s.length===0){if(!R.hasOwnProperty(n))return"modifier-unknown"}else if(s.length===1){if(n!==R.not&&n!=R.have)return"modifier-unknown";const r=m(s[0]);if(r!==R.resolves&&r!==R.rejects&&r!==R.to)return"modifier-unknown"}else return"modifier-unknown";s.push(t)}return"matcher-not-found"},Zs=(e,s)=>{const t=Qs(e.members);return typeof t=="string"?t:{...e,type:s,...t}},Dt=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},en=(e,s)=>{const t=V(e);if(!t?.length)return null;const[n,...r]=t,o=m(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=sn(s,e,m(n));if(!a)return null;const c=a.original??a.local,l=[c,...r.map(m)];if(a.type!=="testContext"&&c!=="vi"&&c!=="vitest"&&c!=="expect"&&c!=="expectTypeOf"&&!zs.has(l.join(".")))return null;const d={name:c,head:{...a,node:n},members:r},f=Js(c);if(f==="expect"||f==="expectTypeOf"){const u=Zs(d,f);return typeof u=="string"&&Dt(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}},tn=(e,s)=>e&&s?[...e,...s]:null;function V(e){if(v(e))return[e];switch(e.type){case i.TaggedTemplateExpression:return V(e.tag);case i.MemberExpression:return tn(V(e.object),V(e.property));case i.CallExpression:return V(e.callee)}return null}const sn=(e,s,t)=>{const n=le(e,s),r=Wt(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:nn(t,e),local:t,type:"global"}},nn=(e,s)=>{const t=s.settings.vitest?.globalAliases??{},n=Object.entries(t).find(([r,o])=>o.includes(e));return n?n[0]:null},rn=({parent:e})=>e?.type===i.CallExpression&&e.callee.type===i.Identifier&&I.hasOwnProperty(e.callee.name),Wt=(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"}if(r.node.type===i.VariableDeclarator&&r.node.id.type===i.Identifier&&I.hasOwnProperty(r.node.id.name)&&r.node.init?.type===i.CallExpression&&r.node.init.callee.type===i.MemberExpression&&N(r.node.init.callee.property,"extend"))return"testContext";const a=M(r.node)?r.node.params.find(l=>l.type===i.Identifier):void 0;if(a&&rn(a.parent))return"testContext";const c=cn(r);return c?.local===s?c:"local"}t=t.upper}return null},on=e=>e.type===i.AwaitExpression?e.argument.type===i.ImportExpression?e.argument.source:null:e.type===i.CallExpression&&N(e.callee,"require")?e.arguments[0]??null:null,an=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},cn=e=>e.type==="Variable"?ln(e):e.type==="ImportBinding"?an(e):null,ln=e=>{if(!e.node.init)return null;const s=on(e.node.init);return!s||!B(s)||e.name.parent?.type!==i.Property||!v(e.name.parent.key)?null:{source:W(s),imported:m(e.name.parent.key),local:e.name.name}},ue=(e,s)=>e.reduce((t,{references:n})=>t.concat(n.map(({identifier:r})=>r.parent).filter(r=>r?.type===i.CallExpression&&q(r,s,["test"]))),[]),P=e=>{const[s]=e.args;return s.type===i.SpreadElement?s:pe(s)},un=e=>e.type===i.TSAsExpression||e.type===i.TSTypeAssertion,pe=e=>un(e)?pe(e.expression):e,de="prefer-lowercase-title",pn=e=>e.arguments[0]&&B(e.arguments[0]),dn=e=>{const s=[];return e.includes(H.describe)&&s.push(...Object.keys(H)),e.includes(I.test)&&s.push(...Object.keys(I).filter(t=>t.endsWith(I.test))),e.includes(I.it)&&s.push(...Object.keys(I).filter(t=>t.endsWith(I.it))),s},fn=p({name:de,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:[H.describe,I.test,I.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=dn(s);let a=0;return{CallExpression(c){const l=h(c,e);if(!l||!pn)return;if(l?.type==="describe"){if(a++,n&&a===1)return}else if(l?.type!=="test")return;const[d]=c.arguments,f=W(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 y=W(d),T=[d.range[0]+1,d.range[1]-1],k=r?y.substring(0,1).toLowerCase()+y.substring(1):y.toLowerCase();return[x.replaceTextRange(T,k)]}})},"CallExpression:exit"(c){q(c,e,["describe"])&&a--}}}}),fe="max-nested-describe",mn=p({name:fe,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}}}),z="no-identical-title",Ht=()=>({describeTitles:[],testTitles:[]}),yn=p({name:z,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=[Ht()];return{CallExpression(t){const n=s[s.length-1],r=h(t,e);if(!r||((r.name==="describe"||r.name==="suite")&&s.push(Ht()),r.members.find(c=>v(c,"each"))))return;const[o]=t.arguments;if(!o||!B(o))return;const a=W(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){q(t,e,["describe"])&&s.pop()}}}}),me="no-focused-tests",ye=e=>e.type==="Identifier"&&["it","test","describe"].includes(e.name),he=e=>e.type==="Identifier"&&e.name==="only",hn=p({name:me,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"&&ye(n.object)&&he(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"&&ye(r.object)&&he(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"&&ye(n.object.object)&&he(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})}}}}}}),ge="no-conditional-tests",gn=p({name:ge,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"})}}}}),kn={typecheck:!1};function Y(e){const s=typeof e.vitest!="object"||e.vitest===null?{}:e.vitest;return{...kn,...s}}const J="expect-expect",bn=p({name:J,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=[];Y(e.settings).typecheck&&s.push("expectTypeOf","assertType");const r=s.map(xn);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=ue(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=O(a)??"";if(q(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 xn(e){const s=e.split(".").map(t=>t==="**"?"[_a-z\\d\\.]*":t.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${s.join("\\.")}(\\.|$)`,"ui")}const ke="hoisted-apis-on-top",In=["mock","hoisted","unmock"],En=p({name:ke,meta:{hasSuggestions:!0,type:"suggestion",docs:{description:"enforce hoisted APIs to be on top of the file"},messages:{hoistedApisOnTop:"Hoisted API is used in a runtime location in this file, but it is actually executed before this file is loaded.",suggestMoveHoistedApiToTop:"Move this hoisted API to the top of the file to better reflect its behavior.",suggestReplaceMockWithDoMock:"Replace 'vi.mock()' with 'vi.doMock()', which is not hoisted."},schema:[]},defaultOptions:[],create(e){let s=null;const t=[];return{ImportDeclaration(n){n.parent.type===i.Program&&(s=n.range[1])},CallExpression(n){if(n.callee.type!==i.MemberExpression)return;const{object:r,property:o}=n.callee;if(r.type!==i.Identifier||r.name!=="vi"||o.type!==i.Identifier)return;const a=o.name;if(In.includes(a)){if(a==="hoisted"){let c=n.parent;if(c?.type===i.AwaitExpression&&(c=c.parent),c?.type===i.VariableDeclarator&&(c=c.parent),(c?.type===i.ExpressionStatement||c?.type===i.VariableDeclaration)&&c.parent?.type===i.Program)return}else if(n.parent?.type===i.ExpressionStatement&&n.parent.parent?.type===i.Program)return;t.push(n)}},"Program:exit"(){for(const n of t){const r=[];r.push({messageId:"suggestMoveHoistedApiToTop",*fix(a){n.parent.type===i.ExpressionStatement?yield a.remove(n):yield a.replaceText(n,"undefined"),s!=null?yield a.insertTextAfterRange([s,s],`
2
2
  `+e.sourceCode.getText(n)+";"):yield a.insertTextAfterRange([0,0],e.sourceCode.getText(n)+`;
3
3
  `)}});const o=n.callee.property;o.name==="mock"&&r.push({messageId:"suggestReplaceMockWithDoMock",fix(a){return a.replaceText(o,"doMock")}}),e.report({node:n,messageId:"hoistedApisOnTop",suggest:r})}}}}}),be="consistent-test-it",Vt=(e,s,t)=>n=>[n.replaceText(e.type===i.MemberExpression?e.object:e,qn(s,t))];function qn(e,s){return e===I.fit?"test.only":e.startsWith("f")||e.startsWith("x")?e.charAt(0)+s:s}function xe(e){return e===I.test?I.it:I.test}const Tn=p({name:be,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:[I.test,I.it]},withinDescribe:{type:"string",enum:[I.test,I.it]}},additionalProperties:!1}]},defaultOptions:[{fn:I.test,withinDescribe:I.it}],create(e){const s=e.options[0]??{},t=s.fn||I.test,n=s?.withinDescribe||s?.fn||I?.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=xe(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(y=>y.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=xe(t);e.report({node:a.callee,data:{testFnKeyWork:t,oppositeTestKeyword:d},messageId:"consistentMethod",fix:Vt(l,c.name,t)})}else if(c.type==="test"&&o>0&&!c.name.endsWith(n)){const d=xe(n);e.report({messageId:"consistentMethodWithinDescribe",node:a.callee,data:{testKeywordWithinDescribe:n,oppositeTestKeyword:d},fix:Vt(l,c.name,n)})}},"CallExpression:exit"(a){q(a,e,["describe"])&&o--}}}}),Ie="consistent-vitest-vi",wn=e=>e===_.vi?_.vitest:_.vi,An=p({name:Ie,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=wn(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)})}}}}),Ee="prefer-to-be",vn=e=>e.type===i.Literal&&e.value===null,Cn=e=>vn(P(e)),Kt=(e,s)=>N(P(e),s),Sn=e=>Math.floor(e)!==Math.ceil(e),Mn=e=>{let s=P(e);return s.type===i.Literal&&typeof s.value=="number"&&Sn(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=[X(o,t.matcher,`toBe${s}`)];return t.args?.length&&s!==""&&a.push(Ft(o,e,n,0)),r&&a.push(o.removeRange([r.range[0]-1,r.range[1]])),a},node:t.matcher})},$n=p({name:Ee,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=m(t.matcher),r=t.modifiers.find(o=>m(o)==="not");if(r&&["toBeUndefined","toBeDefined"].includes(n)){K(e,n==="toBeDefined"?"Undefined":"Defined",t,s,r);return}if(!(!L.hasOwnProperty(n)||t.args.length===0)){if(Cn(t)){K(e,"Null",t,s);return}if(Kt(t,"undefined")){K(e,r?"Defined":"Undefined",t,s);return}if(Kt(t,"NaN")){K(e,"NaN",t,s);return}Mn(t)&&n!==L.toBe&&K(e,"",t,s)}}}}}),qe="no-hooks",On=p({name:qe,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}})}}}}),Te="no-restricted-vi-methods",Rn=p({name:Te,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=m(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}})}}}}}),we="consistent-test-filename",Gt=/.*\.test\.[tj]sx?$/,Q=/.*\.(test|spec)\.[tj]sx?$/,Nn=p({name:we,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:Gt.source},allTestPattern:{format:"regex",default:Q.source}}}]},defaultOptions:[{pattern:Q.source,allTestPattern:Q.source}],create:e=>{const s=e.options[0]??{},{pattern:t=Gt,allTestPattern:n=Q}=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}})}}:{}}}),Ae="max-expects",Bn=p({name:Ae,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||q(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}}))}}}}),ve="no-alias-methods",Ln=p({name:ve,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=m(r);if(o in s){const a=s[o];e.report({messageId:"noAliasMethods",data:{alias:o,canonical:a},node:r,fix:c=>[X(c,r,a)]})}}}}}),Z="no-commented-out-tests";function Fn(e){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(e.value)}const Pn=p({name:Z,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){Fn(n)&&e.report({messageId:"noCommentedOutTests",node:n})}return{Program(){s.getAllComments().forEach(t)}}}}),Ce="no-conditional-expect",Xt=e=>e.callee.type===i.MemberExpression&&v(e.callee.property,"catch"),Un=p({name:Ce,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);ue(c,e).length>0&&(t=!0)},CallExpression(a){const{type:c}=h(a,e)??{};c==="test"&&(t=!0),Xt(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){q(a,e,["test"])&&(t=!1),Xt(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}}}),ee="no-import-node-test",jn=p({name:ee,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"))})}}}}),Se=new Set(["suite","test","chai","describe","it","expectTypeOf","assertType","expect","assert","vitest","vi","beforeAll","afterAll","beforeEach","afterEach","onTestFailed","onTestFinished"]),zt=e=>e.source.value==="vitest",Me=e=>e.type===i.ImportSpecifier&&e.imported.type===i.Identifier&&Se.has(e.imported.name),$e=e=>e.type===i.Property&&e.key.type===i.Identifier&&Se.has(e.key.name),_n=e=>e.callee.type===i.Identifier&&Se.has(e.callee.name),Oe=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"},Yt=e=>e.type===i.ObjectPattern,Dn=(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]])}},Jt=(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]])}},Re="no-importing-vitest-globals",Wn=p({name:Re,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(!zt(s))return;const t=s.specifiers;for(const n of t)Me(n)&&e.report({node:n,messageId:"noImportingVitestGlobals",data:{name:n.imported.name},fix(r){return t.every(o=>Me(o))?r.remove(s):Jt(r,t,n)}})},VariableDeclarator(s){if(!Oe(s.init)||!Yt(s.id))return;const t=s.id.properties;for(const n of t)$e(n)&&e.report({node:n,messageId:"noRequiringVitestGlobals",data:{name:n.key.name},fix(r){return t.every(o=>$e(o))?Dn(r,s):Jt(r,t,n)}})}}}}),Ne="prefer-importing-vitest-globals",Hn=p({name:Ne,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(!zt(r))return;const o=r.specifiers;for(const a of o)if(Me(a)){const c=a.imported.name;s.add(c)}t=r.specifiers},VariableDeclarator(r){if(!Oe(r.init)||!Yt(r.id))return;const o=r.id.properties;for(const a of o)if($e(a)){const c=a.key.name;s.add(c)}n=o},CallExpression(r){if(!_n(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&&Oe(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';
4
4
  `);if(t.find(u=>u.type==="ImportNamespaceSpecifier"))return c.insertTextBefore(l.body[0],`import { ${o} } from 'vitest';
5
5
  `);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}`)}})}}}}),Be="no-conditional-in-test",Vn=p({name:Be,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"&&q(s.parent?.parent?.parent,e,["test","it"])&&e.report({messageId:"noConditionalInTest",node:s})}}}}),Le="no-disabled-tests",Kn=p({name:Le,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=>m(a)==="skip")&&e.report({messageId:"missingFunction",node:n}));const o=r.members.find(a=>m(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=le(e,n);Wt(r,"pending")||(t>0?e.report({messageId:"pendingTest",node:n}):s>0?e.report({messageId:"pendingSuite",node:n}):e.report({messageId:"pending",node:n}))}}}}),Fe="no-done-callback",Gn=(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},Xn=p({name:Fe,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(O(s.callee)??"");if(t&&s.callee.type!==i.TaggedTemplateExpression||e.sourceCode.getAncestors(s).some(a=>a.type!==i.CallExpression||!q(a,e,["describe","test"])?!1:a.callee.type===i.MemberExpression&&v(a.callee.property,"concurrent")))return;const n=Gn(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,y=l[l.length-1],T=d.getTokenBefore(x);let k=d.getTokenAfter(y);if(k?.value===","&&(k=d.getTokenAfter(k)),!f||!u||!T||!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,"()");T.value==="("&&k.value===")"&&(b=a.removeRange([T.range[1],k.range[0]]));let S=`new Promise(${o.name} => `,w=")",E=!0;return c.type===i.BlockStatement&&(S=`return ${S}{`,w+="}",E=!1),[b,E?a.insertTextBefore(f,S):a.insertTextAfter(f,S),a.insertTextAfter(u,w)]}}]})}}}}),Pe="no-duplicate-hooks",zn=p({name:Pe,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){q(t,e,["describe"])&&s.pop()}}}}),Ue="no-large-snapshots",Qt=(e,s,{maxSize:t=50,allowedSnapshots:n={}})=>{const r=s.loc.start.line,o=s.loc.end.line-r;if(!Object.keys(n).every(Ds))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=m(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}})},Yn=p({name:Ue,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){Qt(e,t,s)}}:{CallExpression(t){const n=h(t,e);n?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(m(n.matcher))&&n.args.length&&Qt(e,n.args[0],{...s,maxSize:s.inlineMaxSize??s.maxSize})}}}}),je="no-interpolation-in-snapshots",Jn=p({name:je,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(m(t.matcher))&&t.args.forEach(n=>{n.type===i.TemplateLiteral&&n.expressions.length>0&&e.report({messageId:"noInterpolationInSnapshots",node:n})})}}}}),Zt="__mocks__",Qn=e=>e.split(Ws.sep).includes(Zt),es=e=>B(e)&&Qn(W(e)),_e="no-mocks-import",Zn=p({name:_e,meta:{type:"problem",docs:{description:"disallow importing from __mocks__ directory",recommended:!1},messages:{noMocksImport:`Mocks should not be manually imported from a ${Zt} directory. Instead use \`vi.mock\` and import from the original module path`},schema:[]},defaultOptions:[],create(e){return{ImportDeclaration(s){es(s.source)&&e.report({node:s,messageId:"noMocksImport"})},'CallExpression[callee.name="require"]'(s){const[t]=s.arguments;t&&es(t)&&e.report({node:t,messageId:"noMocksImport"})}}}}),De="no-restricted-matchers",er=(e,s)=>R.hasOwnProperty(s)||s.endsWith(".not")?e.startsWith(s):e===s,tr=p({name:De,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=>m(o)).join(".");for(const[o,a]of Object.entries(s))if(er(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}}}}}),We="no-standalone-expect",ts=(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&&q(n,s,["describe"]))return"describe"}return null},sr=p({name:We,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(O(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(m(o.members[0])))return;const a=t[t.length-1];(!a||a===H.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"&&(q(r,e,["test"])||n(r))&&r.callee.type!==i.MemberExpression||o==="template"&&r.callee.type===i.TaggedTemplateExpression)&&t.pop()},BlockStatement(r){const o=ts(r,e);o&&t.push(o)},"BlockStatement:exit"(r){ts(r,e)&&t.pop()},ArrowFunctionExpression(r){r.parent?.type!==i.CallExpression&&t.push("arrow")},"ArrowFunctionExpression:exit"(){t[t.length-1]==="arrow"&&t.pop()}}}}),He="no-test-prefixes",nr=p({name:He,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=>m(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)]})}}}}),Ve="no-test-return-statement",rr=e=>{const[,s]=e;return s&&M(s)&&s.body.type===i.BlockStatement?s.body.body:[]},or=p({name:Ve,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(!q(s,e,["test"]))return;const t=rr(s.arguments).find(n=>n.type===i.ReturnStatement);t&&e.report({messageId:"noTestReturnStatement",node:t})},FunctionDeclaration(s){const t=e.sourceCode.getDeclaredVariables(s);if(ue(t,e).length===0)return;const n=s.body.body.find(r=>r.type===i.ReturnStatement);n&&e.report({messageId:"noTestReturnStatement",node:n})}}}}),Ke="prefer-called-with",ir=p({name:Ke,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=>m(o)==="not"))return;const{matcher:n}=t,r=m(n);["toBeCalled","toHaveBeenCalled"].includes(r)&&e.report({data:{matcherName:r},messageId:"preferCalledWith",node:n,fix:o=>[o.replaceText(n,`${r}With`)]})}}}}),te="valid-title",ar=e=>["f","x"].includes(e.charAt(0))?e.substring(1):e,ss=e=>e.type===i.TemplateLiteral?`\`${e.quasis[0].value.raw}\``:e.raw,ns={type:"array",items:{type:"string"},minItems:1,maxItems:2,additionalItems:!1},se=e=>{const[s,t]=Array.isArray(e)?e:[e];return[new RegExp(s,"u"),t]};function cr(e){return!!(e.flags&j.TypeFlags.StringLike)}const rs=e=>{if(typeof e=="string"||Array.isArray(e)){const s=se(e);return{describe:s,test:s,it:s}}return{describe:e.describe?se(e.describe):null,test:e.test?se(e.test):null,it:e.it?se(e.it):null}},os=e=>B(e.right)?!0:e.left.type===i.BinaryExpression?os(e.left):B(e.left),lr=p({name:te,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"},ns,{type:"object",propertyNames:{type:"string",enum:["describe","test","it"]},additionalProperties:{oneOf:[{type:"string"},ns]}}]}},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=rs(r??{}),l=rs(o??{}),d=Y(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=F=>{e.report({messageId:"emptyTitle",data:{functionName:u.type==="describe"?H.describe:I.test},node:F})},[y]=f.arguments,T=d.typecheck?ce.getParserServices(e).getTypeAtLocation(y):null;if(T&&Ut(T)||!y||t&&y.type===i.Identifier)return;if(!B(y)){if(y.type===i.BinaryExpression&&os(y)||T&&cr(T))return;y.type!==i.TemplateLiteral&&!(s&&u.type==="describe")&&e.report({messageId:"titleMustBeString",loc:y.loc});return}const k=W(y);if(!k){x(f);return}if(n.length>0){const F=a.exec(k);if(F){e.report({messageId:"disallowedWord",data:{word:F[1]},node:y});return}}k.trim().length!==k.length&&e.report({messageId:"accidentalSpace",node:y,fix:F=>[F.replaceTextRange(y.range,ss(y).replace(/^([`'"]) +?/u,"$1").replace(/ +?([`'"])$/u,"$1"))]});const b=ar(u.name),[S]=k.split(" ");S.toLowerCase()===b&&e.report({messageId:"duplicatePrefix",node:y,fix:F=>[F.replaceTextRange(y.range,ss(y).replace(/^([`'"]).+? /u,"$1"))]});const w=b,[E,A]=c[w]??[];if(E&&E.test(k)){e.report({messageId:A?"mustNotMatchCustom":"mustNotMatch",node:y,data:{functionName:w,pattern:E,message:A}});return}const[U,G]=l[w]??[];U&&(U.test(k)||e.report({messageId:G?"mustMatchCustom":"mustMatch",node:y,data:{functionName:w,pattern:U,message:G}}))}}}}),ne="valid-expect",is=["toReject","toResolve"],ur=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),as=({start:e,end:s})=>`${e.line}:${e.column}-${s.line}:${s.column}`,pr=e=>e.parent.type===i.Property&&e.type===i.FunctionExpression?e.parent:e;function cs(e){const s=e.parent?.parent;return s&&s.type===i.CallExpression&&s.callee.type===i.MemberExpression&&v(s.callee.property)&&["then","catch"].includes(m(s.callee.property))&&s.parent?cs(s):e}const dr=e=>e.parent?.parent&&[i.CallExpression,i.ArrayExpression].includes(e.parent.type)?ur(e.parent):null,ls=({parent:e})=>e?M(e)?e:ls(e):null,us=(e,s)=>s&&e.type===i.ReturnStatement?!0:e.type===i.ConditionalExpression&&e.parent?us(e.parent,s):[i.ArrowFunctionExpression,i.AwaitExpression].includes(e.type),fr=p({name:ne,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:is,minArgs:1,maxArgs:1}],create:(e,[{alwaysAwait:s,asyncMatchers:t=is,minArgs:n=1,maxArgs:r=1}])=>{const o=new Set,a=[],c=f=>o.add(as(f)),l=f=>o.has(as(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=_t(f,e),x=Y(e.settings);if(typeof u=="string"){const A=f.parent?.type===i.MemberExpression?d(f.parent).property:f;if(u==="matcher-not-found"){e.report({messageId:"matcherNotFound",node:A});return}if(u==="matcher-not-called"&&e.report({messageId:v(A)&&R.hasOwnProperty(m(A))?"matcherNotFound":"matcherNotCalled",node:A}),u==="modifier-unknown"){e.report({messageId:"modifierUnknown",node:A});return}return}else if(u?.type==="expectTypeOf"&&x.typecheck||u?.type!=="expect"||u.modifiers.some(A=>A.type===i.Identifier&&A.name=="to"))return;const{parent:y}=u.head.node;if(y?.type!==i.CallExpression)return;if(y.arguments.length<n){const A=m(u.head.node).length,U={start:{column:y.loc.start.column+A,line:y.loc.start.line},end:{column:y.loc.start.column+A+1,line:y.loc.start.line}};e.report({messageId:"notEnoughArgs",data:{amount:n,s:n===1?"":"s"},node:y,loc:U})}if(y.arguments.length>r){if(y.arguments.length===2){const F=y.arguments[1].type===i.Literal&&typeof y.arguments[1].value=="string",_s=y.arguments[1].type===i.TemplateLiteral;if(F||_s)return}const{start:A}=y.arguments[r].loc,{end:U}=y.arguments[y.arguments.length-1].loc,G={start:A,end:{column:U.column+1,line:U.line}};e.report({messageId:"tooManyArgs",data:{amount:r,s:r===1?"":"s"},node:y,loc:G})}const{matcher:T}=u,k=T.parent.parent,b=u.modifiers.some(A=>m(A)!=="not")||t.includes(m(T));if(!k?.parent||!b)return;const S=k.parent.type===i.ArrayExpression,w=cs(k),E=dr(w)||w;E.parent&&!us(E.parent,!s)&&!l(E.loc)&&(a.push({messageId:E===w?"asyncMustBeAwaited":"promisesWithAsyncAssertionsMustBeAwaited",node:E}),S&&c(E.loc))},"Program:exit"(){const f=[];a.forEach(({node:u,messageId:x},y)=>{const T=s?"":" or returned";e.report({loc:u.loc,data:{orReturned:T},messageId:x,node:u,fix(k){const b=ls(u);if(!b)return null;const S=f.some(E=>E.text==="async ");if(!b.async&&!S){const E=pr(b);f.push(k.insertTextBefore(E,"async "))}const w=u.parent?.type===i.ReturnStatement?u.parent:null;if(s&&w){const E=e.sourceCode.getText(w).replace("return","await");f.push(k.replaceText(w,E))}else f.push(k.insertTextBefore(u,"await "));return y===a.length-1?f:null}})})}}}}),re=e=>e.type===i.Literal&&typeof e.value=="boolean",mr=e=>{const s=m(e.matcher);if(["toBeTruthy","toBeFalsy"].includes(s))return!0;if(e.args.length!==1)return!1;const t=P(e);return L.hasOwnProperty(s)&&re(t)},yr=(e,s)=>e.type===i.BinaryExpression&&e.operator==="instanceof"&&v(e.right,s),ps=e=>e.arguments.length===1,Ge="prefer-to-be-object",hr=p({name:Ge,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(Xs(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||!mr(t)||!yr(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=m(t.matcher)==="toBeFalsy";if(t.args.length){const[l]=t.args;a.push(o.remove(l)),c=l.type===i.Literal&&pe(l).value===!1}if(c){const l=t.modifiers.find(d=>m(d)==="not");a.push(l?o.removeRange([l.range[0]-1,l.range[1]]):o.insertTextBefore(t.matcher,"not."))}return a}})}}}}),Xe="prefer-to-be-truthy",gr=e=>e.type===i.Literal&&e.value===!0,kr=p({name:Xe,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&&gr(P(t))&&L.hasOwnProperty(m(t.matcher))&&e.report({node:t.matcher,messageId:"preferToBeTruthy",fix:n=>[n.replaceText(t.matcher,"toBeTruthy"),n.remove(t.args[0])]})}}}}),ze="prefer-to-be-falsy",br=e=>e.type===i.Literal&&e.value===!1,xr=p({name:ze,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&&br(P(t))&&L.hasOwnProperty(m(t.matcher))&&e.report({node:t.matcher,messageId:"preferToBeFalsy",fix:n=>[n.replaceText(t.matcher,"toBeFalsy"),n.remove(t.args[0])]})}}}}),Ye="prefer-to-have-length",Ir=p({name:Ye,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;!L.hasOwnProperty(m(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")]}})}}}}),Je="prefer-equality-matcher",Er=p({name:Je,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!=="!=="||!L.hasOwnProperty(m(a))||!re(c))return;const l=c.value,[d]=t.modifiers,f=t.modifiers.some(y=>m(y)==="not"),u=(r.operator==="!=="?!l:l)===f,x=y=>T=>{const{sourceCode:k}=e;let b=d&&m(d)!=="not"?`.${m(d)}`:"";return u&&(b+=`.${R.not}`),[T.replaceText(r,k.getText(r.left)),T.replaceTextRange([o,a.parent.range[1]],`${b}.${y}`),T.replaceText(c,k.getText(r.right))]};e.report({messageId:"useEqualityMatcher",suggest:["toBe","toEqual","toStrictEqual"].map(y=>({messageId:"suggestEqualityMatcher",data:{equalityMatcher:y},fix:x(y)})),node:a})}}}}),Qe="prefer-strict-equal",qr=p({name:Qe,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=>[X(r,n,L.toStrictEqual)]}]})}}}}),Ze="prefer-expect-resolves",Tr=p({name:Ze,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")]}})}})}),et="prefer-each",wr=p({name:et,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)}}}}),tt="prefer-hooks-on-top",Ar=p({name:tt,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){q(t,e,["test"])&&(s[s.length-1]=!0),s[s.length-1]&&q(t,e,["hook"])&&e.report({messageId:"noHookOnTop",node:t}),s.push(!1)},"CallExpression:exit"(){s.pop()}}}}),st="prefer-hooks-in-order",ds=["beforeAll","beforeEach","afterEach","afterAll"],vr=p({name:st,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=ds.indexOf(o);if(a<s){e.report({messageId:"reorderHooks",data:{previousHook:ds[s],currentHook:o},node:n}),t=!1;return}s=a},"CallExpression:exit"(n){if(q(n,e,["hook"])){t=!1;return}t||(s=-1)}}}}),nt="prefer-mock-promise-shorthand",rt=(e,s)=>`${e}${s?"Once":""}`,Cr=e=>e.body.type!==i.BlockStatement?e.body:e.body.body[0]?.type===i.ReturnStatement?e.body.body[0].argument:null,Sr=p({name:nt,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=O(o);if(a!=="Promise.resolve"&&a!=="Promise.reject")return;const c=rt(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=m(t.callee.property),r=n.endsWith("Once");if(n===rt("mockReturnValue",r))s(t.callee.property,r,t.arguments[0]);else if(n===rt("mockImplementation",r)){const[o]=t.arguments;if(!M(o)||o.params.length!==0)return;s(t.callee.property,r,o,Cr(o))}}}}}),Mr=Bt(import.meta.url),$r=Bt(Mr.resolve("eslint"));$r.resolve("espree");const Or=new Set([i.Program,i.BlockStatement,i.SwitchCase,i.SwitchStatement]),Rr=e=>Or.has(e),Nr=e=>e.value===";"&&e.type===Nt.Punctuator,fs=(e,s)=>{const t=e.getLastToken(s),n=e.getTokenBefore(t),r=e.getTokenAfter(t);return n&&r&&n.range[0]>=s.range[0]&&Nr(t)&&t.loc.start.line!==n.loc.end.line&&t.loc.end.line===r.loc.start.line?n:t},Br=(e,s,t)=>{const n=[];let r=fs(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},ms=(e,s)=>e.loc.end.line===s.loc.start.line,Lr=e=>e.type===i.TSAsExpression||e.type===i.TSTypeAssertion,ys=e=>Lr(e)?ys(e.expression):e,ot="prefer-vi-mocked",Fr=["Mock","MockedFunction","MockedClass","MockedObject"],Pr=p({name:ot,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||!Fr.includes(r.name))return;const o=e.sourceCode.text.slice(...ys(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)}}}}),it="prefer-snapshot-hint",Ur=["toMatchSnapshot","toThrowErrorMatchingSnapshot"],jr=Ur,_r=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)},Dr=p({name:it,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)_r(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){q(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=m(d.matcher);jr.includes(f)&&t.push(d)}}}}),oe="valid-describe-callback",hs=e=>{const[s]=e,t=e[e.length-1];return{start:s.loc.start,end:t.loc.end}},gs=(e,s)=>e.members.every(t=>m(t)!=="each")&&s.params.length,ks=(e,s)=>{e.body.forEach(t=>{t.type===i.ReturnStatement&&s.report({messageId:"unexpectedReturnInDescribe",node:t})})},Wr=p({name:oe,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:hs(s.arguments)});return}if(!M(n)){if(r&&M(r)){gs(t,r)&&e.report({messageId:"unexpectedDescribeArgument",node:r}),r.body.type===i.CallExpression&&e.report({messageId:"unexpectedReturnInDescribe",node:r}),r.body.type===i.BlockStatement&&ks(r.body,e);return}e.report({messageId:"secondArgumentMustBeFunction",loc:hs(s.arguments)});return}gs(t,n)&&e.report({messageId:"unexpectedDescribeArgument",node:n}),n.body.type===i.CallExpression&&e.report({messageId:"unexpectedReturnInDescribe",node:n}),n.body.type===i.BlockStatement&&ks(n.body,e)}}}}),at="require-top-level-describe",Hr=p({name:at,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"&&(o.members.length===0||!o.members.every(a=>"name"in a&&a.name==="extend"))){e.report({node:r,messageId:"unexpectedTestCase"});return}o.type==="hook"&&e.report({node:r,messageId:"unexpectedHook"})}}},"CallExpression:exit"(r){q(r,e,["describe"])&&n--}}}}),ct="require-to-throw-message",Vr=p({name:ct,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=m(n);t.args.length===0&&["toThrow","toThrowError"].includes(r)&&!t.modifiers.some(o=>m(o)==="not")&&e.report({messageId:"addErrorMessage",data:{matcherName:r},node:n})}}}}),lt="require-hook",Kr=(e,s)=>h(e,s)?!0:!!O(e)?.startsWith("vi"),Gr=e=>e.type===i.Literal&&e.value===null||N(e,"undefined"),bs=(e,s,t=[])=>{switch(e.type){case i.ExpressionStatement:return bs(e.expression,s,t);case i.CallExpression:return!(Kr(e,s)||t.includes(O(e)));case i.VariableDeclaration:return e.kind==="const"?!1:e.declarations.some(({init:n})=>n!==null&&!Gr(n));default:return!1}},Xr=p({name:lt,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)bs(r,e,s)&&e.report({node:r,messageId:"useHook"})};return{Program(n){t(n.body)},CallExpression(n){if(!q(n,e,["describe"])||n.arguments.length<2)return;const[,r]=n.arguments;!M(r)||r.body.type!==i.BlockStatement||t(r.body.body)}}}}),ie="require-local-test-context-for-concurrent-snapshots",zr=p({name:ie,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||!q(n,e,["describe","test"])?!1:n.callee.type===i.MemberExpression&&v(n.callee.property,"concurrent"))||e.report({node:s,messageId:"requireLocalTestContext"})}}}}),ut="prefer-todo",Yr=e=>e.members.some(s=>m(s)!=="skip")||e.name.startsWith("x")?!1:!e.name.startsWith("f");function Jr(e){return M(e)?e.body.type===i.BlockStatement&&!e.body.body.length:!1}function xs(e,s){return e.members.length?X(s,e.members[0],"todo"):s.replaceText(e.head.node,`${e.head.local}.todo`)}const Qr=p({name:ut,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"||!Yr(r)||!B(t)||(n&&Jr(n)&&e.report({messageId:"emptyTest",node:s,fix:o=>[o.removeRange([t.range[1],n.range[1]]),xs(r,o)]}),ps(s)&&e.report({messageId:"unimplementedTest",node:s,fix:o=>xs(r,o)}))}}}}),pt="prefer-spy-on",Zr=e=>"object"in e?e.object:e.callee.type===i.MemberExpression?e.callee.object:null,Is=e=>{if(e.type!==i.CallExpression&&e.type!==i.MemberExpression)return null;const s=Zr(e);return s?s.type===i.Identifier?e.type===i.CallExpression&&O(e.callee)==="vi.fn"?e:null:Is(s):null},eo=(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()"},to=p({name:pt,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=Is(n);r&&e.report({node:s,messageId:"useViSpayOn",fix(o){const a=t.property.type===i.Identifier&&!t.computed?"'":"",c=eo(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}`)]}})}}}}),dt="prefer-comparison-matcher",Es=e=>B(e)||e?.type===i.TemplateLiteral,so=e=>Es(e.left)||Es(e.right),no=e=>{switch(e){case">":return"<=";case"<":return">=";case">=":return"<";case"<=":return">"}return null},ro=(e,s)=>{switch(s?no(e):e){case">":return"toBeGreaterThan";case"<":return"toBeLessThan";case">=":return"toBeGreaterThanOrEqual";case"<=":return"toBeLessThanOrEqual"}return null},oo=p({name:dt,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||so(r)||!L.hasOwnProperty(m(a))||!re(c))return;const[l]=t.modifiers,d=t.modifiers.some(u=>m(u)==="not"),f=ro(r.operator,c.value===d);f&&e.report({fix(u){const{sourceCode:x}=e,y=l&&m(l)!=="not"?`.${m(l)}`:"";return[u.replaceText(r,x.getText(r.left)),u.replaceTextRange([o,a.parent.range[1]],`${y}.${f}`),u.replaceText(c,x.getText(r.right))]},messageId:"useToBeComparison",data:{preferredMatcher:f},node:a})}}}}),ft="prefer-describe-function-title",io=p({name:ft,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=Ys(e,s),[n]=s.arguments;if(n.type===i.MemberExpression&&n.object.type===i.Identifier&&n.property.type===i.Identifier){const a=n.object.name;if(t?.set.get(a)?.defs[0]?.type!==Lt.ImportBinding||n.property.name!=="name")return;e.report({node:n,messageId:"preferFunction",fix(c){return c.replaceText(n,a)}});return}if(n.type!==i.Literal||typeof n.value!="string")return;const r=n.value;if(h(s,e)?.type!=="describe")return;const o=t?.set.get(r)?.defs[0];if(o?.type===Lt.ImportBinding){if(Y(e.settings).typecheck){const a=ce.getParserServices(e).getTypeAtLocation(o.node);if(!Ut(a))return}e.report({node:n,messageId:"preferFunction",fix(a){return a.replaceText(n,r)}})}}}}}),mt="prefer-to-contain",ao=e=>e.type===i.CallExpression&&e.callee.type===i.MemberExpression&&v(e.callee.property,"includes")&&ps(e)&&e.arguments[0].type!==i.SpreadElement,co=p({name:mt,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||!L.hasOwnProperty(m(a))||!re(c)||!ao(r))return;const l=t.modifiers.some(d=>m(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?`.${R.not}.toContain`:".toContain"),d.replaceText(t.args[0],f.getText(r.arguments[0]))]},messageId:"useToContain",node:a})}}}}),qs="prefer-expect-assertions",lo=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")},Ts=(e,s,t)=>({messageId:"suggestRemovingExtraArguments",fix:n=>Ft(n,e,s,t)}),uo=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(m(k.members[0])==="hasAssertions"){k.args.length&&e.report({messageId:"hasAssertionsTakesNoArguments",node:k.matcher,suggest:[Ts(e,b,0)]});return}if(k.args.length!==1){let{loc:w}=k.matcher;const E=[];k.args.length&&(w=k.args[1].loc,E.push(Ts(e,b,1))),e.report({messageId:"assertionsRequiresOneArgument",suggest:E,loc:w});return}const[S]=k.args;S.type===i.Literal&&typeof S.value=="number"&&Number.isInteger(S.value)||e.report({messageId:"assertionsRequiresNumberArgument",node:S})}const u=()=>c&&t++,x=()=>c&&t--,y=()=>l=!0,T=()=>l=!1;return{FunctionExpression:u,"FunctionExpression:exit":x,ArrowFunctionExpression:u,"ArrowFunctionExpression:exit":x,ForStatement:y,"ForStatement:exit":T,ForInStatement:y,"ForInStatement:exit":T,ForOfStatement:y,"ForOfStatement:exit":T,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&&lo(k)&&b.head.node.parent?.type===i.MemberExpression&&b.members.length===1&&["assertions","hasAssertions"].includes(m(b.members[0]))&&(f(b,k),o=!0),l&&(r=!0),t>1&&(n=!0))},"CallExpression:exit"(k){if(!q(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 S=[];if(b.body.type===i.BlockStatement){const w=a?`${a}.`:"";S.push(["suggestAddingHasAssertions",`${w}expect.hasAssertions();`],["suggestAddingAssertions",`${w}expect.assertions();`])}e.report({messageId:"haveExpectAssertions",node:k,suggest:S.map(([w,E])=>({messageId:w,fix:A=>A.insertTextBeforeRange([b.body.range[0]+1,b.body.range[1]],E)}))})}}}});var C=(e=>(e[e.Any=0]="Any",e[e.Always=1]="Always",e))(C||{}),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 po=(e,s,t)=>{const{sourceCode:n,ruleContext:r}=t;Br(e,s,n).length>0||r.report({node:s,messageId:"missingPadding",fix(o){let a=fs(n,e);const c=n.getFirstTokenBetween(a,s,{includeComments:!0,filter(d){return ms(a,d)?(a=d,!1):!0}})||s,l=ms(a,c)?`
6
6
 
7
7
  `:`
8
- `;return o.insertTextAfter(a,l)}})},fo={0:()=>!0,1:po},mo=()=>{let e=null;return{get prevNode(){return e.prevNode},set prevNode(s){e.prevNode=s},enter(){e={upper:e,prevNode:null}},exit(){e=e.upper}}},$=e=>(s,t)=>{let n=s;if(n.type===i.ExpressionStatement){n.expression.type===i.AwaitExpression&&(n=n.expression.argument);const r=t.getFirstToken(n);return r?.type===Nt.Identifier&&r.value===e}return!1},yo={0:()=>!0,1:$("afterAll"),2:$("afterEach"),3:$("beforeAll"),4:$("beforeEach"),5:$("describe"),6:$("expect"),7:$("expectTypeOf"),8:$("fdescribe"),9:$("fit"),10:$("it"),11:$("test"),12:$("xdescribe"),13:$("xit"),14:$("xtest")},yt=(e,s,t)=>{let n=e;const{sourceCode:r}=t;for(;n.type===i.LabeledStatement;)n=n.body;return Array.isArray(s)?s.some(o=>yt(n,o,t)):yo[s](n,r)},ho=(e,s,t)=>{const{configs:n}=t,r=o=>fo[o](e,s,t);for(let o=n.length-1;o>=0;--o){const{prevStatementType:a,nextStatementType:c,paddingType:l}=n[o];if(yt(e,a,t)&&yt(s,c,t))return r(l)}return r(0)},ws=(e,s)=>{const{scopeInfo:t}=s;Rr(e?.parent.type)&&(t.prevNode&&ho(t.prevNode,e,s),t.prevNode=e)},D=(e,s,t,n=!1)=>p({name:e,meta:{docs:{description:s},fixable:"whitespace",deprecated:n,messages:{missingPadding:"expect blank line before this statement"},schema:[],type:"suggestion"},defaultOptions:[],create(r){const o={ruleContext:r,sourceCode:r.sourceCode??r.getSourceCode(),scopeInfo:mo(),configs:t},{scopeInfo:a}=o;return{Program:a.enter,"Program:exit":a.exit,BlockStatement:a.enter,"BlockStatement:exit":a.exit,SwitchStatement:a.enter,"SwitchStatement:exit":a.exit,":statement":c=>ws(c,o),SwitchCase(c){ws(c,o),a.enter()},"SwitchCase:exit":a.exit}}}),ht="padding-around-after-all-blocks",As=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.AfterAllToken},{paddingType:C.Always,prevStatementType:g.AfterAllToken,nextStatementType:g.Any}],go=D(ht,"Enforce padding around `afterAll` blocks",As),gt="padding-around-after-each-blocks",vs=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.AfterEachToken},{paddingType:C.Always,prevStatementType:g.AfterEachToken,nextStatementType:g.Any}],ko=D(gt,"Enforce padding around `afterEach` blocks",vs),kt="padding-around-before-all-blocks",Cs=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.BeforeAllToken},{paddingType:C.Always,prevStatementType:g.BeforeAllToken,nextStatementType:g.Any}],bo=D(kt,"Enforce padding around `beforeAll` blocks",Cs),bt="padding-around-before-each-blocks",Ss=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.BeforeEachToken},{paddingType:C.Always,prevStatementType:g.BeforeEachToken,nextStatementType:g.Any}],xo=D(bt,"Enforce padding around `beforeEach` blocks",Ss),xt="padding-around-describe-blocks",Ms=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:[g.DescribeToken,g.FdescribeToken,g.XdescribeToken]},{paddingType:C.Always,prevStatementType:[g.DescribeToken,g.FdescribeToken,g.XdescribeToken],nextStatementType:g.Any}],Io=D(xt,"Enforce padding around `describe` blocks",Ms),It="padding-around-expect-groups",$s=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.ExpectToken},{paddingType:C.Always,prevStatementType:g.ExpectToken,nextStatementType:g.Any},{paddingType:C.Any,prevStatementType:g.ExpectToken,nextStatementType:g.ExpectToken},{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.ExpectTypeOfToken},{paddingType:C.Always,prevStatementType:g.ExpectTypeOfToken,nextStatementType:g.Any},{paddingType:C.Any,prevStatementType:g.ExpectTypeOfToken,nextStatementType:g.ExpectTypeOfToken}],Eo=D(It,"Enforce padding around `expect` groups",$s),Et="padding-around-test-blocks",Os=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:[g.TestToken,g.ItToken,g.FitToken,g.XitToken,g.XtestToken]},{paddingType:C.Always,prevStatementType:[g.TestToken,g.ItToken,g.FitToken,g.XitToken,g.XtestToken],nextStatementType:g.Any}],qo=D(Et,"Enforce padding around `test` blocks",Os),qt="padding-around-all",To=D(qt,"Enforce padding around vitest functions",[...As,...vs,...Cs,...Ss,...Ms,...$s,...Os]),Tt="valid-expect-in-promise",wo=["toRejectWith","toResolveWith"],wt=e=>{if(e.type===i.CallExpression&&e.callee.type===i.MemberExpression&&v(e.callee.property)){if(e.arguments.length===0)return!1;switch(m(e.callee.property)){case"then":return e.arguments.length<3;case"catch":case"finally":return e.arguments.length<2}}return!1},Ao=(e,s)=>{const t=h(e,s);if(t?.type!=="test")return!1;const n=t.members.some(a=>m(a)==="each");if(n&&e.callee.type!==i.TaggedTemplateExpression)return!0;const[,r]=e.arguments,o=Number(n);return r&&M(r)&&r.params.length===1+o},Rs=(e,s)=>{const{name:t}=s;if(e.argument===null)return!1;if(e.argument.type===i.CallExpression&&e.argument.arguments.length>0){const n=O(e.argument);if(["Promise.all","Promise.allSettled"].includes(n)){const[r]=e.argument.arguments;if(r.type===i.ArrayExpression&&r.elements.some(o=>o&&N(o,t)))return!0}if(["Promise.resolve","Promise.reject"].includes(n)&&e.argument.arguments.length===1)return N(e.argument.arguments[0],t)}return N(e.argument,t)},Ns=(e,s)=>{for(const t of s)if(t?.type===i.AwaitExpression&&N(t.argument,e)||t?.type===i.ArrayExpression&&Ns(e,t.elements))return!0;return!1},vo=(e,s)=>{let t=s;for(;t;){if(t.type===i.CallExpression){if(Ns(e,t.arguments))return!0;t=t.callee}if(t.type!==i.MemberExpression)break;t=t.object}return!1},Co=e=>{let s=e,t=e;for(;t&&(t.type===i.CallExpression&&(s=t,t=t.callee),t.type===i.MemberExpression);)t=t.object;return s},At=(e,s,t)=>{const{name:n}=e;for(const r of s)if(!(r.range[0]<=e.range[0])){if(r.type===i.ReturnStatement)return Rs(r,e);if(r.type===i.ExpressionStatement){if(r.expression.type===i.CallExpression){if(vo(n,r.expression))return!0;const o=Co(r.expression),a=h(r.expression,t);if(a?.type==="expect"&&o.arguments.length>0&&N(o.arguments[0],n)&&a.members.some(c=>{const l=m(c);return l===R.resolves||l===R.rejects}))return!0}if(r.expression.type===i.AwaitExpression&&Rs(r.expression,e))return!0;if(r.expression.type===i.AssignmentExpression){if(N(r.expression.left,n)&&O(r.expression.right)?.startsWith(`${n}.`)&&wt(r.expression.right))continue;break}}if(r.type===i.BlockStatement&&At(e,r.body,t))return!0}return!1},Bs=e=>{let s=e;for(;s;){if(s.type===i.BlockStatement)return s.body;s=s.parent}throw new Error("Could not find BlockStatement - please file a github issue at https://github.com/vitest-dev/eslint-plugin-vitest")},So=(e,s)=>{let t=e;for(;t;){if(M(t))return t=t.parent,t?.type===i.CallExpression&&q(t,s,["test"]);t=t.parent}return!1},Mo=(e,s)=>{const t=Bs(e);return N(e.id)?At(e.id,t,s):!0},$o=p({name:Tt,meta:{docs:{description:"require promises that have expectations in their chain to be valid"},messages:{expectInFloatingPromise:"This promise should either be returned or awaited to ensure the expects in its chain are called"},type:"suggestion",schema:[]},defaultOptions:[{alwaysAwait:!1,asyncMatchers:wo,minArgs:1,maxArgs:1}],create(e){let s=!1;const t=[];return{CallExpression(n){if(Ao(n,e)){s=!0;return}if(wt(n)){t.unshift(!1);return}t.length>0&&q(n,e,["expect"])&&(t[0]=!0)},"CallExpression:exit"(n){if(s){q(n,e,["test"])&&(s=!1);return}if(!wt(n)||!t.shift())return;const{parent:r}=Dt(n);if(!(!r||!So(r,e))){switch(r.type){case i.VariableDeclarator:{if(Mo(r,e))return;break}case i.AssignmentExpression:{if(r.left.type===i.Identifier&&At(r.left,Bs(r),e))return;break}case i.ExpressionStatement:break;case i.ReturnStatement:case i.AwaitExpression:default:return}e.report({messageId:"expectInFloatingPromise",node:r})}}}}}),vt="prefer-strict-boolean-matchers",Oo=p({name:vt,meta:{type:"suggestion",docs:{description:"enforce using `toBe(true)` and `toBe(false)` over matchers that coerce types to boolean",recommended:!1},messages:{preferToBeTrue:"Prefer using `toBe(true)` to test value is `true`",preferToBeFalse:"Prefer using `toBe(false)` to test value is `false`"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(!(t?.type==="expect"||t?.type==="expectTypeOf"))return;const n=m(t.matcher);n==="toBeFalsy"&&e.report({node:t.matcher,messageId:"preferToBeFalse",fix:r=>[r.replaceText(t.matcher,"toBe"),r.insertTextAfterRange([t.matcher.range[0],t.matcher.range[1]+1],"false")]}),n==="toBeTruthy"&&e.report({node:t.matcher,messageId:"preferToBeTrue",fix:r=>[r.replaceText(t.matcher,"toBe"),r.insertTextAfterRange([t.matcher.range[0],t.matcher.range[1]+1],"true")]})}}}}),Ct="require-mock-type-parameters",Ro=p({name:Ct,meta:{type:"suggestion",docs:{description:"enforce using type parameters with vitest mock functions",recommended:!1},messages:{noTypeParameter:"Missing type parameters"},fixable:"code",schema:[{type:"object",properties:{checkImportFunctions:{type:"boolean"}},additionalProperties:!1}]},defaultOptions:[{checkImportFunctions:!1}],create(e,[s]){return{CallExpression(t){const n=h(t,e);if(n?.type==="vi")for(const r of n?.members)!("name"in r)||r.parent.parent.typeArguments!==void 0||(r.name==="fn"&&e.report({node:r,messageId:"noTypeParameter"}),s.checkImportFunctions&&["importActual","importMock"].includes(r.name)&&e.report({node:r,messageId:"noTypeParameter"}))}}}}),St="prefer-called-once",No=e=>e.type===i.Literal&&e.value===1,Bo=p({name:St,meta:{docs:{description:"enforce using `toBeCalledOnce()` or `toHaveBeenCalledOnce()`",recommended:!1},messages:{preferCalledOnce:"Prefer {{ replacedMatcherName }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{matcher:n}=t,r=m(n);if(["toBeCalledTimes","toHaveBeenCalledTimes"].includes(r)&&t.args.length===1&&No(P(t))){const o=r.replace("Times","Once");e.report({data:{replacedMatcherName:o},messageId:"preferCalledOnce",node:n,fix:a=>[a.replaceText(n,o),a.remove(t.args[0])]})}}}}}),Mt="prefer-called-times",Lo=p({name:Mt,meta:{docs:{description:"enforce using `toBeCalledTimes(1)` or `toHaveBeenCalledTimes(1)`",recommended:!1},messages:{preferCalledTimes:"Prefer {{ replacedMatcherName }}(1)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{matcher:n}=t,r=m(n);if(["toBeCalledOnce","toHaveBeenCalledOnce"].includes(r)){const o=r.replace("Once","Times");e.report({data:{replacedMatcherName:o},messageId:"preferCalledTimes",node:n,fix:a=>[a.replaceText(n,o),a.insertTextAfterRange([t.matcher.range[0],t.matcher.range[1]+1],"1")]})}}}}}),$t="prefer-expect-type-of",Fo={string:"toBeString",number:"toBeNumber",boolean:"toBeBoolean",object:"toBeObject",function:"toBeFunction",symbol:"toBeSymbol",bigint:"toBeBigInt",undefined:"toBeUndefined"},Po=p({name:$t,meta:{type:"suggestion",docs:{description:"enforce using `expectTypeOf` instead of `expect(typeof ...)`",recommended:!1},schema:[],fixable:"code",messages:{preferExpectTypeOf:'Use `expectTypeOf({{ value }}).{{ matcher }}()` instead of `expect(typeof {{ value }}).toBe("{{ type }}")`'}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect"||t.head.node.parent?.type!==i.CallExpression)return;const n=t.head.node.parent,[r]=n.arguments;if(!r||r.type!==i.UnaryExpression||r.operator!=="typeof")return;const o=m(t.matcher);if(o!=="toBe"&&o!=="toEqual")return;const[a]=t.args;if(!a||a.type!==i.Literal||typeof a.value!="string")return;const c=a.value,l=Fo[c];if(!l)return;const d=e.sourceCode.getText(r.argument),f=t.modifiers.map(x=>m(x)).join("."),u=f?`.${f}`:"";e.report({node:s,messageId:"preferExpectTypeOf",data:{value:d,matcher:l,type:c},fix(x){return x.replaceText(s,`expectTypeOf(${d})${u}.${l}()`)}})}}}}),Ls="warn-todo",Uo=p({name:Ls,meta:{docs:{description:"disallow `.todo` usage",recommended:!1},messages:{warnTodo:"The use of `.todo` is not recommended."},type:"suggestion",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="describe"&&t?.type!=="test"&&t?.type!=="it")return;const n=t.members.find(r=>r.type==="Identifier"&&r.name==="todo");n&&e.report({messageId:"warnTodo",node:n})}}}}),Ot="prefer-import-in-mock",jo=p({name:Ot,meta:{fixable:"code",type:"suggestion",docs:{description:"prefer dynamic import in mock"},messages:{preferImport:"Replace '{{path}}' with import('{{path}}')"},schema:[]},defaultOptions:[],create(e){return{CallExpression(s){if(s.callee.type!==i.MemberExpression)return;const{object:t,property:n}=s.callee;if(t.type!==i.Identifier||t.name!=="vi"||n.type!==i.Identifier)return;const r=n.name,o=s.arguments[0];r==="mock"&&o&&o.type===i.Literal&&e.report({messageId:"preferImport",data:{path:o.value},node:s,fix(a){return a.replaceText(o,`import('${o.value}')`)}})}}}}),ae="prefer-called-exactly-once-with",_o=p({name:ae,meta:{docs:{description:"Prefer `toHaveBeenCalledExactlyOnceWith` over `toHaveBeenCalledOnce` and `toHaveBeenCalledWith`"},messages:{preferCalledExactlyOnceWith:"Prefer {{matcherName}} (/* 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=>m(o)==="not"))return;const{matcher:n}=t,r=m(n);["toHaveBeenCalledOnce","toHaveBeenCalledWith"].includes(r)&&e.report({data:{matcherName:r},messageId:"preferCalledExactlyOnceWith",node:n,fix:o=>[o.replaceText(n,`${r}ExactlyOnceWith`)]})}}}}),Fs=e=>Object.keys(e).reduce((s,t)=>({...s,[`vitest/${t}`]:e[t]}),{}),Ps=e=>({plugins:["@vitest"],rules:Object.keys(e).reduce((s,t)=>({...s,[`@vitest/${t}`]:e[t]}),{})}),Us={[de]:"warn",[fe]:"warn",[me]:"warn",[ge]:"warn",[be]:"warn",[Ie]:"warn",[qe]:"warn",[Te]:"warn",[we]:"warn",[Ae]:"warn",[ve]:"warn",[Ce]:"warn",[Be]:"warn",[Le]:"warn",[Fe]:"warn",[Pe]:"warn",[Ue]:"warn",[je]:"warn",[_e]:"warn",[De]:"warn",[We]:"warn",[He]:"warn",[Ve]:"warn",[Ke]:"warn",[ze]:"off",[Ge]:"warn",[Xe]:"off",[Ye]:"warn",[Je]:"warn",[Qe]:"warn",[Ze]:"warn",[et]:"warn",[tt]:"warn",[st]:"warn",[nt]:"warn",[ot]:"warn",[it]:"warn",[at]:"warn",[ct]:"warn",[lt]:"warn",[ut]:"warn",[pt]:"warn",[dt]:"warn",[ft]:"warn",[mt]:"warn",[qs]:"warn",[Ee]:"warn",[ht]:"warn",[gt]:"warn",[qt]:"warn",[kt]:"warn",[bt]:"warn",[xt]:"warn",[It]:"warn",[Et]:"warn",[Tt]:"warn",[J]:"warn",[z]:"warn",[Z]:"warn",[te]:"warn",[ne]:"warn",[oe]:"warn",[ie]:"warn",[ee]:"warn",[vt]:"warn",[Ct]:"warn",[Re]:"off",[Ne]:"warn",[St]:"off",[Mt]:"warn",[$t]:"warn",[ke]:"warn",[Ot]:"warn",[ae]:"warn"},js={[J]:"error",[z]:"error",[Z]:"error",[te]:"error",[ne]:"error",[oe]:"error",[ie]:"error",[ee]:"error",[ae]:"error"},Do={[de]:fn,[fe]:mn,[z]:yn,[me]:hn,[ge]:gn,[J]:bn,[ke]:En,[be]:Tn,[Ie]:An,[Ee]:$n,[qe]:On,[Te]:Rn,[we]:Nn,[Ae]:Bn,[ve]:Ln,[Z]:Pn,[Ce]:Un,[Be]:Vn,[Le]:Kn,[Fe]:Xn,[Pe]:zn,[Ue]:Yn,[je]:Jn,[_e]:Zn,[De]:tr,[We]:sr,[He]:nr,[Ve]:or,[ee]:jn,[Ke]:ir,[te]:lr,[ne]:fr,[ze]:xr,[Ge]:hr,[Xe]:kr,[Ye]:Ir,[Je]:Er,[Qe]:qr,[Ze]:Tr,[et]:wr,[tt]:Ar,[st]:vr,[ie]:zr,[nt]:Sr,[ot]:Pr,[it]:Dr,[oe]:Wr,[at]:Hr,[ct]:Vr,[lt]:Xr,[ut]:Qr,[pt]:to,[dt]:oo,[ft]:io,[mt]:co,[qs]:uo,[ht]:go,[gt]:ko,[qt]:To,[kt]:bo,[bt]:xo,[xt]:Io,[It]:Eo,[Et]:qo,[Tt]:$o,[vt]:Oo,[Ct]:Ro,[Re]:Wn,[Ne]:Hn,[St]:Bo,[Mt]:Lo,[$t]:Po,[Ls]:Uo,[Ot]:jo,[ae]:_o},Rt={meta:{name:"vitest",version:Hs},rules:Do,environments:{env:{globals:{suite:!0,test:!0,describe:!0,it:!0,expectTypeOf:!0,assertType:!0,expect:!0,assert:!0,chai:!0,vitest:!0,vi:!0,beforeAll:!0,afterAll:!0,beforeEach:!0,afterEach:!0,onTestFailed:!0,onTestFinished:!0}}},configs:{"legacy-recommended":Ps(js),"legacy-all":Ps(Us),recommended:{name:"vitest/recommended",plugins:{get vitest(){return Rt}},rules:Fs(js)},all:{name:"vitest/all",plugins:{get vitest(){return Rt}},rules:Fs(Us)},env:{name:"vitest/env",languageOptions:{globals:{suite:"writable",test:"writable",describe:"writable",it:"writable",expectTypeOf:"writable",assertType:"writable",expect:"writable",assert:"writable",chai:"writable",vitest:"writable",vi:"writable",beforeAll:"writable",afterAll:"writable",beforeEach:"writable",afterEach:"writable",onTestFailed:"writable",onTestFinished:"writable"}}}}};export{Rt as default};
8
+ `;return o.insertTextAfter(a,l)}})},fo={0:()=>!0,1:po},mo=()=>{let e=null;return{get prevNode(){return e.prevNode},set prevNode(s){e.prevNode=s},enter(){e={upper:e,prevNode:null}},exit(){e=e.upper}}},$=e=>(s,t)=>{let n=s;if(n.type===i.ExpressionStatement){n.expression.type===i.AwaitExpression&&(n=n.expression.argument);const r=t.getFirstToken(n);return r?.type===Nt.Identifier&&r.value===e}return!1},yo={0:()=>!0,1:$("afterAll"),2:$("afterEach"),3:$("beforeAll"),4:$("beforeEach"),5:$("describe"),6:$("expect"),7:$("expectTypeOf"),8:$("fdescribe"),9:$("fit"),10:$("it"),11:$("test"),12:$("xdescribe"),13:$("xit"),14:$("xtest")},yt=(e,s,t)=>{let n=e;const{sourceCode:r}=t;for(;n.type===i.LabeledStatement;)n=n.body;return Array.isArray(s)?s.some(o=>yt(n,o,t)):yo[s](n,r)},ho=(e,s,t)=>{const{configs:n}=t,r=o=>fo[o](e,s,t);for(let o=n.length-1;o>=0;--o){const{prevStatementType:a,nextStatementType:c,paddingType:l}=n[o];if(yt(e,a,t)&&yt(s,c,t))return r(l)}return r(0)},ws=(e,s)=>{const{scopeInfo:t}=s;Rr(e?.parent.type)&&(t.prevNode&&ho(t.prevNode,e,s),t.prevNode=e)},D=(e,s,t,n=!1)=>p({name:e,meta:{docs:{description:s},fixable:"whitespace",deprecated:n,messages:{missingPadding:"expect blank line before this statement"},schema:[],type:"suggestion"},defaultOptions:[],create(r){const o={ruleContext:r,sourceCode:r.sourceCode??r.getSourceCode(),scopeInfo:mo(),configs:t},{scopeInfo:a}=o;return{Program:a.enter,"Program:exit":a.exit,BlockStatement:a.enter,"BlockStatement:exit":a.exit,SwitchStatement:a.enter,"SwitchStatement:exit":a.exit,":statement":c=>ws(c,o),SwitchCase(c){ws(c,o),a.enter()},"SwitchCase:exit":a.exit}}}),ht="padding-around-after-all-blocks",As=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.AfterAllToken},{paddingType:C.Always,prevStatementType:g.AfterAllToken,nextStatementType:g.Any}],go=D(ht,"Enforce padding around `afterAll` blocks",As),gt="padding-around-after-each-blocks",vs=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.AfterEachToken},{paddingType:C.Always,prevStatementType:g.AfterEachToken,nextStatementType:g.Any}],ko=D(gt,"Enforce padding around `afterEach` blocks",vs),kt="padding-around-before-all-blocks",Cs=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.BeforeAllToken},{paddingType:C.Always,prevStatementType:g.BeforeAllToken,nextStatementType:g.Any}],bo=D(kt,"Enforce padding around `beforeAll` blocks",Cs),bt="padding-around-before-each-blocks",Ss=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.BeforeEachToken},{paddingType:C.Always,prevStatementType:g.BeforeEachToken,nextStatementType:g.Any}],xo=D(bt,"Enforce padding around `beforeEach` blocks",Ss),xt="padding-around-describe-blocks",Ms=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:[g.DescribeToken,g.FdescribeToken,g.XdescribeToken]},{paddingType:C.Always,prevStatementType:[g.DescribeToken,g.FdescribeToken,g.XdescribeToken],nextStatementType:g.Any}],Io=D(xt,"Enforce padding around `describe` blocks",Ms),It="padding-around-expect-groups",$s=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.ExpectToken},{paddingType:C.Always,prevStatementType:g.ExpectToken,nextStatementType:g.Any},{paddingType:C.Any,prevStatementType:g.ExpectToken,nextStatementType:g.ExpectToken},{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:g.ExpectTypeOfToken},{paddingType:C.Always,prevStatementType:g.ExpectTypeOfToken,nextStatementType:g.Any},{paddingType:C.Any,prevStatementType:g.ExpectTypeOfToken,nextStatementType:g.ExpectTypeOfToken}],Eo=D(It,"Enforce padding around `expect` groups",$s),Et="padding-around-test-blocks",Os=[{paddingType:C.Always,prevStatementType:g.Any,nextStatementType:[g.TestToken,g.ItToken,g.FitToken,g.XitToken,g.XtestToken]},{paddingType:C.Always,prevStatementType:[g.TestToken,g.ItToken,g.FitToken,g.XitToken,g.XtestToken],nextStatementType:g.Any}],qo=D(Et,"Enforce padding around `test` blocks",Os),qt="padding-around-all",To=D(qt,"Enforce padding around vitest functions",[...As,...vs,...Cs,...Ss,...Ms,...$s,...Os]),Tt="valid-expect-in-promise",wo=["toRejectWith","toResolveWith"],wt=e=>{if(e.type===i.CallExpression&&e.callee.type===i.MemberExpression&&v(e.callee.property)){if(e.arguments.length===0)return!1;switch(m(e.callee.property)){case"then":return e.arguments.length<3;case"catch":case"finally":return e.arguments.length<2}}return!1},Ao=(e,s)=>{const t=h(e,s);if(t?.type!=="test")return!1;const n=t.members.some(a=>m(a)==="each");if(n&&e.callee.type!==i.TaggedTemplateExpression)return!0;const[,r]=e.arguments,o=Number(n);return r&&M(r)&&r.params.length===1+o},Rs=(e,s)=>{const{name:t}=s;if(e.argument===null)return!1;if(e.argument.type===i.CallExpression&&e.argument.arguments.length>0){const n=O(e.argument);if(["Promise.all","Promise.allSettled"].includes(n)){const[r]=e.argument.arguments;if(r.type===i.ArrayExpression&&r.elements.some(o=>o&&N(o,t)))return!0}if(["Promise.resolve","Promise.reject"].includes(n)&&e.argument.arguments.length===1)return N(e.argument.arguments[0],t)}return N(e.argument,t)},Ns=(e,s)=>{for(const t of s)if(t?.type===i.AwaitExpression&&N(t.argument,e)||t?.type===i.ArrayExpression&&Ns(e,t.elements))return!0;return!1},vo=(e,s)=>{let t=s;for(;t;){if(t.type===i.CallExpression){if(Ns(e,t.arguments))return!0;t=t.callee}if(t.type!==i.MemberExpression)break;t=t.object}return!1},Co=e=>{let s=e,t=e;for(;t&&(t.type===i.CallExpression&&(s=t,t=t.callee),t.type===i.MemberExpression);)t=t.object;return s},At=(e,s,t)=>{const{name:n}=e;for(const r of s)if(!(r.range[0]<=e.range[0])){if(r.type===i.ReturnStatement)return Rs(r,e);if(r.type===i.ExpressionStatement){if(r.expression.type===i.CallExpression){if(vo(n,r.expression))return!0;const o=Co(r.expression),a=h(r.expression,t);if(a?.type==="expect"&&o.arguments.length>0&&N(o.arguments[0],n)&&a.members.some(c=>{const l=m(c);return l===R.resolves||l===R.rejects}))return!0}if(r.expression.type===i.AwaitExpression&&Rs(r.expression,e))return!0;if(r.expression.type===i.AssignmentExpression){if(N(r.expression.left,n)&&O(r.expression.right)?.startsWith(`${n}.`)&&wt(r.expression.right))continue;break}}if(r.type===i.BlockStatement&&At(e,r.body,t))return!0}return!1},Bs=e=>{let s=e;for(;s;){if(s.type===i.BlockStatement)return s.body;s=s.parent}throw new Error("Could not find BlockStatement - please file a github issue at https://github.com/vitest-dev/eslint-plugin-vitest")},So=(e,s)=>{let t=e;for(;t;){if(M(t))return t=t.parent,t?.type===i.CallExpression&&q(t,s,["test"]);t=t.parent}return!1},Mo=(e,s)=>{const t=Bs(e);return N(e.id)?At(e.id,t,s):!0},$o=p({name:Tt,meta:{docs:{description:"require promises that have expectations in their chain to be valid"},messages:{expectInFloatingPromise:"This promise should either be returned or awaited to ensure the expects in its chain are called"},type:"suggestion",schema:[]},defaultOptions:[{alwaysAwait:!1,asyncMatchers:wo,minArgs:1,maxArgs:1}],create(e){let s=!1;const t=[];return{CallExpression(n){if(Ao(n,e)){s=!0;return}if(wt(n)){t.unshift(!1);return}t.length>0&&q(n,e,["expect"])&&(t[0]=!0)},"CallExpression:exit"(n){if(s){q(n,e,["test"])&&(s=!1);return}if(!wt(n)||!t.shift())return;const{parent:r}=Dt(n);if(!(!r||!So(r,e))){switch(r.type){case i.VariableDeclarator:{if(Mo(r,e))return;break}case i.AssignmentExpression:{if(r.left.type===i.Identifier&&At(r.left,Bs(r),e))return;break}case i.ExpressionStatement:break;case i.ReturnStatement:case i.AwaitExpression:default:return}e.report({messageId:"expectInFloatingPromise",node:r})}}}}}),vt="prefer-strict-boolean-matchers",Oo=p({name:vt,meta:{type:"suggestion",docs:{description:"enforce using `toBe(true)` and `toBe(false)` over matchers that coerce types to boolean",recommended:!1},messages:{preferToBeTrue:"Prefer using `toBe(true)` to test value is `true`",preferToBeFalse:"Prefer using `toBe(false)` to test value is `false`"},fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(!(t?.type==="expect"||t?.type==="expectTypeOf"))return;const n=m(t.matcher);n==="toBeFalsy"&&e.report({node:t.matcher,messageId:"preferToBeFalse",fix:r=>[r.replaceText(t.matcher,"toBe"),r.insertTextAfterRange([t.matcher.range[0],t.matcher.range[1]+1],"false")]}),n==="toBeTruthy"&&e.report({node:t.matcher,messageId:"preferToBeTrue",fix:r=>[r.replaceText(t.matcher,"toBe"),r.insertTextAfterRange([t.matcher.range[0],t.matcher.range[1]+1],"true")]})}}}}),Ct="require-mock-type-parameters",Ro=p({name:Ct,meta:{type:"suggestion",docs:{description:"enforce using type parameters with vitest mock functions",recommended:!1},messages:{noTypeParameter:"Missing type parameters"},fixable:"code",schema:[{type:"object",properties:{checkImportFunctions:{type:"boolean"}},additionalProperties:!1}]},defaultOptions:[{checkImportFunctions:!1}],create(e,[s]){return{CallExpression(t){const n=h(t,e);if(n?.type==="vi")for(const r of n?.members)!("name"in r)||r.parent.parent.typeArguments!==void 0||(r.name==="fn"&&e.report({node:r,messageId:"noTypeParameter"}),s.checkImportFunctions&&["importActual","importMock"].includes(r.name)&&e.report({node:r,messageId:"noTypeParameter"}))}}}}),St="prefer-called-once",No=e=>e.type===i.Literal&&e.value===1,Bo=p({name:St,meta:{docs:{description:"enforce using `toBeCalledOnce()` or `toHaveBeenCalledOnce()`",recommended:!1},messages:{preferCalledOnce:"Prefer {{ replacedMatcherName }}()"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{matcher:n}=t,r=m(n);if(["toBeCalledTimes","toHaveBeenCalledTimes"].includes(r)&&t.args.length===1&&No(P(t))){const o=r.replace("Times","Once");e.report({data:{replacedMatcherName:o},messageId:"preferCalledOnce",node:n,fix:a=>[a.replaceText(n,o),a.remove(t.args[0])]})}}}}}),Mt="prefer-called-times",Lo=p({name:Mt,meta:{docs:{description:"enforce using `toBeCalledTimes(1)` or `toHaveBeenCalledTimes(1)`",recommended:!1},messages:{preferCalledTimes:"Prefer {{ replacedMatcherName }}(1)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect")return;const{matcher:n}=t,r=m(n);if(["toBeCalledOnce","toHaveBeenCalledOnce"].includes(r)){const o=r.replace("Once","Times");e.report({data:{replacedMatcherName:o},messageId:"preferCalledTimes",node:n,fix:a=>[a.replaceText(n,o),a.insertTextAfterRange([t.matcher.range[0],t.matcher.range[1]+1],"1")]})}}}}}),$t="prefer-expect-type-of",Fo={string:"toBeString",number:"toBeNumber",boolean:"toBeBoolean",object:"toBeObject",function:"toBeFunction",symbol:"toBeSymbol",bigint:"toBeBigInt",undefined:"toBeUndefined"},Po=p({name:$t,meta:{type:"suggestion",docs:{description:"enforce using `expectTypeOf` instead of `expect(typeof ...)`",recommended:!1},schema:[],fixable:"code",messages:{preferExpectTypeOf:'Use `expectTypeOf({{ value }}).{{ matcher }}()` instead of `expect(typeof {{ value }}).toBe("{{ type }}")`'}},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="expect"||t.head.node.parent?.type!==i.CallExpression)return;const n=t.head.node.parent,[r]=n.arguments;if(!r||r.type!==i.UnaryExpression||r.operator!=="typeof")return;const o=m(t.matcher);if(o!=="toBe"&&o!=="toEqual")return;const[a]=t.args;if(!a||a.type!==i.Literal||typeof a.value!="string")return;const c=a.value,l=Fo[c];if(!l)return;const d=e.sourceCode.getText(r.argument),f=t.modifiers.map(x=>m(x)).join("."),u=f?`.${f}`:"";e.report({node:s,messageId:"preferExpectTypeOf",data:{value:d,matcher:l,type:c},fix(x){return x.replaceText(s,`expectTypeOf(${d})${u}.${l}()`)}})}}}}),Ls="warn-todo",Uo=p({name:Ls,meta:{docs:{description:"disallow `.todo` usage",recommended:!1},messages:{warnTodo:"The use of `.todo` is not recommended."},type:"suggestion",schema:[]},defaultOptions:[],create(e){return{CallExpression(s){const t=h(s,e);if(t?.type!=="describe"&&t?.type!=="test"&&t?.type!=="it")return;const n=t.members.find(r=>r.type==="Identifier"&&r.name==="todo");n&&e.report({messageId:"warnTodo",node:n})}}}}),Ot="prefer-import-in-mock",jo=p({name:Ot,meta:{fixable:"code",type:"suggestion",docs:{description:"prefer dynamic import in mock"},messages:{preferImport:"Replace '{{path}}' with import('{{path}}')"},schema:[]},defaultOptions:[],create(e){return{CallExpression(s){if(s.callee.type!==i.MemberExpression)return;const{object:t,property:n}=s.callee;if(t.type!==i.Identifier||t.name!=="vi"||n.type!==i.Identifier)return;const r=n.name,o=s.arguments[0];r==="mock"&&o&&o.type===i.Literal&&e.report({messageId:"preferImport",data:{path:o.value},node:s,fix(a){return a.replaceText(o,`import('${o.value}')`)}})}}}}),ae="prefer-called-exactly-once-with",_o=p({name:ae,meta:{docs:{description:"Prefer `toHaveBeenCalledExactlyOnceWith` over `toHaveBeenCalledOnce` and `toHaveBeenCalledWith`"},messages:{preferCalledExactlyOnceWith:"Prefer {{matcherName}} (/* 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=>m(o)==="not"))return;const{matcher:n}=t,r=m(n);["toHaveBeenCalledOnce","toHaveBeenCalledWith"].includes(r)&&e.report({data:{matcherName:r},messageId:"preferCalledExactlyOnceWith",node:n,fix:o=>[o.replaceText(n,"toHaveBeenCalledExactlyOnceWith")]})}}}}),Fs=e=>Object.keys(e).reduce((s,t)=>({...s,[`vitest/${t}`]:e[t]}),{}),Ps=e=>({plugins:["@vitest"],rules:Object.keys(e).reduce((s,t)=>({...s,[`@vitest/${t}`]:e[t]}),{})}),Us={[de]:"warn",[fe]:"warn",[me]:"warn",[ge]:"warn",[be]:"warn",[Ie]:"warn",[qe]:"warn",[Te]:"warn",[we]:"warn",[Ae]:"warn",[ve]:"warn",[Ce]:"warn",[Be]:"warn",[Le]:"warn",[Fe]:"warn",[Pe]:"warn",[Ue]:"warn",[je]:"warn",[_e]:"warn",[De]:"warn",[We]:"warn",[He]:"warn",[Ve]:"warn",[Ke]:"warn",[ze]:"off",[Ge]:"warn",[Xe]:"off",[Ye]:"warn",[Je]:"warn",[Qe]:"warn",[Ze]:"warn",[et]:"warn",[tt]:"warn",[st]:"warn",[nt]:"warn",[ot]:"warn",[it]:"warn",[at]:"warn",[ct]:"warn",[lt]:"warn",[ut]:"warn",[pt]:"warn",[dt]:"warn",[ft]:"warn",[mt]:"warn",[qs]:"warn",[Ee]:"warn",[ht]:"warn",[gt]:"warn",[qt]:"warn",[kt]:"warn",[bt]:"warn",[xt]:"warn",[It]:"warn",[Et]:"warn",[Tt]:"warn",[J]:"warn",[z]:"warn",[Z]:"warn",[te]:"warn",[ne]:"warn",[oe]:"warn",[ie]:"warn",[ee]:"warn",[vt]:"warn",[Ct]:"warn",[Re]:"off",[Ne]:"warn",[St]:"off",[Mt]:"warn",[$t]:"warn",[ke]:"warn",[Ot]:"warn",[ae]:"warn"},js={[J]:"error",[z]:"error",[Z]:"error",[te]:"error",[ne]:"error",[oe]:"error",[ie]:"error",[ee]:"error",[ae]:"error"},Do={[de]:fn,[fe]:mn,[z]:yn,[me]:hn,[ge]:gn,[J]:bn,[ke]:En,[be]:Tn,[Ie]:An,[Ee]:$n,[qe]:On,[Te]:Rn,[we]:Nn,[Ae]:Bn,[ve]:Ln,[Z]:Pn,[Ce]:Un,[Be]:Vn,[Le]:Kn,[Fe]:Xn,[Pe]:zn,[Ue]:Yn,[je]:Jn,[_e]:Zn,[De]:tr,[We]:sr,[He]:nr,[Ve]:or,[ee]:jn,[Ke]:ir,[te]:lr,[ne]:fr,[ze]:xr,[Ge]:hr,[Xe]:kr,[Ye]:Ir,[Je]:Er,[Qe]:qr,[Ze]:Tr,[et]:wr,[tt]:Ar,[st]:vr,[ie]:zr,[nt]:Sr,[ot]:Pr,[it]:Dr,[oe]:Wr,[at]:Hr,[ct]:Vr,[lt]:Xr,[ut]:Qr,[pt]:to,[dt]:oo,[ft]:io,[mt]:co,[qs]:uo,[ht]:go,[gt]:ko,[qt]:To,[kt]:bo,[bt]:xo,[xt]:Io,[It]:Eo,[Et]:qo,[Tt]:$o,[vt]:Oo,[Ct]:Ro,[Re]:Wn,[Ne]:Hn,[St]:Bo,[Mt]:Lo,[$t]:Po,[Ls]:Uo,[Ot]:jo,[ae]:_o},Rt={meta:{name:"vitest",version:Hs},rules:Do,environments:{env:{globals:{suite:!0,test:!0,describe:!0,it:!0,expectTypeOf:!0,assertType:!0,expect:!0,assert:!0,chai:!0,vitest:!0,vi:!0,beforeAll:!0,afterAll:!0,beforeEach:!0,afterEach:!0,onTestFailed:!0,onTestFinished:!0}}},configs:{"legacy-recommended":Ps(js),"legacy-all":Ps(Us),recommended:{name:"vitest/recommended",plugins:{get vitest(){return Rt}},rules:Fs(js)},all:{name:"vitest/all",plugins:{get vitest(){return Rt}},rules:Fs(Us)},env:{name:"vitest/env",languageOptions:{globals:{suite:"writable",test:"writable",describe:"writable",it:"writable",expectTypeOf:"writable",assertType:"writable",expect:"writable",assert:"writable",chai:"writable",vitest:"writable",vi:"writable",beforeAll:"writable",afterAll:"writable",beforeEach:"writable",afterEach:"writable",onTestFailed:"writable",onTestFinished:"writable"}}}}};export{Rt as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitest/eslint-plugin",
3
- "version": "1.3.15",
3
+ "version": "1.3.16",
4
4
  "license": "MIT",
5
5
  "description": "Eslint plugin for vitest",
6
6
  "repository": "vitest-dev/eslint-plugin-vitest",