@vitest/eslint-plugin 1.1.39 → 1.1.40

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,4 +1,4 @@
1
- "use strict";const utils=require("@typescript-eslint/utils"),node_path=require("node:path"),o$3=require("typescript"),node_module=require("node:module");var _documentCurrentScript=typeof document<"u"?document.currentScript:null;function _interopDefaultCompat(d){return d&&typeof d=="object"&&"default"in d?d.default:d}const o__default=_interopDefaultCompat(o$3),version="1.1.39";function createEslintRule(d){return utils.ESLintUtils.RuleCreator(q=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${q}.md`)(d)}const joinNames=(d,q)=>d&&q?`${d}.${q}`:null,isFunction=d=>d.type===utils.AST_NODE_TYPES.FunctionExpression||d.type===utils.AST_NODE_TYPES.ArrowFunctionExpression;function getNodeName(d){if(isSupportedAccessor(d))return getAccessorValue(d);switch(d.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeName(d.tag);case utils.AST_NODE_TYPES.MemberExpression:return joinNames(getNodeName(d.object),getNodeName(d.property));case utils.AST_NODE_TYPES.NewExpression:case utils.AST_NODE_TYPES.CallExpression:return getNodeName(d.callee)}return null}const isSupportedAccessor=(d,q)=>isIdentifier(d,q)||isStringNode(d,q),isIdentifier=(d,q)=>d.type===utils.AST_NODE_TYPES.Identifier&&(q===void 0||d.name===q),p$2=(d,q)=>d.type===utils.AST_NODE_TYPES.TemplateLiteral&&d.quasis.length===1&&(q===void 0||d.quasis[0].value.raw===q),g$2=(d,q)=>d.type===utils.AST_NODE_TYPES.Literal&&typeof d.value=="string"&&(q===void 0||d.value===q),isStringNode=(d,q)=>g$2(d,q)||p$2(d,q),getAccessorValue=d=>d.type===utils.AST_NODE_TYPES.Identifier?d.name:getStringValue(d),getStringValue=d=>d?.type===utils.AST_NODE_TYPES.TemplateLiteral?d.quasis[0].value.raw:d?.value,replaceAccessorFixer=(d,q,b)=>d.replaceText(q,q.type===utils.AST_NODE_TYPES.Identifier?b:`'${b}'`),removeExtraArgumentsFixer=(d,q,b,Y)=>{const $=b.arguments[Y],B=b.arguments[b.arguments.length-1],{sourceCode:H}=q;let V=H.getTokenAfter(B);return V.value===","&&(V=H.getTokenAfter(V)),d.removeRange([$.range[0],V.range[0]])},isParsedInstanceOfMatcherCall=(d,q)=>getAccessorValue(d.matcher)==="toBeInstanceOf"&&d.args.length===1&&isSupportedAccessor(d.args[0],q);var DescribeAlias=(d=>(d.describe="describe",d.fdescribe="fdescribe",d.xdescribe="xdescribe",d))(DescribeAlias||{}),TestCaseName=(d=>(d.fit="fit",d.it="it",d.test="test",d.xit="xit",d.xtest="xtest",d.bench="bench",d))(TestCaseName||{}),HookName=(d=>(d.beforeAll="beforeAll",d.beforeEach="beforeEach",d.afterAll="afterAll",d.afterEach="afterEach",d))(HookName||{}),ModifierName=(d=>(d.to="to",d.have="have",d.not="not",d.rejects="rejects",d.resolves="resolves",d.returns="returns",d.branded="branded",d.asserts="asserts",d.constructorParameters="constructorParameters",d.parameters="parameters",d.thisParameter="thisParameter",d.guards="guards",d.instance="instance",d.items="items",d))(ModifierName||{}),EqualityMatcher=(d=>(d.toBe="toBe",d.toEqual="toEqual",d.toStrictEqual="toStrictEqual",d))(EqualityMatcher||{});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"]),isTypeOfVitestFnCall=(d,q,b)=>{const Y=parseVitestFnCall(d,q);return Y!==null&&b.includes(Y.type)},parseVitestFnCall=(d,q)=>{const b=parseVitestFnCallWithReason(d,q);return typeof b=="string"?null:b},y$4=new WeakMap,parseVitestFnCallWithReason=(d,q)=>{let b=y$4.get(d);return b||(b=P$2(d,q),y$4.set(d,b),b)},F=d=>d==="expect"?"expect":d==="expectTypeOf"?"expectTypeOf":d==="vi"?"vi":DescribeAlias.hasOwnProperty(d)?"describe":TestCaseName.hasOwnProperty(d)?"test":HookName.hasOwnProperty(d)?"hook":"unknown",A$3=d=>{const q=[];for(const b of d){if(b.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&b.parent.parent?.type===utils.AST_NODE_TYPES.CallExpression)return{matcher:b,args:b.parent.parent.arguments,modifiers:q};const Y=getAccessorValue(b);if(q.length===0){if(!ModifierName.hasOwnProperty(Y))return"modifier-unknown"}else if(q.length===1){if(Y!==ModifierName.not&&Y!=ModifierName.have)return"modifier-unknown";const $=getAccessorValue(q[0]);if($!==ModifierName.resolves&&$!==ModifierName.rejects&&$!==ModifierName.to)return"modifier-unknown"}else return"modifier-unknown";q.push(b)}return"matcher-not-found"},w$2=(d,q)=>{const b=A$3(d.members);return typeof b=="string"?b:{...d,type:q,...b}},findTopMostCallExpression=d=>{let q=d,{parent:b}=d;for(;b;){if(b.type===utils.AST_NODE_TYPES.CallExpression){q=b,b=b.parent;continue}if(b.type!==utils.AST_NODE_TYPES.MemberExpression)break;b=b.parent}return q},P$2=(d,q)=>{const b=getNodeChain(d);if(!b?.length)return null;const[Y,...$]=b,B=getAccessorValue(b[b.length-1]);if(B==="each"&&d.callee.type!==utils.AST_NODE_TYPES.CallExpression&&d.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||d.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&B!=="each")return null;const H=k$2(q,d,getAccessorValue(Y));if(!H)return null;const V=H.original??H.local,K=[V,...$.map(getAccessorValue)];if(H.type!=="testContext"&&V!=="vi"&&V!=="expect"&&V!=="expectTypeOf"&&!ValidVitestFnCallChains.has(K.join(".")))return null;const G={name:V,head:{...H,node:Y},members:$},J=F(V);if(J==="expect"||J==="expectTypeOf"){const X=w$2(G,J);return typeof X=="string"&&findTopMostCallExpression(d)!==d?null:X==="matcher-not-found"&&d.parent?.type===utils.AST_NODE_TYPES.MemberExpression?"matcher-not-called":X}return b.slice(0,b.length-1).some(X=>X.parent?.type!==utils.AST_NODE_TYPES.MemberExpression)||d.parent?.type===utils.AST_NODE_TYPES.CallExpression||d.parent?.type===utils.AST_NODE_TYPES.MemberExpression?null:{...G,type:J}},M$3=(d,q)=>d&&q?[...d,...q]:null;function getNodeChain(d){if(isSupportedAccessor(d))return[d];switch(d.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeChain(d.tag);case utils.AST_NODE_TYPES.MemberExpression:return M$3(getNodeChain(d.object),getNodeChain(d.property));case utils.AST_NODE_TYPES.CallExpression:return getNodeChain(d.callee)}return null}const k$2=(d,q,b)=>{const Y=d.sourceCode.getScope?d.sourceCode.getScope(q):d.getScope(),$=resolveScope(Y,b);return $==="local"?null:$==="testContext"?{local:b,original:null,type:"testContext"}:$?$.source==="vitest"?{original:$.imported,local:$.local,type:"import"}:null:{original:N$4(b,d),local:b,type:"global"}},N$4=(d,q)=>{const b=q.settings.vitest?.globalAliases??{},Y=Object.entries(b).find(([$,B])=>B.includes(d));return Y?Y[0]:null},I$1=({parent:d})=>{if(d?.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.Identifier)return TestCaseName.hasOwnProperty(d.callee.name)},resolveScope=(d,q)=>{let b=d;for(;b!==null;){const Y=b.set.get(q);if(Y&&Y.defs.length>0){const $=Y.defs[Y.defs.length-1],B=isFunction($.node)?$.node.params.find(K=>K.type===utils.AST_NODE_TYPES.ObjectPattern):void 0;if(B){const K=B.properties.find(G=>G.type===utils.AST_NODE_TYPES.Property);if((K?.key.type===utils.AST_NODE_TYPES.Identifier?K.key:void 0)?.name===q)return"testContext"}const H=isFunction($.node)?$.node.params.find(K=>K.type===utils.AST_NODE_TYPES.Identifier):void 0;if(H&&I$1(H.parent))return"testContext";const V=O$2($);return V?.local===q?V:"local"}b=b.upper}return null},v=d=>d.type===utils.AST_NODE_TYPES.AwaitExpression?d.argument.type===utils.AST_NODE_TYPES.ImportExpression?d.argument.source:null:d.type===utils.AST_NODE_TYPES.CallExpression&&isIdentifier(d.callee,"require")?d.arguments[0]??null:null,R=d=>d.parent.type===utils.AST_NODE_TYPES.TSImportEqualsDeclaration||d.node.type!==utils.AST_NODE_TYPES.ImportSpecifier||d.node.imported.type!=utils.AST_NODE_TYPES.Identifier||d.parent.importKind==="type"?null:{source:d.parent.source.value,imported:d.node.imported.name,local:d.node.local.name},O$2=d=>d.type==="Variable"?D$1(d):d.type==="ImportBinding"?R(d):null,D$1=d=>{if(!d.node.init)return null;const q=v(d.node.init);return!q||!isStringNode(q)||d.name.parent?.type!==utils.AST_NODE_TYPES.Property||!isSupportedAccessor(d.name.parent.key)?null:{source:getStringValue(q),imported:getAccessorValue(d.name.parent.key),local:d.name.name}},getTestCallExpressionsFromDeclaredVariables=(d,q)=>d.reduce((b,{references:Y})=>b.concat(Y.map(({identifier:$})=>$.parent).filter($=>$?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall($,q,["test"]))),[]),getFirstMatcherArg=d=>{const[q]=d.args;return q.type===utils.AST_NODE_TYPES.SpreadElement?q:followTypeAssertionChain$1(q)},L$1=d=>d.type===utils.AST_NODE_TYPES.TSAsExpression||d.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain$1=d=>L$1(d)?followTypeAssertionChain$1(d.expression):d,RULE_NAME$$="prefer-lowercase-title",E$5=d=>d.arguments[0]&&isStringNode(d.arguments[0]),x$4=d=>{const q=[];return d.includes(DescribeAlias.describe)&&q.push(...Object.keys(DescribeAlias)),d.includes(TestCaseName.test)&&q.push(...Object.keys(TestCaseName).filter(b=>b.endsWith(TestCaseName.test))),d.includes(TestCaseName.it)&&q.push(...Object.keys(TestCaseName).filter(b=>b.endsWith(TestCaseName.it))),q},we=createEslintRule({name:RULE_NAME$$,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:(d,[{ignore:q=[],allowedPrefixes:b=[],ignoreTopLevelDescribe:Y=!1,lowercaseFirstCharacterOnly:$=!1}])=>{const B=x$4(q);let H=0;return{CallExpression(V){const K=parseVitestFnCall(V,d);if(!K||!E$5)return;if(K?.type==="describe"){if(H++,Y&&H===1)return}else if(K?.type!=="test")return;const[G]=V.arguments,J=getStringValue(G);if(typeof J!="string"||b.some(ee=>J.startsWith(ee)))return;const X=J.charAt(0);B.includes(K.name)||$&&(!X||X===X.toLowerCase())||!$&&J===J.toLowerCase()||d.report({messageId:$?"lowerCaseTitle":"fullyLowerCaseTitle",node:V.arguments[0],data:{method:K.name},fix:ee=>{const z=getStringValue(G),te=[G.range[0]+1,G.range[1]-1],Q=$?z.substring(0,1).toLowerCase()+z.substring(1):z.toLowerCase();return[ee.replaceTextRange(te,Q)]}})},"CallExpression:exit"(V){isTypeOfVitestFnCall(V,d,["describe"])&&H--}}}}),RULE_NAME$_="max-nested-describe",Re=createEslintRule({name:RULE_NAME$_,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(d,[{max:q}]){const b=[];function Y(B){B.parent?.type==="CallExpression"&&(B.parent.callee.type!=="Identifier"||B.parent.callee.name!=="describe"||(b.push(0),b.length>q&&d.report({node:B.parent,messageId:"maxNestedDescribe"})))}function $(B){B.parent?.type==="CallExpression"&&(B.parent.callee.type!=="Identifier"||B.parent.callee.name!=="describe"||b.pop())}return{FunctionExpression:Y,"FunctionExpression:exit":$,ArrowFunctionExpression:Y,"ArrowFunctionExpression:exit":$}}}),RULE_NAME$Z="no-identical-title",c$4=()=>({describeTitles:[],testTitles:[]}),Le=createEslintRule({name:RULE_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(d){const q=[c$4()];return{CallExpression(b){const Y=q[q.length-1],$=parseVitestFnCall(b,d);if(!$||(($.name==="describe"||$.name==="suite")&&q.push(c$4()),$.members.find(V=>isSupportedAccessor(V,"each"))))return;const[B]=b.arguments;if(!B||!isStringNode(B))return;const H=getStringValue(B);$.type==="test"&&(Y?.testTitles.includes(H)&&d.report({node:b,messageId:"multipleTestTitle"}),Y?.testTitles.push(H)),$.type==="describe"&&(Y?.describeTitles.includes(H)&&d.report({node:b,messageId:"multipleDescribeTitle"}),Y?.describeTitles.push(H))},"CallExpression:exit"(b){isTypeOfVitestFnCall(b,d,["describe"])&&q.pop()}}}}),RULE_NAME$Y="no-focused-tests",n$2=d=>d.type==="Identifier"&&["it","test","describe"].includes(d.name),a$6=d=>d.type==="Identifier"&&d.name==="only",Te=createEslintRule({name:RULE_NAME$Y,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:d=>{const q=d.options[0]?.fixable;return{ExpressionStatement(b){if(b.expression.type==="CallExpression"){const{callee:Y}=b.expression;if(Y.type==="MemberExpression"&&n$2(Y.object)&&a$6(Y.property)&&d.report({node:Y.property,messageId:"noFocusedTests",fix:$=>q?$.removeRange([Y.property.range[0]-1,Y.property.range[1]]):null}),Y.type==="TaggedTemplateExpression"){const $=Y.tag.type==="MemberExpression"?Y.tag.object:null;if(!$)return;$.type==="MemberExpression"&&n$2($.object)&&a$6($.property)&&d.report({node:$.property,messageId:"noFocusedTests",fix:B=>q?B.removeRange([$.property.range[0]-1,$.property.range[1]]):null})}}},CallExpression(b){if(b.callee.type==="CallExpression"){const{callee:Y}=b.callee;if(Y.type==="MemberExpression"&&Y.object.type==="MemberExpression"&&n$2(Y.object.object)&&a$6(Y.object.property)&&Y.property.type==="Identifier"&&Y.property.name==="each"){const $=Y.object.property;d.report({node:Y.object.property,messageId:"noFocusedTests",fix:B=>q?B.removeRange([$.range[0]-1,$.range[1]]):null})}}}}}}),RULE_NAME$X="no-conditional-tests",Ue=createEslintRule({name:RULE_NAME$X,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(d){return{Identifier:function(q){["test","it","describe"].includes(q.name)&&q.parent?.parent?.parent?.parent?.type==="IfStatement"&&d.report({node:q,messageId:"noConditionalTests"})}}}}),i$2={typecheck:!1};function parsePluginSettings(d){const q=typeof d.vitest!="object"||d.vitest===null?{}:d.vitest;return{...i$2,...q}}const RULE_NAME$W="expect-expect",_e=createEslintRule({name:RULE_NAME$W,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(d,[{assertFunctionNames:q=["expect"],additionalTestBlockFunctions:b=[]}]){const Y=[];parsePluginSettings(d.settings).typecheck&&q.push("expectTypeOf","assertType");const $=q.map(x$3);function B(H){for(const V of H){const K=V.type===utils.AST_NODE_TYPES.CallExpression?Y.indexOf(V):-1;if(V.type===utils.AST_NODE_TYPES.FunctionDeclaration){const G=d.sourceCode.getDeclaredVariables(V),J=getTestCallExpressionsFromDeclaredVariables(G,d);B(J)}if(K!==-1){Y.splice(K,1);break}}}return{CallExpression(H){if(H.callee.type===utils.AST_NODE_TYPES.Identifier&&H.callee.name==="bench"||H?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&H.callee.property.type===utils.AST_NODE_TYPES.Identifier&&H.callee.property.name==="extend"||H?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&H.callee.property.type===utils.AST_NODE_TYPES.Identifier&&H.callee.property.name==="skip")return;const V=getNodeName(H)??"";if(isTypeOfVitestFnCall(H,d,["test"])||b.includes(V)){if(H.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(H.callee.property,"todo"))return;Y.push(H)}else $.some(K=>K.test(V))&&B(d.sourceCode.getAncestors(H))},"Program:exit"(){Y.forEach(H=>{d.report({node:H.callee,messageId:"noAssertions"})})}}}});function x$3(d){const q=d.split(".").map(b=>b==="**"?"[_a-z\\d\\.]*":b.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${q.join("\\.")}(\\.|$)`,"ui")}const RULE_NAME$V="consistent-test-it",g$1=(d,q,b)=>Y=>[Y.replaceText(d.type===utils.AST_NODE_TYPES.MemberExpression?d.object:d,E$4(q,b))];function E$4(d,q){return d===TestCaseName.fit?"test.only":d.startsWith("f")||d.startsWith("x")?d.charAt(0)+q:q}function u$5(d){return d===TestCaseName.test?TestCaseName.it:TestCaseName.test}const he=createEslintRule({name:RULE_NAME$V,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(d){const q=d.options[0]??{},b=q.fn||TestCaseName.test,Y=q?.withinDescribe||q?.fn||TestCaseName?.it,$=b===Y?b:void 0;let B=0;return{ImportDeclaration(H){if($==null||H.source.type!=="Literal"||H.source.value!=="vitest")return;const V=u$5($);for(const K of H.specifiers)K.type==="ImportSpecifier"&&K.imported.type==="Identifier"&&K.local.name===K.imported.name&&K.local.name===V&&d.report({node:K,data:{testFnKeyWork:b,oppositeTestKeyword:V},messageId:"consistentMethod",fix:G=>{const J=H.specifiers.filter(X=>X.local.name!==V);if(J.length>0){const X=J.map(z=>z.local.name).join(", "),ee=H.specifiers.at(-1)?.range;return ee?G.replaceTextRange([H.specifiers[0].range[0],ee[1]],X):null}return G.replaceText(K.local,$)}})},CallExpression(H){if(H.callee.type===utils.AST_NODE_TYPES.Identifier&&H.callee.name==="bench")return;const V=parseVitestFnCall(H,d);if(!V)return;if(V.type==="describe"){B++;return}const K=H.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?H.callee.tag:H.callee.type===utils.AST_NODE_TYPES.CallExpression?H.callee.callee:H.callee;if(V.type==="test"&&B===0&&!V.name.endsWith(b)){const G=u$5(b);d.report({node:H.callee,data:{testFnKeyWork:b,oppositeTestKeyword:G},messageId:"consistentMethod",fix:g$1(K,V.name,b)})}else if(V.type==="test"&&B>0&&!V.name.endsWith(Y)){const G=u$5(Y);d.report({messageId:"consistentMethodWithinDescribe",node:H.callee,data:{testKeywordWithinDescribe:Y,oppositeTestKeyword:G},fix:g$1(K,V.name,Y)})}},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,d,["describe"])&&B--}}}}),RULE_NAME$U="prefer-to-be",E$3=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===null,N$3=d=>E$3(getFirstMatcherArg(d)),c$3=(d,q)=>isIdentifier(getFirstMatcherArg(d),q),h$2=d=>Math.floor(d)!==Math.ceil(d),y$3=d=>{let q=getFirstMatcherArg(d);return q.type===utils.AST_NODE_TYPES.Literal&&typeof q.value=="number"&&h$2(q.value)?!1:(q.type===utils.AST_NODE_TYPES.UnaryExpression&&q.operator==="-"&&(q=q.argument),q.type===utils.AST_NODE_TYPES.Literal?!("regex"in q):q.type===utils.AST_NODE_TYPES.TemplateLiteral)},o$2=(d,q,b,Y,$)=>{d.report({messageId:`useToBe${q}`,fix(B){const H=[replaceAccessorFixer(B,b.matcher,`toBe${q}`)];return b.args?.length&&q!==""&&H.push(removeExtraArgumentsFixer(B,d,Y,0)),$&&H.push(B.removeRange([$.range[0]-1,$.range[1]])),H},node:b.matcher})},ge=createEslintRule({name:RULE_NAME$U,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const Y=getAccessorValue(b.matcher),$=b.modifiers.find(B=>getAccessorValue(B)==="not");if($&&["toBeUndefined","toBeDefined"].includes(Y)){o$2(d,Y==="toBeDefined"?"Undefined":"Defined",b,q,$);return}if(!(!EqualityMatcher.hasOwnProperty(Y)||b.args.length===0)){if(N$3(b)){o$2(d,"Null",b,q);return}if(c$3(b,"undefined")){o$2(d,$?"Defined":"Undefined",b,q);return}if(c$3(b,"NaN")){o$2(d,"NaN",b,q);return}y$3(b)&&Y!==EqualityMatcher.toBe&&o$2(d,"",b,q)}}}}}),RULE_NAME$T="no-hooks",be=createEslintRule({name:RULE_NAME$T,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(d,[{allow:q=[]}]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);Y?.type==="hook"&&!q.includes(Y.name)&&d.report({node:b,messageId:"unexpectedHook",data:{hookName:Y.name}})}}}}),RULE_NAME$S="no-restricted-vi-methods",ke=createEslintRule({name:RULE_NAME$S,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(d,[q]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type!=="vi"||Y.members.length===0)return;const $=getAccessorValue(Y.members[0]);if($ in q){const B=q[$];d.report({messageId:B?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:B,restriction:$},loc:{start:Y.members[0].loc.start,end:Y.members[Y.members.length-1].loc.end}})}}}}}),RULE_NAME$R="consistent-test-filename",o$1=/.*\.test\.[tj]sx?$/,e=/.*\.(test|spec)\.[tj]sx?$/,xe=createEslintRule({name:RULE_NAME$R,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:d=>{const q=d.options[0]??{},{pattern:b=o$1,allTestPattern:Y=e}=q,$=typeof b=="string"?new RegExp(b):b,B=typeof Y=="string"?new RegExp(Y):Y,{filename:H}=d;return B.test(H)?{Program:V=>{$.test(H)||d.report({node:V,messageId:"consistentTestFilename",data:{pattern:$.source}})}}:{}}}),RULE_NAME$Q="max-expects",ve=createEslintRule({name:RULE_NAME$Q,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(d,[{max:q}]){let b=0;const Y=$=>{($.parent?.type!==utils.AST_NODE_TYPES.CallExpression||isTypeOfVitestFnCall($.parent,d,["test"]))&&(b=0)};return{FunctionExpression:Y,"FunctionExpression:exit":Y,ArrowFunctionExpression:Y,"ArrowFunctionExpression:exit":Y,CallExpression($){const B=parseVitestFnCall($,d);B?.type!=="expect"||B.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression||(b+=1,b>q&&d.report({node:$,messageId:"maxExpect",data:{count:b,max:q}}))}}}}),RULE_NAME$P="no-alias-methods",Ce=createEslintRule({name:RULE_NAME$P,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(d){const q={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type!=="expect")return;const{matcher:$}=Y,B=getAccessorValue($);if(B in q){const H=q[B];d.report({messageId:"noAliasMethods",data:{alias:B,canonical:H},node:$,fix:V=>[replaceAccessorFixer(V,$,H)]})}}}}}),RULE_NAME$O="no-commented-out-tests";function n$1(d){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(d.value)}const Be=createEslintRule({name:RULE_NAME$O,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(d){const{sourceCode:q}=d;function b(Y){n$1(Y)&&d.report({messageId:"noCommentedOutTests",node:Y})}return{Program(){q.getAllComments().forEach(b)}}}}),RULE_NAME$N="no-conditional-expect",r=d=>d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.property,"catch"),Se=createEslintRule({name:RULE_NAME$N,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(d){let q=0,b=!1,Y=!1;const $=()=>b&&q++,B=()=>b&&q--;return{FunctionDeclaration(H){const V=d.sourceCode.getDeclaredVariables(H);getTestCallExpressionsFromDeclaredVariables(V,d).length>0&&(b=!0)},CallExpression(H){const{type:V}=parseVitestFnCall(H,d)??{};V==="test"&&(b=!0),r(H)&&(Y=!0),b&&V==="expect"&&q>0&&d.report({messageId:"noConditionalExpect",node:H}),Y&&V==="expect"&&d.report({messageId:"noConditionalExpect",node:H})},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,d,["test"])&&(b=!1),r(H)&&(Y=!1)},CatchClause:$,"CatchClause:exit":B,IfStatement:$,"IfStatement:exit":B,SwitchStatement:$,"SwitchStatement:exit":B,ConditionalExpression:$,"ConditionalExpression:exit":B,LogicalExpression:$,"LogicalExpression:exit":B}}}),RULE_NAME$M="no-import-node-test",ye=createEslintRule({name:RULE_NAME$M,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(d){return{ImportDeclaration(q){q.source.value==="node:test"&&d.report({messageId:"noImportNodeTest",node:q,fix:b=>b.replaceText(q.source,q.source.raw.replace("node:test","vitest"))})}}}}),RULE_NAME$L="no-conditional-in-test",Ie=createEslintRule({name:RULE_NAME$L,meta:{docs:{description:"disallow conditional tests",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalInTest:"Remove conditional tests"},schema:[],type:"problem"},defaultOptions:[],create(d){return{IfStatement(q){q.parent?.parent?.parent?.type==="CallExpression"&&isTypeOfVitestFnCall(q.parent?.parent?.parent,d,["test","it"])&&d.report({messageId:"noConditionalInTest",node:q})}}}}),RULE_NAME$K="no-disabled-tests",He=createEslintRule({name:RULE_NAME$K,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(d){let q=0,b=0;return{CallExpression(Y){const $=parseVitestFnCall(Y,d);if(!$)return;$.type==="describe"&&q++,$.type==="test"&&(b++,Y.arguments.length<2&&$.members.every(H=>getAccessorValue(H)==="skip")&&d.report({messageId:"missingFunction",node:Y}));const B=$.members.find(H=>getAccessorValue(H)==="skip");($.name.startsWith("x")||B!==void 0)&&d.report({messageId:$.type==="describe"?"disabledSuite":"disabledTest",node:B??$.head.node})},"CallExpression:exit"(Y){const $=parseVitestFnCall(Y,d);$&&($.type==="describe"&&q--,$.type==="test"&&b--)},'CallExpression[callee.name="pending"]'(Y){const $=d.sourceCode.getScope?d.sourceCode.getScope(Y):d.getScope();resolveScope($,"pending")||(b>0?d.report({messageId:"pendingTest",node:Y}):q>0?d.report({messageId:"pendingSuite",node:Y}):d.report({messageId:"pending",node:Y}))}}}}),RULE_NAME$J="no-done-callback",P$1=(d,q,b)=>{if(q)return d.arguments[1];const Y=parseVitestFnCall(d,b);return Y?.type==="hook"&&d.arguments.length>=1?d.arguments[0]:Y?.type==="test"&&d.arguments.length>=2?d.arguments[1]:null},Oe=createEslintRule({name:RULE_NAME$J,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(d){return{CallExpression(q){const b=/\.each$|\.concurrent$/.test(getNodeName(q.callee)??"");if(b&&q.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||d.sourceCode.getAncestors(q).some(H=>H.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(H,d,["describe","test"])?!1:H.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(H.callee.property,"concurrent")))return;const Y=P$1(q,b,d),$=Number(b);if(!Y||!isFunction(Y)||Y.params.length!==1+$)return;const B=Y.params[$];if(B.type!==utils.AST_NODE_TYPES.Identifier){d.report({node:B,messageId:"noDoneCallback"});return}if(Y.async){d.report({node:B,messageId:"useAwaitInsteadOfCallback"});return}d.report({node:q,messageId:"noDoneCallback",suggest:[{messageId:"suggestWrappingInPromise",data:{callback:B.name},fix(H){const{body:V,params:K}=Y,{sourceCode:G}=d,J=G.getFirstToken(V),X=G.getLastToken(V),[ee]=K,z=K[K.length-1],te=G.getTokenBefore(ee);let Q=G.getTokenAfter(z);if(Q?.value===","&&(Q=G.getTokenAfter(Q)),!J||!X||!te||!Q)throw new Error(`Unexpected null when attempting to fix ${d.filename} - please file an issue at https://github/veritem/eslint-plugin-vitest`);let Z=H.replaceText(ee,"()");te.value==="("&&Q.value===")"&&(Z=H.removeRange([te.range[1],Q.range[0]]));let oe=`new Promise(${B.name} => `,ne=")",se=!0;return V.type===utils.AST_NODE_TYPES.BlockStatement&&(oe=`return ${oe}{`,ne+="}",se=!1),[Z,se?H.insertTextBefore(J,oe):H.insertTextAfter(J,oe),H.insertTextAfter(X,ne)]}}]})}}}}),RULE_NAME$I="no-duplicate-hooks",qe=createEslintRule({name:RULE_NAME$I,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(d){const q=[{}];return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type==="describe"&&q.push({}),Y?.type!=="hook")return;const $=q[q.length-1];$[Y.name]||=0,$[Y.name]+=1,$[Y.name]>1&&d.report({messageId:"noDuplicateHooks",data:{hook:Y.name},node:b})},"CallExpression:exit"(b){isTypeOfVitestFnCall(b,d,["describe"])&&q.pop()}}}}),RULE_NAME$H="no-large-snapshots",m$4=(d,q,{maxSize:b=50,allowedSnapshots:Y={}})=>{const $=q.loc.start.line,B=q.loc.end.line-$;if(!Object.keys(Y).every(node_path.isAbsolute))throw new Error("All paths for allowedSnapshots must be absolute. You can use JS config and `path.resolve`");let H=!1;if(q.type===utils.AST_NODE_TYPES.ExpressionStatement&&"left"in q.expression&&q.expression.left.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.expression.left.property)){const V=d.filename,K=Y[V];if(K){const G=getAccessorValue(q.expression.left.property);H=K.some(J=>J instanceof RegExp?J.test(G):G===J)}}!H&&B>b&&d.report({node:q,messageId:b===0?"noSnapShot":"tooLongSnapShot",data:{lineCount:B,lineLimit:b}})},De=createEslintRule({name:RULE_NAME$H,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(d,[q]){return d.filename.endsWith(".snap")?{ExpressionStatement(b){m$4(d,b,q)}}:{CallExpression(b){const Y=parseVitestFnCall(b,d);Y?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(Y.matcher))&&Y.args.length&&m$4(d,Y.args[0],{...q,maxSize:q.inlineMaxSize??q.maxSize})}}}}),RULE_NAME$G="no-interpolation-in-snapshots",Fe=createEslintRule({name:RULE_NAME$G,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);b?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(b.matcher))&&b.args.forEach(Y=>{Y.type===utils.AST_NODE_TYPES.TemplateLiteral&&Y.expressions.length>0&&d.report({messageId:"noInterpolationInSnapshots",node:Y})})}}}}),t="__mocks__",p$1=d=>d.split(node_path.posix.sep).includes(t),s=d=>isStringNode(d)&&p$1(getStringValue(d)),RULE_NAME$F="no-mocks-import",Pe=createEslintRule({name:RULE_NAME$F,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(d){return{ImportDeclaration(q){s(q.source)&&d.report({node:q,messageId:"noMocksImport"})},'CallExpression[callee.name="require"]'(q){const[b]=q.arguments;b&&s(b)&&d.report({node:b,messageId:"noMocksImport"})}}}}),RULE_NAME$E="no-restricted-matchers",l$3=(d,q)=>ModifierName.hasOwnProperty(q)||q.endsWith(".not")?d.startsWith(q):d===q,je=createEslintRule({name:RULE_NAME$E,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(d,[q]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type!=="expect")return;const $=Y.members.map(B=>getAccessorValue(B)).join(".");for(const[B,H]of Object.entries(q))if(l$3($,B)){d.report({messageId:H?"restrictedChainWithMessage":"restrictedChain",data:{message:H,restriction:B},loc:{start:Y.members[0].loc.start,end:Y.members[Y.members.length-1].loc.end}});break}}}}}),RULE_NAME$D="no-standalone-expect",a$5=(d,q)=>{const b=d.parent;if(!b)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(b.type===utils.AST_NODE_TYPES.FunctionDeclaration)return"function";if(isFunction(b)&&b.parent){const Y=b.parent;if(Y.type===utils.AST_NODE_TYPES.VariableDeclarator)return"function";if(Y.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(Y,q,["describe"]))return"describe"}return null},Ve=createEslintRule({name:RULE_NAME$D,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(d,[{additionalTestBlockFunctions:q=[]}]){const b=[],Y=$=>q.includes(getNodeName($)||"");return{CallExpression($){const B=parseVitestFnCall($,d);if(B?.type==="expect"){if(B.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&B.members.length===1&&!["assertions","hasAssertions"].includes(getAccessorValue(B.members[0])))return;const H=b[b.length-1];(!H||H===DescribeAlias.describe)&&d.report({node:$,messageId:"noStandaloneExpect"});return}(B?.type==="test"||Y($))&&b.push("test"),$.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&b.push("template")},"CallExpression:exit"($){const B=b[b.length-1];(B==="test"&&(isTypeOfVitestFnCall($,d,["test"])||Y($))&&$.callee.type!==utils.AST_NODE_TYPES.MemberExpression||B==="template"&&$.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression)&&b.pop()},BlockStatement($){const B=a$5($,d);B&&b.push(B)},"BlockStatement:exit"($){a$5($,d)&&b.pop()},ArrowFunctionExpression($){$.parent?.type!==utils.AST_NODE_TYPES.CallExpression&&b.push("arrow")},"ArrowFunctionExpression:exit"(){b[b.length-1]==="arrow"&&b.pop()}}}}),RULE_NAME$C="no-test-prefixes",Ke=createEslintRule({name:RULE_NAME$C,meta:{docs:{description:"disallow using `test` as a prefix",recommended:!1},type:"suggestion",messages:{usePreferredName:'Use "{{ preferredNodeName }}" instead'},fixable:"code",schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="describe"&&b?.type!=="test"||b.name[0]!=="f"&&b.name[0]!=="x")return;const Y=[b.name.slice(1),b.name[0]==="f"?"only":"skip",...b.members.map(B=>getAccessorValue(B))].join("."),$=q.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?q.callee.tag:q.callee.type===utils.AST_NODE_TYPES.CallExpression?q.callee.callee:q.callee;d.report({messageId:"usePreferredName",node:q.callee,data:{preferredNodeName:Y},fix:B=>[B.replaceText($,Y)]})}}}}),RULE_NAME$B="no-test-return-statement",u$4=d=>{const[,q]=d;return q&&isFunction(q)&&q.body.type===utils.AST_NODE_TYPES.BlockStatement?q.body.body:[]},$e=createEslintRule({name:RULE_NAME$B,meta:{type:"problem",docs:{description:"disallow return statements in tests",recommended:!1},schema:[],messages:{noTestReturnStatement:"Return statements are not allowed in tests"}},defaultOptions:[],create(d){return{CallExpression(q){if(!isTypeOfVitestFnCall(q,d,["test"]))return;const b=u$4(q.arguments).find(Y=>Y.type===utils.AST_NODE_TYPES.ReturnStatement);b&&d.report({messageId:"noTestReturnStatement",node:b})},FunctionDeclaration(q){const b=d.sourceCode.getDeclaredVariables(q);if(getTestCallExpressionsFromDeclaredVariables(b,d).length===0)return;const Y=q.body.body.find($=>$.type===utils.AST_NODE_TYPES.ReturnStatement);Y&&d.report({messageId:"noTestReturnStatement",node:Y})}}}}),RULE_NAME$A="prefer-called-with",Ge=createEslintRule({name:RULE_NAME$A,meta:{docs:{description:"enforce using `toBeCalledWith()` or `toHaveBeenCalledWith()`",recommended:!1},messages:{preferCalledWith:"Prefer {{ matcherName }}With(/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.modifiers.some(B=>getAccessorValue(B)==="not"))return;const{matcher:Y}=b,$=getAccessorValue(Y);["toBeCalled","toHaveBeenCalled"].includes($)&&d.report({data:{matcherName:$},messageId:"preferCalledWith",node:Y,fix:B=>[B.replaceText(Y,`${$}With`)]})}}}}),RULE_NAME$z="valid-title",W=d=>["f","x"].includes(d.charAt(0))?d.substring(1):d,T$2=d=>d.type===utils.AST_NODE_TYPES.TemplateLiteral?`\`${d.quasis[0].value.raw}\``:d.raw,A$2={type:"array",items:{type:"string"},minItems:1,maxItems:2,additionalItems:!1},u$3=d=>{const[q,b]=Array.isArray(d)?d:[d];return[new RegExp(q,"u"),b]};function _(d){const q=d.getSymbol();return q?q.getDeclarations()?.some(b=>o__default.isFunctionDeclaration(b)||o__default.isMethodDeclaration(b)||o__default.isFunctionExpression(b)||o__default.isArrowFunction(b))??!1:!1}function j(d){const q=d.getSymbol();return q?q.getDeclarations()?.some(b=>o__default.isClassDeclaration(b)||o__default.isClassExpression(b))??!1:!1}function k$1(d){return!!(d.flags&o__default.TypeFlags.StringLike)}const E$2=d=>{if(typeof d=="string"||Array.isArray(d)){const q=u$3(d);return{describe:q,test:q,it:q}}return{describe:d.describe?u$3(d.describe):null,test:d.test?u$3(d.test):null,it:d.it?u$3(d.it):null}},C$1=d=>isStringNode(d.right)?!0:d.left.type===utils.AST_NODE_TYPES.BinaryExpression?C$1(d.left):isStringNode(d.left),We=createEslintRule({name:RULE_NAME$z,meta:{docs:{description:"enforce valid titles",recommended:!1},messages:{titleMustBeString:"Test title must be a string, a function or class name",emptyTitle:"{{ functionName }} should not have an empty title",duplicatePrefix:"should not have duplicate prefix",accidentalSpace:"should not have leading or trailing spaces",disallowedWord:'"{{ word }}" is not allowed in test title',mustNotMatch:"{{ functionName }} should not match {{ pattern }}",mustMatch:"{{ functionName }} should match {{ pattern }}",mustNotMatchCustom:"{{ message }}",mustMatchCustom:"{{ message }}"},type:"suggestion",schema:[{type:"object",properties:{ignoreTypeOfDescribeName:{type:"boolean",default:!1},allowArguments:{type:"boolean",default:!1},disallowedWords:{type:"array",items:{type:"string"}}},patternProperties:{[/^must(?:Not)?Match$/u.source]:{oneOf:[{type:"string"},A$2,{type:"object",propertyNames:{type:"string",enum:["describe","test","it"]},additionalProperties:{oneOf:[{type:"string"},A$2]}}]}},additionalProperties:!1}],fixable:"code"},defaultOptions:[{ignoreTypeOfDescribeName:!1,allowArguments:!1,disallowedWords:[]}],create(d,[{ignoreTypeOfDescribeName:q,allowArguments:b,disallowedWords:Y=[],mustNotMatch:$,mustMatch:B}]){const H=new RegExp(`\\b(${Y.join("|")})\\b`,"iu"),V=E$2($??{}),K=E$2(B??{}),G=parsePluginSettings(d.settings);return{CallExpression(J){const X=parseVitestFnCall(J,d);if(X?.type!=="describe"&&X?.type!=="test"&&X?.type!=="it"||X.members&&X.members[0]&&X.members[0].type===utils.AST_NODE_TYPES.Identifier&&X.members[0].name==="extend")return;const ee=ie=>{d.report({messageId:"emptyTitle",data:{functionName:X.type==="describe"?DescribeAlias.describe:TestCaseName.test},node:ie})},[z]=J.arguments;if(G.typecheck){const ie=utils.ESLintUtils.getParserServices(d).getTypeAtLocation(z);if(_(ie)||j(ie))return;if(k$1(ie)){isStringNode(z)&&!getStringValue(z)&&ee(J);return}}if(!z||b&&z.type===utils.AST_NODE_TYPES.Identifier)return;if(!isStringNode(z)){if(z.type===utils.AST_NODE_TYPES.BinaryExpression&&C$1(z))return;z.type!==utils.AST_NODE_TYPES.TemplateLiteral&&!(q&&X.type==="describe")&&d.report({messageId:"titleMustBeString",loc:z.loc});return}const te=getStringValue(z);if(!te){ee(J);return}if(Y.length>0){const ie=H.exec(te);if(ie){d.report({messageId:"disallowedWord",data:{word:ie[1]},node:z});return}}te.trim().length!==te.length&&d.report({messageId:"accidentalSpace",node:z,fix:ie=>[ie.replaceTextRange(z.range,T$2(z).replace(/^([`'"]) +?/u,"$1").replace(/ +?([`'"])$/u,"$1"))]});const Q=W(X.name),[Z]=te.split(" ");Z.toLowerCase()===Q&&d.report({messageId:"duplicatePrefix",node:z,fix:ie=>[ie.replaceTextRange(z.range,T$2(z).replace(/^([`'"]).+? /u,"$1"))]});const oe=Q,[ne,se]=V[oe]??[];if(ne&&ne.test(te)){d.report({messageId:se?"mustNotMatchCustom":"mustNotMatch",node:z,data:{functionName:oe,pattern:ne,message:se}});return}const[re,ae]=K[oe]??[];re&&(re.test(te)||d.report({messageId:ae?"mustMatchCustom":"mustMatch",node:z,data:{functionName:oe,pattern:re,message:ae}}))}}}}),RULE_NAME$y="valid-expect",h$1=["toReject","toResolve"],D=d=>(d.type===utils.AST_NODE_TYPES.ArrayExpression&&d.parent&&d.parent.type===utils.AST_NODE_TYPES.CallExpression&&(d=d.parent),d.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.object,"Promise")&&d.parent?d:null),A$1=({start:d,end:q})=>`${d.line}:${d.column}-${q.line}:${q.column}`,O$1=d=>d.parent.type===utils.AST_NODE_TYPES.Property&&d.type===utils.AST_NODE_TYPES.FunctionExpression?d.parent:d;function M$2(d){const q=d.parent?.parent;return q&&q.type===utils.AST_NODE_TYPES.CallExpression&&q.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.callee.property)&&["then","catch"].includes(getAccessorValue(q.callee.property))&&q.parent?M$2(q):d}const U=d=>d.parent?.parent&&[utils.AST_NODE_TYPES.CallExpression,utils.AST_NODE_TYPES.ArrayExpression].includes(d.parent.type)?D(d.parent):null,N$2=({parent:d})=>d?isFunction(d)?d:N$2(d):null,w$1=(d,q)=>q&&d.type===utils.AST_NODE_TYPES.ReturnStatement?!0:d.type===utils.AST_NODE_TYPES.ConditionalExpression&&d.parent?w$1(d.parent,q):[utils.AST_NODE_TYPES.ArrowFunctionExpression,utils.AST_NODE_TYPES.AwaitExpression].includes(d.type),ze=createEslintRule({name:RULE_NAME$y,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:(d,[{alwaysAwait:q,asyncMatchers:b=h$1,minArgs:Y=1,maxArgs:$=1}])=>{const B=new Set,H=[],V=J=>B.add(A$1(J)),K=J=>B.has(A$1(J)),G=J=>{let X=J,{parent:ee}=J;for(;ee&&ee.type===utils.AST_NODE_TYPES.MemberExpression;)X=ee,ee=ee.parent;return X};return{CallExpression(J){const X=parseVitestFnCallWithReason(J,d),ee=parsePluginSettings(d.settings);if(typeof X=="string"){const re=J.parent?.type===utils.AST_NODE_TYPES.MemberExpression?G(J.parent).property:J;if(X==="matcher-not-found"){d.report({messageId:"matcherNotFound",node:re});return}if(X==="matcher-not-called"&&d.report({messageId:isSupportedAccessor(re)&&ModifierName.hasOwnProperty(getAccessorValue(re))?"matcherNotFound":"matcherNotCalled",node:re}),X==="modifier-unknown"){d.report({messageId:"modifierUnknown",node:re});return}return}else if(X?.type==="expectTypeOf"&&ee.typecheck||X?.type!=="expect"||X.modifiers.some(re=>re.type===utils.AST_NODE_TYPES.Identifier&&re.name=="to"))return;const{parent:z}=X.head.node;if(z?.type!==utils.AST_NODE_TYPES.CallExpression)return;if(z.arguments.length<Y){const re=getAccessorValue(X.head.node).length,ae={start:{column:z.loc.start.column+re,line:z.loc.start.line},end:{column:z.loc.start.column+re+1,line:z.loc.start.line}};d.report({messageId:"notEnoughArgs",data:{amount:Y,s:Y===1?"":"s"},node:z,loc:ae})}if(z.arguments.length>$){if(z.arguments.length===2){const ce=z.arguments[1].type===utils.AST_NODE_TYPES.Literal&&typeof z.arguments[1].value=="string",le=z.arguments[1].type===utils.AST_NODE_TYPES.TemplateLiteral;if(ce||le)return}const{start:re}=z.arguments[$].loc,{end:ae}=z.arguments[z.arguments.length-1].loc,ie={start:re,end:{column:ae.column+1,line:ae.line}};d.report({messageId:"tooManyArgs",data:{amount:$,s:$===1?"":"s"},node:z,loc:ie})}const{matcher:te}=X,Q=te.parent.parent,Z=X.modifiers.some(re=>getAccessorValue(re)!=="not")||b.includes(getAccessorValue(te));if(!Q?.parent||!Z)return;const oe=Q.parent.type===utils.AST_NODE_TYPES.ArrayExpression,ne=M$2(Q),se=U(ne)||ne;se.parent&&!w$1(se.parent,!q)&&!K(se.loc)&&(H.push({messageId:se===ne?"asyncMustBeAwaited":"promisesWithAsyncAssertionsMustBeAwaited",node:se}),oe&&V(se.loc))},"Program:exit"(){const J=[];H.forEach(({node:X,messageId:ee},z)=>{const te=q?"":" or returned";d.report({loc:X.loc,data:{orReturned:te},messageId:ee,node:X,fix(Q){const Z=N$2(X);if(!Z)return null;const oe=J.some(se=>se.text==="async ");if(!Z.async&&!oe){const se=O$1(Z);J.push(Q.insertTextBefore(se,"async "))}const ne=X.parent?.type===utils.AST_NODE_TYPES.ReturnStatement?X.parent:null;if(q&&ne){const se=d.sourceCode.getText(ne).replace("return","await");J.push(Q.replaceText(ne,se))}else J.push(Q.insertTextBefore(X,"await "));return z===H.length-1?J:null}})})}}}}),isBooleanLiteral=d=>d.type===utils.AST_NODE_TYPES.Literal&&typeof d.value=="boolean",isBooleanEqualityMatcher=d=>{const q=getAccessorValue(d.matcher);if(["toBeTruthy","toBeFalsy"].includes(q))return!0;if(d.args.length!==1)return!1;const b=getFirstMatcherArg(d);return EqualityMatcher.hasOwnProperty(q)&&isBooleanLiteral(b)},isInstanceOfBinaryExpression=(d,q)=>d.type===utils.AST_NODE_TYPES.BinaryExpression&&d.operator==="instanceof"&&isSupportedAccessor(d.right,q),hasOnlyOneArgument=d=>d.arguments.length===1,RULE_NAME$x="prefer-to-be-object",Je=createEslintRule({name:RULE_NAME$x,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expectTypeOf")return;if(isParsedInstanceOfMatcherCall(b,"Object")){d.report({node:b.matcher,messageId:"preferToBeObject",fix:B=>[B.replaceTextRange([b.matcher.range[0],b.matcher.range[1]+8],"toBeObject()")]});return}const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[$]=Y.arguments;!$||!isBooleanEqualityMatcher(b)||!isInstanceOfBinaryExpression($,"Object")||d.report({node:b.matcher,messageId:"preferToBeObject",fix(B){const H=[B.replaceText(b.matcher,"toBeObject"),B.removeRange([$.left.range[1],$.range[1]])];let V=getAccessorValue(b.matcher)==="toBeFalsy";if(b.args.length){const[K]=b.args;H.push(B.remove(K)),V=K.type===utils.AST_NODE_TYPES.Literal&&followTypeAssertionChain$1(K).value===!1}if(V){const K=b.modifiers.find(G=>getAccessorValue(G)==="not");H.push(K?B.removeRange([K.range[0]-1,K.range[1]]):B.insertTextBefore(b.matcher,"not."))}return H}})}}}}),RULE_NAME$w="prefer-to-be-truthy",n=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===!0,Qe=createEslintRule({name:RULE_NAME$w,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);(b?.type==="expect"||b?.type==="expectTypeOf")&&b.args.length===1&&n(getFirstMatcherArg(b))&&EqualityMatcher.hasOwnProperty(getAccessorValue(b.matcher))&&d.report({node:b.matcher,messageId:"preferToBeTruthy",fix:Y=>[Y.replaceText(b.matcher,"toBeTruthy"),Y.remove(b.args[0])]})}}}}),RULE_NAME$v="prefer-to-be-falsy",c$2=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===!1,Xe=createEslintRule({name:RULE_NAME$v,meta:{type:"suggestion",docs:{description:"enforce using toBeFalsy()",recommended:!1},fixable:"code",schema:[],messages:{preferToBeFalsy:"Prefer using toBeFalsy()"}},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);(b?.type==="expect"||b?.type==="expectTypeOf")&&b.args.length===1&&c$2(getFirstMatcherArg(b))&&EqualityMatcher.hasOwnProperty(getAccessorValue(b.matcher))&&d.report({node:b.matcher,messageId:"preferToBeFalsy",fix:Y=>[Y.replaceText(b.matcher,"toBeFalsy"),Y.remove(b.args[0])]})}}}}),RULE_NAME$u="prefer-to-have-length",Ye=createEslintRule({name:RULE_NAME$u,meta:{type:"suggestion",docs:{description:"enforce using toHaveLength()",recommended:!1},fixable:"code",messages:{preferToHaveLength:"Prefer toHaveLength()"},schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[$]=Y.arguments,{matcher:B}=b;!EqualityMatcher.hasOwnProperty(getAccessorValue(B))||$?.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor($.property,"length")||d.report({node:B,messageId:"preferToHaveLength",fix(H){return[H.removeRange([$.property.range[0]-1,$.range[1]]),H.replaceTextRange([B.parent.object.range[1],B.parent.range[1]],".toHaveLength")]}})}}}}),RULE_NAME$t="prefer-equality-matcher",Ze=createEslintRule({name:RULE_NAME$t,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.args.length===0)return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[$],range:[,B]}=Y,{matcher:H}=b,V=getFirstMatcherArg(b);if($?.type!==utils.AST_NODE_TYPES.BinaryExpression||$.operator!=="==="&&$.operator!=="!=="||!EqualityMatcher.hasOwnProperty(getAccessorValue(H))||!isBooleanLiteral(V))return;const K=V.value,[G]=b.modifiers,J=b.modifiers.some(z=>getAccessorValue(z)==="not"),X=($.operator==="!=="?!K:K)===J,ee=z=>te=>{const{sourceCode:Q}=d;let Z=G&&getAccessorValue(G)!=="not"?`.${getAccessorValue(G)}`:"";return X&&(Z+=`.${ModifierName.not}`),[te.replaceText($,Q.getText($.left)),te.replaceTextRange([B,H.parent.range[1]],`${Z}.${z}`),te.replaceText(V,Q.getText($.right))]};d.report({messageId:"useEqualityMatcher",suggest:["toBe","toEqual","toStrictEqual"].map(z=>({messageId:"suggestEqualityMatcher",data:{equalityMatcher:z},fix:ee(z)})),node:H})}}}}),RULE_NAME$s="prefer-strict-equal",er=createEslintRule({name:RULE_NAME$s,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{matcher:Y}=b;isSupportedAccessor(Y,"toEqual")&&d.report({messageId:"useToStrictEqual",node:Y,suggest:[{messageId:"suggestReplaceWithStrictEqual",fix:$=>[replaceAccessorFixer($,Y,EqualityMatcher.toStrictEqual)]}]})}}}}),RULE_NAME$r="prefer-expect-resolves",rr=createEslintRule({name:RULE_NAME$r,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:d=>({CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[$]=Y.arguments;$?.type===utils.AST_NODE_TYPES.AwaitExpression&&d.report({node:$,messageId:"expectResolves",fix(B){return[B.insertTextBefore(Y,"await "),B.removeRange([$.range[0],$.argument.range[0]]),B.insertTextAfter(Y,".resolves")]}})}})}),RULE_NAME$q="prefer-each",or=createEslintRule({name:RULE_NAME$q,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(d){const q=[];let b=!1;const Y=()=>q.length===1&&q[0]==="test"?"it":"describe",$=()=>{q.length===0||b||(q.length=0)},B=H=>{q.length===0||b||(d.report({node:H,messageId:"preferEach",data:{fn:Y()}}),q.length=0)};return{ForStatement:$,"ForStatement:exit":B,ForInStatement:$,"ForInStatement:exit":B,ForOfStatement:$,"ForOfStatement:exit":B,CallExpression(H){const{type:V}=parseVitestFnCall(H,d)??{};(V==="hook"||V==="describe"||V==="test")&&q.push(V),V==="test"&&(b=!0)},"CallExpression:exit"(H){const{type:V}=parseVitestFnCall(H,d)??{};V==="test"&&(b=!1)}}}}),RULE_NAME$p="prefer-hooks-on-top",ar=createEslintRule({name:RULE_NAME$p,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(d){const q=[!1];return{CallExpression(b){isTypeOfVitestFnCall(b,d,["test"])&&(q[q.length-1]=!0),q[q.length-1]&&isTypeOfVitestFnCall(b,d,["hook"])&&d.report({messageId:"noHookOnTop",node:b}),q.push(!1)},"CallExpression:exit"(){q.pop()}}}}),RULE_NAME$o="prefer-hooks-in-order",a$4=["beforeAll","beforeEach","afterEach","afterAll"],tr=createEslintRule({name:RULE_NAME$o,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(d){let q=-1,b=!1;return{CallExpression(Y){if(b)return;const $=parseVitestFnCall(Y,d);if($?.type!=="hook"){q=-1;return}b=!0;const B=$.name,H=a$4.indexOf(B);if(H<q){d.report({messageId:"reorderHooks",data:{previousHook:a$4[q],currentHook:B},node:Y}),b=!1;return}q=H},"CallExpression:exit"(Y){if(isTypeOfVitestFnCall(Y,d,["hook"])){b=!1;return}b||(q=-1)}}}}),RULE_NAME$n="prefer-mock-promise-shorthand",l$2=(d,q)=>`${d}${q?"Once":""}`,f=d=>d.body.type!==utils.AST_NODE_TYPES.BlockStatement?d.body:d.body.body[0]?.type===utils.AST_NODE_TYPES.ReturnStatement?d.body.body[0].argument:null,nr=createEslintRule({name:RULE_NAME$n,meta:{type:"suggestion",docs:{description:"enforce mock resolved/rejected shorthands for promises",recommended:!1},messages:{useMockShorthand:"Prefer {{ replacement }}"},schema:[],fixable:"code"},defaultOptions:[],create(d){const q=(b,Y,$,B=$)=>{if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const H=getNodeName(B);if(H!=="Promise.resolve"&&H!=="Promise.reject")return;const V=l$2(H.endsWith("reject")?"mockRejectedValue":"mockResolvedValue",Y);d.report({node:b,messageId:"useMockShorthand",data:{replacement:V},fix(K){const{sourceCode:G}=d;return B.arguments.length>1?null:[K.replaceText(b,V),K.replaceText($,B.arguments.length===1?G.getText(B.arguments[0]):"undefined")]}})};return{CallExpression(b){if(b.callee.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor(b.callee.property)||b.arguments.length===0)return;const Y=getAccessorValue(b.callee.property),$=Y.endsWith("Once");if(Y===l$2("mockReturnValue",$))q(b.callee.property,$,b.arguments[0]);else if(Y===l$2("mockImplementation",$)){const[B]=b.arguments;if(!isFunction(B)||B.params.length!==0)return;q(b.callee.property,$,B,f(B))}}}}}),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=d=>p.has(d),isTokenASemicolon=d=>d.value===";"&&d.type===utils.AST_TOKEN_TYPES.Punctuator,getActualLastToken=(d,q)=>{const b=d.getLastToken(q),Y=d.getTokenBefore(b),$=d.getTokenAfter(b);return Y&&$&&Y.range[0]>=q.range[0]&&isTokenASemicolon(b)&&b.loc.start.line!==Y.loc.end.line&&b.loc.end.line===$.loc.start.line?Y:b},getPaddingLineSequences=(d,q,b)=>{const Y=[];let $=getActualLastToken(b,d);if(q.loc.start.line-d.loc.end.line>=2)do{const B=b.getTokenAfter($,{includeComments:!0});B.loc.start.line-$.loc.end.line>=2&&Y.push([$,B]),$=B}while($.range[0]<q.range[0]);return Y},areTokensOnSameLine=(d,q)=>d.loc.end.line===q.loc.start.line,E$1=d=>d.type===utils.AST_NODE_TYPES.TSAsExpression||d.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain=d=>E$1(d)?followTypeAssertionChain(d.expression):d,RULE_NAME$m="prefer-vi-mocked",m$3=["Mock","MockedFunction","MockedClass","MockedObject"],sr=createEslintRule({name:RULE_NAME$m,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(d){function q(b){const{typeAnnotation:Y}=b;if(Y.type!==utils.AST_NODE_TYPES.TSTypeReference)return;const{typeName:$}=Y;if($.type!==utils.AST_NODE_TYPES.Identifier||!m$3.includes($.name))return;const B=d.sourceCode.text.slice(...followTypeAssertionChain(b.expression).range);d.report({node:b,messageId:"useViMocked",fix(H){return H.replaceText(b,`vi.mocked(${B})`)}})}return{TSAsExpression(b){b.parent.type!==utils.AST_NODE_TYPES.TSAsExpression&&q(b)},TSTypeAssertion(b){q(b)}}}}),RULE_NAME$l="prefer-snapshot-hint",E=["toMatchSnapshot","toThrowErrorMatchingSnapshot"],x$2=E,S$3=d=>{if(d.args.length===0)return!0;if(!isSupportedAccessor(d.matcher,"toMatchSnapshot"))return d.args.length!==1;if(d.args.length===2)return!1;const[q]=d.args;return!isStringNode(q)},ir=createEslintRule({name:RULE_NAME$l,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(d,[q]){const b=[];let Y=0;const $=[],B=()=>{for(const K of b)S$3(K)&&d.report({messageId:"missingHint",node:K.matcher})},H=()=>{Y++},V=()=>{Y--,q==="always"&&(B(),b.length=0),q==="multi"&&Y===0&&(b.length>1&&B(),b.length=0)};return{"Program:exit"(){H(),V()},FunctionExpression:H,"FunctionExpression:exit":V,ArrowFunctionExpression:H,"ArrowFunctionExpression:exit":V,"CallExpression:exit"(K){isTypeOfVitestFnCall(K,d,["describe","test"])&&(Y=$.pop()??0)},CallExpression(K){const G=parseVitestFnCall(K,d);if(G?.type!=="expect"){(G?.type==="describe"||G?.type==="test")&&($.push(Y),Y=0);return}const J=getAccessorValue(G.matcher);x$2.includes(J)&&b.push(G)}}}}),RULE_NAME$k="valid-describe-callback",o=d=>{const[q]=d,b=d[d.length-1];return{start:q.loc.start,end:b.loc.end}},i$1=(d,q)=>d.members.every(b=>getAccessorValue(b)!=="each")&&q.params.length,u$2=(d,q)=>{d.body.forEach(b=>{b.type===utils.AST_NODE_TYPES.ReturnStatement&&q.report({messageId:"unexpectedReturnInDescribe",node:b})})},mr=createEslintRule({name:RULE_NAME$k,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="describe"||b?.members[0]?.type===utils.AST_NODE_TYPES.Identifier&&b.members[0].name==="todo")return;if(q.arguments.length<1)return d.report({messageId:"nameAndCallback",loc:q.loc});const[,Y,$]=q.arguments;if(!Y){d.report({messageId:"nameAndCallback",loc:o(q.arguments)});return}if(!isFunction(Y)){if($&&isFunction($)){i$1(b,$)&&d.report({messageId:"unexpectedDescribeArgument",node:$}),$.body.type===utils.AST_NODE_TYPES.CallExpression&&d.report({messageId:"unexpectedReturnInDescribe",node:$}),$.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2($.body,d);return}d.report({messageId:"secondArgumentMustBeFunction",loc:o(q.arguments)});return}i$1(b,Y)&&d.report({messageId:"unexpectedDescribeArgument",node:Y}),Y.body.type===utils.AST_NODE_TYPES.CallExpression&&d.report({messageId:"unexpectedReturnInDescribe",node:Y}),Y.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2(Y.body,d)}}}}),RULE_NAME$j="require-top-level-describe",pr=createEslintRule({name:RULE_NAME$j,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(d){const{maxNumberOfTopLevelDescribes:q=1/0}=d.options[0]??{};let b=0,Y=0;return{CallExpression($){const B=parseVitestFnCall($,d);if(B){if(B.type==="describe"){Y++,Y===1&&(b++,b>q&&d.report({node:$,messageId:"tooManyDescribes",data:{max:q,s:q===1?"":"s"}}));return}if(Y===0){if(B.type==="test"){d.report({node:$,messageId:"unexpectedTestCase"});return}B.type==="hook"&&d.report({node:$,messageId:"unexpectedHook"})}}},"CallExpression:exit"($){isTypeOfVitestFnCall($,d,["describe"])&&Y--}}}}),RULE_NAME$i="require-to-throw-message",Er=createEslintRule({name:RULE_NAME$i,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{matcher:Y}=b,$=getAccessorValue(Y);b.args.length===0&&["toThrow","toThrowError"].includes($)&&!b.modifiers.some(B=>getAccessorValue(B)==="not")&&d.report({messageId:"addErrorMessage",data:{matcherName:$},node:Y})}}}}),RULE_NAME$h="require-hook",S$2=(d,q)=>parseVitestFnCall(d,q)?!0:!!getNodeName(d)?.startsWith("vi"),m$2=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===null||isIdentifier(d,"undefined"),a$2=(d,q,b=[])=>{switch(d.type){case utils.AST_NODE_TYPES.ExpressionStatement:return a$2(d.expression,q,b);case utils.AST_NODE_TYPES.CallExpression:return!(S$2(d,q)||b.includes(getNodeName(d)));case utils.AST_NODE_TYPES.VariableDeclaration:return d.kind==="const"?!1:d.declarations.some(({init:Y})=>Y!==null&&!m$2(Y));default:return!1}},lr=createEslintRule({name:RULE_NAME$h,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(d){const{allowedFunctionCalls:q}=d.options[0]??{},b=Y=>{for(const $ of Y)a$2($,d,q)&&d.report({node:$,messageId:"useHook"})};return{Program(Y){b(Y.body)},CallExpression(Y){if(!isTypeOfVitestFnCall(Y,d,["describe"])||Y.arguments.length<2)return;const[,$]=Y.arguments;!isFunction($)||$.body.type!==utils.AST_NODE_TYPES.BlockStatement||b($.body.body)}}}}),RULE_NAME$g="require-local-test-context-for-concurrent-snapshots",fr=createEslintRule({name:RULE_NAME$g,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);b===null||b.type!=="expect"||b.type==="expect"&&b.head.type==="testContext"||!["toMatchSnapshot","toMatchInlineSnapshot","toMatchFileSnapshot","toThrowErrorMatchingSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(q.callee?.property.name)||!d.sourceCode.getAncestors(q).some(Y=>Y.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(Y,d,["describe","test"])?!1:Y.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(Y.callee.property,"concurrent"))||d.report({node:q,messageId:"requireLocalTestContext"})}}}}),RULE_NAME$f="prefer-todo",S$1=d=>d.members.some(q=>getAccessorValue(q)!=="skip")||d.name.startsWith("x")?!1:!d.name.startsWith("f");function T$1(d){return isFunction(d)?d.body.type===utils.AST_NODE_TYPES.BlockStatement&&!d.body.body.length:!1}function a$1(d,q){return d.members.length?replaceAccessorFixer(q,d.members[0],"todo"):q.replaceText(d.head.node,`${d.head.local}.todo`)}const cr=createEslintRule({name:RULE_NAME$f,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(d){return{CallExpression(q){const[b,Y]=q.arguments,$=parseVitestFnCall(q,d);!b||$?.type!=="test"||!S$1($)||!isStringNode(b)||(Y&&T$1(Y)&&d.report({messageId:"emptyTest",node:q,fix:B=>[B.removeRange([b.range[1],Y.range[1]]),a$1($,B)]}),hasOnlyOneArgument(q)&&d.report({messageId:"unimplementedTest",node:q,fix:B=>a$1($,B)}))}}}}),RULE_NAME$e="prefer-spy-on",u$1=d=>"object"in d?d.object:d.callee.type===utils.AST_NODE_TYPES.MemberExpression?d.callee.object:null,a=d=>{if(d.type!==utils.AST_NODE_TYPES.CallExpression&&d.type!==utils.AST_NODE_TYPES.MemberExpression)return null;const q=u$1(d);return q?q.type===utils.AST_NODE_TYPES.Identifier?d.type===utils.AST_NODE_TYPES.CallExpression&&getNodeName(d.callee)==="vi.fn"?d:null:a(q):null},S=(d,q)=>{if(d.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&d.parent.property.type===utils.AST_NODE_TYPES.Identifier&&d.parent.property.name==="mockImplementation")return"";const[b]=d.arguments,Y=b&&q.sourceCode.getText(b);return Y?`.mockImplementation(${Y})`:".mockImplementation()"},Nr=createEslintRule({name:RULE_NAME$e,meta:{type:"suggestion",docs:{description:"enforce using `vi.spyOn`",recommended:!1},messages:{useViSpayOn:"Use `vi.spyOn` instead"},fixable:"code",schema:[]},defaultOptions:[],create(d){return{AssignmentExpression(q){const{left:b,right:Y}=q;if(b.type!==utils.AST_NODE_TYPES.MemberExpression)return;const $=a(Y);$&&d.report({node:q,messageId:"useViSpayOn",fix(B){const H=b.property.type===utils.AST_NODE_TYPES.Identifier&&!b.computed?"'":"",V=S($,d);return[B.insertTextBefore(b,"vi.spyOn("),B.replaceTextRange([b.object.range[1],b.property.range[0]],`, ${H}`),B.replaceTextRange([b.property.range[1],$.range[1]],`${H})${V}`)]}})}}}}),RULE_NAME$d="prefer-comparison-matcher",g=d=>isStringNode(d)||d?.type===utils.AST_NODE_TYPES.TemplateLiteral,C=d=>g(d.left)||g(d.right),M$1=d=>{switch(d){case">":return"<=";case"<":return">=";case">=":return"<";case"<=":return">"}return null},O=(d,q)=>{switch(q?M$1(d):d){case">":return"toBeGreaterThan";case"<":return"toBeLessThan";case">=":return"toBeGreaterThanOrEqual";case"<=":return"toBeLessThanOrEqual"}return null},dr=createEslintRule({name:RULE_NAME$d,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.args.length===0)return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[$],range:[,B]}=Y,{matcher:H}=b,V=getFirstMatcherArg(b);if($?.type!==utils.AST_NODE_TYPES.BinaryExpression||C($)||!EqualityMatcher.hasOwnProperty(getAccessorValue(H))||!isBooleanLiteral(V))return;const[K]=b.modifiers,G=b.modifiers.some(X=>getAccessorValue(X)==="not"),J=O($.operator,V.value===G);J&&d.report({fix(X){const{sourceCode:ee}=d,z=K&&getAccessorValue(K)!=="not"?`.${getAccessorValue(K)}`:"";return[X.replaceText($,ee.getText($.left)),X.replaceTextRange([B,H.parent.range[1]],`${z}.${J}`),X.replaceText(V,ee.getText($.right))]},messageId:"useToBeComparison",data:{preferredMatcher:J},node:H})}}}}),RULE_NAME$c="prefer-to-contain",T=d=>d.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.property,"includes")&&hasOnlyOneArgument(d)&&d.arguments[0].type!==utils.AST_NODE_TYPES.SpreadElement,Ar=createEslintRule({name:RULE_NAME$c,meta:{docs:{description:"enforce using toContain()",recommended:!1},messages:{useToContain:"Use toContain() instead"},fixable:"code",type:"suggestion",schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.args.length===0)return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[$],range:[,B]}=Y,{matcher:H}=b,V=getFirstMatcherArg(b);if(!$||V.type===utils.AST_NODE_TYPES.SpreadElement||!EqualityMatcher.hasOwnProperty(getAccessorValue(H))||!isBooleanLiteral(V)||!T($))return;const K=b.modifiers.some(G=>getAccessorValue(G)==="not");d.report({fix(G){const{sourceCode:J}=d,X=V.value===K;return[G.removeRange([$.callee.property.range[0]-1,$.range[1]]),G.replaceTextRange([B,H.parent.range[1]],X?`.${ModifierName.not}.toContain`:".toContain"),G.replaceText(b.args[0],J.getText($.arguments[0]))]},messageId:"useToContain",node:H})}}}}),RULE_NAME$b="prefer-expect-assertions",L=d=>{let q=d;for(;q;){if(q.parent?.type===utils.AST_NODE_TYPES.BlockStatement)return q.parent.body[0]===q;if(q.parent?.type===utils.AST_NODE_TYPES.ArrowFunctionExpression)return!0;q=q.parent}throw new Error("Could not find parent block statement")},y$2=(d,q,b)=>({messageId:"suggestRemovingExtraArguments",fix:Y=>removeExtraArgumentsFixer(Y,d,q,b)}),Mr=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(d,[q]){let b=0,Y=!1,$=!1,B=!1,H=null,V=!1,K=!1;const G=Q=>!!(!q.onlyFunctionsWithAsyncKeyword&&!q.onlyFunctionsWithExpectInCallback&&!q.onlyFunctionsWithExpectInLoop||q.onlyFunctionsWithAsyncKeyword&&Q.async||q.onlyFunctionsWithExpectInCallback&&Y||q.onlyFunctionsWithExpectInLoop&&$);function J(Q,Z){if(getAccessorValue(Q.members[0])==="hasAssertions"){Q.args.length&&d.report({messageId:"hasAssertionsTakesNoArguments",node:Q.matcher,suggest:[y$2(d,Z,0)]});return}if(Q.args.length!==1){let{loc:ne}=Q.matcher;const se=[];Q.args.length&&(ne=Q.args[1].loc,se.push(y$2(d,Z,1))),d.report({messageId:"assertionsRequiresOneArgument",suggest:se,loc:ne});return}const[oe]=Q.args;oe.type===utils.AST_NODE_TYPES.Literal&&typeof oe.value=="number"&&Number.isInteger(oe.value)||d.report({messageId:"assertionsRequiresNumberArgument",node:oe})}const X=()=>V&&b++,ee=()=>V&&b--,z=()=>K=!0,te=()=>K=!1;return{FunctionExpression:X,"FunctionExpression:exit":ee,ArrowFunctionExpression:X,"ArrowFunctionExpression:exit":ee,ForStatement:z,"ForStatement:exit":te,ForInStatement:z,"ForInStatement:exit":te,ForOfStatement:z,"ForOfStatement:exit":te,CallExpression(Q){const Z=parseVitestFnCall(Q,d);if(Z?.type==="test"){V=!0;return}Z?.head.type==="testContext"&&Z.members[0].type===utils.AST_NODE_TYPES.Identifier&&Z.members[0].name==="expect"&&(H=`${Z.head.local}`),Z?.type==="expect"&&V&&(b===1&&L(Q)&&Z.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&Z.members.length===1&&["assertions","hasAssertions"].includes(getAccessorValue(Z.members[0]))&&(J(Z,Q),B=!0),K&&($=!0),b>1&&(Y=!0))},"CallExpression:exit"(Q){if(!isTypeOfVitestFnCall(Q,d,["test"])||(V=!1,Q.arguments.length<2))return;const[,Z]=Q.arguments;if(!isFunction(Z)||!G(Z))return;if($=!1,Y=!1,B){B=!1;return}const oe=[];if(Z.body.type===utils.AST_NODE_TYPES.BlockStatement){const ne=H?`${H}.`:"";oe.push(["suggestAddingHasAssertions",`${ne}expect.hasAssertions();`],["suggestAddingAssertions",`${ne}expect.assertions();`])}d.report({messageId:"haveExpectAssertions",node:Q,suggest:oe.map(([ne,se])=>({messageId:ne,fix:re=>re.insertTextBeforeRange([Z.body.range[0]+1,Z.body.range[1]],se)}))})}}}});var PaddingType=(d=>(d[d.Any=0]="Any",d[d.Always=1]="Always",d))(PaddingType||{}),StatementType=(d=>(d[d.Any=0]="Any",d[d.AfterAllToken=1]="AfterAllToken",d[d.AfterEachToken=2]="AfterEachToken",d[d.BeforeAllToken=3]="BeforeAllToken",d[d.BeforeEachToken=4]="BeforeEachToken",d[d.DescribeToken=5]="DescribeToken",d[d.ExpectToken=6]="ExpectToken",d[d.ExpectTypeOfToken=7]="ExpectTypeOfToken",d[d.FdescribeToken=8]="FdescribeToken",d[d.FitToken=9]="FitToken",d[d.ItToken=10]="ItToken",d[d.TestToken=11]="TestToken",d[d.XdescribeToken=12]="XdescribeToken",d[d.XitToken=13]="XitToken",d[d.XtestToken=14]="XtestToken",d))(StatementType||{});const x$1=(d,q,b)=>{const{sourceCode:Y,ruleContext:$}=b;getPaddingLineSequences(d,q,Y).length>0||$.report({node:q,messageId:"missingPadding",fix(B){let H=getActualLastToken(Y,d);const V=Y.getFirstTokenBetween(H,q,{includeComments:!0,filter(G){return areTokensOnSameLine(H,G)?(H=G,!1):!0}})||q,K=areTokensOnSameLine(H,V)?`
1
+ "use strict";const utils=require("@typescript-eslint/utils"),node_path=require("node:path"),o$3=require("typescript"),node_module=require("node:module");var _documentCurrentScript=typeof document<"u"?document.currentScript:null;function _interopDefaultCompat(d){return d&&typeof d=="object"&&"default"in d?d.default:d}const o__default=_interopDefaultCompat(o$3),version="1.1.40";function createEslintRule(d){return utils.ESLintUtils.RuleCreator(q=>`https://github.com/vitest-dev/eslint-plugin-vitest/blob/main/docs/rules/${q}.md`)(d)}const joinNames=(d,q)=>d&&q?`${d}.${q}`:null,isFunction=d=>d.type===utils.AST_NODE_TYPES.FunctionExpression||d.type===utils.AST_NODE_TYPES.ArrowFunctionExpression;function getNodeName(d){if(isSupportedAccessor(d))return getAccessorValue(d);switch(d.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeName(d.tag);case utils.AST_NODE_TYPES.MemberExpression:return joinNames(getNodeName(d.object),getNodeName(d.property));case utils.AST_NODE_TYPES.NewExpression:case utils.AST_NODE_TYPES.CallExpression:return getNodeName(d.callee)}return null}const isSupportedAccessor=(d,q)=>isIdentifier(d,q)||isStringNode(d,q),isIdentifier=(d,q)=>d.type===utils.AST_NODE_TYPES.Identifier&&(q===void 0||d.name===q),p$2=(d,q)=>d.type===utils.AST_NODE_TYPES.TemplateLiteral&&d.quasis.length===1&&(q===void 0||d.quasis[0].value.raw===q),g$2=(d,q)=>d.type===utils.AST_NODE_TYPES.Literal&&typeof d.value=="string"&&(q===void 0||d.value===q),isStringNode=(d,q)=>g$2(d,q)||p$2(d,q),getAccessorValue=d=>d.type===utils.AST_NODE_TYPES.Identifier?d.name:getStringValue(d),getStringValue=d=>d?.type===utils.AST_NODE_TYPES.TemplateLiteral?d.quasis[0].value.raw:d?.value,replaceAccessorFixer=(d,q,b)=>d.replaceText(q,q.type===utils.AST_NODE_TYPES.Identifier?b:`'${b}'`),removeExtraArgumentsFixer=(d,q,b,Y)=>{const $=b.arguments[Y],B=b.arguments[b.arguments.length-1],{sourceCode:H}=q;let V=H.getTokenAfter(B);return V.value===","&&(V=H.getTokenAfter(V)),d.removeRange([$.range[0],V.range[0]])},isParsedInstanceOfMatcherCall=(d,q)=>getAccessorValue(d.matcher)==="toBeInstanceOf"&&d.args.length===1&&isSupportedAccessor(d.args[0],q);var DescribeAlias=(d=>(d.describe="describe",d.fdescribe="fdescribe",d.xdescribe="xdescribe",d))(DescribeAlias||{}),TestCaseName=(d=>(d.fit="fit",d.it="it",d.test="test",d.xit="xit",d.xtest="xtest",d.bench="bench",d))(TestCaseName||{}),HookName=(d=>(d.beforeAll="beforeAll",d.beforeEach="beforeEach",d.afterAll="afterAll",d.afterEach="afterEach",d))(HookName||{}),ModifierName=(d=>(d.to="to",d.have="have",d.not="not",d.rejects="rejects",d.resolves="resolves",d.returns="returns",d.branded="branded",d.asserts="asserts",d.constructorParameters="constructorParameters",d.parameters="parameters",d.thisParameter="thisParameter",d.guards="guards",d.instance="instance",d.items="items",d))(ModifierName||{}),EqualityMatcher=(d=>(d.toBe="toBe",d.toEqual="toEqual",d.toStrictEqual="toStrictEqual",d))(EqualityMatcher||{});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"]),isTypeOfVitestFnCall=(d,q,b)=>{const Y=parseVitestFnCall(d,q);return Y!==null&&b.includes(Y.type)},parseVitestFnCall=(d,q)=>{const b=parseVitestFnCallWithReason(d,q);return typeof b=="string"?null:b},y$4=new WeakMap,parseVitestFnCallWithReason=(d,q)=>{let b=y$4.get(d);return b||(b=P$2(d,q),y$4.set(d,b),b)},F=d=>d==="expect"?"expect":d==="expectTypeOf"?"expectTypeOf":d==="vi"?"vi":DescribeAlias.hasOwnProperty(d)?"describe":TestCaseName.hasOwnProperty(d)?"test":HookName.hasOwnProperty(d)?"hook":"unknown",A$3=d=>{const q=[];for(const b of d){if(b.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&b.parent.parent?.type===utils.AST_NODE_TYPES.CallExpression)return{matcher:b,args:b.parent.parent.arguments,modifiers:q};const Y=getAccessorValue(b);if(q.length===0){if(!ModifierName.hasOwnProperty(Y))return"modifier-unknown"}else if(q.length===1){if(Y!==ModifierName.not&&Y!=ModifierName.have)return"modifier-unknown";const $=getAccessorValue(q[0]);if($!==ModifierName.resolves&&$!==ModifierName.rejects&&$!==ModifierName.to)return"modifier-unknown"}else return"modifier-unknown";q.push(b)}return"matcher-not-found"},w$2=(d,q)=>{const b=A$3(d.members);return typeof b=="string"?b:{...d,type:q,...b}},findTopMostCallExpression=d=>{let q=d,{parent:b}=d;for(;b;){if(b.type===utils.AST_NODE_TYPES.CallExpression){q=b,b=b.parent;continue}if(b.type!==utils.AST_NODE_TYPES.MemberExpression)break;b=b.parent}return q},P$2=(d,q)=>{const b=getNodeChain(d);if(!b?.length)return null;const[Y,...$]=b,B=getAccessorValue(b[b.length-1]);if(B==="each"&&d.callee.type!==utils.AST_NODE_TYPES.CallExpression&&d.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||d.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&B!=="each")return null;const H=k$2(q,d,getAccessorValue(Y));if(!H)return null;const V=H.original??H.local,K=[V,...$.map(getAccessorValue)];if(H.type!=="testContext"&&V!=="vi"&&V!=="expect"&&V!=="expectTypeOf"&&!ValidVitestFnCallChains.has(K.join(".")))return null;const G={name:V,head:{...H,node:Y},members:$},J=F(V);if(J==="expect"||J==="expectTypeOf"){const X=w$2(G,J);return typeof X=="string"&&findTopMostCallExpression(d)!==d?null:X==="matcher-not-found"&&d.parent?.type===utils.AST_NODE_TYPES.MemberExpression?"matcher-not-called":X}return b.slice(0,b.length-1).some(X=>X.parent?.type!==utils.AST_NODE_TYPES.MemberExpression)||d.parent?.type===utils.AST_NODE_TYPES.CallExpression||d.parent?.type===utils.AST_NODE_TYPES.MemberExpression?null:{...G,type:J}},M$3=(d,q)=>d&&q?[...d,...q]:null;function getNodeChain(d){if(isSupportedAccessor(d))return[d];switch(d.type){case utils.AST_NODE_TYPES.TaggedTemplateExpression:return getNodeChain(d.tag);case utils.AST_NODE_TYPES.MemberExpression:return M$3(getNodeChain(d.object),getNodeChain(d.property));case utils.AST_NODE_TYPES.CallExpression:return getNodeChain(d.callee)}return null}const k$2=(d,q,b)=>{const Y=d.sourceCode.getScope?d.sourceCode.getScope(q):d.getScope(),$=resolveScope(Y,b);return $==="local"?null:$==="testContext"?{local:b,original:null,type:"testContext"}:$?$.source==="vitest"?{original:$.imported,local:$.local,type:"import"}:null:{original:N$4(b,d),local:b,type:"global"}},N$4=(d,q)=>{const b=q.settings.vitest?.globalAliases??{},Y=Object.entries(b).find(([$,B])=>B.includes(d));return Y?Y[0]:null},I$1=({parent:d})=>{if(d?.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.Identifier)return TestCaseName.hasOwnProperty(d.callee.name)},resolveScope=(d,q)=>{let b=d;for(;b!==null;){const Y=b.set.get(q);if(Y&&Y.defs.length>0){const $=Y.defs[Y.defs.length-1],B=isFunction($.node)?$.node.params.find(K=>K.type===utils.AST_NODE_TYPES.ObjectPattern):void 0;if(B){const K=B.properties.find(G=>G.type===utils.AST_NODE_TYPES.Property);if((K?.key.type===utils.AST_NODE_TYPES.Identifier?K.key:void 0)?.name===q)return"testContext"}const H=isFunction($.node)?$.node.params.find(K=>K.type===utils.AST_NODE_TYPES.Identifier):void 0;if(H&&I$1(H.parent))return"testContext";const V=O$2($);return V?.local===q?V:"local"}b=b.upper}return null},v=d=>d.type===utils.AST_NODE_TYPES.AwaitExpression?d.argument.type===utils.AST_NODE_TYPES.ImportExpression?d.argument.source:null:d.type===utils.AST_NODE_TYPES.CallExpression&&isIdentifier(d.callee,"require")?d.arguments[0]??null:null,R=d=>d.parent.type===utils.AST_NODE_TYPES.TSImportEqualsDeclaration||d.node.type!==utils.AST_NODE_TYPES.ImportSpecifier||d.node.imported.type!=utils.AST_NODE_TYPES.Identifier||d.parent.importKind==="type"?null:{source:d.parent.source.value,imported:d.node.imported.name,local:d.node.local.name},O$2=d=>d.type==="Variable"?D$1(d):d.type==="ImportBinding"?R(d):null,D$1=d=>{if(!d.node.init)return null;const q=v(d.node.init);return!q||!isStringNode(q)||d.name.parent?.type!==utils.AST_NODE_TYPES.Property||!isSupportedAccessor(d.name.parent.key)?null:{source:getStringValue(q),imported:getAccessorValue(d.name.parent.key),local:d.name.name}},getTestCallExpressionsFromDeclaredVariables=(d,q)=>d.reduce((b,{references:Y})=>b.concat(Y.map(({identifier:$})=>$.parent).filter($=>$?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall($,q,["test"]))),[]),getFirstMatcherArg=d=>{const[q]=d.args;return q.type===utils.AST_NODE_TYPES.SpreadElement?q:followTypeAssertionChain$1(q)},L$1=d=>d.type===utils.AST_NODE_TYPES.TSAsExpression||d.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain$1=d=>L$1(d)?followTypeAssertionChain$1(d.expression):d,RULE_NAME$$="prefer-lowercase-title",E$5=d=>d.arguments[0]&&isStringNode(d.arguments[0]),x$4=d=>{const q=[];return d.includes(DescribeAlias.describe)&&q.push(...Object.keys(DescribeAlias)),d.includes(TestCaseName.test)&&q.push(...Object.keys(TestCaseName).filter(b=>b.endsWith(TestCaseName.test))),d.includes(TestCaseName.it)&&q.push(...Object.keys(TestCaseName).filter(b=>b.endsWith(TestCaseName.it))),q},we=createEslintRule({name:RULE_NAME$$,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:(d,[{ignore:q=[],allowedPrefixes:b=[],ignoreTopLevelDescribe:Y=!1,lowercaseFirstCharacterOnly:$=!1}])=>{const B=x$4(q);let H=0;return{CallExpression(V){const K=parseVitestFnCall(V,d);if(!K||!E$5)return;if(K?.type==="describe"){if(H++,Y&&H===1)return}else if(K?.type!=="test")return;const[G]=V.arguments,J=getStringValue(G);if(typeof J!="string"||b.some(ee=>J.startsWith(ee)))return;const X=J.charAt(0);B.includes(K.name)||$&&(!X||X===X.toLowerCase())||!$&&J===J.toLowerCase()||d.report({messageId:$?"lowerCaseTitle":"fullyLowerCaseTitle",node:V.arguments[0],data:{method:K.name},fix:ee=>{const z=getStringValue(G),te=[G.range[0]+1,G.range[1]-1],Q=$?z.substring(0,1).toLowerCase()+z.substring(1):z.toLowerCase();return[ee.replaceTextRange(te,Q)]}})},"CallExpression:exit"(V){isTypeOfVitestFnCall(V,d,["describe"])&&H--}}}}),RULE_NAME$_="max-nested-describe",Re=createEslintRule({name:RULE_NAME$_,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(d,[{max:q}]){const b=[];function Y(B){B.parent?.type==="CallExpression"&&(B.parent.callee.type!=="Identifier"||B.parent.callee.name!=="describe"||(b.push(0),b.length>q&&d.report({node:B.parent,messageId:"maxNestedDescribe"})))}function $(B){B.parent?.type==="CallExpression"&&(B.parent.callee.type!=="Identifier"||B.parent.callee.name!=="describe"||b.pop())}return{FunctionExpression:Y,"FunctionExpression:exit":$,ArrowFunctionExpression:Y,"ArrowFunctionExpression:exit":$}}}),RULE_NAME$Z="no-identical-title",c$4=()=>({describeTitles:[],testTitles:[]}),Le=createEslintRule({name:RULE_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(d){const q=[c$4()];return{CallExpression(b){const Y=q[q.length-1],$=parseVitestFnCall(b,d);if(!$||(($.name==="describe"||$.name==="suite")&&q.push(c$4()),$.members.find(V=>isSupportedAccessor(V,"each"))))return;const[B]=b.arguments;if(!B||!isStringNode(B))return;const H=getStringValue(B);$.type==="test"&&(Y?.testTitles.includes(H)&&d.report({node:b,messageId:"multipleTestTitle"}),Y?.testTitles.push(H)),$.type==="describe"&&(Y?.describeTitles.includes(H)&&d.report({node:b,messageId:"multipleDescribeTitle"}),Y?.describeTitles.push(H))},"CallExpression:exit"(b){isTypeOfVitestFnCall(b,d,["describe"])&&q.pop()}}}}),RULE_NAME$Y="no-focused-tests",n$2=d=>d.type==="Identifier"&&["it","test","describe"].includes(d.name),a$6=d=>d.type==="Identifier"&&d.name==="only",Te=createEslintRule({name:RULE_NAME$Y,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:d=>{const q=d.options[0]?.fixable;return{ExpressionStatement(b){if(b.expression.type==="CallExpression"){const{callee:Y}=b.expression;if(Y.type==="MemberExpression"&&n$2(Y.object)&&a$6(Y.property)&&d.report({node:Y.property,messageId:"noFocusedTests",fix:$=>q?$.removeRange([Y.property.range[0]-1,Y.property.range[1]]):null}),Y.type==="TaggedTemplateExpression"){const $=Y.tag.type==="MemberExpression"?Y.tag.object:null;if(!$)return;$.type==="MemberExpression"&&n$2($.object)&&a$6($.property)&&d.report({node:$.property,messageId:"noFocusedTests",fix:B=>q?B.removeRange([$.property.range[0]-1,$.property.range[1]]):null})}}},CallExpression(b){if(b.callee.type==="CallExpression"){const{callee:Y}=b.callee;if(Y.type==="MemberExpression"&&Y.object.type==="MemberExpression"&&n$2(Y.object.object)&&a$6(Y.object.property)&&Y.property.type==="Identifier"&&Y.property.name==="each"){const $=Y.object.property;d.report({node:Y.object.property,messageId:"noFocusedTests",fix:B=>q?B.removeRange([$.range[0]-1,$.range[1]]):null})}}}}}}),RULE_NAME$X="no-conditional-tests",Ue=createEslintRule({name:RULE_NAME$X,meta:{type:"problem",docs:{description:"disallow conditional tests",recommended:!1},schema:[],messages:{noConditionalTests:"Avoid using if conditions in a test"}},defaultOptions:[],create(d){return{Identifier:function(q){["test","it","describe"].includes(q.name)&&q.parent?.parent?.parent?.parent?.type==="IfStatement"&&d.report({node:q,messageId:"noConditionalTests"})}}}}),i$2={typecheck:!1};function parsePluginSettings(d){const q=typeof d.vitest!="object"||d.vitest===null?{}:d.vitest;return{...i$2,...q}}const RULE_NAME$W="expect-expect",_e=createEslintRule({name:RULE_NAME$W,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(d,[{assertFunctionNames:q=["expect"],additionalTestBlockFunctions:b=[]}]){const Y=[];parsePluginSettings(d.settings).typecheck&&q.push("expectTypeOf","assertType");const $=q.map(x$3);function B(H){for(const V of H){const K=V.type===utils.AST_NODE_TYPES.CallExpression?Y.indexOf(V):-1;if(V.type===utils.AST_NODE_TYPES.FunctionDeclaration){const G=d.sourceCode.getDeclaredVariables(V),J=getTestCallExpressionsFromDeclaredVariables(G,d);B(J)}if(K!==-1){Y.splice(K,1);break}}}return{CallExpression(H){if(H.callee.type===utils.AST_NODE_TYPES.Identifier&&H.callee.name==="bench"||H?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&H.callee.property.type===utils.AST_NODE_TYPES.Identifier&&H.callee.property.name==="extend"||H?.callee?.type===utils.AST_NODE_TYPES.MemberExpression&&H.callee.property.type===utils.AST_NODE_TYPES.Identifier&&H.callee.property.name==="skip")return;const V=getNodeName(H)??"";if(isTypeOfVitestFnCall(H,d,["test"])||b.includes(V)){if(H.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(H.callee.property,"todo"))return;Y.push(H)}else $.some(K=>K.test(V))&&B(d.sourceCode.getAncestors(H))},"Program:exit"(){Y.forEach(H=>{d.report({node:H.callee,messageId:"noAssertions"})})}}}});function x$3(d){const q=d.split(".").map(b=>b==="**"?"[_a-z\\d\\.]*":b.replace(/\*/gu,"[a-z\\d]*"));return new RegExp(`^${q.join("\\.")}(\\.|$)`,"ui")}const RULE_NAME$V="consistent-test-it",g$1=(d,q,b)=>Y=>[Y.replaceText(d.type===utils.AST_NODE_TYPES.MemberExpression?d.object:d,E$4(q,b))];function E$4(d,q){return d===TestCaseName.fit?"test.only":d.startsWith("f")||d.startsWith("x")?d.charAt(0)+q:q}function u$5(d){return d===TestCaseName.test?TestCaseName.it:TestCaseName.test}const he=createEslintRule({name:RULE_NAME$V,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(d){const q=d.options[0]??{},b=q.fn||TestCaseName.test,Y=q?.withinDescribe||q?.fn||TestCaseName?.it,$=b===Y?b:void 0;let B=0;return{ImportDeclaration(H){if($==null||H.source.type!=="Literal"||H.source.value!=="vitest")return;const V=u$5($);for(const K of H.specifiers)K.type==="ImportSpecifier"&&K.imported.type==="Identifier"&&K.local.name===K.imported.name&&K.local.name===V&&d.report({node:K,data:{testFnKeyWork:b,oppositeTestKeyword:V},messageId:"consistentMethod",fix:G=>{const J=H.specifiers.filter(X=>X.local.name!==V);if(J.length>0){const X=J.map(z=>z.local.name).join(", "),ee=H.specifiers.at(-1)?.range;return ee?G.replaceTextRange([H.specifiers[0].range[0],ee[1]],X):null}return G.replaceText(K.local,$)}})},CallExpression(H){if(H.callee.type===utils.AST_NODE_TYPES.Identifier&&H.callee.name==="bench")return;const V=parseVitestFnCall(H,d);if(!V)return;if(V.type==="describe"){B++;return}const K=H.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?H.callee.tag:H.callee.type===utils.AST_NODE_TYPES.CallExpression?H.callee.callee:H.callee;if(V.type==="test"&&B===0&&!V.name.endsWith(b)){const G=u$5(b);d.report({node:H.callee,data:{testFnKeyWork:b,oppositeTestKeyword:G},messageId:"consistentMethod",fix:g$1(K,V.name,b)})}else if(V.type==="test"&&B>0&&!V.name.endsWith(Y)){const G=u$5(Y);d.report({messageId:"consistentMethodWithinDescribe",node:H.callee,data:{testKeywordWithinDescribe:Y,oppositeTestKeyword:G},fix:g$1(K,V.name,Y)})}},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,d,["describe"])&&B--}}}}),RULE_NAME$U="prefer-to-be",E$3=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===null,N$3=d=>E$3(getFirstMatcherArg(d)),c$3=(d,q)=>isIdentifier(getFirstMatcherArg(d),q),h$2=d=>Math.floor(d)!==Math.ceil(d),y$3=d=>{let q=getFirstMatcherArg(d);return q.type===utils.AST_NODE_TYPES.Literal&&typeof q.value=="number"&&h$2(q.value)?!1:(q.type===utils.AST_NODE_TYPES.UnaryExpression&&q.operator==="-"&&(q=q.argument),q.type===utils.AST_NODE_TYPES.Literal?!("regex"in q):q.type===utils.AST_NODE_TYPES.TemplateLiteral)},o$2=(d,q,b,Y,$)=>{d.report({messageId:`useToBe${q}`,fix(B){const H=[replaceAccessorFixer(B,b.matcher,`toBe${q}`)];return b.args?.length&&q!==""&&H.push(removeExtraArgumentsFixer(B,d,Y,0)),$&&H.push(B.removeRange([$.range[0]-1,$.range[1]])),H},node:b.matcher})},ge=createEslintRule({name:RULE_NAME$U,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const Y=getAccessorValue(b.matcher),$=b.modifiers.find(B=>getAccessorValue(B)==="not");if($&&["toBeUndefined","toBeDefined"].includes(Y)){o$2(d,Y==="toBeDefined"?"Undefined":"Defined",b,q,$);return}if(!(!EqualityMatcher.hasOwnProperty(Y)||b.args.length===0)){if(N$3(b)){o$2(d,"Null",b,q);return}if(c$3(b,"undefined")){o$2(d,$?"Defined":"Undefined",b,q);return}if(c$3(b,"NaN")){o$2(d,"NaN",b,q);return}y$3(b)&&Y!==EqualityMatcher.toBe&&o$2(d,"",b,q)}}}}}),RULE_NAME$T="no-hooks",be=createEslintRule({name:RULE_NAME$T,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(d,[{allow:q=[]}]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);Y?.type==="hook"&&!q.includes(Y.name)&&d.report({node:b,messageId:"unexpectedHook",data:{hookName:Y.name}})}}}}),RULE_NAME$S="no-restricted-vi-methods",ke=createEslintRule({name:RULE_NAME$S,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(d,[q]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type!=="vi"||Y.members.length===0)return;const $=getAccessorValue(Y.members[0]);if($ in q){const B=q[$];d.report({messageId:B?"restrictedViMethodWithMessage":"restrictedViMethod",data:{message:B,restriction:$},loc:{start:Y.members[0].loc.start,end:Y.members[Y.members.length-1].loc.end}})}}}}}),RULE_NAME$R="consistent-test-filename",o$1=/.*\.test\.[tj]sx?$/,e=/.*\.(test|spec)\.[tj]sx?$/,xe=createEslintRule({name:RULE_NAME$R,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:d=>{const q=d.options[0]??{},{pattern:b=o$1,allTestPattern:Y=e}=q,$=typeof b=="string"?new RegExp(b):b,B=typeof Y=="string"?new RegExp(Y):Y,{filename:H}=d;return B.test(H)?{Program:V=>{$.test(H)||d.report({node:V,messageId:"consistentTestFilename",data:{pattern:$.source}})}}:{}}}),RULE_NAME$Q="max-expects",ve=createEslintRule({name:RULE_NAME$Q,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(d,[{max:q}]){let b=0;const Y=$=>{($.parent?.type!==utils.AST_NODE_TYPES.CallExpression||isTypeOfVitestFnCall($.parent,d,["test"]))&&(b=0)};return{FunctionExpression:Y,"FunctionExpression:exit":Y,ArrowFunctionExpression:Y,"ArrowFunctionExpression:exit":Y,CallExpression($){const B=parseVitestFnCall($,d);B?.type!=="expect"||B.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression||(b+=1,b>q&&d.report({node:$,messageId:"maxExpect",data:{count:b,max:q}}))}}}}),RULE_NAME$P="no-alias-methods",Ce=createEslintRule({name:RULE_NAME$P,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(d){const q={toBeCalled:"toHaveBeenCalled",toBeCalledTimes:"toHaveBeenCalledTimes",toBeCalledWith:"toHaveBeenCalledWith",lastCalledWith:"toHaveBeenLastCalledWith",nthCalledWith:"toHaveBeenNthCalledWith",toReturn:"toHaveReturned",toReturnTimes:"toHaveReturnedTimes",toReturnWith:"toHaveReturnedWith",lastReturnedWith:"toHaveLastReturnedWith",nthReturnedWith:"toHaveNthReturnedWith",toThrowError:"toThrow"};return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type!=="expect")return;const{matcher:$}=Y,B=getAccessorValue($);if(B in q){const H=q[B];d.report({messageId:"noAliasMethods",data:{alias:B,canonical:H},node:$,fix:V=>[replaceAccessorFixer(V,$,H)]})}}}}}),RULE_NAME$O="no-commented-out-tests";function n$1(d){return/^\s*[xf]?(test|it|describe)(\.\w+|\[['"]\w+['"]\])?\s*\(/mu.test(d.value)}const Be=createEslintRule({name:RULE_NAME$O,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(d){const{sourceCode:q}=d;function b(Y){n$1(Y)&&d.report({messageId:"noCommentedOutTests",node:Y})}return{Program(){q.getAllComments().forEach(b)}}}}),RULE_NAME$N="no-conditional-expect",r=d=>d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.property,"catch"),Se=createEslintRule({name:RULE_NAME$N,meta:{type:"problem",docs:{description:"disallow conditional expects",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalExpect:"Avoid calling `expect` inside conditional statements"},schema:[]},defaultOptions:[],create(d){let q=0,b=!1,Y=!1;const $=()=>b&&q++,B=()=>b&&q--;return{FunctionDeclaration(H){const V=d.sourceCode.getDeclaredVariables(H);getTestCallExpressionsFromDeclaredVariables(V,d).length>0&&(b=!0)},CallExpression(H){const{type:V}=parseVitestFnCall(H,d)??{};V==="test"&&(b=!0),r(H)&&(Y=!0),b&&V==="expect"&&q>0&&d.report({messageId:"noConditionalExpect",node:H}),Y&&V==="expect"&&d.report({messageId:"noConditionalExpect",node:H})},"CallExpression:exit"(H){isTypeOfVitestFnCall(H,d,["test"])&&(b=!1),r(H)&&(Y=!1)},CatchClause:$,"CatchClause:exit":B,IfStatement:$,"IfStatement:exit":B,SwitchStatement:$,"SwitchStatement:exit":B,ConditionalExpression:$,"ConditionalExpression:exit":B,LogicalExpression:$,"LogicalExpression:exit":B}}}),RULE_NAME$M="no-import-node-test",ye=createEslintRule({name:RULE_NAME$M,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(d){return{ImportDeclaration(q){q.source.value==="node:test"&&d.report({messageId:"noImportNodeTest",node:q,fix:b=>b.replaceText(q.source,q.source.raw.replace("node:test","vitest"))})}}}}),RULE_NAME$L="no-conditional-in-test",Ie=createEslintRule({name:RULE_NAME$L,meta:{docs:{description:"disallow conditional tests",requiresTypeChecking:!1,recommended:!1},messages:{noConditionalInTest:"Remove conditional tests"},schema:[],type:"problem"},defaultOptions:[],create(d){return{IfStatement(q){q.parent?.parent?.parent?.type==="CallExpression"&&isTypeOfVitestFnCall(q.parent?.parent?.parent,d,["test","it"])&&d.report({messageId:"noConditionalInTest",node:q})}}}}),RULE_NAME$K="no-disabled-tests",He=createEslintRule({name:RULE_NAME$K,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(d){let q=0,b=0;return{CallExpression(Y){const $=parseVitestFnCall(Y,d);if(!$)return;$.type==="describe"&&q++,$.type==="test"&&(b++,Y.arguments.length<2&&$.members.every(H=>getAccessorValue(H)==="skip")&&d.report({messageId:"missingFunction",node:Y}));const B=$.members.find(H=>getAccessorValue(H)==="skip");($.name.startsWith("x")||B!==void 0)&&d.report({messageId:$.type==="describe"?"disabledSuite":"disabledTest",node:B??$.head.node})},"CallExpression:exit"(Y){const $=parseVitestFnCall(Y,d);$&&($.type==="describe"&&q--,$.type==="test"&&b--)},'CallExpression[callee.name="pending"]'(Y){const $=d.sourceCode.getScope?d.sourceCode.getScope(Y):d.getScope();resolveScope($,"pending")||(b>0?d.report({messageId:"pendingTest",node:Y}):q>0?d.report({messageId:"pendingSuite",node:Y}):d.report({messageId:"pending",node:Y}))}}}}),RULE_NAME$J="no-done-callback",P$1=(d,q,b)=>{if(q)return d.arguments[1];const Y=parseVitestFnCall(d,b);return Y?.type==="hook"&&d.arguments.length>=1?d.arguments[0]:Y?.type==="test"&&d.arguments.length>=2?d.arguments[1]:null},Oe=createEslintRule({name:RULE_NAME$J,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(d){return{CallExpression(q){const b=/\.each$|\.concurrent$/.test(getNodeName(q.callee)??"");if(b&&q.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression||d.sourceCode.getAncestors(q).some(H=>H.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(H,d,["describe","test"])?!1:H.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(H.callee.property,"concurrent")))return;const Y=P$1(q,b,d),$=Number(b);if(!Y||!isFunction(Y)||Y.params.length!==1+$)return;const B=Y.params[$];if(B.type!==utils.AST_NODE_TYPES.Identifier){d.report({node:B,messageId:"noDoneCallback"});return}if(Y.async){d.report({node:B,messageId:"useAwaitInsteadOfCallback"});return}d.report({node:q,messageId:"noDoneCallback",suggest:[{messageId:"suggestWrappingInPromise",data:{callback:B.name},fix(H){const{body:V,params:K}=Y,{sourceCode:G}=d,J=G.getFirstToken(V),X=G.getLastToken(V),[ee]=K,z=K[K.length-1],te=G.getTokenBefore(ee);let Q=G.getTokenAfter(z);if(Q?.value===","&&(Q=G.getTokenAfter(Q)),!J||!X||!te||!Q)throw new Error(`Unexpected null when attempting to fix ${d.filename} - please file an issue at https://github/veritem/eslint-plugin-vitest`);let Z=H.replaceText(ee,"()");te.value==="("&&Q.value===")"&&(Z=H.removeRange([te.range[1],Q.range[0]]));let oe=`new Promise(${B.name} => `,ne=")",se=!0;return V.type===utils.AST_NODE_TYPES.BlockStatement&&(oe=`return ${oe}{`,ne+="}",se=!1),[Z,se?H.insertTextBefore(J,oe):H.insertTextAfter(J,oe),H.insertTextAfter(X,ne)]}}]})}}}}),RULE_NAME$I="no-duplicate-hooks",qe=createEslintRule({name:RULE_NAME$I,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(d){const q=[{}];return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type==="describe"&&q.push({}),Y?.type!=="hook")return;const $=q[q.length-1];$[Y.name]||=0,$[Y.name]+=1,$[Y.name]>1&&d.report({messageId:"noDuplicateHooks",data:{hook:Y.name},node:b})},"CallExpression:exit"(b){isTypeOfVitestFnCall(b,d,["describe"])&&q.pop()}}}}),RULE_NAME$H="no-large-snapshots",m$4=(d,q,{maxSize:b=50,allowedSnapshots:Y={}})=>{const $=q.loc.start.line,B=q.loc.end.line-$;if(!Object.keys(Y).every(node_path.isAbsolute))throw new Error("All paths for allowedSnapshots must be absolute. You can use JS config and `path.resolve`");let H=!1;if(q.type===utils.AST_NODE_TYPES.ExpressionStatement&&"left"in q.expression&&q.expression.left.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.expression.left.property)){const V=d.filename,K=Y[V];if(K){const G=getAccessorValue(q.expression.left.property);H=K.some(J=>J instanceof RegExp?J.test(G):G===J)}}!H&&B>b&&d.report({node:q,messageId:b===0?"noSnapShot":"tooLongSnapShot",data:{lineCount:B,lineLimit:b}})},De=createEslintRule({name:RULE_NAME$H,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(d,[q]){return d.filename.endsWith(".snap")?{ExpressionStatement(b){m$4(d,b,q)}}:{CallExpression(b){const Y=parseVitestFnCall(b,d);Y?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(Y.matcher))&&Y.args.length&&m$4(d,Y.args[0],{...q,maxSize:q.inlineMaxSize??q.maxSize})}}}}),RULE_NAME$G="no-interpolation-in-snapshots",Fe=createEslintRule({name:RULE_NAME$G,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);b?.type==="expect"&&["toMatchInlineSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(getAccessorValue(b.matcher))&&b.args.forEach(Y=>{Y.type===utils.AST_NODE_TYPES.TemplateLiteral&&Y.expressions.length>0&&d.report({messageId:"noInterpolationInSnapshots",node:Y})})}}}}),t="__mocks__",p$1=d=>d.split(node_path.posix.sep).includes(t),s=d=>isStringNode(d)&&p$1(getStringValue(d)),RULE_NAME$F="no-mocks-import",Pe=createEslintRule({name:RULE_NAME$F,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(d){return{ImportDeclaration(q){s(q.source)&&d.report({node:q,messageId:"noMocksImport"})},'CallExpression[callee.name="require"]'(q){const[b]=q.arguments;b&&s(b)&&d.report({node:b,messageId:"noMocksImport"})}}}}),RULE_NAME$E="no-restricted-matchers",l$3=(d,q)=>ModifierName.hasOwnProperty(q)||q.endsWith(".not")?d.startsWith(q):d===q,je=createEslintRule({name:RULE_NAME$E,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(d,[q]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type!=="expect")return;const $=Y.members.map(B=>getAccessorValue(B)).join(".");for(const[B,H]of Object.entries(q))if(l$3($,B)){d.report({messageId:H?"restrictedChainWithMessage":"restrictedChain",data:{message:H,restriction:B},loc:{start:Y.members[0].loc.start,end:Y.members[Y.members.length-1].loc.end}});break}}}}}),RULE_NAME$D="no-standalone-expect",a$5=(d,q)=>{const b=d.parent;if(!b)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(b.type===utils.AST_NODE_TYPES.FunctionDeclaration)return"function";if(isFunction(b)&&b.parent){const Y=b.parent;if(Y.type===utils.AST_NODE_TYPES.VariableDeclarator)return"function";if(Y.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(Y,q,["describe"]))return"describe"}return null},Ve=createEslintRule({name:RULE_NAME$D,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(d,[{additionalTestBlockFunctions:q=[]}]){const b=[],Y=$=>q.includes(getNodeName($)||"");return{CallExpression($){const B=parseVitestFnCall($,d);if(B?.type==="expect"){if(B.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&B.members.length===1&&!["assertions","hasAssertions"].includes(getAccessorValue(B.members[0])))return;const H=b[b.length-1];(!H||H===DescribeAlias.describe)&&d.report({node:$,messageId:"noStandaloneExpect"});return}(B?.type==="test"||Y($))&&b.push("test"),$.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression&&b.push("template")},"CallExpression:exit"($){const B=b[b.length-1];(B==="test"&&(isTypeOfVitestFnCall($,d,["test"])||Y($))&&$.callee.type!==utils.AST_NODE_TYPES.MemberExpression||B==="template"&&$.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression)&&b.pop()},BlockStatement($){const B=a$5($,d);B&&b.push(B)},"BlockStatement:exit"($){a$5($,d)&&b.pop()},ArrowFunctionExpression($){$.parent?.type!==utils.AST_NODE_TYPES.CallExpression&&b.push("arrow")},"ArrowFunctionExpression:exit"(){b[b.length-1]==="arrow"&&b.pop()}}}}),RULE_NAME$C="no-test-prefixes",Ke=createEslintRule({name:RULE_NAME$C,meta:{docs:{description:"disallow using `test` as a prefix",recommended:!1},type:"suggestion",messages:{usePreferredName:'Use "{{ preferredNodeName }}" instead'},fixable:"code",schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="describe"&&b?.type!=="test"||b.name[0]!=="f"&&b.name[0]!=="x")return;const Y=[b.name.slice(1),b.name[0]==="f"?"only":"skip",...b.members.map(B=>getAccessorValue(B))].join("."),$=q.callee.type===utils.AST_NODE_TYPES.TaggedTemplateExpression?q.callee.tag:q.callee.type===utils.AST_NODE_TYPES.CallExpression?q.callee.callee:q.callee;d.report({messageId:"usePreferredName",node:q.callee,data:{preferredNodeName:Y},fix:B=>[B.replaceText($,Y)]})}}}}),RULE_NAME$B="no-test-return-statement",u$4=d=>{const[,q]=d;return q&&isFunction(q)&&q.body.type===utils.AST_NODE_TYPES.BlockStatement?q.body.body:[]},$e=createEslintRule({name:RULE_NAME$B,meta:{type:"problem",docs:{description:"disallow return statements in tests",recommended:!1},schema:[],messages:{noTestReturnStatement:"Return statements are not allowed in tests"}},defaultOptions:[],create(d){return{CallExpression(q){if(!isTypeOfVitestFnCall(q,d,["test"]))return;const b=u$4(q.arguments).find(Y=>Y.type===utils.AST_NODE_TYPES.ReturnStatement);b&&d.report({messageId:"noTestReturnStatement",node:b})},FunctionDeclaration(q){const b=d.sourceCode.getDeclaredVariables(q);if(getTestCallExpressionsFromDeclaredVariables(b,d).length===0)return;const Y=q.body.body.find($=>$.type===utils.AST_NODE_TYPES.ReturnStatement);Y&&d.report({messageId:"noTestReturnStatement",node:Y})}}}}),RULE_NAME$A="prefer-called-with",Ge=createEslintRule({name:RULE_NAME$A,meta:{docs:{description:"enforce using `toBeCalledWith()` or `toHaveBeenCalledWith()`",recommended:!1},messages:{preferCalledWith:"Prefer {{ matcherName }}With(/* expected args */)"},type:"suggestion",fixable:"code",schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.modifiers.some(B=>getAccessorValue(B)==="not"))return;const{matcher:Y}=b,$=getAccessorValue(Y);["toBeCalled","toHaveBeenCalled"].includes($)&&d.report({data:{matcherName:$},messageId:"preferCalledWith",node:Y,fix:B=>[B.replaceText(Y,`${$}With`)]})}}}}),RULE_NAME$z="valid-title",W=d=>["f","x"].includes(d.charAt(0))?d.substring(1):d,T$2=d=>d.type===utils.AST_NODE_TYPES.TemplateLiteral?`\`${d.quasis[0].value.raw}\``:d.raw,A$2={type:"array",items:{type:"string"},minItems:1,maxItems:2,additionalItems:!1},u$3=d=>{const[q,b]=Array.isArray(d)?d:[d];return[new RegExp(q,"u"),b]};function _(d){const q=d.getSymbol();return q?q.getDeclarations()?.some(b=>o__default.isFunctionDeclaration(b)||o__default.isMethodDeclaration(b)||o__default.isFunctionExpression(b)||o__default.isArrowFunction(b))??!1:!1}function j(d){const q=d.getSymbol();return q?q.getDeclarations()?.some(b=>o__default.isClassDeclaration(b)||o__default.isClassExpression(b))??!1:!1}function k$1(d){return!!(d.flags&o__default.TypeFlags.StringLike)}const E$2=d=>{if(typeof d=="string"||Array.isArray(d)){const q=u$3(d);return{describe:q,test:q,it:q}}return{describe:d.describe?u$3(d.describe):null,test:d.test?u$3(d.test):null,it:d.it?u$3(d.it):null}},C$1=d=>isStringNode(d.right)?!0:d.left.type===utils.AST_NODE_TYPES.BinaryExpression?C$1(d.left):isStringNode(d.left),We=createEslintRule({name:RULE_NAME$z,meta:{docs:{description:"enforce valid titles",recommended:!1},messages:{titleMustBeString:"Test title must be a string, a function or class name",emptyTitle:"{{ functionName }} should not have an empty title",duplicatePrefix:"should not have duplicate prefix",accidentalSpace:"should not have leading or trailing spaces",disallowedWord:'"{{ word }}" is not allowed in test title',mustNotMatch:"{{ functionName }} should not match {{ pattern }}",mustMatch:"{{ functionName }} should match {{ pattern }}",mustNotMatchCustom:"{{ message }}",mustMatchCustom:"{{ message }}"},type:"suggestion",schema:[{type:"object",properties:{ignoreTypeOfDescribeName:{type:"boolean",default:!1},allowArguments:{type:"boolean",default:!1},disallowedWords:{type:"array",items:{type:"string"}}},patternProperties:{[/^must(?:Not)?Match$/u.source]:{oneOf:[{type:"string"},A$2,{type:"object",propertyNames:{type:"string",enum:["describe","test","it"]},additionalProperties:{oneOf:[{type:"string"},A$2]}}]}},additionalProperties:!1}],fixable:"code"},defaultOptions:[{ignoreTypeOfDescribeName:!1,allowArguments:!1,disallowedWords:[]}],create(d,[{ignoreTypeOfDescribeName:q,allowArguments:b,disallowedWords:Y=[],mustNotMatch:$,mustMatch:B}]){const H=new RegExp(`\\b(${Y.join("|")})\\b`,"iu"),V=E$2($??{}),K=E$2(B??{}),G=parsePluginSettings(d.settings);return{CallExpression(J){const X=parseVitestFnCall(J,d);if(X?.type!=="describe"&&X?.type!=="test"&&X?.type!=="it"||X.members&&X.members[0]&&X.members[0].type===utils.AST_NODE_TYPES.Identifier&&X.members[0].name==="extend")return;const ee=ie=>{d.report({messageId:"emptyTitle",data:{functionName:X.type==="describe"?DescribeAlias.describe:TestCaseName.test},node:ie})},[z]=J.arguments;if(G.typecheck){const ie=utils.ESLintUtils.getParserServices(d).getTypeAtLocation(z);if(_(ie)||j(ie))return;if(k$1(ie)){isStringNode(z)&&!getStringValue(z)&&ee(J);return}}if(!z||b&&z.type===utils.AST_NODE_TYPES.Identifier)return;if(!isStringNode(z)){if(z.type===utils.AST_NODE_TYPES.BinaryExpression&&C$1(z))return;z.type!==utils.AST_NODE_TYPES.TemplateLiteral&&!(q&&X.type==="describe")&&d.report({messageId:"titleMustBeString",loc:z.loc});return}const te=getStringValue(z);if(!te){ee(J);return}if(Y.length>0){const ie=H.exec(te);if(ie){d.report({messageId:"disallowedWord",data:{word:ie[1]},node:z});return}}te.trim().length!==te.length&&d.report({messageId:"accidentalSpace",node:z,fix:ie=>[ie.replaceTextRange(z.range,T$2(z).replace(/^([`'"]) +?/u,"$1").replace(/ +?([`'"])$/u,"$1"))]});const Q=W(X.name),[Z]=te.split(" ");Z.toLowerCase()===Q&&d.report({messageId:"duplicatePrefix",node:z,fix:ie=>[ie.replaceTextRange(z.range,T$2(z).replace(/^([`'"]).+? /u,"$1"))]});const oe=Q,[ne,se]=V[oe]??[];if(ne&&ne.test(te)){d.report({messageId:se?"mustNotMatchCustom":"mustNotMatch",node:z,data:{functionName:oe,pattern:ne,message:se}});return}const[re,ae]=K[oe]??[];re&&(re.test(te)||d.report({messageId:ae?"mustMatchCustom":"mustMatch",node:z,data:{functionName:oe,pattern:re,message:ae}}))}}}}),RULE_NAME$y="valid-expect",h$1=["toReject","toResolve"],D=d=>(d.type===utils.AST_NODE_TYPES.ArrayExpression&&d.parent&&d.parent.type===utils.AST_NODE_TYPES.CallExpression&&(d=d.parent),d.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.object,"Promise")&&d.parent?d:null),A$1=({start:d,end:q})=>`${d.line}:${d.column}-${q.line}:${q.column}`,O$1=d=>d.parent.type===utils.AST_NODE_TYPES.Property&&d.type===utils.AST_NODE_TYPES.FunctionExpression?d.parent:d;function M$2(d){const q=d.parent?.parent;return q&&q.type===utils.AST_NODE_TYPES.CallExpression&&q.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(q.callee.property)&&["then","catch"].includes(getAccessorValue(q.callee.property))&&q.parent?M$2(q):d}const U=d=>d.parent?.parent&&[utils.AST_NODE_TYPES.CallExpression,utils.AST_NODE_TYPES.ArrayExpression].includes(d.parent.type)?D(d.parent):null,N$2=({parent:d})=>d?isFunction(d)?d:N$2(d):null,w$1=(d,q)=>q&&d.type===utils.AST_NODE_TYPES.ReturnStatement?!0:d.type===utils.AST_NODE_TYPES.ConditionalExpression&&d.parent?w$1(d.parent,q):[utils.AST_NODE_TYPES.ArrowFunctionExpression,utils.AST_NODE_TYPES.AwaitExpression].includes(d.type),ze=createEslintRule({name:RULE_NAME$y,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:(d,[{alwaysAwait:q,asyncMatchers:b=h$1,minArgs:Y=1,maxArgs:$=1}])=>{const B=new Set,H=[],V=J=>B.add(A$1(J)),K=J=>B.has(A$1(J)),G=J=>{let X=J,{parent:ee}=J;for(;ee&&ee.type===utils.AST_NODE_TYPES.MemberExpression;)X=ee,ee=ee.parent;return X};return{CallExpression(J){const X=parseVitestFnCallWithReason(J,d),ee=parsePluginSettings(d.settings);if(typeof X=="string"){const re=J.parent?.type===utils.AST_NODE_TYPES.MemberExpression?G(J.parent).property:J;if(X==="matcher-not-found"){d.report({messageId:"matcherNotFound",node:re});return}if(X==="matcher-not-called"&&d.report({messageId:isSupportedAccessor(re)&&ModifierName.hasOwnProperty(getAccessorValue(re))?"matcherNotFound":"matcherNotCalled",node:re}),X==="modifier-unknown"){d.report({messageId:"modifierUnknown",node:re});return}return}else if(X?.type==="expectTypeOf"&&ee.typecheck||X?.type!=="expect"||X.modifiers.some(re=>re.type===utils.AST_NODE_TYPES.Identifier&&re.name=="to"))return;const{parent:z}=X.head.node;if(z?.type!==utils.AST_NODE_TYPES.CallExpression)return;if(z.arguments.length<Y){const re=getAccessorValue(X.head.node).length,ae={start:{column:z.loc.start.column+re,line:z.loc.start.line},end:{column:z.loc.start.column+re+1,line:z.loc.start.line}};d.report({messageId:"notEnoughArgs",data:{amount:Y,s:Y===1?"":"s"},node:z,loc:ae})}if(z.arguments.length>$){if(z.arguments.length===2){const ce=z.arguments[1].type===utils.AST_NODE_TYPES.Literal&&typeof z.arguments[1].value=="string",le=z.arguments[1].type===utils.AST_NODE_TYPES.TemplateLiteral;if(ce||le)return}const{start:re}=z.arguments[$].loc,{end:ae}=z.arguments[z.arguments.length-1].loc,ie={start:re,end:{column:ae.column+1,line:ae.line}};d.report({messageId:"tooManyArgs",data:{amount:$,s:$===1?"":"s"},node:z,loc:ie})}const{matcher:te}=X,Q=te.parent.parent,Z=X.modifiers.some(re=>getAccessorValue(re)!=="not")||b.includes(getAccessorValue(te));if(!Q?.parent||!Z)return;const oe=Q.parent.type===utils.AST_NODE_TYPES.ArrayExpression,ne=M$2(Q),se=U(ne)||ne;se.parent&&!w$1(se.parent,!q)&&!K(se.loc)&&(H.push({messageId:se===ne?"asyncMustBeAwaited":"promisesWithAsyncAssertionsMustBeAwaited",node:se}),oe&&V(se.loc))},"Program:exit"(){const J=[];H.forEach(({node:X,messageId:ee},z)=>{const te=q?"":" or returned";d.report({loc:X.loc,data:{orReturned:te},messageId:ee,node:X,fix(Q){const Z=N$2(X);if(!Z)return null;const oe=J.some(se=>se.text==="async ");if(!Z.async&&!oe){const se=O$1(Z);J.push(Q.insertTextBefore(se,"async "))}const ne=X.parent?.type===utils.AST_NODE_TYPES.ReturnStatement?X.parent:null;if(q&&ne){const se=d.sourceCode.getText(ne).replace("return","await");J.push(Q.replaceText(ne,se))}else J.push(Q.insertTextBefore(X,"await "));return z===H.length-1?J:null}})})}}}}),isBooleanLiteral=d=>d.type===utils.AST_NODE_TYPES.Literal&&typeof d.value=="boolean",isBooleanEqualityMatcher=d=>{const q=getAccessorValue(d.matcher);if(["toBeTruthy","toBeFalsy"].includes(q))return!0;if(d.args.length!==1)return!1;const b=getFirstMatcherArg(d);return EqualityMatcher.hasOwnProperty(q)&&isBooleanLiteral(b)},isInstanceOfBinaryExpression=(d,q)=>d.type===utils.AST_NODE_TYPES.BinaryExpression&&d.operator==="instanceof"&&isSupportedAccessor(d.right,q),hasOnlyOneArgument=d=>d.arguments.length===1,RULE_NAME$x="prefer-to-be-object",Je=createEslintRule({name:RULE_NAME$x,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expectTypeOf")return;if(isParsedInstanceOfMatcherCall(b,"Object")){d.report({node:b.matcher,messageId:"preferToBeObject",fix:B=>[B.replaceTextRange([b.matcher.range[0],b.matcher.range[1]+8],"toBeObject()")]});return}const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[$]=Y.arguments;!$||!isBooleanEqualityMatcher(b)||!isInstanceOfBinaryExpression($,"Object")||d.report({node:b.matcher,messageId:"preferToBeObject",fix(B){const H=[B.replaceText(b.matcher,"toBeObject"),B.removeRange([$.left.range[1],$.range[1]])];let V=getAccessorValue(b.matcher)==="toBeFalsy";if(b.args.length){const[K]=b.args;H.push(B.remove(K)),V=K.type===utils.AST_NODE_TYPES.Literal&&followTypeAssertionChain$1(K).value===!1}if(V){const K=b.modifiers.find(G=>getAccessorValue(G)==="not");H.push(K?B.removeRange([K.range[0]-1,K.range[1]]):B.insertTextBefore(b.matcher,"not."))}return H}})}}}}),RULE_NAME$w="prefer-to-be-truthy",n=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===!0,Qe=createEslintRule({name:RULE_NAME$w,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);(b?.type==="expect"||b?.type==="expectTypeOf")&&b.args.length===1&&n(getFirstMatcherArg(b))&&EqualityMatcher.hasOwnProperty(getAccessorValue(b.matcher))&&d.report({node:b.matcher,messageId:"preferToBeTruthy",fix:Y=>[Y.replaceText(b.matcher,"toBeTruthy"),Y.remove(b.args[0])]})}}}}),RULE_NAME$v="prefer-to-be-falsy",c$2=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===!1,Xe=createEslintRule({name:RULE_NAME$v,meta:{type:"suggestion",docs:{description:"enforce using toBeFalsy()",recommended:!1},fixable:"code",schema:[],messages:{preferToBeFalsy:"Prefer using toBeFalsy()"}},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);(b?.type==="expect"||b?.type==="expectTypeOf")&&b.args.length===1&&c$2(getFirstMatcherArg(b))&&EqualityMatcher.hasOwnProperty(getAccessorValue(b.matcher))&&d.report({node:b.matcher,messageId:"preferToBeFalsy",fix:Y=>[Y.replaceText(b.matcher,"toBeFalsy"),Y.remove(b.args[0])]})}}}}),RULE_NAME$u="prefer-to-have-length",Ye=createEslintRule({name:RULE_NAME$u,meta:{type:"suggestion",docs:{description:"enforce using toHaveLength()",recommended:!1},fixable:"code",messages:{preferToHaveLength:"Prefer toHaveLength()"},schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[$]=Y.arguments,{matcher:B}=b;!EqualityMatcher.hasOwnProperty(getAccessorValue(B))||$?.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor($.property,"length")||d.report({node:B,messageId:"preferToHaveLength",fix(H){return[H.removeRange([$.property.range[0]-1,$.range[1]]),H.replaceTextRange([B.parent.object.range[1],B.parent.range[1]],".toHaveLength")]}})}}}}),RULE_NAME$t="prefer-equality-matcher",Ze=createEslintRule({name:RULE_NAME$t,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.args.length===0)return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[$],range:[,B]}=Y,{matcher:H}=b,V=getFirstMatcherArg(b);if($?.type!==utils.AST_NODE_TYPES.BinaryExpression||$.operator!=="==="&&$.operator!=="!=="||!EqualityMatcher.hasOwnProperty(getAccessorValue(H))||!isBooleanLiteral(V))return;const K=V.value,[G]=b.modifiers,J=b.modifiers.some(z=>getAccessorValue(z)==="not"),X=($.operator==="!=="?!K:K)===J,ee=z=>te=>{const{sourceCode:Q}=d;let Z=G&&getAccessorValue(G)!=="not"?`.${getAccessorValue(G)}`:"";return X&&(Z+=`.${ModifierName.not}`),[te.replaceText($,Q.getText($.left)),te.replaceTextRange([B,H.parent.range[1]],`${Z}.${z}`),te.replaceText(V,Q.getText($.right))]};d.report({messageId:"useEqualityMatcher",suggest:["toBe","toEqual","toStrictEqual"].map(z=>({messageId:"suggestEqualityMatcher",data:{equalityMatcher:z},fix:ee(z)})),node:H})}}}}),RULE_NAME$s="prefer-strict-equal",er=createEslintRule({name:RULE_NAME$s,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{matcher:Y}=b;isSupportedAccessor(Y,"toEqual")&&d.report({messageId:"useToStrictEqual",node:Y,suggest:[{messageId:"suggestReplaceWithStrictEqual",fix:$=>[replaceAccessorFixer($,Y,EqualityMatcher.toStrictEqual)]}]})}}}}),RULE_NAME$r="prefer-expect-resolves",rr=createEslintRule({name:RULE_NAME$r,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:d=>({CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const[$]=Y.arguments;$?.type===utils.AST_NODE_TYPES.AwaitExpression&&d.report({node:$,messageId:"expectResolves",fix(B){return[B.insertTextBefore(Y,"await "),B.removeRange([$.range[0],$.argument.range[0]]),B.insertTextAfter(Y,".resolves")]}})}})}),RULE_NAME$q="prefer-each",or=createEslintRule({name:RULE_NAME$q,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(d){const q=[];let b=!1;const Y=()=>q.length===1&&q[0]==="test"?"it":"describe",$=()=>{q.length===0||b||(q.length=0)},B=H=>{q.length===0||b||(d.report({node:H,messageId:"preferEach",data:{fn:Y()}}),q.length=0)};return{ForStatement:$,"ForStatement:exit":B,ForInStatement:$,"ForInStatement:exit":B,ForOfStatement:$,"ForOfStatement:exit":B,CallExpression(H){const{type:V}=parseVitestFnCall(H,d)??{};(V==="hook"||V==="describe"||V==="test")&&q.push(V),V==="test"&&(b=!0)},"CallExpression:exit"(H){const{type:V}=parseVitestFnCall(H,d)??{};V==="test"&&(b=!1)}}}}),RULE_NAME$p="prefer-hooks-on-top",ar=createEslintRule({name:RULE_NAME$p,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(d){const q=[!1];return{CallExpression(b){isTypeOfVitestFnCall(b,d,["test"])&&(q[q.length-1]=!0),q[q.length-1]&&isTypeOfVitestFnCall(b,d,["hook"])&&d.report({messageId:"noHookOnTop",node:b}),q.push(!1)},"CallExpression:exit"(){q.pop()}}}}),RULE_NAME$o="prefer-hooks-in-order",a$4=["beforeAll","beforeEach","afterEach","afterAll"],tr=createEslintRule({name:RULE_NAME$o,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(d){let q=-1,b=!1;return{CallExpression(Y){if(b)return;const $=parseVitestFnCall(Y,d);if($?.type!=="hook"){q=-1;return}b=!0;const B=$.name,H=a$4.indexOf(B);if(H<q){d.report({messageId:"reorderHooks",data:{previousHook:a$4[q],currentHook:B},node:Y}),b=!1;return}q=H},"CallExpression:exit"(Y){if(isTypeOfVitestFnCall(Y,d,["hook"])){b=!1;return}b||(q=-1)}}}}),RULE_NAME$n="prefer-mock-promise-shorthand",l$2=(d,q)=>`${d}${q?"Once":""}`,f=d=>d.body.type!==utils.AST_NODE_TYPES.BlockStatement?d.body:d.body.body[0]?.type===utils.AST_NODE_TYPES.ReturnStatement?d.body.body[0].argument:null,nr=createEslintRule({name:RULE_NAME$n,meta:{type:"suggestion",docs:{description:"enforce mock resolved/rejected shorthands for promises",recommended:!1},messages:{useMockShorthand:"Prefer {{ replacement }}"},schema:[],fixable:"code"},defaultOptions:[],create(d){const q=(b,Y,$,B=$)=>{if(B?.type!==utils.AST_NODE_TYPES.CallExpression)return;const H=getNodeName(B);if(H!=="Promise.resolve"&&H!=="Promise.reject")return;const V=l$2(H.endsWith("reject")?"mockRejectedValue":"mockResolvedValue",Y);d.report({node:b,messageId:"useMockShorthand",data:{replacement:V},fix(K){const{sourceCode:G}=d;return B.arguments.length>1?null:[K.replaceText(b,V),K.replaceText($,B.arguments.length===1?G.getText(B.arguments[0]):"undefined")]}})};return{CallExpression(b){if(b.callee.type!==utils.AST_NODE_TYPES.MemberExpression||!isSupportedAccessor(b.callee.property)||b.arguments.length===0)return;const Y=getAccessorValue(b.callee.property),$=Y.endsWith("Once");if(Y===l$2("mockReturnValue",$))q(b.callee.property,$,b.arguments[0]);else if(Y===l$2("mockImplementation",$)){const[B]=b.arguments;if(!isFunction(B)||B.params.length!==0)return;q(b.callee.property,$,B,f(B))}}}}}),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=d=>p.has(d),isTokenASemicolon=d=>d.value===";"&&d.type===utils.AST_TOKEN_TYPES.Punctuator,getActualLastToken=(d,q)=>{const b=d.getLastToken(q),Y=d.getTokenBefore(b),$=d.getTokenAfter(b);return Y&&$&&Y.range[0]>=q.range[0]&&isTokenASemicolon(b)&&b.loc.start.line!==Y.loc.end.line&&b.loc.end.line===$.loc.start.line?Y:b},getPaddingLineSequences=(d,q,b)=>{const Y=[];let $=getActualLastToken(b,d);if(q.loc.start.line-d.loc.end.line>=2)do{const B=b.getTokenAfter($,{includeComments:!0});B.loc.start.line-$.loc.end.line>=2&&Y.push([$,B]),$=B}while($.range[0]<q.range[0]);return Y},areTokensOnSameLine=(d,q)=>d.loc.end.line===q.loc.start.line,E$1=d=>d.type===utils.AST_NODE_TYPES.TSAsExpression||d.type===utils.AST_NODE_TYPES.TSTypeAssertion,followTypeAssertionChain=d=>E$1(d)?followTypeAssertionChain(d.expression):d,RULE_NAME$m="prefer-vi-mocked",m$3=["Mock","MockedFunction","MockedClass","MockedObject"],sr=createEslintRule({name:RULE_NAME$m,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(d){function q(b){const{typeAnnotation:Y}=b;if(Y.type!==utils.AST_NODE_TYPES.TSTypeReference)return;const{typeName:$}=Y;if($.type!==utils.AST_NODE_TYPES.Identifier||!m$3.includes($.name))return;const B=d.sourceCode.text.slice(...followTypeAssertionChain(b.expression).range);d.report({node:b,messageId:"useViMocked",fix(H){return H.replaceText(b,`vi.mocked(${B})`)}})}return{TSAsExpression(b){b.parent.type!==utils.AST_NODE_TYPES.TSAsExpression&&q(b)},TSTypeAssertion(b){q(b)}}}}),RULE_NAME$l="prefer-snapshot-hint",E=["toMatchSnapshot","toThrowErrorMatchingSnapshot"],x$2=E,S$3=d=>{if(d.args.length===0)return!0;if(!isSupportedAccessor(d.matcher,"toMatchSnapshot"))return d.args.length!==1;if(d.args.length===2)return!1;const[q]=d.args;return!isStringNode(q)},ir=createEslintRule({name:RULE_NAME$l,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(d,[q]){const b=[];let Y=0;const $=[],B=()=>{for(const K of b)S$3(K)&&d.report({messageId:"missingHint",node:K.matcher})},H=()=>{Y++},V=()=>{Y--,q==="always"&&(B(),b.length=0),q==="multi"&&Y===0&&(b.length>1&&B(),b.length=0)};return{"Program:exit"(){H(),V()},FunctionExpression:H,"FunctionExpression:exit":V,ArrowFunctionExpression:H,"ArrowFunctionExpression:exit":V,"CallExpression:exit"(K){isTypeOfVitestFnCall(K,d,["describe","test"])&&(Y=$.pop()??0)},CallExpression(K){const G=parseVitestFnCall(K,d);if(G?.type!=="expect"){(G?.type==="describe"||G?.type==="test")&&($.push(Y),Y=0);return}const J=getAccessorValue(G.matcher);x$2.includes(J)&&b.push(G)}}}}),RULE_NAME$k="valid-describe-callback",o=d=>{const[q]=d,b=d[d.length-1];return{start:q.loc.start,end:b.loc.end}},i$1=(d,q)=>d.members.every(b=>getAccessorValue(b)!=="each")&&q.params.length,u$2=(d,q)=>{d.body.forEach(b=>{b.type===utils.AST_NODE_TYPES.ReturnStatement&&q.report({messageId:"unexpectedReturnInDescribe",node:b})})},mr=createEslintRule({name:RULE_NAME$k,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="describe"||b?.members[0]?.type===utils.AST_NODE_TYPES.Identifier&&b.members[0].name==="todo")return;if(q.arguments.length<1)return d.report({messageId:"nameAndCallback",loc:q.loc});const[,Y,$]=q.arguments;if(!Y){d.report({messageId:"nameAndCallback",loc:o(q.arguments)});return}if(!isFunction(Y)){if($&&isFunction($)){i$1(b,$)&&d.report({messageId:"unexpectedDescribeArgument",node:$}),$.body.type===utils.AST_NODE_TYPES.CallExpression&&d.report({messageId:"unexpectedReturnInDescribe",node:$}),$.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2($.body,d);return}d.report({messageId:"secondArgumentMustBeFunction",loc:o(q.arguments)});return}i$1(b,Y)&&d.report({messageId:"unexpectedDescribeArgument",node:Y}),Y.body.type===utils.AST_NODE_TYPES.CallExpression&&d.report({messageId:"unexpectedReturnInDescribe",node:Y}),Y.body.type===utils.AST_NODE_TYPES.BlockStatement&&u$2(Y.body,d)}}}}),RULE_NAME$j="require-top-level-describe",pr=createEslintRule({name:RULE_NAME$j,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(d){const{maxNumberOfTopLevelDescribes:q=1/0}=d.options[0]??{};let b=0,Y=0;return{CallExpression($){const B=parseVitestFnCall($,d);if(B){if(B.type==="describe"){Y++,Y===1&&(b++,b>q&&d.report({node:$,messageId:"tooManyDescribes",data:{max:q,s:q===1?"":"s"}}));return}if(Y===0){if(B.type==="test"){d.report({node:$,messageId:"unexpectedTestCase"});return}B.type==="hook"&&d.report({node:$,messageId:"unexpectedHook"})}}},"CallExpression:exit"($){isTypeOfVitestFnCall($,d,["describe"])&&Y--}}}}),RULE_NAME$i="require-to-throw-message",Er=createEslintRule({name:RULE_NAME$i,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect")return;const{matcher:Y}=b,$=getAccessorValue(Y);b.args.length===0&&["toThrow","toThrowError"].includes($)&&!b.modifiers.some(B=>getAccessorValue(B)==="not")&&d.report({messageId:"addErrorMessage",data:{matcherName:$},node:Y})}}}}),RULE_NAME$h="require-hook",S$2=(d,q)=>parseVitestFnCall(d,q)?!0:!!getNodeName(d)?.startsWith("vi"),m$2=d=>d.type===utils.AST_NODE_TYPES.Literal&&d.value===null||isIdentifier(d,"undefined"),a$2=(d,q,b=[])=>{switch(d.type){case utils.AST_NODE_TYPES.ExpressionStatement:return a$2(d.expression,q,b);case utils.AST_NODE_TYPES.CallExpression:return!(S$2(d,q)||b.includes(getNodeName(d)));case utils.AST_NODE_TYPES.VariableDeclaration:return d.kind==="const"?!1:d.declarations.some(({init:Y})=>Y!==null&&!m$2(Y));default:return!1}},lr=createEslintRule({name:RULE_NAME$h,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(d){const{allowedFunctionCalls:q}=d.options[0]??{},b=Y=>{for(const $ of Y)a$2($,d,q)&&d.report({node:$,messageId:"useHook"})};return{Program(Y){b(Y.body)},CallExpression(Y){if(!isTypeOfVitestFnCall(Y,d,["describe"])||Y.arguments.length<2)return;const[,$]=Y.arguments;!isFunction($)||$.body.type!==utils.AST_NODE_TYPES.BlockStatement||b($.body.body)}}}}),RULE_NAME$g="require-local-test-context-for-concurrent-snapshots",fr=createEslintRule({name:RULE_NAME$g,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);b===null||b.type!=="expect"||b.type==="expect"&&b.head.type==="testContext"||!["toMatchSnapshot","toMatchInlineSnapshot","toMatchFileSnapshot","toThrowErrorMatchingSnapshot","toThrowErrorMatchingInlineSnapshot"].includes(q.callee?.property.name)||!d.sourceCode.getAncestors(q).some(Y=>Y.type!==utils.AST_NODE_TYPES.CallExpression||!isTypeOfVitestFnCall(Y,d,["describe","test"])?!1:Y.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(Y.callee.property,"concurrent"))||d.report({node:q,messageId:"requireLocalTestContext"})}}}}),RULE_NAME$f="prefer-todo",S$1=d=>d.members.some(q=>getAccessorValue(q)!=="skip")||d.name.startsWith("x")?!1:!d.name.startsWith("f");function T$1(d){return isFunction(d)?d.body.type===utils.AST_NODE_TYPES.BlockStatement&&!d.body.body.length:!1}function a$1(d,q){return d.members.length?replaceAccessorFixer(q,d.members[0],"todo"):q.replaceText(d.head.node,`${d.head.local}.todo`)}const cr=createEslintRule({name:RULE_NAME$f,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(d){return{CallExpression(q){const[b,Y]=q.arguments,$=parseVitestFnCall(q,d);!b||$?.type!=="test"||!S$1($)||!isStringNode(b)||(Y&&T$1(Y)&&d.report({messageId:"emptyTest",node:q,fix:B=>[B.removeRange([b.range[1],Y.range[1]]),a$1($,B)]}),hasOnlyOneArgument(q)&&d.report({messageId:"unimplementedTest",node:q,fix:B=>a$1($,B)}))}}}}),RULE_NAME$e="prefer-spy-on",u$1=d=>"object"in d?d.object:d.callee.type===utils.AST_NODE_TYPES.MemberExpression?d.callee.object:null,a=d=>{if(d.type!==utils.AST_NODE_TYPES.CallExpression&&d.type!==utils.AST_NODE_TYPES.MemberExpression)return null;const q=u$1(d);return q?q.type===utils.AST_NODE_TYPES.Identifier?d.type===utils.AST_NODE_TYPES.CallExpression&&getNodeName(d.callee)==="vi.fn"?d:null:a(q):null},S=(d,q)=>{if(d.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&d.parent.property.type===utils.AST_NODE_TYPES.Identifier&&d.parent.property.name==="mockImplementation")return"";const[b]=d.arguments,Y=b&&q.sourceCode.getText(b);return Y?`.mockImplementation(${Y})`:".mockImplementation()"},Nr=createEslintRule({name:RULE_NAME$e,meta:{type:"suggestion",docs:{description:"enforce using `vi.spyOn`",recommended:!1},messages:{useViSpayOn:"Use `vi.spyOn` instead"},fixable:"code",schema:[]},defaultOptions:[],create(d){return{AssignmentExpression(q){const{left:b,right:Y}=q;if(b.type!==utils.AST_NODE_TYPES.MemberExpression)return;const $=a(Y);$&&d.report({node:q,messageId:"useViSpayOn",fix(B){const H=b.property.type===utils.AST_NODE_TYPES.Identifier&&!b.computed?"'":"",V=S($,d);return[B.insertTextBefore(b,"vi.spyOn("),B.replaceTextRange([b.object.range[1],b.property.range[0]],`, ${H}`),B.replaceTextRange([b.property.range[1],$.range[1]],`${H})${V}`)]}})}}}}),RULE_NAME$d="prefer-comparison-matcher",g=d=>isStringNode(d)||d?.type===utils.AST_NODE_TYPES.TemplateLiteral,C=d=>g(d.left)||g(d.right),M$1=d=>{switch(d){case">":return"<=";case"<":return">=";case">=":return"<";case"<=":return">"}return null},O=(d,q)=>{switch(q?M$1(d):d){case">":return"toBeGreaterThan";case"<":return"toBeLessThan";case">=":return"toBeGreaterThanOrEqual";case"<=":return"toBeLessThanOrEqual"}return null},dr=createEslintRule({name:RULE_NAME$d,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.args.length===0)return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[$],range:[,B]}=Y,{matcher:H}=b,V=getFirstMatcherArg(b);if($?.type!==utils.AST_NODE_TYPES.BinaryExpression||C($)||!EqualityMatcher.hasOwnProperty(getAccessorValue(H))||!isBooleanLiteral(V))return;const[K]=b.modifiers,G=b.modifiers.some(X=>getAccessorValue(X)==="not"),J=O($.operator,V.value===G);J&&d.report({fix(X){const{sourceCode:ee}=d,z=K&&getAccessorValue(K)!=="not"?`.${getAccessorValue(K)}`:"";return[X.replaceText($,ee.getText($.left)),X.replaceTextRange([B,H.parent.range[1]],`${z}.${J}`),X.replaceText(V,ee.getText($.right))]},messageId:"useToBeComparison",data:{preferredMatcher:J},node:H})}}}}),RULE_NAME$c="prefer-to-contain",T=d=>d.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.property,"includes")&&hasOnlyOneArgument(d)&&d.arguments[0].type!==utils.AST_NODE_TYPES.SpreadElement,Ar=createEslintRule({name:RULE_NAME$c,meta:{docs:{description:"enforce using toContain()",recommended:!1},messages:{useToContain:"Use toContain() instead"},fixable:"code",type:"suggestion",schema:[]},defaultOptions:[],create(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(b?.type!=="expect"||b.args.length===0)return;const{parent:Y}=b.head.node;if(Y?.type!==utils.AST_NODE_TYPES.CallExpression)return;const{arguments:[$],range:[,B]}=Y,{matcher:H}=b,V=getFirstMatcherArg(b);if(!$||V.type===utils.AST_NODE_TYPES.SpreadElement||!EqualityMatcher.hasOwnProperty(getAccessorValue(H))||!isBooleanLiteral(V)||!T($))return;const K=b.modifiers.some(G=>getAccessorValue(G)==="not");d.report({fix(G){const{sourceCode:J}=d,X=V.value===K;return[G.removeRange([$.callee.property.range[0]-1,$.range[1]]),G.replaceTextRange([B,H.parent.range[1]],X?`.${ModifierName.not}.toContain`:".toContain"),G.replaceText(b.args[0],J.getText($.arguments[0]))]},messageId:"useToContain",node:H})}}}}),RULE_NAME$b="prefer-expect-assertions",L=d=>{let q=d;for(;q;){if(q.parent?.type===utils.AST_NODE_TYPES.BlockStatement)return q.parent.body[0]===q;if(q.parent?.type===utils.AST_NODE_TYPES.ArrowFunctionExpression)return!0;q=q.parent}throw new Error("Could not find parent block statement")},y$2=(d,q,b)=>({messageId:"suggestRemovingExtraArguments",fix:Y=>removeExtraArgumentsFixer(Y,d,q,b)}),Mr=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(d,[q]){let b=0,Y=!1,$=!1,B=!1,H=null,V=!1,K=!1;const G=Q=>!!(!q.onlyFunctionsWithAsyncKeyword&&!q.onlyFunctionsWithExpectInCallback&&!q.onlyFunctionsWithExpectInLoop||q.onlyFunctionsWithAsyncKeyword&&Q.async||q.onlyFunctionsWithExpectInCallback&&Y||q.onlyFunctionsWithExpectInLoop&&$);function J(Q,Z){if(getAccessorValue(Q.members[0])==="hasAssertions"){Q.args.length&&d.report({messageId:"hasAssertionsTakesNoArguments",node:Q.matcher,suggest:[y$2(d,Z,0)]});return}if(Q.args.length!==1){let{loc:ne}=Q.matcher;const se=[];Q.args.length&&(ne=Q.args[1].loc,se.push(y$2(d,Z,1))),d.report({messageId:"assertionsRequiresOneArgument",suggest:se,loc:ne});return}const[oe]=Q.args;oe.type===utils.AST_NODE_TYPES.Literal&&typeof oe.value=="number"&&Number.isInteger(oe.value)||d.report({messageId:"assertionsRequiresNumberArgument",node:oe})}const X=()=>V&&b++,ee=()=>V&&b--,z=()=>K=!0,te=()=>K=!1;return{FunctionExpression:X,"FunctionExpression:exit":ee,ArrowFunctionExpression:X,"ArrowFunctionExpression:exit":ee,ForStatement:z,"ForStatement:exit":te,ForInStatement:z,"ForInStatement:exit":te,ForOfStatement:z,"ForOfStatement:exit":te,CallExpression(Q){const Z=parseVitestFnCall(Q,d);if(Z?.type==="test"){V=!0;return}Z?.head.type==="testContext"&&Z.members[0].type===utils.AST_NODE_TYPES.Identifier&&Z.members[0].name==="expect"&&(H=`${Z.head.local}`),Z?.type==="expect"&&V&&(b===1&&L(Q)&&Z.head.node.parent?.type===utils.AST_NODE_TYPES.MemberExpression&&Z.members.length===1&&["assertions","hasAssertions"].includes(getAccessorValue(Z.members[0]))&&(J(Z,Q),B=!0),K&&($=!0),b>1&&(Y=!0))},"CallExpression:exit"(Q){if(!isTypeOfVitestFnCall(Q,d,["test"])||(V=!1,Q.arguments.length<2))return;const[,Z]=Q.arguments;if(!isFunction(Z)||!G(Z))return;if($=!1,Y=!1,B){B=!1;return}const oe=[];if(Z.body.type===utils.AST_NODE_TYPES.BlockStatement){const ne=H?`${H}.`:"";oe.push(["suggestAddingHasAssertions",`${ne}expect.hasAssertions();`],["suggestAddingAssertions",`${ne}expect.assertions();`])}d.report({messageId:"haveExpectAssertions",node:Q,suggest:oe.map(([ne,se])=>({messageId:ne,fix:re=>re.insertTextBeforeRange([Z.body.range[0]+1,Z.body.range[1]],se)}))})}}}});var PaddingType=(d=>(d[d.Any=0]="Any",d[d.Always=1]="Always",d))(PaddingType||{}),StatementType=(d=>(d[d.Any=0]="Any",d[d.AfterAllToken=1]="AfterAllToken",d[d.AfterEachToken=2]="AfterEachToken",d[d.BeforeAllToken=3]="BeforeAllToken",d[d.BeforeEachToken=4]="BeforeEachToken",d[d.DescribeToken=5]="DescribeToken",d[d.ExpectToken=6]="ExpectToken",d[d.ExpectTypeOfToken=7]="ExpectTypeOfToken",d[d.FdescribeToken=8]="FdescribeToken",d[d.FitToken=9]="FitToken",d[d.ItToken=10]="ItToken",d[d.TestToken=11]="TestToken",d[d.XdescribeToken=12]="XdescribeToken",d[d.XitToken=13]="XitToken",d[d.XtestToken=14]="XtestToken",d))(StatementType||{});const x$1=(d,q,b)=>{const{sourceCode:Y,ruleContext:$}=b;getPaddingLineSequences(d,q,Y).length>0||$.report({node:q,messageId:"missingPadding",fix(B){let H=getActualLastToken(Y,d);const V=Y.getFirstTokenBetween(H,q,{includeComments:!0,filter(G){return areTokensOnSameLine(H,G)?(H=G,!1):!0}})||q,K=areTokensOnSameLine(H,V)?`
2
2
 
3
3
  `:`
4
4
  `;return B.insertTextAfter(H,K)}})},m$1={0:()=>!0,1:x$1},y$1=()=>{let d=null;return{get prevNode(){return d.prevNode},set prevNode(q){d.prevNode=q},enter(){d={upper:d,prevNode:null}},exit(){d=d.upper}}},i=d=>(q,b)=>{let Y=q;if(Y.type===utils.AST_NODE_TYPES.ExpressionStatement){Y.expression.type===utils.AST_NODE_TYPES.AwaitExpression&&(Y=Y.expression.argument);const $=b.getFirstToken(Y);return $?.type===utils.AST_TOKEN_TYPES.Identifier&&$.value===d}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=(d,q,b)=>{let Y=d;const{sourceCode:$}=b;for(;Y.type===utils.AST_NODE_TYPES.LabeledStatement;)Y=Y.body;return Array.isArray(q)?q.some(B=>l$1(Y,B,b)):A[q](Y,$)},N$1=(d,q,b)=>{const{configs:Y}=b,$=B=>m$1[B](d,q,b);for(let B=Y.length-1;B>=0;--B){const{prevStatementType:H,nextStatementType:V,paddingType:K}=Y[B];if(l$1(d,H,b)&&l$1(q,V,b))return $(K)}return $(0)},u=(d,q)=>{const{scopeInfo:b}=q;isValidParent(d?.parent.type)&&(b.prevNode&&N$1(b.prevNode,d,q),b.prevNode=d)},createPaddingRule=(d,q,b,Y=!1)=>createEslintRule({name:d,meta:{docs:{description:q},fixable:"whitespace",deprecated:Y,messages:{missingPadding:"expect blank line before this statement"},schema:[],type:"suggestion"},defaultOptions:[],create($){const B={ruleContext:$,sourceCode:$.sourceCode??$.getSourceCode(),scopeInfo:y$1(),configs:b},{scopeInfo:H}=B;return{Program:H.enter,"Program:exit":H.exit,BlockStatement:H.enter,"BlockStatement:exit":H.exit,SwitchStatement:H.enter,"SwitchStatement:exit":H.exit,":statement":V=>u(V,B),SwitchCase(V){u(V,B),H.enter()},"SwitchCase:exit":H.exit}}}),RULE_NAME$a="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}],ur=createPaddingRule(RULE_NAME$a,"Enforce padding around `afterAll` blocks",config$6),RULE_NAME$9="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}],wr=createPaddingRule(RULE_NAME$9,"Enforce padding around `afterEach` blocks",config$5),RULE_NAME$8="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}],Lr=createPaddingRule(RULE_NAME$8,"Enforce padding around `beforeAll` blocks",config$4),RULE_NAME$7="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}],Tr=createPaddingRule(RULE_NAME$7,"Enforce padding around `beforeEach` blocks",config$3),RULE_NAME$6="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}],Ur=createPaddingRule(RULE_NAME$6,"Enforce padding around `describe` blocks",config$2),RULE_NAME$5="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}],_r=createPaddingRule(RULE_NAME$5,"Enforce padding around `expect` groups",config$1),RULE_NAME$4="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}],hr=createPaddingRule(RULE_NAME$4,"Enforce padding around `test` blocks",config),RULE_NAME$3="padding-around-all",Rr=createPaddingRule(RULE_NAME$3,"Enforce padding around vitest functions",[...config$6,...config$5,...config$4,...config$3,...config$2,...config$1,...config]),RULE_NAME$2="valid-expect-in-promise",w=["toRejectWith","toResolveWith"],c=d=>{if(d.type===utils.AST_NODE_TYPES.CallExpression&&d.callee.type===utils.AST_NODE_TYPES.MemberExpression&&isSupportedAccessor(d.callee.property)){if(d.arguments.length===0)return!1;switch(getAccessorValue(d.callee.property)){case"then":return d.arguments.length<3;case"catch":case"finally":return d.arguments.length<2}}return!1},k=(d,q)=>{const b=parseVitestFnCall(d,q);if(b?.type!=="test")return!1;const Y=b.members.some(H=>getAccessorValue(H)==="each");if(Y&&d.callee.type!==utils.AST_NODE_TYPES.TaggedTemplateExpression)return!0;const[,$]=d.arguments,B=Number(Y);return $&&isFunction($)&&$.params.length===1+B},x=(d,q)=>{const{name:b}=q;if(d.argument===null)return!1;if(d.argument.type===utils.AST_NODE_TYPES.CallExpression&&d.argument.arguments.length>0){const Y=getNodeName(d.argument);if(["Promise.all","Promise.allSettled"].includes(Y)){const[$]=d.argument.arguments;if($.type===utils.AST_NODE_TYPES.ArrayExpression&&$.elements.some(B=>B&&isIdentifier(B,b)))return!0}if(["Promise.resolve","Promise.reject"].includes(Y)&&d.argument.arguments.length===1)return isIdentifier(d.argument.arguments[0],b)}return isIdentifier(d.argument,b)},h=(d,q)=>{for(const b of q)if(b?.type===utils.AST_NODE_TYPES.AwaitExpression&&isIdentifier(b.argument,d)||b?.type===utils.AST_NODE_TYPES.ArrayExpression&&h(d,b.elements))return!0;return!1},M=(d,q)=>{let b=q;for(;b;){if(b.type===utils.AST_NODE_TYPES.CallExpression){if(h(d,b.arguments))return!0;b=b.callee}if(b.type!==utils.AST_NODE_TYPES.MemberExpression)break;b=b.object}return!1},N=d=>{let q=d,b=d;for(;b&&(b.type===utils.AST_NODE_TYPES.CallExpression&&(q=b,b=b.callee),b.type===utils.AST_NODE_TYPES.MemberExpression);)b=b.object;return q},m=(d,q,b)=>{const{name:Y}=d;for(const $ of q)if(!($.range[0]<=d.range[0])){if($.type===utils.AST_NODE_TYPES.ReturnStatement)return x($,d);if($.type===utils.AST_NODE_TYPES.ExpressionStatement){if($.expression.type===utils.AST_NODE_TYPES.CallExpression){if(M(Y,$.expression))return!0;const B=N($.expression),H=parseVitestFnCall($.expression,b);if(H?.type==="expect"&&B.arguments.length>0&&isIdentifier(B.arguments[0],Y)&&H.members.some(V=>{const K=getAccessorValue(V);return K===ModifierName.resolves||K===ModifierName.rejects}))return!0}if($.expression.type===utils.AST_NODE_TYPES.AwaitExpression&&x($.expression,d))return!0;if($.expression.type===utils.AST_NODE_TYPES.AssignmentExpression){if(isIdentifier($.expression.left,Y)&&getNodeName($.expression.right)?.startsWith(`${Y}.`)&&c($.expression.right))continue;break}}if($.type===utils.AST_NODE_TYPES.BlockStatement&&m(d,$.body,b))return!0}return!1},y=d=>{let q=d;for(;q;){if(q.type===utils.AST_NODE_TYPES.BlockStatement)return q.body;q=q.parent}throw new Error("Could not find BlockStatement - please file a github issue at https://github.com/vitest-dev/eslint-plugin-vitest")},I=(d,q)=>{let b=d;for(;b;){if(isFunction(b))return b=b.parent,b?.type===utils.AST_NODE_TYPES.CallExpression&&isTypeOfVitestFnCall(b,q,["test"]);b=b.parent}return!1},P=(d,q)=>{const b=y(d);return isIdentifier(d.id)?m(d.id,b,q):!0},gr=createEslintRule({name:RULE_NAME$2,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(d){let q=!1;const b=[];return{CallExpression(Y){if(k(Y,d)){q=!0;return}if(c(Y)){b.unshift(!1);return}b.length>0&&isTypeOfVitestFnCall(Y,d,["expect"])&&(b[0]=!0)},"CallExpression:exit"(Y){if(q){isTypeOfVitestFnCall(Y,d,["test"])&&(q=!1);return}if(!c(Y)||!b.shift())return;const{parent:$}=findTopMostCallExpression(Y);if(!(!$||!I($,d))){switch($.type){case utils.AST_NODE_TYPES.VariableDeclarator:{if(P($,d))return;break}case utils.AST_NODE_TYPES.AssignmentExpression:{if($.left.type===utils.AST_NODE_TYPES.Identifier&&m($.left,y($),d))return;break}case utils.AST_NODE_TYPES.ExpressionStatement:break;case utils.AST_NODE_TYPES.ReturnStatement:case utils.AST_NODE_TYPES.AwaitExpression:default:return}d.report({messageId:"expectInFloatingPromise",node:$})}}}}}),RULE_NAME$1="prefer-strict-boolean-matchers",br=createEslintRule({name:RULE_NAME$1,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(d){return{CallExpression(q){const b=parseVitestFnCall(q,d);if(!(b?.type==="expect"||b?.type==="expectTypeOf"))return;const Y=getAccessorValue(b.matcher);Y==="toBeFalsy"&&d.report({node:b.matcher,messageId:"preferToBeFalse",fix:$=>[$.replaceText(b.matcher,"toBe"),$.insertTextAfterRange([b.matcher.range[0],b.matcher.range[1]+1],"false")]}),Y==="toBeTruthy"&&d.report({node:b.matcher,messageId:"preferToBeTrue",fix:$=>[$.replaceText(b.matcher,"toBe"),$.insertTextAfterRange([b.matcher.range[0],b.matcher.range[1]+1],"true")]})}}}}),RULE_NAME="require-mock-type-parameters",kr=createEslintRule({name:RULE_NAME,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(d,[q]){return{CallExpression(b){const Y=parseVitestFnCall(b,d);if(Y?.type==="vi")for(const $ of Y?.members)!("name"in $)||$.parent.parent.typeArguments!==void 0||($.name==="fn"&&d.report({node:$,messageId:"noTypeParameter"}),q.checkImportFunctions&&["importActual","importMock"].includes($.name)&&d.report({node:$,messageId:"noTypeParameter"}))}}}}),Ne=d=>Object.keys(d).reduce((q,b)=>({...q,[`vitest/${b}`]:d[b]}),{}),de=d=>({plugins:["@vitest"],rules:Object.keys(d).reduce((q,b)=>({...q,[`@vitest/${b}`]:d[b]}),{})}),Ae={[RULE_NAME$$]:"warn",[RULE_NAME$_]:"warn",[RULE_NAME$Y]:"warn",[RULE_NAME$X]:"warn",[RULE_NAME$V]:"warn",[RULE_NAME$T]:"warn",[RULE_NAME$S]:"warn",[RULE_NAME$R]:"warn",[RULE_NAME$Q]:"warn",[RULE_NAME$P]:"warn",[RULE_NAME$N]:"warn",[RULE_NAME$L]:"warn",[RULE_NAME$K]:"warn",[RULE_NAME$J]:"warn",[RULE_NAME$I]:"warn",[RULE_NAME$H]:"warn",[RULE_NAME$G]:"warn",[RULE_NAME$F]:"warn",[RULE_NAME$E]:"warn",[RULE_NAME$D]:"warn",[RULE_NAME$C]:"warn",[RULE_NAME$B]:"warn",[RULE_NAME$A]:"warn",[RULE_NAME$v]:"off",[RULE_NAME$x]:"warn",[RULE_NAME$w]:"off",[RULE_NAME$u]:"warn",[RULE_NAME$t]:"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$j]:"warn",[RULE_NAME$i]:"warn",[RULE_NAME$h]:"warn",[RULE_NAME$f]:"warn",[RULE_NAME$e]:"warn",[RULE_NAME$d]:"warn",[RULE_NAME$c]:"warn",[RULE_NAME$b]:"warn",[RULE_NAME$U]:"warn",[RULE_NAME$a]:"warn",[RULE_NAME$9]:"warn",[RULE_NAME$3]:"warn",[RULE_NAME$8]:"warn",[RULE_NAME$7]:"warn",[RULE_NAME$6]:"warn",[RULE_NAME$5]:"warn",[RULE_NAME$4]:"warn",[RULE_NAME$2]:"warn",[RULE_NAME$W]:"warn",[RULE_NAME$Z]:"warn",[RULE_NAME$O]:"warn",[RULE_NAME$z]:"warn",[RULE_NAME$y]:"warn",[RULE_NAME$k]:"warn",[RULE_NAME$g]:"warn",[RULE_NAME$M]:"warn",[RULE_NAME$1]:"warn",[RULE_NAME]:"warn"},Me={[RULE_NAME$W]:"error",[RULE_NAME$Z]:"error",[RULE_NAME$O]:"error",[RULE_NAME$z]:"error",[RULE_NAME$y]:"error",[RULE_NAME$k]:"error",[RULE_NAME$g]:"error",[RULE_NAME$M]:"error"},l={meta:{name:"vitest",version},rules:{[RULE_NAME$$]:we,[RULE_NAME$_]:Re,[RULE_NAME$Z]:Le,[RULE_NAME$Y]:Te,[RULE_NAME$X]:Ue,[RULE_NAME$W]:_e,[RULE_NAME$V]:he,[RULE_NAME$U]:ge,[RULE_NAME$T]:be,[RULE_NAME$S]:ke,[RULE_NAME$R]:xe,[RULE_NAME$Q]:ve,[RULE_NAME$P]:Ce,[RULE_NAME$O]:Be,[RULE_NAME$N]:Se,[RULE_NAME$L]:Ie,[RULE_NAME$K]:He,[RULE_NAME$J]:Oe,[RULE_NAME$I]:qe,[RULE_NAME$H]:De,[RULE_NAME$G]:Fe,[RULE_NAME$F]:Pe,[RULE_NAME$E]:je,[RULE_NAME$D]:Ve,[RULE_NAME$C]:Ke,[RULE_NAME$B]:$e,[RULE_NAME$M]:ye,[RULE_NAME$A]:Ge,[RULE_NAME$z]:We,[RULE_NAME$y]:ze,[RULE_NAME$v]:Xe,[RULE_NAME$x]:Je,[RULE_NAME$w]:Qe,[RULE_NAME$u]:Ye,[RULE_NAME$t]:Ze,[RULE_NAME$s]:er,[RULE_NAME$r]:rr,[RULE_NAME$q]:or,[RULE_NAME$p]:ar,[RULE_NAME$o]:tr,[RULE_NAME$g]:fr,[RULE_NAME$n]:nr,[RULE_NAME$m]:sr,[RULE_NAME$l]:ir,[RULE_NAME$k]:mr,[RULE_NAME$j]:pr,[RULE_NAME$i]:Er,[RULE_NAME$h]:lr,[RULE_NAME$f]:cr,[RULE_NAME$e]:Nr,[RULE_NAME$d]:dr,[RULE_NAME$c]:Ar,[RULE_NAME$b]:Mr,[RULE_NAME$a]:ur,[RULE_NAME$9]:wr,[RULE_NAME$3]:Rr,[RULE_NAME$8]:Lr,[RULE_NAME$7]:Tr,[RULE_NAME$6]:Ur,[RULE_NAME$5]:_r,[RULE_NAME$4]:hr,[RULE_NAME$2]:gr,[RULE_NAME$1]:br,[RULE_NAME]:kr},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":de(Me),"legacy-all":de(Ae),recommended:{name:"@vitest/recommended",plugins:{get vitest(){return l}},rules:Ne(Me)},all:{name:"@vitest/all",plugins:{get vitest(){return l}},rules:Ne(Ae)},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;