await-fire-event.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.RULE_NAME = void 0;
  4. const utils_1 = require("@typescript-eslint/utils");
  5. const create_testing_library_rule_1 = require("../create-testing-library-rule");
  6. const node_utils_1 = require("../node-utils");
  7. exports.RULE_NAME = 'await-fire-event';
  8. exports.default = (0, create_testing_library_rule_1.createTestingLibraryRule)({
  9. name: exports.RULE_NAME,
  10. meta: {
  11. type: 'problem',
  12. docs: {
  13. description: 'Enforce promises from `fireEvent` methods to be handled',
  14. recommendedConfig: {
  15. dom: false,
  16. angular: false,
  17. react: false,
  18. vue: 'error',
  19. marko: 'error',
  20. },
  21. },
  22. messages: {
  23. awaitFireEvent: 'Promise returned from `fireEvent.{{ name }}` must be handled',
  24. fireEventWrapper: 'Promise returned from `{{ name }}` wrapper over fire event method must be handled',
  25. },
  26. schema: [],
  27. },
  28. defaultOptions: [],
  29. create(context, _, helpers) {
  30. const functionWrappersNames = [];
  31. function reportUnhandledNode(node, closestCallExpressionNode, messageId = 'awaitFireEvent') {
  32. if (!(0, node_utils_1.isPromiseHandled)(node)) {
  33. context.report({
  34. node: closestCallExpressionNode.callee,
  35. messageId,
  36. data: { name: node.name },
  37. });
  38. }
  39. }
  40. function detectFireEventMethodWrapper(node) {
  41. const innerFunction = (0, node_utils_1.getInnermostReturningFunction)(context, node);
  42. if (innerFunction) {
  43. functionWrappersNames.push((0, node_utils_1.getFunctionName)(innerFunction));
  44. }
  45. }
  46. return {
  47. 'CallExpression Identifier'(node) {
  48. if (helpers.isFireEventMethod(node)) {
  49. detectFireEventMethodWrapper(node);
  50. const closestCallExpression = (0, node_utils_1.findClosestCallExpressionNode)(node, true);
  51. if (!(closestCallExpression === null || closestCallExpression === void 0 ? void 0 : closestCallExpression.parent)) {
  52. return;
  53. }
  54. const references = (0, node_utils_1.getVariableReferences)(context, closestCallExpression.parent);
  55. if (references.length === 0) {
  56. reportUnhandledNode(node, closestCallExpression);
  57. }
  58. else {
  59. for (const reference of references) {
  60. if (utils_1.ASTUtils.isIdentifier(reference.identifier)) {
  61. reportUnhandledNode(reference.identifier, closestCallExpression);
  62. }
  63. }
  64. }
  65. }
  66. else if (functionWrappersNames.includes(node.name)) {
  67. const closestCallExpression = (0, node_utils_1.findClosestCallExpressionNode)(node, true);
  68. if (!closestCallExpression) {
  69. return;
  70. }
  71. reportUnhandledNode(node, closestCallExpression, 'fireEventWrapper');
  72. }
  73. },
  74. };
  75. },
  76. });