prefer-each.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _utils = require("./utils");
  7. var _default = (0, _utils.createRule)({
  8. name: __filename,
  9. meta: {
  10. docs: {
  11. category: 'Best Practices',
  12. description: 'Prefer using `.each` rather than manual loops',
  13. recommended: false
  14. },
  15. messages: {
  16. preferEach: 'prefer using `{{ fn }}.each` rather than a manual loop'
  17. },
  18. type: 'suggestion',
  19. schema: []
  20. },
  21. defaultOptions: [],
  22. create(context) {
  23. const jestFnCalls = [];
  24. let inTestCaseCall = false;
  25. const recommendFn = () => {
  26. if (jestFnCalls.length === 1 && jestFnCalls[0] === 'test') {
  27. return 'it';
  28. }
  29. return 'describe';
  30. };
  31. const enterForLoop = () => {
  32. if (jestFnCalls.length === 0 || inTestCaseCall) {
  33. return;
  34. }
  35. jestFnCalls.length = 0;
  36. };
  37. const exitForLoop = node => {
  38. if (jestFnCalls.length === 0 || inTestCaseCall) {
  39. return;
  40. }
  41. context.report({
  42. node,
  43. messageId: 'preferEach',
  44. data: {
  45. fn: recommendFn()
  46. }
  47. });
  48. jestFnCalls.length = 0;
  49. };
  50. return {
  51. ForStatement: enterForLoop,
  52. 'ForStatement:exit': exitForLoop,
  53. ForInStatement: enterForLoop,
  54. 'ForInStatement:exit': exitForLoop,
  55. ForOfStatement: enterForLoop,
  56. 'ForOfStatement:exit': exitForLoop,
  57. CallExpression(node) {
  58. var _parseJestFnCall;
  59. const {
  60. type: jestFnCallType
  61. } = (_parseJestFnCall = (0, _utils.parseJestFnCall)(node, context)) !== null && _parseJestFnCall !== void 0 ? _parseJestFnCall : {};
  62. if (jestFnCallType === 'hook' || jestFnCallType === 'describe' || jestFnCallType === 'test') {
  63. jestFnCalls.push(jestFnCallType);
  64. }
  65. if (jestFnCallType === 'test') {
  66. inTestCaseCall = true;
  67. }
  68. },
  69. 'CallExpression:exit'(node) {
  70. var _parseJestFnCall2;
  71. const {
  72. type: jestFnCallType
  73. } = (_parseJestFnCall2 = (0, _utils.parseJestFnCall)(node, context)) !== null && _parseJestFnCall2 !== void 0 ? _parseJestFnCall2 : {};
  74. if (jestFnCallType === 'test') {
  75. inTestCaseCall = false;
  76. }
  77. }
  78. };
  79. }
  80. });
  81. exports.default = _default;