eslint-config-typed 3.13.6 → 3.14.0
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/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mjs +2 -2
- package/dist/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mjs.map +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.d.mts +6 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.d.mts.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.mjs +35 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.mjs.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.d.mts +6 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.d.mts.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.mjs +54 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.mjs.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.d.mts +6 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.d.mts.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.mjs +35 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.mjs.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.d.mts +6 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.d.mts.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.mjs +54 -0
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.mjs.map +1 -0
- package/dist/plugins/vitest-coding-style/rules/rules.d.mts +4 -0
- package/dist/plugins/vitest-coding-style/rules/rules.d.mts.map +1 -1
- package/dist/plugins/vitest-coding-style/rules/rules.mjs +8 -0
- package/dist/plugins/vitest-coding-style/rules/rules.mjs.map +1 -1
- package/dist/rules/eslint-vitest-coding-style-rules.d.mts +4 -0
- package/dist/rules/eslint-vitest-coding-style-rules.d.mts.map +1 -1
- package/dist/rules/eslint-vitest-coding-style-rules.mjs +4 -0
- package/dist/rules/eslint-vitest-coding-style-rules.mjs.map +1 -1
- package/dist/types/rules/eslint-vitest-coding-style-rules.d.mts +62 -1
- package/dist/types/rules/eslint-vitest-coding-style-rules.d.mts.map +1 -1
- package/package.json +5 -5
- package/src/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mts +2 -2
- package/src/plugins/vitest-coding-style/rules/prefer-assert-coding-style-rules.test.mts +95 -0
- package/src/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.mts +42 -0
- package/src/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.mts +74 -0
- package/src/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.mts +42 -0
- package/src/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.mts +74 -0
- package/src/plugins/vitest-coding-style/rules/rules.mts +12 -0
- package/src/rules/eslint-vitest-coding-style-rules.mts +4 -0
- package/src/types/rules/eslint-vitest-coding-style-rules.mts +66 -1
|
@@ -5,12 +5,12 @@ const noExpectToStrictEqualRule = {
|
|
|
5
5
|
meta: {
|
|
6
6
|
type: 'suggestion',
|
|
7
7
|
docs: {
|
|
8
|
-
description: 'Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual()
|
|
8
|
+
description: 'Disallow `expect(X).toStrictEqual(Y)` in favor of `assert.deepStrictEqual(X, Y)`, as the former also checks type equality between X and Y.',
|
|
9
9
|
},
|
|
10
10
|
fixable: 'code',
|
|
11
11
|
schema: [],
|
|
12
12
|
messages: {
|
|
13
|
-
useAssert: 'Use `assert.deepStrictEqual()` instead of `expect().toStrictEqual()`.',
|
|
13
|
+
useAssert: 'Use `assert.deepStrictEqual(X, Y)` instead of `expect(X).toStrictEqual(Y)`.',
|
|
14
14
|
},
|
|
15
15
|
},
|
|
16
16
|
defaultOptions: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-expect-to-strict-equal.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAcO,MAAM,yBAAyB,GAAoC;AACxE,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE;AACJ,YAAA,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"no-expect-to-strict-equal.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.d.mts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type MessageIds = 'preferAssertOverAssertNotOk';
|
|
3
|
+
type Options = readonly [];
|
|
4
|
+
export declare const preferAssertNotOkOverAssertIsNotOkRule: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-assert-not-ok-over-assert-is-not-ok.d.mts.map
|
package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.d.mts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-not-ok-over-assert-is-not-ok.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.mts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzE,KAAK,UAAU,GAAG,6BAA6B,CAAC;AAEhD,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,eAAO,MAAM,sCAAsC,EAAE,QAAQ,CAAC,UAAU,CACtE,UAAU,EACV,OAAO,CAiCR,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
|
|
3
|
+
const preferAssertNotOkOverAssertIsNotOkRule = {
|
|
4
|
+
meta: {
|
|
5
|
+
type: 'suggestion',
|
|
6
|
+
docs: {
|
|
7
|
+
description: 'Prefer assert.notOk(X) over assert.isNotOk(X).',
|
|
8
|
+
},
|
|
9
|
+
fixable: 'code',
|
|
10
|
+
schema: [],
|
|
11
|
+
messages: {
|
|
12
|
+
preferAssertOverAssertNotOk: 'Use assert.notOk(X) instead of assert.isNotOk(X).',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
defaultOptions: [],
|
|
16
|
+
create: (context) => ({
|
|
17
|
+
MemberExpression: (node) => {
|
|
18
|
+
if (node.object.type === AST_NODE_TYPES.Identifier &&
|
|
19
|
+
node.object.name === 'assert' &&
|
|
20
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
21
|
+
node.property.name === 'isNotOk' &&
|
|
22
|
+
node.parent.type === AST_NODE_TYPES.CallExpression &&
|
|
23
|
+
node.parent.callee === node) {
|
|
24
|
+
context.report({
|
|
25
|
+
node,
|
|
26
|
+
messageId: 'preferAssertOverAssertNotOk',
|
|
27
|
+
fix: (fixer) => fixer.replaceText(node, 'assert.notOk'),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { preferAssertNotOkOverAssertIsNotOkRule };
|
|
35
|
+
//# sourceMappingURL=prefer-assert-not-ok-over-assert-is-not-ok.mjs.map
|
package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-not-ok-over-assert-is-not-ok.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-assert-is-not-ok.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAMO,MAAM,sCAAsC,GAG/C;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE;AACJ,YAAA,WAAW,EAAE,gDAAgD;AAC9D,SAAA;AACD,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,QAAQ,EAAE;AACR,YAAA,2BAA2B,EACzB,mDAAmD;AACtD,SAAA;AACF,KAAA;AACD,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,MAAM,EAAE,CAAC,OAAO,MAAM;AACpB,QAAA,gBAAgB,EAAE,CAAC,IAAI,KAAI;YACzB,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAC9C,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;AAC7B,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAChD,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;AAChC,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;AAClD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,EAC3B;gBACA,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;AACJ,oBAAA,SAAS,EAAE,6BAA6B;AACxC,oBAAA,GAAG,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC;AACxD,iBAAA,CAAC;YACJ;QACF,CAAC;KACF,CAAC;;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type MessageIds = 'preferAssertNotOkOverExpectFalse';
|
|
3
|
+
type Options = readonly [];
|
|
4
|
+
export declare const preferAssertNotOkOverExpectFalseRule: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-assert-not-ok-over-expect-false.d.mts.map
|
package/dist/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.d.mts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-not-ok-over-expect-false.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAIlC,KAAK,UAAU,GAAG,kCAAkC,CAAC;AAErD,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,eAAO,MAAM,oCAAoC,EAAE,QAAQ,CAAC,UAAU,CACpE,UAAU,EACV,OAAO,CA2DR,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ESLintUtils, AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { Arr } from 'ts-data-forge';
|
|
3
|
+
import * as ts from 'typescript';
|
|
4
|
+
|
|
5
|
+
const preferAssertNotOkOverExpectFalseRule = {
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'suggestion',
|
|
8
|
+
docs: {
|
|
9
|
+
description: 'Prefer assert.notOk(X) over expect(X).toBe(false) (only if X is boolean)',
|
|
10
|
+
},
|
|
11
|
+
fixable: 'code',
|
|
12
|
+
schema: [],
|
|
13
|
+
messages: {
|
|
14
|
+
preferAssertNotOkOverExpectFalse: 'Use assert.notOk(X) instead of expect(X).toBe(false)',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
defaultOptions: [],
|
|
18
|
+
create: (context) => {
|
|
19
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
20
|
+
const checker = parserServices.program.getTypeChecker();
|
|
21
|
+
return {
|
|
22
|
+
CallExpression: (node) => {
|
|
23
|
+
if (node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
24
|
+
node.callee.object.type === AST_NODE_TYPES.CallExpression &&
|
|
25
|
+
node.callee.object.callee.type === AST_NODE_TYPES.Identifier &&
|
|
26
|
+
node.callee.object.callee.name === 'expect' &&
|
|
27
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
28
|
+
node.callee.property.name === 'toBe' &&
|
|
29
|
+
Arr.isArrayOfLength(node.arguments, 1) &&
|
|
30
|
+
node.arguments[0].type === AST_NODE_TYPES.Literal &&
|
|
31
|
+
node.arguments[0].value === false) {
|
|
32
|
+
const arg = node.callee.object.arguments[0];
|
|
33
|
+
if (arg !== undefined) {
|
|
34
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(arg);
|
|
35
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
36
|
+
const isBoolean = (type.flags & ts.TypeFlags.Boolean) !== 0;
|
|
37
|
+
if (!isBoolean) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const argText = context.sourceCode.getText(arg);
|
|
42
|
+
context.report({
|
|
43
|
+
node,
|
|
44
|
+
messageId: 'preferAssertNotOkOverExpectFalse',
|
|
45
|
+
fix: (fixer) => fixer.replaceText(node, `assert.notOk(${argText})`),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export { preferAssertNotOkOverExpectFalseRule };
|
|
54
|
+
//# sourceMappingURL=prefer-assert-not-ok-over-expect-false.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-not-ok-over-expect-false.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-not-ok-over-expect-false.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAYO,MAAM,oCAAoC,GAG7C;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE;AACJ,YAAA,WAAW,EACT,0EAA0E;AAC7E,SAAA;AACD,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,QAAQ,EAAE;AACR,YAAA,gCAAgC,EAC9B,sDAAsD;AACzD,SAAA;AACF,KAAA;AACD,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,MAAM,EAAE,CAAC,OAAO,KAAI;QAClB,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAE7D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE;QAEvD,OAAO;AACL,YAAA,cAAc,EAAE,CAAC,IAAI,KAAI;gBACvB,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;oBACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;oBACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;oBAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AACvD,oBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;oBACpC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;oBACtC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;oBACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,EACjC;AACA,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAE3C,oBAAA,IAAI,GAAG,KAAK,SAAS,EAAE;wBACrB,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC;wBAE5D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAE9C,wBAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,MAAM,CAAC;wBAE3D,IAAI,CAAC,SAAS,EAAE;4BACd;wBACF;oBACF;oBAEA,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;oBAE/C,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;AACJ,wBAAA,SAAS,EAAE,kCAAkC;AAC7C,wBAAA,GAAG,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA,aAAA,EAAgB,OAAO,GAAG,CAAC;AACpE,qBAAA,CAAC;gBACJ;YACF,CAAC;SACF;IACH,CAAC;;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type MessageIds = 'preferAssertOverAssertOk';
|
|
3
|
+
type Options = readonly [];
|
|
4
|
+
export declare const preferAssertOverAssertOkRule: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-assert-over-assert-ok.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-over-assert-ok.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.mts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzE,KAAK,UAAU,GAAG,0BAA0B,CAAC;AAE7C,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,UAAU,CAC5D,UAAU,EACV,OAAO,CAiCR,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
|
|
3
|
+
const preferAssertOverAssertOkRule = {
|
|
4
|
+
meta: {
|
|
5
|
+
type: 'suggestion',
|
|
6
|
+
docs: {
|
|
7
|
+
description: 'Prefer assert(X) over assert.ok(X), assert.isOk(X).',
|
|
8
|
+
},
|
|
9
|
+
fixable: 'code',
|
|
10
|
+
schema: [],
|
|
11
|
+
messages: {
|
|
12
|
+
preferAssertOverAssertOk: 'Use assert(X) instead of assert.ok(X), assert.isOk(X).',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
defaultOptions: [],
|
|
16
|
+
create: (context) => ({
|
|
17
|
+
MemberExpression: (node) => {
|
|
18
|
+
if (node.object.type === AST_NODE_TYPES.Identifier &&
|
|
19
|
+
node.object.name === 'assert' &&
|
|
20
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
21
|
+
(node.property.name === 'ok' || node.property.name === 'isOk') &&
|
|
22
|
+
node.parent.type === AST_NODE_TYPES.CallExpression &&
|
|
23
|
+
node.parent.callee === node) {
|
|
24
|
+
context.report({
|
|
25
|
+
node,
|
|
26
|
+
messageId: 'preferAssertOverAssertOk',
|
|
27
|
+
fix: (fixer) => fixer.replaceText(node, 'assert'),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { preferAssertOverAssertOkRule };
|
|
35
|
+
//# sourceMappingURL=prefer-assert-over-assert-ok.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-over-assert-ok.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-over-assert-ok.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAMO,MAAM,4BAA4B,GAGrC;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE;AACJ,YAAA,WAAW,EAAE,qDAAqD;AACnE,SAAA;AACD,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,QAAQ,EAAE;AACR,YAAA,wBAAwB,EACtB,wDAAwD;AAC3D,SAAA;AACF,KAAA;AACD,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,MAAM,EAAE,CAAC,OAAO,MAAM;AACpB,QAAA,gBAAgB,EAAE,CAAC,IAAI,KAAI;YACzB,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAC9C,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;AAC7B,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAChD,iBAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9D,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;AAClD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,EAC3B;gBACA,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;AACJ,oBAAA,SAAS,EAAE,0BAA0B;AACrC,oBAAA,GAAG,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;AAClD,iBAAA,CAAC;YACJ;QACF,CAAC;KACF,CAAC;;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type MessageIds = 'preferAssertOverExpectTrue';
|
|
3
|
+
type Options = readonly [];
|
|
4
|
+
export declare const preferAssertOverExpectTrueRule: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-assert-over-expect-true.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-over-expect-true.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAIlC,KAAK,UAAU,GAAG,4BAA4B,CAAC;AAE/C,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,UAAU,CAC9D,UAAU,EACV,OAAO,CA2DR,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ESLintUtils, AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
import { Arr } from 'ts-data-forge';
|
|
3
|
+
import * as ts from 'typescript';
|
|
4
|
+
|
|
5
|
+
const preferAssertOverExpectTrueRule = {
|
|
6
|
+
meta: {
|
|
7
|
+
type: 'suggestion',
|
|
8
|
+
docs: {
|
|
9
|
+
description: 'Prefer assert(X) over expect(X).toBe(true) (only if X is boolean)',
|
|
10
|
+
},
|
|
11
|
+
fixable: 'code',
|
|
12
|
+
schema: [],
|
|
13
|
+
messages: {
|
|
14
|
+
preferAssertOverExpectTrue: 'Use assert(X) instead of expect(X).toBe(true)',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
defaultOptions: [],
|
|
18
|
+
create: (context) => {
|
|
19
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
20
|
+
const checker = parserServices.program.getTypeChecker();
|
|
21
|
+
return {
|
|
22
|
+
CallExpression: (node) => {
|
|
23
|
+
if (node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
24
|
+
node.callee.object.type === AST_NODE_TYPES.CallExpression &&
|
|
25
|
+
node.callee.object.callee.type === AST_NODE_TYPES.Identifier &&
|
|
26
|
+
node.callee.object.callee.name === 'expect' &&
|
|
27
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
28
|
+
node.callee.property.name === 'toBe' &&
|
|
29
|
+
Arr.isArrayOfLength(node.arguments, 1) &&
|
|
30
|
+
node.arguments[0].type === AST_NODE_TYPES.Literal &&
|
|
31
|
+
node.arguments[0].value === true) {
|
|
32
|
+
const arg = node.callee.object.arguments[0];
|
|
33
|
+
if (arg !== undefined) {
|
|
34
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(arg);
|
|
35
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
36
|
+
const isBoolean = (type.flags & ts.TypeFlags.Boolean) !== 0;
|
|
37
|
+
if (!isBoolean) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const argText = context.sourceCode.getText(arg);
|
|
42
|
+
context.report({
|
|
43
|
+
node,
|
|
44
|
+
messageId: 'preferAssertOverExpectTrue',
|
|
45
|
+
fix: (fixer) => fixer.replaceText(node, `assert(${argText})`),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export { preferAssertOverExpectTrueRule };
|
|
54
|
+
//# sourceMappingURL=prefer-assert-over-expect-true.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-assert-over-expect-true.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/prefer-assert-over-expect-true.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAYO,MAAM,8BAA8B,GAGvC;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,IAAI,EAAE;AACJ,YAAA,WAAW,EACT,mEAAmE;AACtE,SAAA;AACD,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,QAAQ,EAAE;AACR,YAAA,0BAA0B,EACxB,+CAA+C;AAClD,SAAA;AACF,KAAA;AACD,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,MAAM,EAAE,CAAC,OAAO,KAAI;QAClB,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAE7D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE;QAEvD,OAAO;AACL,YAAA,cAAc,EAAE,CAAC,IAAI,KAAI;gBACvB,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;oBACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;oBACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;oBAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AACvD,oBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;oBACpC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;oBACtC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;oBACjD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,EAChC;AACA,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAE3C,oBAAA,IAAI,GAAG,KAAK,SAAS,EAAE;wBACrB,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC;wBAE5D,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAE9C,wBAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,MAAM,CAAC;wBAE3D,IAAI,CAAC,SAAS,EAAE;4BACd;wBACF;oBACF;oBAEA,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;oBAE/C,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;AACJ,wBAAA,SAAS,EAAE,4BAA4B;AACvC,wBAAA,GAAG,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA,OAAA,EAAU,OAAO,GAAG,CAAC;AAC9D,qBAAA,CAAC;gBACJ;YACF,CAAC;SACF;IACH,CAAC;;;;;"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export declare const vitestCodingStyleRules: {
|
|
2
2
|
readonly 'no-expect-to-strict-equal': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useAssert", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
|
+
readonly 'prefer-assert-over-assert-ok': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferAssertOverAssertOk", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
4
|
+
readonly 'prefer-assert-not-ok-over-assert-is-not-ok': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferAssertOverAssertNotOk", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
5
|
+
readonly 'prefer-assert-over-expect-true': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferAssertOverExpectTrue", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
6
|
+
readonly 'prefer-assert-not-ok-over-expect-false': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferAssertNotOkOverExpectFalse", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
7
|
};
|
|
4
8
|
//# sourceMappingURL=rules.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/rules.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/rules.mts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB;;;;;;CAUO,CAAC"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { noExpectToStrictEqualRule } from './no-expect-to-strict-equal.mjs';
|
|
2
|
+
import { preferAssertNotOkOverAssertIsNotOkRule } from './prefer-assert-not-ok-over-assert-is-not-ok.mjs';
|
|
3
|
+
import { preferAssertNotOkOverExpectFalseRule } from './prefer-assert-not-ok-over-expect-false.mjs';
|
|
4
|
+
import { preferAssertOverAssertOkRule } from './prefer-assert-over-assert-ok.mjs';
|
|
5
|
+
import { preferAssertOverExpectTrueRule } from './prefer-assert-over-expect-true.mjs';
|
|
2
6
|
|
|
3
7
|
const vitestCodingStyleRules = {
|
|
4
8
|
'no-expect-to-strict-equal': noExpectToStrictEqualRule,
|
|
9
|
+
'prefer-assert-over-assert-ok': preferAssertOverAssertOkRule,
|
|
10
|
+
'prefer-assert-not-ok-over-assert-is-not-ok': preferAssertNotOkOverAssertIsNotOkRule,
|
|
11
|
+
'prefer-assert-over-expect-true': preferAssertOverExpectTrueRule,
|
|
12
|
+
'prefer-assert-not-ok-over-expect-false': preferAssertNotOkOverExpectFalseRule,
|
|
5
13
|
};
|
|
6
14
|
|
|
7
15
|
export { vitestCodingStyleRules };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/rules.mts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rules.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/rules.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAOO,MAAM,sBAAsB,GAAG;AACpC,IAAA,2BAA2B,EAAE,yBAAyB;AAEtD,IAAA,8BAA8B,EAAE,4BAA4B;AAC5D,IAAA,4CAA4C,EAC1C,sCAAsC;AAExC,IAAA,gCAAgC,EAAE,8BAA8B;AAChE,IAAA,wCAAwC,EACtC,oCAAoC;;;;;"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export declare const eslintVitestCodingStyleRules: {
|
|
2
2
|
readonly 'vitest-coding-style/no-expect-to-strict-equal': "error";
|
|
3
|
+
readonly 'vitest-coding-style/prefer-assert-over-assert-ok': "error";
|
|
4
|
+
readonly 'vitest-coding-style/prefer-assert-not-ok-over-assert-is-not-ok': "error";
|
|
5
|
+
readonly 'vitest-coding-style/prefer-assert-over-expect-true': "error";
|
|
6
|
+
readonly 'vitest-coding-style/prefer-assert-not-ok-over-expect-false': "error";
|
|
3
7
|
};
|
|
4
8
|
//# sourceMappingURL=eslint-vitest-coding-style-rules.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-vitest-coding-style-rules.d.mts","sourceRoot":"","sources":["../../src/rules/eslint-vitest-coding-style-rules.mts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B
|
|
1
|
+
{"version":3,"file":"eslint-vitest-coding-style-rules.d.mts","sourceRoot":"","sources":["../../src/rules/eslint-vitest-coding-style-rules.mts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B;;;;;;CAMQ,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
const eslintVitestCodingStyleRules = {
|
|
2
2
|
'vitest-coding-style/no-expect-to-strict-equal': 'error',
|
|
3
|
+
'vitest-coding-style/prefer-assert-over-assert-ok': 'error',
|
|
4
|
+
'vitest-coding-style/prefer-assert-not-ok-over-assert-is-not-ok': 'error',
|
|
5
|
+
'vitest-coding-style/prefer-assert-over-expect-true': 'error',
|
|
6
|
+
'vitest-coding-style/prefer-assert-not-ok-over-expect-false': 'error',
|
|
3
7
|
};
|
|
4
8
|
|
|
5
9
|
export { eslintVitestCodingStyleRules };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-vitest-coding-style-rules.mjs","sources":["../../src/rules/eslint-vitest-coding-style-rules.mts"],"sourcesContent":[null],"names":[],"mappings":"AAEO,MAAM,4BAA4B,GAAG;AAC1C,IAAA,+CAA+C,EAAE,OAAO;;;;;"}
|
|
1
|
+
{"version":3,"file":"eslint-vitest-coding-style-rules.mjs","sources":["../../src/rules/eslint-vitest-coding-style-rules.mts"],"sourcesContent":[null],"names":[],"mappings":"AAEO,MAAM,4BAA4B,GAAG;AAC1C,IAAA,+CAA+C,EAAE,OAAO;AACxD,IAAA,kDAAkD,EAAE,OAAO;AAC3D,IAAA,gEAAgE,EAAE,OAAO;AACzE,IAAA,oDAAoD,EAAE,OAAO;AAC7D,IAAA,4DAA4D,EAAE,OAAO;;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Linter } from 'eslint';
|
|
2
2
|
/**
|
|
3
|
-
* Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual(
|
|
3
|
+
* Disallow `expect(X).toStrictEqual(Y)` in favor of `assert.deepStrictEqual(X,
|
|
4
|
+
* Y)`, as the former also checks type equality between X and Y.
|
|
4
5
|
*
|
|
5
6
|
* ```md
|
|
6
7
|
* | key | value |
|
|
@@ -13,8 +14,68 @@ import { type Linter } from 'eslint';
|
|
|
13
14
|
declare namespace NoExpectToStrictEqual {
|
|
14
15
|
type RuleEntry = Linter.StringSeverity;
|
|
15
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Prefer assert(X) over assert.ok(X), assert.isOk(X).
|
|
19
|
+
*
|
|
20
|
+
* ```md
|
|
21
|
+
* | key | value |
|
|
22
|
+
* | :--------- | :--------- |
|
|
23
|
+
* | type | suggestion |
|
|
24
|
+
* | deprecated | false |
|
|
25
|
+
* | fixable | code |
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare namespace PreferAssertOverAssertOk {
|
|
29
|
+
type RuleEntry = Linter.StringSeverity;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Prefer assert.notOk(X) over assert.isNotOk(X).
|
|
33
|
+
*
|
|
34
|
+
* ```md
|
|
35
|
+
* | key | value |
|
|
36
|
+
* | :--------- | :--------- |
|
|
37
|
+
* | type | suggestion |
|
|
38
|
+
* | deprecated | false |
|
|
39
|
+
* | fixable | code |
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
declare namespace PreferAssertNotOkOverAssertIsNotOk {
|
|
43
|
+
type RuleEntry = Linter.StringSeverity;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Prefer assert(X) over expect(X).toBe(true) (only if X is boolean)
|
|
47
|
+
*
|
|
48
|
+
* ```md
|
|
49
|
+
* | key | value |
|
|
50
|
+
* | :--------- | :--------- |
|
|
51
|
+
* | type | suggestion |
|
|
52
|
+
* | deprecated | false |
|
|
53
|
+
* | fixable | code |
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
declare namespace PreferAssertOverExpectTrue {
|
|
57
|
+
type RuleEntry = Linter.StringSeverity;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Prefer assert.notOk(X) over expect(X).toBe(false) (only if X is boolean)
|
|
61
|
+
*
|
|
62
|
+
* ```md
|
|
63
|
+
* | key | value |
|
|
64
|
+
* | :--------- | :--------- |
|
|
65
|
+
* | type | suggestion |
|
|
66
|
+
* | deprecated | false |
|
|
67
|
+
* | fixable | code |
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
declare namespace PreferAssertNotOkOverExpectFalse {
|
|
71
|
+
type RuleEntry = Linter.StringSeverity;
|
|
72
|
+
}
|
|
16
73
|
export type EslintVitestCodingStyleRules = Readonly<{
|
|
17
74
|
'vitest-coding-style/no-expect-to-strict-equal': NoExpectToStrictEqual.RuleEntry;
|
|
75
|
+
'vitest-coding-style/prefer-assert-over-assert-ok': PreferAssertOverAssertOk.RuleEntry;
|
|
76
|
+
'vitest-coding-style/prefer-assert-not-ok-over-assert-is-not-ok': PreferAssertNotOkOverAssertIsNotOk.RuleEntry;
|
|
77
|
+
'vitest-coding-style/prefer-assert-over-expect-true': PreferAssertOverExpectTrue.RuleEntry;
|
|
78
|
+
'vitest-coding-style/prefer-assert-not-ok-over-expect-false': PreferAssertNotOkOverExpectFalse.RuleEntry;
|
|
18
79
|
}>;
|
|
19
80
|
export {};
|
|
20
81
|
//# sourceMappingURL=eslint-vitest-coding-style-rules.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-vitest-coding-style-rules.d.mts","sourceRoot":"","sources":["../../../src/types/rules/eslint-vitest-coding-style-rules.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC
|
|
1
|
+
{"version":3,"file":"eslint-vitest-coding-style-rules.d.mts","sourceRoot":"","sources":["../../../src/types/rules/eslint-vitest-coding-style-rules.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,kBAAU,qBAAqB,CAAC;IAC9B,KAAY,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;CAC/C;AAED;;;;;;;;;;GAUG;AACH,kBAAU,wBAAwB,CAAC;IACjC,KAAY,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;CAC/C;AAED;;;;;;;;;;GAUG;AACH,kBAAU,kCAAkC,CAAC;IAC3C,KAAY,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;CAC/C;AAED;;;;;;;;;;GAUG;AACH,kBAAU,0BAA0B,CAAC;IACnC,KAAY,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;CAC/C;AAED;;;;;;;;;;GAUG;AACH,kBAAU,gCAAgC,CAAC;IACzC,KAAY,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;CAC/C;AAED,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,+CAA+C,EAAE,qBAAqB,CAAC,SAAS,CAAC;IACjF,kDAAkD,EAAE,wBAAwB,CAAC,SAAS,CAAC;IACvF,gEAAgE,EAAE,kCAAkC,CAAC,SAAS,CAAC;IAC/G,oDAAoD,EAAE,0BAA0B,CAAC,SAAS,CAAC;IAC3F,4DAA4D,EAAE,gCAAgC,CAAC,SAAS,CAAC;CAC1G,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-config-typed",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.14.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript"
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"eslint-plugin-import-x": "^4.16.1",
|
|
84
84
|
"eslint-plugin-jest": "29.1.0",
|
|
85
85
|
"eslint-plugin-jsx-a11y": "6.10.2",
|
|
86
|
-
"eslint-plugin-math": "^0.13.
|
|
86
|
+
"eslint-plugin-math": "^0.13.1",
|
|
87
87
|
"eslint-plugin-n": "^17.23.1",
|
|
88
88
|
"eslint-plugin-playwright": "2.3.0",
|
|
89
89
|
"eslint-plugin-prefer-arrow-functions": "3.9.1",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"@types/json-schema": "^7.0.15",
|
|
122
122
|
"@types/micromatch": "^4.0.10",
|
|
123
123
|
"@types/node": "^24.10.1",
|
|
124
|
-
"@types/react": "^19.2.
|
|
124
|
+
"@types/react": "^19.2.7",
|
|
125
125
|
"@typescript-eslint/rule-tester": "8.47.0",
|
|
126
126
|
"@vitest/coverage-v8": "^4.0.10",
|
|
127
127
|
"@vitest/ui": "^4.0.10",
|
|
@@ -141,11 +141,11 @@
|
|
|
141
141
|
"prettier-plugin-organize-imports": "^4.3.0",
|
|
142
142
|
"prettier-plugin-packagejson": "^2.5.19",
|
|
143
143
|
"react": "^19.2.0",
|
|
144
|
-
"rollup": "^4.53.
|
|
144
|
+
"rollup": "^4.53.3",
|
|
145
145
|
"semantic-release": "^25.0.2",
|
|
146
146
|
"ts-fortress": "^6.1.0",
|
|
147
147
|
"ts-morph": "^27.0.2",
|
|
148
|
-
"ts-repo-utils": "^7.
|
|
148
|
+
"ts-repo-utils": "^7.9.2",
|
|
149
149
|
"ts-type-forge": "^2.3.0",
|
|
150
150
|
"tslib": "^2.8.1",
|
|
151
151
|
"tsx": "^4.20.6",
|
|
@@ -17,13 +17,13 @@ export const noExpectToStrictEqualRule: TSESLint.RuleModule<MessageIds> = {
|
|
|
17
17
|
type: 'suggestion',
|
|
18
18
|
docs: {
|
|
19
19
|
description:
|
|
20
|
-
'Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual()
|
|
20
|
+
'Disallow `expect(X).toStrictEqual(Y)` in favor of `assert.deepStrictEqual(X, Y)`, as the former also checks type equality between X and Y.',
|
|
21
21
|
},
|
|
22
22
|
fixable: 'code',
|
|
23
23
|
schema: [],
|
|
24
24
|
messages: {
|
|
25
25
|
useAssert:
|
|
26
|
-
'Use `assert.deepStrictEqual()` instead of `expect().toStrictEqual()`.',
|
|
26
|
+
'Use `assert.deepStrictEqual(X, Y)` instead of `expect(X).toStrictEqual(Y)`.',
|
|
27
27
|
},
|
|
28
28
|
},
|
|
29
29
|
defaultOptions: [],
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import parser from '@typescript-eslint/parser';
|
|
2
|
+
import { RuleTester } from '@typescript-eslint/rule-tester';
|
|
3
|
+
import { preferAssertNotOkOverAssertIsNotOkRule } from './prefer-assert-not-ok-over-assert-is-not-ok.mjs';
|
|
4
|
+
import { preferAssertNotOkOverExpectFalseRule } from './prefer-assert-not-ok-over-expect-false.mjs';
|
|
5
|
+
import { preferAssertOverAssertOkRule } from './prefer-assert-over-assert-ok.mjs';
|
|
6
|
+
import { preferAssertOverExpectTrueRule } from './prefer-assert-over-expect-true.mjs';
|
|
7
|
+
|
|
8
|
+
const ruleTester = new RuleTester({
|
|
9
|
+
languageOptions: {
|
|
10
|
+
parserOptions: {
|
|
11
|
+
sourceType: 'module',
|
|
12
|
+
project: './tsconfig.tests.json',
|
|
13
|
+
},
|
|
14
|
+
parser,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
ruleTester.run(
|
|
19
|
+
'prefer-assert-not-ok-over-expect-false',
|
|
20
|
+
preferAssertNotOkOverExpectFalseRule,
|
|
21
|
+
{
|
|
22
|
+
valid: [
|
|
23
|
+
{ code: 'assert.notOk(0);' },
|
|
24
|
+
{ code: 'expect(0).toBe(true);' },
|
|
25
|
+
{ code: 'expect(0).toEqual(false);' },
|
|
26
|
+
],
|
|
27
|
+
invalid: [
|
|
28
|
+
{
|
|
29
|
+
code: 'expect(Array.isArray({})).toBe(false);',
|
|
30
|
+
output: 'assert.notOk(Array.isArray({}));',
|
|
31
|
+
errors: [{ messageId: 'preferAssertNotOkOverExpectFalse' }],
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
ruleTester.run(
|
|
38
|
+
'prefer-assert-over-expect-true',
|
|
39
|
+
preferAssertOverExpectTrueRule,
|
|
40
|
+
{
|
|
41
|
+
valid: [
|
|
42
|
+
{ code: 'assert(0);' },
|
|
43
|
+
{ code: 'expect(0).toBe(false);' },
|
|
44
|
+
{ code: 'expect(0).toEqual(true);' },
|
|
45
|
+
// Non-boolean argument
|
|
46
|
+
{ code: 'expect(123).toBe(true);' },
|
|
47
|
+
],
|
|
48
|
+
invalid: [
|
|
49
|
+
{
|
|
50
|
+
code: 'expect(Array.isArray([{}])).toBe(true);',
|
|
51
|
+
output: 'assert(Array.isArray([{}]));',
|
|
52
|
+
errors: [{ messageId: 'preferAssertOverExpectTrue' }],
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
ruleTester.run('prefer-assert-over-assert-ok', preferAssertOverAssertOkRule, {
|
|
59
|
+
valid: [
|
|
60
|
+
{ code: 'assert(0);' },
|
|
61
|
+
{ code: 'assert.notOk(0);' },
|
|
62
|
+
{ code: 'foo.ok(0);' },
|
|
63
|
+
],
|
|
64
|
+
invalid: [
|
|
65
|
+
{
|
|
66
|
+
code: 'assert.ok(Array.isArray([]));',
|
|
67
|
+
output: 'assert(Array.isArray([]));',
|
|
68
|
+
errors: [{ messageId: 'preferAssertOverAssertOk' }],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
code: 'assert.isOk(Array.isArray([]));',
|
|
72
|
+
output: 'assert(Array.isArray([]));',
|
|
73
|
+
errors: [{ messageId: 'preferAssertOverAssertOk' }],
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
ruleTester.run(
|
|
79
|
+
'prefer-assert-not-ok-over-assert-is-not-ok',
|
|
80
|
+
preferAssertNotOkOverAssertIsNotOkRule,
|
|
81
|
+
{
|
|
82
|
+
valid: [
|
|
83
|
+
{ code: 'assert(0);' },
|
|
84
|
+
{ code: 'assert.notOk(0);' },
|
|
85
|
+
{ code: 'foo.isNotOk(0);' },
|
|
86
|
+
],
|
|
87
|
+
invalid: [
|
|
88
|
+
{
|
|
89
|
+
code: 'assert.isNotOk(Array.isArray([]));',
|
|
90
|
+
output: 'assert.notOk(Array.isArray([]));',
|
|
91
|
+
errors: [{ messageId: 'preferAssertOverAssertNotOk' }],
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AST_NODE_TYPES, type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
|
|
3
|
+
type MessageIds = 'preferAssertOverAssertNotOk';
|
|
4
|
+
|
|
5
|
+
type Options = readonly [];
|
|
6
|
+
|
|
7
|
+
export const preferAssertNotOkOverAssertIsNotOkRule: TSESLint.RuleModule<
|
|
8
|
+
MessageIds,
|
|
9
|
+
Options
|
|
10
|
+
> = {
|
|
11
|
+
meta: {
|
|
12
|
+
type: 'suggestion',
|
|
13
|
+
docs: {
|
|
14
|
+
description: 'Prefer assert.notOk(X) over assert.isNotOk(X).',
|
|
15
|
+
},
|
|
16
|
+
fixable: 'code',
|
|
17
|
+
schema: [],
|
|
18
|
+
messages: {
|
|
19
|
+
preferAssertOverAssertNotOk:
|
|
20
|
+
'Use assert.notOk(X) instead of assert.isNotOk(X).',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultOptions: [],
|
|
24
|
+
create: (context) => ({
|
|
25
|
+
MemberExpression: (node) => {
|
|
26
|
+
if (
|
|
27
|
+
node.object.type === AST_NODE_TYPES.Identifier &&
|
|
28
|
+
node.object.name === 'assert' &&
|
|
29
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
30
|
+
node.property.name === 'isNotOk' &&
|
|
31
|
+
node.parent.type === AST_NODE_TYPES.CallExpression &&
|
|
32
|
+
node.parent.callee === node
|
|
33
|
+
) {
|
|
34
|
+
context.report({
|
|
35
|
+
node,
|
|
36
|
+
messageId: 'preferAssertOverAssertNotOk',
|
|
37
|
+
fix: (fixer) => fixer.replaceText(node, 'assert.notOk'),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AST_NODE_TYPES,
|
|
3
|
+
ESLintUtils,
|
|
4
|
+
type TSESLint,
|
|
5
|
+
} from '@typescript-eslint/utils';
|
|
6
|
+
import { Arr } from 'ts-data-forge';
|
|
7
|
+
import * as ts from 'typescript';
|
|
8
|
+
|
|
9
|
+
type MessageIds = 'preferAssertNotOkOverExpectFalse';
|
|
10
|
+
|
|
11
|
+
type Options = readonly [];
|
|
12
|
+
|
|
13
|
+
export const preferAssertNotOkOverExpectFalseRule: TSESLint.RuleModule<
|
|
14
|
+
MessageIds,
|
|
15
|
+
Options
|
|
16
|
+
> = {
|
|
17
|
+
meta: {
|
|
18
|
+
type: 'suggestion',
|
|
19
|
+
docs: {
|
|
20
|
+
description:
|
|
21
|
+
'Prefer assert.notOk(X) over expect(X).toBe(false) (only if X is boolean)',
|
|
22
|
+
},
|
|
23
|
+
fixable: 'code',
|
|
24
|
+
schema: [],
|
|
25
|
+
messages: {
|
|
26
|
+
preferAssertNotOkOverExpectFalse:
|
|
27
|
+
'Use assert.notOk(X) instead of expect(X).toBe(false)',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
defaultOptions: [],
|
|
31
|
+
create: (context) => {
|
|
32
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
33
|
+
|
|
34
|
+
const checker = parserServices.program.getTypeChecker();
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
CallExpression: (node) => {
|
|
38
|
+
if (
|
|
39
|
+
node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
40
|
+
node.callee.object.type === AST_NODE_TYPES.CallExpression &&
|
|
41
|
+
node.callee.object.callee.type === AST_NODE_TYPES.Identifier &&
|
|
42
|
+
node.callee.object.callee.name === 'expect' &&
|
|
43
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
44
|
+
node.callee.property.name === 'toBe' &&
|
|
45
|
+
Arr.isArrayOfLength(node.arguments, 1) &&
|
|
46
|
+
node.arguments[0].type === AST_NODE_TYPES.Literal &&
|
|
47
|
+
node.arguments[0].value === false
|
|
48
|
+
) {
|
|
49
|
+
const arg = node.callee.object.arguments[0];
|
|
50
|
+
|
|
51
|
+
if (arg !== undefined) {
|
|
52
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(arg);
|
|
53
|
+
|
|
54
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
55
|
+
|
|
56
|
+
const isBoolean = (type.flags & ts.TypeFlags.Boolean) !== 0;
|
|
57
|
+
|
|
58
|
+
if (!isBoolean) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const argText = context.sourceCode.getText(arg);
|
|
64
|
+
|
|
65
|
+
context.report({
|
|
66
|
+
node,
|
|
67
|
+
messageId: 'preferAssertNotOkOverExpectFalse',
|
|
68
|
+
fix: (fixer) => fixer.replaceText(node, `assert.notOk(${argText})`),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { AST_NODE_TYPES, type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
|
|
3
|
+
type MessageIds = 'preferAssertOverAssertOk';
|
|
4
|
+
|
|
5
|
+
type Options = readonly [];
|
|
6
|
+
|
|
7
|
+
export const preferAssertOverAssertOkRule: TSESLint.RuleModule<
|
|
8
|
+
MessageIds,
|
|
9
|
+
Options
|
|
10
|
+
> = {
|
|
11
|
+
meta: {
|
|
12
|
+
type: 'suggestion',
|
|
13
|
+
docs: {
|
|
14
|
+
description: 'Prefer assert(X) over assert.ok(X), assert.isOk(X).',
|
|
15
|
+
},
|
|
16
|
+
fixable: 'code',
|
|
17
|
+
schema: [],
|
|
18
|
+
messages: {
|
|
19
|
+
preferAssertOverAssertOk:
|
|
20
|
+
'Use assert(X) instead of assert.ok(X), assert.isOk(X).',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultOptions: [],
|
|
24
|
+
create: (context) => ({
|
|
25
|
+
MemberExpression: (node) => {
|
|
26
|
+
if (
|
|
27
|
+
node.object.type === AST_NODE_TYPES.Identifier &&
|
|
28
|
+
node.object.name === 'assert' &&
|
|
29
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
30
|
+
(node.property.name === 'ok' || node.property.name === 'isOk') &&
|
|
31
|
+
node.parent.type === AST_NODE_TYPES.CallExpression &&
|
|
32
|
+
node.parent.callee === node
|
|
33
|
+
) {
|
|
34
|
+
context.report({
|
|
35
|
+
node,
|
|
36
|
+
messageId: 'preferAssertOverAssertOk',
|
|
37
|
+
fix: (fixer) => fixer.replaceText(node, 'assert'),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AST_NODE_TYPES,
|
|
3
|
+
ESLintUtils,
|
|
4
|
+
type TSESLint,
|
|
5
|
+
} from '@typescript-eslint/utils';
|
|
6
|
+
import { Arr } from 'ts-data-forge';
|
|
7
|
+
import * as ts from 'typescript';
|
|
8
|
+
|
|
9
|
+
type MessageIds = 'preferAssertOverExpectTrue';
|
|
10
|
+
|
|
11
|
+
type Options = readonly [];
|
|
12
|
+
|
|
13
|
+
export const preferAssertOverExpectTrueRule: TSESLint.RuleModule<
|
|
14
|
+
MessageIds,
|
|
15
|
+
Options
|
|
16
|
+
> = {
|
|
17
|
+
meta: {
|
|
18
|
+
type: 'suggestion',
|
|
19
|
+
docs: {
|
|
20
|
+
description:
|
|
21
|
+
'Prefer assert(X) over expect(X).toBe(true) (only if X is boolean)',
|
|
22
|
+
},
|
|
23
|
+
fixable: 'code',
|
|
24
|
+
schema: [],
|
|
25
|
+
messages: {
|
|
26
|
+
preferAssertOverExpectTrue:
|
|
27
|
+
'Use assert(X) instead of expect(X).toBe(true)',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
defaultOptions: [],
|
|
31
|
+
create: (context) => {
|
|
32
|
+
const parserServices = ESLintUtils.getParserServices(context);
|
|
33
|
+
|
|
34
|
+
const checker = parserServices.program.getTypeChecker();
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
CallExpression: (node) => {
|
|
38
|
+
if (
|
|
39
|
+
node.callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
40
|
+
node.callee.object.type === AST_NODE_TYPES.CallExpression &&
|
|
41
|
+
node.callee.object.callee.type === AST_NODE_TYPES.Identifier &&
|
|
42
|
+
node.callee.object.callee.name === 'expect' &&
|
|
43
|
+
node.callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
44
|
+
node.callee.property.name === 'toBe' &&
|
|
45
|
+
Arr.isArrayOfLength(node.arguments, 1) &&
|
|
46
|
+
node.arguments[0].type === AST_NODE_TYPES.Literal &&
|
|
47
|
+
node.arguments[0].value === true
|
|
48
|
+
) {
|
|
49
|
+
const arg = node.callee.object.arguments[0];
|
|
50
|
+
|
|
51
|
+
if (arg !== undefined) {
|
|
52
|
+
const tsNode = parserServices.esTreeNodeToTSNodeMap.get(arg);
|
|
53
|
+
|
|
54
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
55
|
+
|
|
56
|
+
const isBoolean = (type.flags & ts.TypeFlags.Boolean) !== 0;
|
|
57
|
+
|
|
58
|
+
if (!isBoolean) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const argText = context.sourceCode.getText(arg);
|
|
64
|
+
|
|
65
|
+
context.report({
|
|
66
|
+
node,
|
|
67
|
+
messageId: 'preferAssertOverExpectTrue',
|
|
68
|
+
fix: (fixer) => fixer.replaceText(node, `assert(${argText})`),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
};
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { type ESLintPlugin } from '../../../types/index.mjs';
|
|
2
2
|
import { noExpectToStrictEqualRule } from './no-expect-to-strict-equal.mjs';
|
|
3
|
+
import { preferAssertNotOkOverAssertIsNotOkRule } from './prefer-assert-not-ok-over-assert-is-not-ok.mjs';
|
|
4
|
+
import { preferAssertNotOkOverExpectFalseRule } from './prefer-assert-not-ok-over-expect-false.mjs';
|
|
5
|
+
import { preferAssertOverAssertOkRule } from './prefer-assert-over-assert-ok.mjs';
|
|
6
|
+
import { preferAssertOverExpectTrueRule } from './prefer-assert-over-expect-true.mjs';
|
|
3
7
|
|
|
4
8
|
export const vitestCodingStyleRules = {
|
|
5
9
|
'no-expect-to-strict-equal': noExpectToStrictEqualRule,
|
|
10
|
+
|
|
11
|
+
'prefer-assert-over-assert-ok': preferAssertOverAssertOkRule,
|
|
12
|
+
'prefer-assert-not-ok-over-assert-is-not-ok':
|
|
13
|
+
preferAssertNotOkOverAssertIsNotOkRule,
|
|
14
|
+
|
|
15
|
+
'prefer-assert-over-expect-true': preferAssertOverExpectTrueRule,
|
|
16
|
+
'prefer-assert-not-ok-over-expect-false':
|
|
17
|
+
preferAssertNotOkOverExpectFalseRule,
|
|
6
18
|
} as const satisfies ESLintPlugin['rules'];
|
|
@@ -2,4 +2,8 @@ import { type EslintVitestCodingStyleRules } from '../types/index.mjs';
|
|
|
2
2
|
|
|
3
3
|
export const eslintVitestCodingStyleRules = {
|
|
4
4
|
'vitest-coding-style/no-expect-to-strict-equal': 'error',
|
|
5
|
+
'vitest-coding-style/prefer-assert-over-assert-ok': 'error',
|
|
6
|
+
'vitest-coding-style/prefer-assert-not-ok-over-assert-is-not-ok': 'error',
|
|
7
|
+
'vitest-coding-style/prefer-assert-over-expect-true': 'error',
|
|
8
|
+
'vitest-coding-style/prefer-assert-not-ok-over-expect-false': 'error',
|
|
5
9
|
} as const satisfies EslintVitestCodingStyleRules;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { type Linter } from 'eslint';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual(
|
|
5
|
+
* Disallow `expect(X).toStrictEqual(Y)` in favor of `assert.deepStrictEqual(X,
|
|
6
|
+
* Y)`, as the former also checks type equality between X and Y.
|
|
6
7
|
*
|
|
7
8
|
* ```md
|
|
8
9
|
* | key | value |
|
|
@@ -16,6 +17,70 @@ namespace NoExpectToStrictEqual {
|
|
|
16
17
|
export type RuleEntry = Linter.StringSeverity;
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Prefer assert(X) over assert.ok(X), assert.isOk(X).
|
|
22
|
+
*
|
|
23
|
+
* ```md
|
|
24
|
+
* | key | value |
|
|
25
|
+
* | :--------- | :--------- |
|
|
26
|
+
* | type | suggestion |
|
|
27
|
+
* | deprecated | false |
|
|
28
|
+
* | fixable | code |
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
namespace PreferAssertOverAssertOk {
|
|
32
|
+
export type RuleEntry = Linter.StringSeverity;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Prefer assert.notOk(X) over assert.isNotOk(X).
|
|
37
|
+
*
|
|
38
|
+
* ```md
|
|
39
|
+
* | key | value |
|
|
40
|
+
* | :--------- | :--------- |
|
|
41
|
+
* | type | suggestion |
|
|
42
|
+
* | deprecated | false |
|
|
43
|
+
* | fixable | code |
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
namespace PreferAssertNotOkOverAssertIsNotOk {
|
|
47
|
+
export type RuleEntry = Linter.StringSeverity;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Prefer assert(X) over expect(X).toBe(true) (only if X is boolean)
|
|
52
|
+
*
|
|
53
|
+
* ```md
|
|
54
|
+
* | key | value |
|
|
55
|
+
* | :--------- | :--------- |
|
|
56
|
+
* | type | suggestion |
|
|
57
|
+
* | deprecated | false |
|
|
58
|
+
* | fixable | code |
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
namespace PreferAssertOverExpectTrue {
|
|
62
|
+
export type RuleEntry = Linter.StringSeverity;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Prefer assert.notOk(X) over expect(X).toBe(false) (only if X is boolean)
|
|
67
|
+
*
|
|
68
|
+
* ```md
|
|
69
|
+
* | key | value |
|
|
70
|
+
* | :--------- | :--------- |
|
|
71
|
+
* | type | suggestion |
|
|
72
|
+
* | deprecated | false |
|
|
73
|
+
* | fixable | code |
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
namespace PreferAssertNotOkOverExpectFalse {
|
|
77
|
+
export type RuleEntry = Linter.StringSeverity;
|
|
78
|
+
}
|
|
79
|
+
|
|
19
80
|
export type EslintVitestCodingStyleRules = Readonly<{
|
|
20
81
|
'vitest-coding-style/no-expect-to-strict-equal': NoExpectToStrictEqual.RuleEntry;
|
|
82
|
+
'vitest-coding-style/prefer-assert-over-assert-ok': PreferAssertOverAssertOk.RuleEntry;
|
|
83
|
+
'vitest-coding-style/prefer-assert-not-ok-over-assert-is-not-ok': PreferAssertNotOkOverAssertIsNotOk.RuleEntry;
|
|
84
|
+
'vitest-coding-style/prefer-assert-over-expect-true': PreferAssertOverExpectTrue.RuleEntry;
|
|
85
|
+
'vitest-coding-style/prefer-assert-not-ok-over-expect-false': PreferAssertNotOkOverExpectFalse.RuleEntry;
|
|
21
86
|
}>;
|