eslint-config-typed 3.4.0 → 3.5.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.
Files changed (66) hide show
  1. package/dist/configs/plugins.d.mts +1 -1
  2. package/dist/configs/plugins.d.mts.map +1 -1
  3. package/dist/configs/plugins.mjs +6 -4
  4. package/dist/configs/plugins.mjs.map +1 -1
  5. package/dist/configs/typescript-without-rules.mjs +1 -0
  6. package/dist/configs/typescript-without-rules.mjs.map +1 -1
  7. package/dist/configs/vitest.d.mts.map +1 -1
  8. package/dist/configs/vitest.mjs +2 -1
  9. package/dist/configs/vitest.mjs.map +1 -1
  10. package/dist/entry-point.mjs +1 -0
  11. package/dist/entry-point.mjs.map +1 -1
  12. package/dist/index.mjs +2 -0
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/plugins/index.d.mts +1 -0
  15. package/dist/plugins/index.d.mts.map +1 -1
  16. package/dist/plugins/index.mjs +1 -0
  17. package/dist/plugins/index.mjs.map +1 -1
  18. package/dist/plugins/vitest-coding-style/index.d.mts +2 -0
  19. package/dist/plugins/vitest-coding-style/index.d.mts.map +1 -0
  20. package/dist/plugins/vitest-coding-style/index.mjs +2 -0
  21. package/dist/plugins/vitest-coding-style/index.mjs.map +1 -0
  22. package/dist/plugins/vitest-coding-style/plugin.d.mts +3 -0
  23. package/dist/plugins/vitest-coding-style/plugin.d.mts.map +1 -0
  24. package/dist/plugins/vitest-coding-style/plugin.mjs +8 -0
  25. package/dist/plugins/vitest-coding-style/plugin.mjs.map +1 -0
  26. package/dist/plugins/vitest-coding-style/rules/index.d.mts +2 -0
  27. package/dist/plugins/vitest-coding-style/rules/index.d.mts.map +1 -0
  28. package/dist/plugins/vitest-coding-style/rules/index.mjs +2 -0
  29. package/dist/plugins/vitest-coding-style/rules/index.mjs.map +1 -0
  30. package/dist/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.d.mts +5 -0
  31. package/dist/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.d.mts.map +1 -0
  32. package/dist/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mjs +103 -0
  33. package/dist/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mjs.map +1 -0
  34. package/dist/plugins/vitest-coding-style/rules/rules.d.mts +4 -0
  35. package/dist/plugins/vitest-coding-style/rules/rules.d.mts.map +1 -0
  36. package/dist/plugins/vitest-coding-style/rules/rules.mjs +8 -0
  37. package/dist/plugins/vitest-coding-style/rules/rules.mjs.map +1 -0
  38. package/dist/rules/eslint-vitest-coding-style-rules.d.mts +4 -0
  39. package/dist/rules/eslint-vitest-coding-style-rules.d.mts.map +1 -0
  40. package/dist/rules/eslint-vitest-coding-style-rules.mjs +6 -0
  41. package/dist/rules/eslint-vitest-coding-style-rules.mjs.map +1 -0
  42. package/dist/rules/index.d.mts +1 -0
  43. package/dist/rules/index.d.mts.map +1 -1
  44. package/dist/rules/index.mjs +1 -0
  45. package/dist/rules/index.mjs.map +1 -1
  46. package/dist/types/rules/eslint-vitest-coding-style-rules.d.mts +20 -0
  47. package/dist/types/rules/eslint-vitest-coding-style-rules.d.mts.map +1 -0
  48. package/dist/types/rules/eslint-vitest-coding-style-rules.mjs +2 -0
  49. package/dist/types/rules/eslint-vitest-coding-style-rules.mjs.map +1 -0
  50. package/dist/types/rules/index.d.mts +1 -0
  51. package/dist/types/rules/index.d.mts.map +1 -1
  52. package/package.json +1 -1
  53. package/src/configs/plugins.mts +12 -9
  54. package/src/configs/typescript-without-rules.mts +2 -0
  55. package/src/configs/vitest.mts +5 -2
  56. package/src/plugins/index.mts +1 -0
  57. package/src/plugins/vitest-coding-style/index.mts +1 -0
  58. package/src/plugins/vitest-coding-style/plugin.mts +6 -0
  59. package/src/plugins/vitest-coding-style/rules/index.mts +1 -0
  60. package/src/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mts +160 -0
  61. package/src/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.test.mts +48 -0
  62. package/src/plugins/vitest-coding-style/rules/rules.mts +6 -0
  63. package/src/rules/eslint-vitest-coding-style-rules.mts +5 -0
  64. package/src/rules/index.mts +1 -0
  65. package/src/types/rules/eslint-vitest-coding-style-rules.mts +21 -0
  66. package/src/types/rules/index.mts +1 -0
@@ -1,3 +1,3 @@
1
1
  import { type ESLintPlugin } from '../types/index.mjs';
2
- export declare const plugins: Record<'@typescript-eslint' | '@stylistic' | 'array-func' | 'cypress' | 'playwright' | 'functional' | 'import-x' | 'jest' | 'vitest' | 'jsx-a11y' | 'prefer-arrow-functions' | 'promise' | 'react' | 'react-hooks' | 'react-refresh' | 'react-perf' | 'react-coding-style' | 'security' | 'strict-dependencies' | 'testing-library' | 'total-functions' | 'unicorn' | 'sort-destructure-keys' | 'tree-shakable' | 'eslint-plugin' | 'custom', Omit<ESLintPlugin, 'configs'>>;
2
+ export declare const plugins: Record<'@typescript-eslint' | '@stylistic' | 'array-func' | 'cypress' | 'playwright' | 'functional' | 'import-x' | 'jest' | 'vitest' | 'jsx-a11y' | 'prefer-arrow-functions' | 'promise' | 'react' | 'react-hooks' | 'react-refresh' | 'react-perf' | 'security' | 'testing-library' | 'unicorn' | 'sort-destructure-keys' | 'eslint-plugin' | 'tree-shakable' | 'total-functions' | 'strict-dependencies' | 'custom' | 'react-coding-style' | 'vitest-coding-style', Omit<ESLintPlugin, 'configs'>>;
3
3
  //# sourceMappingURL=plugins.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.mts","sourceRoot":"","sources":["../../src/configs/plugins.mts"],"names":[],"mappings":"AA2DA,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAExE,eAAO,MAAM,OAAO,EAAE,MAAM,CACxB,oBAAoB,GACpB,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,MAAM,GACN,QAAQ,GACR,UAAU,GACV,wBAAwB,GACxB,SAAS,GACT,OAAO,GACP,aAAa,GACb,eAAe,GACf,YAAY,GACZ,oBAAoB,GACpB,UAAU,GACV,qBAAqB,GACrB,iBAAiB,GACjB,iBAAiB,GACjB,SAAS,GACT,uBAAuB,GACvB,eAAe,GACf,eAAe,GACf,QAAQ,EACV,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAmCW,CAAC"}
1
+ {"version":3,"file":"plugins.d.mts","sourceRoot":"","sources":["../../src/configs/plugins.mts"],"names":[],"mappings":"AA4DA,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAExE,eAAO,MAAM,OAAO,EAAE,MAAM,CACxB,oBAAoB,GACpB,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,YAAY,GACZ,UAAU,GACV,MAAM,GACN,QAAQ,GACR,UAAU,GACV,wBAAwB,GACxB,SAAS,GACT,OAAO,GACP,aAAa,GACb,eAAe,GACf,YAAY,GACZ,UAAU,GACV,iBAAiB,GACjB,SAAS,GACT,uBAAuB,GACvB,eAAe,GACf,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,QAAQ,GACR,oBAAoB,GACpB,qBAAqB,EACvB,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAoCW,CAAC"}
@@ -24,6 +24,7 @@ import { eslintPluginReactCodingStyle } from '../plugins/react-coding-style/plug
24
24
  import { eslintPluginStrictDependencies } from '../plugins/strict-dependencies/plugin.mjs';
25
25
  import { eslintPluginTotalFunctions } from '../plugins/total-functions/plugin.mjs';
26
26
  import { eslintPluginTreeShakable } from '../plugins/tree-shakable/plugin.mjs';
27
+ import { eslintPluginVitestCodingStyle } from '../plugins/vitest-coding-style/plugin.mjs';
27
28
 
28
29
  /* eslint-disable import-x/no-rename-default */
29
30
  const plugins = {
@@ -50,16 +51,17 @@ const plugins = {
50
51
  'react-refresh': eslintPluginReactRefresh,
51
52
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
52
53
  'react-perf': eslintPluginReactPerf,
53
- 'react-coding-style': eslintPluginReactCodingStyle,
54
54
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
55
55
  security: eslintPluginSecurity,
56
- 'strict-dependencies': eslintPluginStrictDependencies,
57
56
  'testing-library': eslintPluginTestingLibrary,
58
- 'total-functions': eslintPluginTotalFunctions,
59
57
  unicorn: eslintPluginUnicorn,
60
- 'tree-shakable': eslintPluginTreeShakable,
61
58
  'eslint-plugin': eslintPluginEslintPlugin,
59
+ 'tree-shakable': eslintPluginTreeShakable,
60
+ 'total-functions': eslintPluginTotalFunctions,
61
+ 'strict-dependencies': eslintPluginStrictDependencies,
62
62
  custom: eslintPluginCustom,
63
+ 'react-coding-style': eslintPluginReactCodingStyle,
64
+ 'vitest-coding-style': eslintPluginVitestCodingStyle,
63
65
  };
64
66
 
65
67
  export { plugins };
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.mjs","sources":["../../src/configs/plugins.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AA6DO,MAAM,OAAO,GA4BhB;AACF,IAAA,oBAAoB,EAAE,gBAAgB;AACtC,IAAA,YAAY,EAAE,SAAS;;AAEvB,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,UAAU,EAAE,sBAAsB;AAClC,IAAA,UAAU,EAAE,sBAAsB;;AAElC,IAAA,uBAAuB,EAAE,+BAA+B;AACxD,IAAA,UAAU,EAAE,kBAAkB;AAC9B,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,MAAM,EAAE,kBAAkB;;AAE1B,IAAA,UAAU,EAAE,mBAAmB;AAC/B,IAAA,wBAAwB,EAAE,gCAAgC;;AAE1D,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,KAAK,EAAE,iBAAiB;;AAExB,IAAA,aAAa,EAAE,sBAAiD;AAChE,IAAA,eAAe,EAAE,wBAAwB;;AAEzC,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,oBAAoB,EAAE,4BAA4B;;AAElD,IAAA,QAAQ,EAAE,oBAAoB;AAC9B,IAAA,qBAAqB,EAAE,8BAA8B;AACrD,IAAA,iBAAiB,EAAE,0BAA0B;AAC7C,IAAA,iBAAiB,EAAE,0BAA0B;AAC7C,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,eAAe,EAAE,wBAAwB;AACzC,IAAA,eAAe,EAAE,wBAAwB;AACzC,IAAA,MAAM,EAAE,kBAAkB;;;;;"}
1
+ {"version":3,"file":"plugins.mjs","sources":["../../src/configs/plugins.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AA8DO,MAAM,OAAO,GA6BhB;AACF,IAAA,oBAAoB,EAAE,gBAAgB;AACtC,IAAA,YAAY,EAAE,SAAS;;AAEvB,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,UAAU,EAAE,sBAAsB;AAClC,IAAA,UAAU,EAAE,sBAAsB;;AAElC,IAAA,uBAAuB,EAAE,+BAA+B;AACxD,IAAA,UAAU,EAAE,kBAAkB;AAC9B,IAAA,IAAI,EAAE,gBAAgB;AACtB,IAAA,MAAM,EAAE,kBAAkB;;AAE1B,IAAA,UAAU,EAAE,mBAAmB;AAC/B,IAAA,wBAAwB,EAAE,gCAAgC;;AAE1D,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,KAAK,EAAE,iBAAiB;;AAExB,IAAA,aAAa,EAAE,sBAAiD;AAChE,IAAA,eAAe,EAAE,wBAAwB;;AAEzC,IAAA,YAAY,EAAE,qBAAqB;;AAEnC,IAAA,QAAQ,EAAE,oBAAoB;AAC9B,IAAA,iBAAiB,EAAE,0BAA0B;AAC7C,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,eAAe,EAAE,wBAAwB;AACzC,IAAA,eAAe,EAAE,wBAAwB;AACzC,IAAA,iBAAiB,EAAE,0BAA0B;AAC7C,IAAA,qBAAqB,EAAE,8BAA8B;AACrD,IAAA,MAAM,EAAE,kBAAkB;AAC1B,IAAA,oBAAoB,EAAE,4BAA4B;AAClD,IAAA,qBAAqB,EAAE,6BAA6B;;;;;"}
@@ -55,6 +55,7 @@ const allExtensions = [
55
55
  '.cjs',
56
56
  '.mjs',
57
57
  ];
58
+ // https://github.com/un-ts/eslint-plugin-import-x/blob/v4.16.1/src/config/typescript.ts
58
59
  /**
59
60
  * This config:
60
61
  *
@@ -1 +1 @@
1
- {"version":3,"file":"typescript-without-rules.mjs","sources":["../../src/configs/typescript-without-rules.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAKO,MAAM,qCAAqC,GAAG,CAAC,EACpD,gBAAgB,EAChB,eAAe,GAIf,KACA;AACE,IAAA;AACE,QAAA,OAAO,EAAE;YACP,0CAA0C;YAC1C,4CAA4C;YAC5C,4CAA4C;YAC5C,iBAAiB;YACjB,SAAS;YACT,UAAU;YACV,aAAa;AACd,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,eAAe,EAAE;AACf,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,aAAa,EAAE;AACb,gBAAA,OAAO,EAAE,gBAAgB;gBACzB,eAAe;AACf,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,YAAY,EAAE;AACZ,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,aAAa,EAAE,IAAI;AACnB,oBAAA,GAAG,EAAE,IAAI;AACV,iBAAA;gBACD,SAAS,EAAE,IAAI;AACf,gBAAA,UAAU,EAAE,QAAQ;AACrB,aAAA;AACD,YAAA,OAAO,EAAE;gBACP,GAAG,OAAO,CAAC,MAAM;AAClB,aAAA;AACF,SAAA;AACD,QAAA,aAAa,EAAE;AACb,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,6BAA6B,EAAE,IAAI;AACpC,SAAA;QACD,OAAO;AACP,QAAA,QAAQ,EAAE;AACR,YAAA,GAAG,2BAA2B;AAC/B,SAAA;AACF,KAAA;;AAGL;AACA;AACA;AACA,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU;AAErE,MAAM,aAAa,GAAG;AACpB,IAAA,GAAG,oBAAoB;IACvB,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;CACE;AAEV;;;;;AAKG;AACH,MAAM,2BAA2B,GAAG;AAClC,IAAA,qBAAqB,EAAE,aAAa;AACpC,IAAA,kCAAkC,EAAE,CAAC,cAAc,EAAE,qBAAqB,CAAC;AAC3E,IAAA,kBAAkB,EAAE;AAClB,QAAA,2BAA2B,EAAE,oBAAoB;AAClD,KAAA;AACD,IAAA,mBAAmB,EAAE;AACnB,QAAA,UAAU,EAAE,IAAI;;;;;;;;;;;;;;;;;;;AAoBjB,KAAA;CACO;;;;"}
1
+ {"version":3,"file":"typescript-without-rules.mjs","sources":["../../src/configs/typescript-without-rules.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAKO,MAAM,qCAAqC,GAAG,CAAC,EACpD,gBAAgB,EAChB,eAAe,GAIf,KACA;AACE,IAAA;AACE,QAAA,OAAO,EAAE;YACP,0CAA0C;YAC1C,4CAA4C;YAC5C,4CAA4C;YAC5C,iBAAiB;YACjB,SAAS;YACT,UAAU;YACV,aAAa;AACd,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,eAAe,EAAE;AACf,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,MAAM,EAAE,sBAAsB;AAC9B,YAAA,aAAa,EAAE;AACb,gBAAA,OAAO,EAAE,gBAAgB;gBACzB,eAAe;AACf,gBAAA,WAAW,EAAE,QAAQ;AACrB,gBAAA,YAAY,EAAE;AACZ,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,aAAa,EAAE,IAAI;AACnB,oBAAA,GAAG,EAAE,IAAI;AACV,iBAAA;gBACD,SAAS,EAAE,IAAI;AACf,gBAAA,UAAU,EAAE,QAAQ;AACrB,aAAA;AACD,YAAA,OAAO,EAAE;gBACP,GAAG,OAAO,CAAC,MAAM;AAClB,aAAA;AACF,SAAA;AACD,QAAA,aAAa,EAAE;AACb,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,6BAA6B,EAAE,IAAI;AACpC,SAAA;QACD,OAAO;AACP,QAAA,QAAQ,EAAE;AACR,YAAA,GAAG,2BAA2B;AAC/B,SAAA;AACF,KAAA;;AAGL;AACA;AACA;AACA,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU;AAErE,MAAM,aAAa,GAAG;AACpB,IAAA,GAAG,oBAAoB;IACvB,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;CACE;AAEV;AAEA;;;;;AAKG;AACH,MAAM,2BAA2B,GAAG;AAClC,IAAA,qBAAqB,EAAE,aAAa;AACpC,IAAA,kCAAkC,EAAE,CAAC,cAAc,EAAE,qBAAqB,CAAC;AAC3E,IAAA,kBAAkB,EAAE;AAClB,QAAA,2BAA2B,EAAE,oBAAoB;AAClD,KAAA;AACD,IAAA,mBAAmB,EAAE;AACnB,QAAA,UAAU,EAAE,IAAI;;;;;;;;;;;;;;;;;;;AAoBjB,KAAA;CACO;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.d.mts","sourceRoot":"","sources":["../../src/configs/vitest.mts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEvE,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,MAAM,EAAE,KAAG,UAYrD,CAAC"}
1
+ {"version":3,"file":"vitest.d.mts","sourceRoot":"","sources":["../../src/configs/vitest.mts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEvE,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,MAAM,EAAE,KAAG,UAarD,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { defineKnownRules } from '../types/define-known-rules.mjs';
2
2
  import '../rules/eslint-rules.mjs';
3
+ import { eslintVitestCodingStyleRules } from '../rules/eslint-vitest-coding-style-rules.mjs';
3
4
  import { eslintVitestRules } from '../rules/eslint-vitest-rules.mjs';
4
5
 
5
- // import vitest from 'eslint-plugin-vitest';
6
6
  const eslintConfigForVitest = (files) => ({
7
7
  ...(files === undefined ? {} : { files }),
8
8
  languageOptions: {
@@ -13,6 +13,7 @@ const eslintConfigForVitest = (files) => ({
13
13
  },
14
14
  rules: defineKnownRules({
15
15
  ...eslintVitestRules,
16
+ ...eslintVitestCodingStyleRules,
16
17
  }),
17
18
  });
18
19
 
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.mjs","sources":["../../src/configs/vitest.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAAA;MAIa,qBAAqB,GAAG,CAAC,KAAyB,MAC5D;AACC,IAAA,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzC,IAAA,eAAe,EAAE;;AAEf,QAAA,OAAO,EAAE;;AAER,SAAA;AACF,KAAA;IACD,KAAK,EAAE,gBAAgB,CAAC;AACtB,QAAA,GAAG,iBAAiB;KACrB,CAAC;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"vitest.mjs","sources":["../../src/configs/vitest.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;MAMa,qBAAqB,GAAG,CAAC,KAAyB,MAC5D;AACC,IAAA,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzC,IAAA,eAAe,EAAE;;AAEf,QAAA,OAAO,EAAE;;AAER,SAAA;AACF,KAAA;IACD,KAAK,EAAE,gBAAgB,CAAC;AACtB,QAAA,GAAG,iBAAiB;AACpB,QAAA,GAAG,4BAA4B;KAChC,CAAC;AACH,CAAA;;;;"}
@@ -45,4 +45,5 @@ import 'ts-data-forge';
45
45
  import 'typescript';
46
46
  export { eslintPluginTotalFunctions } from './plugins/total-functions/plugin.mjs';
47
47
  export { eslintPluginTreeShakable } from './plugins/tree-shakable/plugin.mjs';
48
+ import '@typescript-eslint/utils';
48
49
  //# sourceMappingURL=entry-point.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-point.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"entry-point.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.mjs CHANGED
@@ -16,6 +16,7 @@ export { eslintPluginReactCodingStyle } from './plugins/react-coding-style/plugi
16
16
  export { eslintPluginStrictDependencies } from './plugins/strict-dependencies/plugin.mjs';
17
17
  export { eslintPluginTotalFunctions } from './plugins/total-functions/plugin.mjs';
18
18
  export { eslintPluginTreeShakable } from './plugins/tree-shakable/plugin.mjs';
19
+ export { eslintPluginVitestCodingStyle } from './plugins/vitest-coding-style/plugin.mjs';
19
20
  export { allExtensionsRegexUnionStr, allExtensionsStr } from './rules/all-extensions.mjs';
20
21
  export { eslintArrayFuncRules } from './rules/eslint-array-func-rules.mjs';
21
22
  export { eslintCypressRules } from './rules/eslint-cypress-rules.mjs';
@@ -40,6 +41,7 @@ export { eslintTestingLibraryRules } from './rules/eslint-testing-library-rules.
40
41
  export { eslintTotalFunctionsRules } from './rules/eslint-total-functions-rules.mjs';
41
42
  export { eslintTreeShakableRules } from './rules/eslint-tree-shakable-rules.mjs';
42
43
  export { eslintUnicornRules } from './rules/eslint-unicorn-rules.mjs';
44
+ export { eslintVitestCodingStyleRules } from './rules/eslint-vitest-coding-style-rules.mjs';
43
45
  export { eslintVitestRules } from './rules/eslint-vitest-rules.mjs';
44
46
  export { typescriptEslintRules } from './rules/typescript-eslint-rules.mjs';
45
47
  export { defineConfig } from './types/define-config.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -3,4 +3,5 @@ export * from './react-coding-style/index.mjs';
3
3
  export * from './strict-dependencies/index.mjs';
4
4
  export * from './total-functions/index.mjs';
5
5
  export * from './tree-shakable/index.mjs';
6
+ export * from './vitest-coding-style/index.mjs';
6
7
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/plugins/index.mts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/plugins/index.mts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC"}
@@ -3,4 +3,5 @@ export { eslintPluginReactCodingStyle } from './react-coding-style/plugin.mjs';
3
3
  export { eslintPluginStrictDependencies } from './strict-dependencies/plugin.mjs';
4
4
  export { eslintPluginTotalFunctions } from './total-functions/plugin.mjs';
5
5
  export { eslintPluginTreeShakable } from './tree-shakable/plugin.mjs';
6
+ export { eslintPluginVitestCodingStyle } from './vitest-coding-style/plugin.mjs';
6
7
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from './plugin.mjs';
2
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/plugins/vitest-coding-style/index.mts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { eslintPluginVitestCodingStyle } from './plugin.mjs';
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { type ESLintPlugin } from '../../types/index.mjs';
2
+ export declare const eslintPluginVitestCodingStyle: Omit<ESLintPlugin, 'configs'>;
3
+ //# sourceMappingURL=plugin.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.mts","sourceRoot":"","sources":["../../../src/plugins/vitest-coding-style/plugin.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,eAAO,MAAM,6BAA6B,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAE9D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { vitestCodingStyleRules } from './rules/rules.mjs';
2
+
3
+ const eslintPluginVitestCodingStyle = {
4
+ rules: vitestCodingStyleRules,
5
+ };
6
+
7
+ export { eslintPluginVitestCodingStyle };
8
+ //# sourceMappingURL=plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.mjs","sources":["../../../src/plugins/vitest-coding-style/plugin.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAGO,MAAM,6BAA6B,GAAkC;AAC1E,IAAA,KAAK,EAAE,sBAAsB;;;;;"}
@@ -0,0 +1,2 @@
1
+ export * from './rules.mjs';
2
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/index.mts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { vitestCodingStyleRules } from './rules.mjs';
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { type TSESLint } from '@typescript-eslint/utils';
2
+ type MessageIds = 'useAssert';
3
+ export declare const noExpectToStrictEqualRule: TSESLint.RuleModule<MessageIds>;
4
+ export {};
5
+ //# sourceMappingURL=no-expect-to-strict-equal.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-expect-to-strict-equal.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/no-expect-to-strict-equal.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAGlC,KAAK,UAAU,GAAG,WAAW,CAAC;AAO9B,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,CAmErE,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { AST_NODE_TYPES } from '@typescript-eslint/utils';
2
+ import { isRecord, hasKey } from 'ts-data-forge';
3
+
4
+ const noExpectToStrictEqualRule = {
5
+ meta: {
6
+ type: 'suggestion',
7
+ docs: {
8
+ description: 'Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual()`.',
9
+ },
10
+ fixable: 'code',
11
+ schema: [],
12
+ messages: {
13
+ useAssert: 'Use `assert.deepStrictEqual()` instead of `expect().toStrictEqual()`.',
14
+ },
15
+ },
16
+ defaultOptions: [],
17
+ create: (context) => {
18
+ const sourceCode = context.sourceCode;
19
+ return {
20
+ CallExpression: (node) => {
21
+ if (!isToStrictEqualInvocation(node)) {
22
+ return;
23
+ }
24
+ const expectCall = node.callee.object;
25
+ if (!isExpectCall(expectCall)) {
26
+ return;
27
+ }
28
+ if (expectCall.arguments.length !== 1 ||
29
+ node.arguments.length !== 1 ||
30
+ expectCall.arguments[0]?.type === AST_NODE_TYPES.SpreadElement ||
31
+ node.arguments[0]?.type === AST_NODE_TYPES.SpreadElement) {
32
+ return;
33
+ }
34
+ const actualArgument = expectCall.arguments[0];
35
+ const expectedArgument = node.arguments[0];
36
+ if (actualArgument === undefined || expectedArgument === undefined) {
37
+ return;
38
+ }
39
+ const actualText = sourceCode.getText(actualArgument);
40
+ const expectedText = sourceCode.getText(expectedArgument);
41
+ const typeArgumentText = getTypeArgumentText(node, sourceCode);
42
+ const expectedWithCast = typeArgumentText === undefined
43
+ ? expectedText
44
+ : `(${expectedText}) as ${typeArgumentText}`;
45
+ context.report({
46
+ node,
47
+ messageId: 'useAssert',
48
+ fix: (fixer) => fixer.replaceText(node, `assert.deepStrictEqual(${actualText}, ${expectedWithCast})`),
49
+ });
50
+ },
51
+ };
52
+ },
53
+ };
54
+ const isToStrictEqualInvocation = (
55
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
56
+ node) => {
57
+ if (node.callee.type !== AST_NODE_TYPES.MemberExpression ||
58
+ node.optional ||
59
+ node.callee.optional ||
60
+ node.callee.computed) {
61
+ return false;
62
+ }
63
+ return (node.callee.property.type === AST_NODE_TYPES.Identifier &&
64
+ node.callee.property.name === 'toStrictEqual' &&
65
+ node.callee.object.type === AST_NODE_TYPES.CallExpression);
66
+ };
67
+ const isExpectCall = (
68
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
69
+ node) => node.callee.type === AST_NODE_TYPES.Identifier &&
70
+ node.callee.name === 'expect';
71
+ const getTypeArgumentText = (
72
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
73
+ node,
74
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
75
+ sourceCode) => {
76
+ const typeArguments = getModernTypeArguments(node) ?? getLegacyTypeParameters(node);
77
+ if (typeArguments === undefined) {
78
+ return undefined;
79
+ }
80
+ const rawText = sourceCode.getText(typeArguments).trim();
81
+ if (rawText.length < 2) {
82
+ return undefined;
83
+ }
84
+ const withoutAngles = rawText
85
+ .replace(/^\s*</u, '')
86
+ .replace(/>\s*$/u, '')
87
+ .trim();
88
+ return withoutAngles.length === 0 ? undefined : withoutAngles;
89
+ };
90
+ const getModernTypeArguments = (
91
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
92
+ node) => isRecord(node) && hasKey(node, 'typeArguments')
93
+ ? node.typeArguments
94
+ : undefined;
95
+ const getLegacyTypeParameters = (
96
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
97
+ node) => isRecord(node) && hasKey(node, 'typeParameters')
98
+ ? // eslint-disable-next-line total-functions/no-unsafe-type-assertion
99
+ node.typeParameters
100
+ : undefined;
101
+
102
+ export { noExpectToStrictEqualRule };
103
+ //# sourceMappingURL=no-expect-to-strict-equal.mjs.map
@@ -0,0 +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":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const vitestCodingStyleRules: {
2
+ readonly 'no-expect-to-strict-equal': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useAssert", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
3
+ };
4
+ //# sourceMappingURL=rules.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../../../src/plugins/vitest-coding-style/rules/rules.mts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB;;CAEO,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { noExpectToStrictEqualRule } from './no-expect-to-strict-equal.mjs';
2
+
3
+ const vitestCodingStyleRules = {
4
+ 'no-expect-to-strict-equal': noExpectToStrictEqualRule,
5
+ };
6
+
7
+ export { vitestCodingStyleRules };
8
+ //# sourceMappingURL=rules.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.mjs","sources":["../../../../src/plugins/vitest-coding-style/rules/rules.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAGO,MAAM,sBAAsB,GAAG;AACpC,IAAA,2BAA2B,EAAE,yBAAyB;;;;;"}
@@ -0,0 +1,4 @@
1
+ export declare const eslintVitestCodingStyleRules: {
2
+ readonly 'vitest-coding-style/no-expect-to-strict-equal': "error";
3
+ };
4
+ //# sourceMappingURL=eslint-vitest-coding-style-rules.d.mts.map
@@ -0,0 +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;;CAEQ,CAAC"}
@@ -0,0 +1,6 @@
1
+ const eslintVitestCodingStyleRules = {
2
+ 'vitest-coding-style/no-expect-to-strict-equal': 'error',
3
+ };
4
+
5
+ export { eslintVitestCodingStyleRules };
6
+ //# sourceMappingURL=eslint-vitest-coding-style-rules.mjs.map
@@ -0,0 +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;;;;;"}
@@ -22,6 +22,7 @@ export * from './eslint-testing-library-rules.mjs';
22
22
  export * from './eslint-total-functions-rules.mjs';
23
23
  export * from './eslint-tree-shakable-rules.mjs';
24
24
  export * from './eslint-unicorn-rules.mjs';
25
+ export * from './eslint-vitest-coding-style-rules.mjs';
25
26
  export * from './eslint-vitest-rules.mjs';
26
27
  export * from './typescript-eslint-rules.mjs';
27
28
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/rules/index.mts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iDAAiD,CAAC;AAChE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/rules/index.mts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iDAAiD,CAAC;AAChE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
@@ -22,6 +22,7 @@ export { eslintTestingLibraryRules } from './eslint-testing-library-rules.mjs';
22
22
  export { eslintTotalFunctionsRules } from './eslint-total-functions-rules.mjs';
23
23
  export { eslintTreeShakableRules } from './eslint-tree-shakable-rules.mjs';
24
24
  export { eslintUnicornRules } from './eslint-unicorn-rules.mjs';
25
+ export { eslintVitestCodingStyleRules } from './eslint-vitest-coding-style-rules.mjs';
25
26
  export { eslintVitestRules } from './eslint-vitest-rules.mjs';
26
27
  export { typescriptEslintRules } from './typescript-eslint-rules.mjs';
27
28
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,20 @@
1
+ import { type Linter } from 'eslint';
2
+ /**
3
+ * Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual()`.
4
+ *
5
+ * ```md
6
+ * | key | value |
7
+ * | :--------- | :--------- |
8
+ * | type | suggestion |
9
+ * | deprecated | false |
10
+ * | fixable | code |
11
+ * ```
12
+ */
13
+ declare namespace NoExpectToStrictEqual {
14
+ type RuleEntry = Linter.StringSeverity;
15
+ }
16
+ export type EslintVitestCodingStyleRules = {
17
+ readonly 'vitest-coding-style/no-expect-to-strict-equal': NoExpectToStrictEqual.RuleEntry;
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=eslint-vitest-coding-style-rules.d.mts.map
@@ -0,0 +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;;;;;;;;;;GAUG;AACH,kBAAU,qBAAqB,CAAC;IAC9B,KAAY,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;CAC/C;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,+CAA+C,EAAE,qBAAqB,CAAC,SAAS,CAAC;CAC3F,CAAC"}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=eslint-vitest-coding-style-rules.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint-vitest-coding-style-rules.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -23,6 +23,7 @@ export * from './eslint-testing-library-rules.mjs';
23
23
  export * from './eslint-total-functions-rules.mjs';
24
24
  export * from './eslint-tree-shakable-rules.mjs';
25
25
  export * from './eslint-unicorn-rules.mjs';
26
+ export * from './eslint-vitest-coding-style-rules.mjs';
26
27
  export * from './eslint-vitest-rules.mjs';
27
28
  export * from './typescript-eslint-rules.mjs';
28
29
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/types/rules/index.mts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iDAAiD,CAAC;AAChE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/types/rules/index.mts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iDAAiD,CAAC;AAChE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-config-typed",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "private": false,
5
5
  "keywords": [
6
6
  "typescript"
@@ -55,6 +55,7 @@ import {
55
55
  eslintPluginStrictDependencies,
56
56
  eslintPluginTotalFunctions,
57
57
  eslintPluginTreeShakable,
58
+ eslintPluginVitestCodingStyle,
58
59
  } from '../plugins/index.mjs';
59
60
 
60
61
  import { type ESLintPlugin, type FlatConfig } from '../types/index.mjs';
@@ -76,16 +77,17 @@ export const plugins: Record<
76
77
  | 'react-hooks'
77
78
  | 'react-refresh'
78
79
  | 'react-perf'
79
- | 'react-coding-style'
80
80
  | 'security'
81
- | 'strict-dependencies'
82
81
  | 'testing-library'
83
- | 'total-functions'
84
82
  | 'unicorn'
85
83
  | 'sort-destructure-keys'
86
- | 'tree-shakable'
87
84
  | 'eslint-plugin'
88
- | 'custom',
85
+ | 'tree-shakable'
86
+ | 'total-functions'
87
+ | 'strict-dependencies'
88
+ | 'custom'
89
+ | 'react-coding-style'
90
+ | 'vitest-coding-style',
89
91
  Omit<ESLintPlugin, 'configs'>
90
92
  > = {
91
93
  '@typescript-eslint': typescriptEslint,
@@ -111,14 +113,15 @@ export const plugins: Record<
111
113
  'react-refresh': eslintPluginReactRefresh,
112
114
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
113
115
  'react-perf': eslintPluginReactPerf,
114
- 'react-coding-style': eslintPluginReactCodingStyle,
115
116
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
116
117
  security: eslintPluginSecurity,
117
- 'strict-dependencies': eslintPluginStrictDependencies,
118
118
  'testing-library': eslintPluginTestingLibrary,
119
- 'total-functions': eslintPluginTotalFunctions,
120
119
  unicorn: eslintPluginUnicorn,
121
- 'tree-shakable': eslintPluginTreeShakable,
122
120
  'eslint-plugin': eslintPluginEslintPlugin,
121
+ 'tree-shakable': eslintPluginTreeShakable,
122
+ 'total-functions': eslintPluginTotalFunctions,
123
+ 'strict-dependencies': eslintPluginStrictDependencies,
123
124
  custom: eslintPluginCustom,
125
+ 'react-coding-style': eslintPluginReactCodingStyle,
126
+ 'vitest-coding-style': eslintPluginVitestCodingStyle,
124
127
  } as const satisfies FlatConfig['plugins'];
@@ -66,6 +66,8 @@ const allExtensions = [
66
66
  '.mjs',
67
67
  ] as const;
68
68
 
69
+ // https://github.com/un-ts/eslint-plugin-import-x/blob/v4.16.1/src/config/typescript.ts
70
+
69
71
  /**
70
72
  * This config:
71
73
  *
@@ -1,5 +1,7 @@
1
- // import vitest from 'eslint-plugin-vitest';
2
- import { eslintVitestRules } from '../rules/index.mjs';
1
+ import {
2
+ eslintVitestCodingStyleRules,
3
+ eslintVitestRules,
4
+ } from '../rules/index.mjs';
3
5
  import { defineKnownRules, type FlatConfig } from '../types/index.mjs';
4
6
 
5
7
  export const eslintConfigForVitest = (files?: readonly string[]): FlatConfig =>
@@ -13,5 +15,6 @@ export const eslintConfigForVitest = (files?: readonly string[]): FlatConfig =>
13
15
  },
14
16
  rules: defineKnownRules({
15
17
  ...eslintVitestRules,
18
+ ...eslintVitestCodingStyleRules,
16
19
  }),
17
20
  }) as const;
@@ -3,3 +3,4 @@ export * from './react-coding-style/index.mjs';
3
3
  export * from './strict-dependencies/index.mjs';
4
4
  export * from './total-functions/index.mjs';
5
5
  export * from './tree-shakable/index.mjs';
6
+ export * from './vitest-coding-style/index.mjs';
@@ -0,0 +1 @@
1
+ export * from './plugin.mjs';
@@ -0,0 +1,6 @@
1
+ import { type ESLintPlugin } from '../../types/index.mjs';
2
+ import { vitestCodingStyleRules } from './rules/index.mjs';
3
+
4
+ export const eslintPluginVitestCodingStyle: Omit<ESLintPlugin, 'configs'> = {
5
+ rules: vitestCodingStyleRules,
6
+ } as const;
@@ -0,0 +1 @@
1
+ export * from './rules.mjs';
@@ -0,0 +1,160 @@
1
+ import {
2
+ AST_NODE_TYPES,
3
+ type TSESLint,
4
+ type TSESTree,
5
+ } from '@typescript-eslint/utils';
6
+ import { hasKey, isRecord } from 'ts-data-forge';
7
+
8
+ type MessageIds = 'useAssert';
9
+
10
+ type CallExpressionWithLegacyTypeParameters = TSESTree.CallExpression &
11
+ Readonly<{
12
+ typeParameters?: TSESTree.TSTypeParameterInstantiation;
13
+ }>;
14
+
15
+ export const noExpectToStrictEqualRule: TSESLint.RuleModule<MessageIds> = {
16
+ meta: {
17
+ type: 'suggestion',
18
+ docs: {
19
+ description:
20
+ 'Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual()`.',
21
+ },
22
+ fixable: 'code',
23
+ schema: [],
24
+ messages: {
25
+ useAssert:
26
+ 'Use `assert.deepStrictEqual()` instead of `expect().toStrictEqual()`.',
27
+ },
28
+ },
29
+ defaultOptions: [],
30
+ create: (context) => {
31
+ const sourceCode = context.sourceCode;
32
+
33
+ return {
34
+ CallExpression: (node) => {
35
+ if (!isToStrictEqualInvocation(node)) {
36
+ return;
37
+ }
38
+
39
+ const expectCall = node.callee.object;
40
+
41
+ if (!isExpectCall(expectCall)) {
42
+ return;
43
+ }
44
+
45
+ if (
46
+ expectCall.arguments.length !== 1 ||
47
+ node.arguments.length !== 1 ||
48
+ expectCall.arguments[0]?.type === AST_NODE_TYPES.SpreadElement ||
49
+ node.arguments[0]?.type === AST_NODE_TYPES.SpreadElement
50
+ ) {
51
+ return;
52
+ }
53
+
54
+ const actualArgument = expectCall.arguments[0];
55
+ const expectedArgument = node.arguments[0];
56
+
57
+ if (actualArgument === undefined || expectedArgument === undefined) {
58
+ return;
59
+ }
60
+
61
+ const actualText = sourceCode.getText(actualArgument);
62
+ const expectedText = sourceCode.getText(expectedArgument);
63
+ const typeArgumentText = getTypeArgumentText(node, sourceCode);
64
+
65
+ const expectedWithCast =
66
+ typeArgumentText === undefined
67
+ ? expectedText
68
+ : `(${expectedText}) as ${typeArgumentText}`;
69
+
70
+ context.report({
71
+ node,
72
+ messageId: 'useAssert',
73
+ fix: (fixer) =>
74
+ fixer.replaceText(
75
+ node,
76
+ `assert.deepStrictEqual(${actualText}, ${expectedWithCast})`,
77
+ ),
78
+ });
79
+ },
80
+ };
81
+ },
82
+ };
83
+
84
+ const isToStrictEqualInvocation = (
85
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
86
+ node: TSESTree.CallExpression,
87
+ ): node is TSESTree.CallExpression & {
88
+ callee: TSESTree.MemberExpression & {
89
+ object: TSESTree.CallExpression;
90
+ property: TSESTree.Identifier;
91
+ };
92
+ } => {
93
+ if (
94
+ node.callee.type !== AST_NODE_TYPES.MemberExpression ||
95
+ node.optional ||
96
+ node.callee.optional ||
97
+ node.callee.computed
98
+ ) {
99
+ return false;
100
+ }
101
+
102
+ return (
103
+ node.callee.property.type === AST_NODE_TYPES.Identifier &&
104
+ node.callee.property.name === 'toStrictEqual' &&
105
+ node.callee.object.type === AST_NODE_TYPES.CallExpression
106
+ );
107
+ };
108
+
109
+ const isExpectCall = (
110
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
111
+ node: TSESTree.CallExpression,
112
+ ): node is TSESTree.CallExpression & {
113
+ callee: TSESTree.Identifier;
114
+ } =>
115
+ node.callee.type === AST_NODE_TYPES.Identifier &&
116
+ node.callee.name === 'expect';
117
+
118
+ const getTypeArgumentText = (
119
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
120
+ node: TSESTree.CallExpression,
121
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
122
+ sourceCode: TSESLint.SourceCode,
123
+ ): string | undefined => {
124
+ const typeArguments =
125
+ getModernTypeArguments(node) ?? getLegacyTypeParameters(node);
126
+
127
+ if (typeArguments === undefined) {
128
+ return undefined;
129
+ }
130
+
131
+ const rawText = sourceCode.getText(typeArguments).trim();
132
+
133
+ if (rawText.length < 2) {
134
+ return undefined;
135
+ }
136
+
137
+ const withoutAngles = rawText
138
+ .replace(/^\s*</u, '')
139
+ .replace(/>\s*$/u, '')
140
+ .trim();
141
+
142
+ return withoutAngles.length === 0 ? undefined : withoutAngles;
143
+ };
144
+
145
+ const getModernTypeArguments = (
146
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
147
+ node: TSESTree.CallExpression,
148
+ ): TSESTree.TSTypeParameterInstantiation | undefined =>
149
+ isRecord(node) && hasKey(node, 'typeArguments')
150
+ ? node.typeArguments
151
+ : undefined;
152
+
153
+ const getLegacyTypeParameters = (
154
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
155
+ node: TSESTree.CallExpression,
156
+ ): TSESTree.TSTypeParameterInstantiation | undefined =>
157
+ isRecord(node) && hasKey(node, 'typeParameters')
158
+ ? // eslint-disable-next-line total-functions/no-unsafe-type-assertion
159
+ (node as CallExpressionWithLegacyTypeParameters).typeParameters
160
+ : undefined;
@@ -0,0 +1,48 @@
1
+ import parser from '@typescript-eslint/parser';
2
+ import { RuleTester } from '@typescript-eslint/rule-tester';
3
+ import dedent from 'dedent';
4
+ import { noExpectToStrictEqualRule } from './no-expect-to-strict-equal.mjs';
5
+
6
+ const tester = new RuleTester({
7
+ languageOptions: {
8
+ parser,
9
+ parserOptions: {
10
+ ecmaVersion: 2020,
11
+ sourceType: 'module',
12
+ },
13
+ },
14
+ });
15
+
16
+ tester.run('no-expect-to-strict-equal', noExpectToStrictEqualRule, {
17
+ valid: [
18
+ {
19
+ code: 'assert.deepStrictEqual(actual, expected);',
20
+ },
21
+ {
22
+ code: 'expect(actual).toBe(expected);',
23
+ },
24
+ {
25
+ code: 'something.expect(actual).toStrictEqual(expected);',
26
+ },
27
+ ],
28
+ invalid: [
29
+ {
30
+ code: 'expect(actual).toStrictEqual(expected);',
31
+ output: 'assert.deepStrictEqual(actual, expected);',
32
+ errors: [{ messageId: 'useAssert' }],
33
+ },
34
+ {
35
+ code: dedent`
36
+ expect(resultError[0]).toStrictEqual<ValidationError>({
37
+ foo: 'bar',
38
+ });
39
+ `,
40
+ output: dedent`
41
+ assert.deepStrictEqual(resultError[0], ({
42
+ foo: 'bar',
43
+ }) as ValidationError);
44
+ `,
45
+ errors: [{ messageId: 'useAssert' }],
46
+ },
47
+ ],
48
+ });
@@ -0,0 +1,6 @@
1
+ import { type ESLintPlugin } from '../../../types/index.mjs';
2
+ import { noExpectToStrictEqualRule } from './no-expect-to-strict-equal.mjs';
3
+
4
+ export const vitestCodingStyleRules = {
5
+ 'no-expect-to-strict-equal': noExpectToStrictEqualRule,
6
+ } as const satisfies ESLintPlugin['rules'];
@@ -0,0 +1,5 @@
1
+ import { type EslintVitestCodingStyleRules } from '../types/index.mjs';
2
+
3
+ export const eslintVitestCodingStyleRules = {
4
+ 'vitest-coding-style/no-expect-to-strict-equal': 'error',
5
+ } as const satisfies EslintVitestCodingStyleRules;
@@ -22,5 +22,6 @@ export * from './eslint-testing-library-rules.mjs';
22
22
  export * from './eslint-total-functions-rules.mjs';
23
23
  export * from './eslint-tree-shakable-rules.mjs';
24
24
  export * from './eslint-unicorn-rules.mjs';
25
+ export * from './eslint-vitest-coding-style-rules.mjs';
25
26
  export * from './eslint-vitest-rules.mjs';
26
27
  export * from './typescript-eslint-rules.mjs';
@@ -0,0 +1,21 @@
1
+ /* cSpell:disable */
2
+ import { type Linter } from 'eslint';
3
+
4
+ /**
5
+ * Disallow `expect().toStrictEqual()` in favor of `assert.deepStrictEqual()`.
6
+ *
7
+ * ```md
8
+ * | key | value |
9
+ * | :--------- | :--------- |
10
+ * | type | suggestion |
11
+ * | deprecated | false |
12
+ * | fixable | code |
13
+ * ```
14
+ */
15
+ namespace NoExpectToStrictEqual {
16
+ export type RuleEntry = Linter.StringSeverity;
17
+ }
18
+
19
+ export type EslintVitestCodingStyleRules = {
20
+ readonly 'vitest-coding-style/no-expect-to-strict-equal': NoExpectToStrictEqual.RuleEntry;
21
+ };
@@ -23,5 +23,6 @@ export * from './eslint-testing-library-rules.mjs';
23
23
  export * from './eslint-total-functions-rules.mjs';
24
24
  export * from './eslint-tree-shakable-rules.mjs';
25
25
  export * from './eslint-unicorn-rules.mjs';
26
+ export * from './eslint-vitest-coding-style-rules.mjs';
26
27
  export * from './eslint-vitest-rules.mjs';
27
28
  export * from './typescript-eslint-rules.mjs';