misc.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.getFirstMatcherArg = exports.findTopMostCallExpression = exports.createRule = exports.TestCaseName = exports.ModifierName = exports.HookName = exports.EqualityMatcher = exports.DescribeAlias = void 0;
  6. exports.getNodeName = getNodeName;
  7. exports.replaceAccessorFixer = exports.isFunction = exports.isBooleanLiteral = exports.hasOnlyOneArgument = exports.getTestCallExpressionsFromDeclaredVariables = void 0;
  8. var _path = require("path");
  9. var _utils = require("@typescript-eslint/utils");
  10. var _package = require("../../../package.json");
  11. var _accessors = require("./accessors");
  12. var _followTypeAssertionChain = require("./followTypeAssertionChain");
  13. var _parseJestFnCall = require("./parseJestFnCall");
  14. const REPO_URL = 'https://github.com/jest-community/eslint-plugin-jest';
  15. const createRule = _utils.ESLintUtils.RuleCreator(name => {
  16. const ruleName = (0, _path.parse)(name).name;
  17. return `${REPO_URL}/blob/v${_package.version}/docs/rules/${ruleName}.md`;
  18. });
  19. /**
  20. * Represents a `MemberExpression` with a "known" `property`.
  21. */
  22. exports.createRule = createRule;
  23. /**
  24. * Guards that the given `call` has only one `argument`.
  25. *
  26. * @param {CallExpression} call
  27. *
  28. * @return {call is CallExpressionWithSingleArgument}
  29. */
  30. const hasOnlyOneArgument = call => call.arguments.length === 1;
  31. exports.hasOnlyOneArgument = hasOnlyOneArgument;
  32. let DescribeAlias;
  33. exports.DescribeAlias = DescribeAlias;
  34. (function (DescribeAlias) {
  35. DescribeAlias["describe"] = "describe";
  36. DescribeAlias["fdescribe"] = "fdescribe";
  37. DescribeAlias["xdescribe"] = "xdescribe";
  38. })(DescribeAlias || (exports.DescribeAlias = DescribeAlias = {}));
  39. let TestCaseName;
  40. exports.TestCaseName = TestCaseName;
  41. (function (TestCaseName) {
  42. TestCaseName["fit"] = "fit";
  43. TestCaseName["it"] = "it";
  44. TestCaseName["test"] = "test";
  45. TestCaseName["xit"] = "xit";
  46. TestCaseName["xtest"] = "xtest";
  47. })(TestCaseName || (exports.TestCaseName = TestCaseName = {}));
  48. let HookName;
  49. exports.HookName = HookName;
  50. (function (HookName) {
  51. HookName["beforeAll"] = "beforeAll";
  52. HookName["beforeEach"] = "beforeEach";
  53. HookName["afterAll"] = "afterAll";
  54. HookName["afterEach"] = "afterEach";
  55. })(HookName || (exports.HookName = HookName = {}));
  56. let ModifierName;
  57. exports.ModifierName = ModifierName;
  58. (function (ModifierName) {
  59. ModifierName["not"] = "not";
  60. ModifierName["rejects"] = "rejects";
  61. ModifierName["resolves"] = "resolves";
  62. })(ModifierName || (exports.ModifierName = ModifierName = {}));
  63. let EqualityMatcher;
  64. exports.EqualityMatcher = EqualityMatcher;
  65. (function (EqualityMatcher) {
  66. EqualityMatcher["toBe"] = "toBe";
  67. EqualityMatcher["toEqual"] = "toEqual";
  68. EqualityMatcher["toStrictEqual"] = "toStrictEqual";
  69. })(EqualityMatcher || (exports.EqualityMatcher = EqualityMatcher = {}));
  70. const joinNames = (a, b) => a && b ? `${a}.${b}` : null;
  71. function getNodeName(node) {
  72. if ((0, _accessors.isSupportedAccessor)(node)) {
  73. return (0, _accessors.getAccessorValue)(node);
  74. }
  75. switch (node.type) {
  76. case _utils.AST_NODE_TYPES.TaggedTemplateExpression:
  77. return getNodeName(node.tag);
  78. case _utils.AST_NODE_TYPES.MemberExpression:
  79. return joinNames(getNodeName(node.object), getNodeName(node.property));
  80. case _utils.AST_NODE_TYPES.NewExpression:
  81. case _utils.AST_NODE_TYPES.CallExpression:
  82. return getNodeName(node.callee);
  83. }
  84. return null;
  85. }
  86. const isFunction = node => node.type === _utils.AST_NODE_TYPES.FunctionExpression || node.type === _utils.AST_NODE_TYPES.ArrowFunctionExpression;
  87. exports.isFunction = isFunction;
  88. const getTestCallExpressionsFromDeclaredVariables = (declaredVariables, context) => {
  89. return declaredVariables.reduce((acc, {
  90. references
  91. }) => acc.concat(references.map(({
  92. identifier
  93. }) => identifier.parent).filter(node => (node === null || node === void 0 ? void 0 : node.type) === _utils.AST_NODE_TYPES.CallExpression && (0, _parseJestFnCall.isTypeOfJestFnCall)(node, context, ['test']))), []);
  94. };
  95. /**
  96. * Replaces an accessor node with the given `text`, surrounding it in quotes if required.
  97. *
  98. * This ensures that fixes produce valid code when replacing both dot-based and
  99. * bracket-based property accessors.
  100. */
  101. exports.getTestCallExpressionsFromDeclaredVariables = getTestCallExpressionsFromDeclaredVariables;
  102. const replaceAccessorFixer = (fixer, node, text) => {
  103. return fixer.replaceText(node, node.type === _utils.AST_NODE_TYPES.Identifier ? text : `'${text}'`);
  104. };
  105. exports.replaceAccessorFixer = replaceAccessorFixer;
  106. const findTopMostCallExpression = node => {
  107. let topMostCallExpression = node;
  108. let {
  109. parent
  110. } = node;
  111. while (parent) {
  112. if (parent.type === _utils.AST_NODE_TYPES.CallExpression) {
  113. topMostCallExpression = parent;
  114. parent = parent.parent;
  115. continue;
  116. }
  117. if (parent.type !== _utils.AST_NODE_TYPES.MemberExpression) {
  118. break;
  119. }
  120. parent = parent.parent;
  121. }
  122. return topMostCallExpression;
  123. };
  124. exports.findTopMostCallExpression = findTopMostCallExpression;
  125. const isBooleanLiteral = node => node.type === _utils.AST_NODE_TYPES.Literal && typeof node.value === 'boolean';
  126. exports.isBooleanLiteral = isBooleanLiteral;
  127. const getFirstMatcherArg = expectFnCall => {
  128. const [firstArg] = expectFnCall.args;
  129. if (firstArg.type === _utils.AST_NODE_TYPES.SpreadElement) {
  130. return firstArg;
  131. }
  132. return (0, _followTypeAssertionChain.followTypeAssertionChain)(firstArg);
  133. };
  134. exports.getFirstMatcherArg = getFirstMatcherArg;