UNPKG

2.13 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to flag when IIFE is not wrapped in parens
3 * @author Ilya Volodin
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Rule Definition
10//------------------------------------------------------------------------------
11
12module.exports = {
13 meta: {
14 docs: {
15 description: "require parentheses around immediate `function` invocations",
16 category: "Best Practices",
17 recommended: false
18 },
19
20 schema: [
21 {
22 enum: ["outside", "inside", "any"]
23 }
24 ]
25 },
26
27 create(context) {
28
29 const style = context.options[0] || "outside";
30
31 const sourceCode = context.getSourceCode();
32
33 /**
34 * Check if the node is wrapped in ()
35 * @param {ASTNode} node node to evaluate
36 * @returns {boolean} True if it is wrapped
37 * @private
38 */
39 function wrapped(node) {
40 const previousToken = sourceCode.getTokenBefore(node),
41 nextToken = sourceCode.getTokenAfter(node);
42
43 return previousToken && previousToken.value === "(" &&
44 nextToken && nextToken.value === ")";
45 }
46
47 return {
48
49 CallExpression(node) {
50 if (node.callee.type === "FunctionExpression") {
51 const callExpressionWrapped = wrapped(node),
52 functionExpressionWrapped = wrapped(node.callee);
53
54 if (!callExpressionWrapped && !functionExpressionWrapped) {
55 context.report(node, "Wrap an immediate function invocation in parentheses.");
56 } else if (style === "inside" && !functionExpressionWrapped) {
57 context.report(node, "Wrap only the function expression in parens.");
58 } else if (style === "outside" && !callExpressionWrapped) {
59 context.report(node, "Move the invocation into the parens that contain the function.");
60 }
61 }
62 }
63 };
64
65 }
66};