no-duplicate-hooks.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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: 'Disallow duplicate setup and teardown hooks',
  13. recommended: false
  14. },
  15. messages: {
  16. noDuplicateHook: 'Duplicate {{hook}} in describe block'
  17. },
  18. schema: [],
  19. type: 'suggestion'
  20. },
  21. defaultOptions: [],
  22. create(context) {
  23. const hookContexts = [{}];
  24. return {
  25. CallExpression(node) {
  26. var _jestFnCall$name;
  27. const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
  28. if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'describe') {
  29. hookContexts.push({});
  30. }
  31. if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
  32. return;
  33. }
  34. const currentLayer = hookContexts[hookContexts.length - 1];
  35. currentLayer[_jestFnCall$name = jestFnCall.name] || (currentLayer[_jestFnCall$name] = 0);
  36. currentLayer[jestFnCall.name] += 1;
  37. if (currentLayer[jestFnCall.name] > 1) {
  38. context.report({
  39. messageId: 'noDuplicateHook',
  40. data: {
  41. hook: jestFnCall.name
  42. },
  43. node
  44. });
  45. }
  46. },
  47. 'CallExpression:exit'(node) {
  48. if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
  49. hookContexts.pop();
  50. }
  51. }
  52. };
  53. }
  54. });
  55. exports.default = _default;