valid-describe-callback.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _utils = require("@typescript-eslint/utils");
  7. var _utils2 = require("./utils");
  8. const paramsLocation = params => {
  9. const [first] = params;
  10. const last = params[params.length - 1];
  11. return {
  12. start: first.loc.start,
  13. end: last.loc.end
  14. };
  15. };
  16. var _default = (0, _utils2.createRule)({
  17. name: __filename,
  18. meta: {
  19. type: 'problem',
  20. docs: {
  21. category: 'Possible Errors',
  22. description: 'Enforce valid `describe()` callback',
  23. recommended: 'error'
  24. },
  25. messages: {
  26. nameAndCallback: 'Describe requires name and callback arguments',
  27. secondArgumentMustBeFunction: 'Second argument must be function',
  28. noAsyncDescribeCallback: 'No async describe callback',
  29. unexpectedDescribeArgument: 'Unexpected argument(s) in describe callback',
  30. unexpectedReturnInDescribe: 'Unexpected return statement in describe callback'
  31. },
  32. schema: []
  33. },
  34. defaultOptions: [],
  35. create(context) {
  36. return {
  37. CallExpression(node) {
  38. const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
  39. if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'describe') {
  40. return;
  41. }
  42. if (node.arguments.length < 1) {
  43. return context.report({
  44. messageId: 'nameAndCallback',
  45. loc: node.loc
  46. });
  47. }
  48. const [, callback] = node.arguments;
  49. if (!callback) {
  50. context.report({
  51. messageId: 'nameAndCallback',
  52. loc: paramsLocation(node.arguments)
  53. });
  54. return;
  55. }
  56. if (!(0, _utils2.isFunction)(callback)) {
  57. context.report({
  58. messageId: 'secondArgumentMustBeFunction',
  59. loc: paramsLocation(node.arguments)
  60. });
  61. return;
  62. }
  63. if (callback.async) {
  64. context.report({
  65. messageId: 'noAsyncDescribeCallback',
  66. node: callback
  67. });
  68. }
  69. if (jestFnCall.members.every(s => (0, _utils2.getAccessorValue)(s) !== 'each') && callback.params.length) {
  70. context.report({
  71. messageId: 'unexpectedDescribeArgument',
  72. loc: paramsLocation(callback.params)
  73. });
  74. }
  75. if (callback.body.type === _utils.AST_NODE_TYPES.CallExpression) {
  76. context.report({
  77. messageId: 'unexpectedReturnInDescribe',
  78. node: callback
  79. });
  80. }
  81. if (callback.body.type === _utils.AST_NODE_TYPES.BlockStatement) {
  82. callback.body.body.forEach(node => {
  83. if (node.type === _utils.AST_NODE_TYPES.ReturnStatement) {
  84. context.report({
  85. messageId: 'unexpectedReturnInDescribe',
  86. node
  87. });
  88. }
  89. });
  90. }
  91. }
  92. };
  93. }
  94. });
  95. exports.default = _default;