no-render-in-setup.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.findClosestBeforeHook = 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. const utils_2 = require("../utils");
  8. exports.RULE_NAME = 'no-render-in-setup';
  9. function findClosestBeforeHook(node, testingFrameworkSetupHooksToFilter) {
  10. if (node === null) {
  11. return null;
  12. }
  13. if ((0, node_utils_1.isCallExpression)(node) &&
  14. utils_1.ASTUtils.isIdentifier(node.callee) &&
  15. testingFrameworkSetupHooksToFilter.includes(node.callee.name)) {
  16. return node.callee;
  17. }
  18. if (node.parent) {
  19. return findClosestBeforeHook(node.parent, testingFrameworkSetupHooksToFilter);
  20. }
  21. return null;
  22. }
  23. exports.findClosestBeforeHook = findClosestBeforeHook;
  24. exports.default = (0, create_testing_library_rule_1.createTestingLibraryRule)({
  25. name: exports.RULE_NAME,
  26. meta: {
  27. type: 'problem',
  28. docs: {
  29. description: 'Disallow the use of `render` in testing frameworks setup functions',
  30. recommendedConfig: {
  31. dom: false,
  32. angular: 'error',
  33. react: 'error',
  34. vue: 'error',
  35. marko: 'error',
  36. },
  37. },
  38. messages: {
  39. noRenderInSetup: 'Forbidden usage of `render` within testing framework `{{ name }}` setup',
  40. },
  41. schema: [
  42. {
  43. type: 'object',
  44. properties: {
  45. allowTestingFrameworkSetupHook: {
  46. enum: utils_2.TESTING_FRAMEWORK_SETUP_HOOKS,
  47. },
  48. },
  49. },
  50. ],
  51. },
  52. defaultOptions: [
  53. {
  54. allowTestingFrameworkSetupHook: '',
  55. },
  56. ],
  57. create(context, [{ allowTestingFrameworkSetupHook }], helpers) {
  58. const renderWrapperNames = [];
  59. function detectRenderWrapper(node) {
  60. const innerFunction = (0, node_utils_1.getInnermostReturningFunction)(context, node);
  61. if (innerFunction) {
  62. renderWrapperNames.push((0, node_utils_1.getFunctionName)(innerFunction));
  63. }
  64. }
  65. return {
  66. CallExpression(node) {
  67. const testingFrameworkSetupHooksToFilter = utils_2.TESTING_FRAMEWORK_SETUP_HOOKS.filter((hook) => hook !== allowTestingFrameworkSetupHook);
  68. const callExpressionIdentifier = (0, node_utils_1.getDeepestIdentifierNode)(node);
  69. if (!callExpressionIdentifier) {
  70. return;
  71. }
  72. const isRenderIdentifier = helpers.isRenderUtil(callExpressionIdentifier);
  73. if (isRenderIdentifier) {
  74. detectRenderWrapper(callExpressionIdentifier);
  75. }
  76. if (!isRenderIdentifier &&
  77. !renderWrapperNames.includes(callExpressionIdentifier.name)) {
  78. return;
  79. }
  80. const beforeHook = findClosestBeforeHook(node, testingFrameworkSetupHooksToFilter);
  81. if (!beforeHook) {
  82. return;
  83. }
  84. context.report({
  85. node: callExpressionIdentifier,
  86. messageId: 'noRenderInSetup',
  87. data: {
  88. name: beforeHook.name,
  89. },
  90. });
  91. },
  92. };
  93. },
  94. });