• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @fileoverview require default case in switch statements
3 * @author Aliaksei Shytkin
4 */
5"use strict";
6
7const DEFAULT_COMMENT_PATTERN = /^no default$/iu;
8
9//------------------------------------------------------------------------------
10// Rule Definition
11//------------------------------------------------------------------------------
12
13module.exports = {
14    meta: {
15        type: "suggestion",
16
17        docs: {
18            description: "require `default` cases in `switch` statements",
19            category: "Best Practices",
20            recommended: false,
21            url: "https://eslint.org/docs/rules/default-case"
22        },
23
24        schema: [{
25            type: "object",
26            properties: {
27                commentPattern: {
28                    type: "string"
29                }
30            },
31            additionalProperties: false
32        }],
33
34        messages: {
35            missingDefaultCase: "Expected a default case."
36        }
37    },
38
39    create(context) {
40        const options = context.options[0] || {};
41        const commentPattern = options.commentPattern
42            ? new RegExp(options.commentPattern, "u")
43            : DEFAULT_COMMENT_PATTERN;
44
45        const sourceCode = context.getSourceCode();
46
47        //--------------------------------------------------------------------------
48        // Helpers
49        //--------------------------------------------------------------------------
50
51        /**
52         * Shortcut to get last element of array
53         * @param  {*[]} collection Array
54         * @returns {*} Last element
55         */
56        function last(collection) {
57            return collection[collection.length - 1];
58        }
59
60        //--------------------------------------------------------------------------
61        // Public
62        //--------------------------------------------------------------------------
63
64        return {
65
66            SwitchStatement(node) {
67
68                if (!node.cases.length) {
69
70                    /*
71                     * skip check of empty switch because there is no easy way
72                     * to extract comments inside it now
73                     */
74                    return;
75                }
76
77                const hasDefault = node.cases.some(v => v.test === null);
78
79                if (!hasDefault) {
80
81                    let comment;
82
83                    const lastCase = last(node.cases);
84                    const comments = sourceCode.getCommentsAfter(lastCase);
85
86                    if (comments.length) {
87                        comment = last(comments);
88                    }
89
90                    if (!comment || !commentPattern.test(comment.value.trim())) {
91                        context.report({ node, messageId: "missingDefaultCase" });
92                    }
93                }
94            }
95        };
96    }
97};
98