UNPKG

1.33 kBJavaScriptView Raw
1'use strict';
2
3const astUtil = require('../util/ast');
4const { additionalSuiteNames } = require('../util/settings');
5
6function newDescribeLayer(describeNode) {
7 return {
8 describeNode,
9 before: false,
10 after: false,
11 beforeEach: false,
12 afterEach: false
13 };
14}
15
16module.exports = function (context) {
17 const isUsed = [];
18 const settings = context.settings;
19
20 return {
21 Program(node) {
22 isUsed.push(newDescribeLayer(node));
23 },
24
25 CallExpression(node) {
26 const name = astUtil.getNodeName(node.callee);
27
28 if (astUtil.isDescribe(node, additionalSuiteNames(settings))) {
29 isUsed.push(newDescribeLayer(node));
30 return;
31 }
32
33 if (!astUtil.isHookIdentifier(node.callee)) {
34 return;
35 }
36
37 if (isUsed[isUsed.length - 1][name]) {
38 context.report({
39 node: node.callee,
40 message: `Unexpected use of duplicate Mocha \`${ name }\` hook`
41 });
42 }
43
44 isUsed[isUsed.length - 1][name] = true;
45 },
46
47 'CallExpression:exit'(node) {
48 if (isUsed[isUsed.length - 1].describeNode === node) {
49 isUsed.pop();
50 }
51 }
52 };
53};