• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @fileoverview Rule to check for tabs inside a file
3 * @author Gyandeep Singh
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Helpers
10//------------------------------------------------------------------------------
11
12const tabRegex = /\t+/gu;
13const anyNonWhitespaceRegex = /\S/u;
14
15//------------------------------------------------------------------------------
16// Public Interface
17//------------------------------------------------------------------------------
18
19module.exports = {
20    meta: {
21        type: "layout",
22
23        docs: {
24            description: "disallow all tabs",
25            category: "Stylistic Issues",
26            recommended: false,
27            url: "https://eslint.org/docs/rules/no-tabs"
28        },
29        schema: [{
30            type: "object",
31            properties: {
32                allowIndentationTabs: {
33                    type: "boolean",
34                    default: false
35                }
36            },
37            additionalProperties: false
38        }],
39
40        messages: {
41            unexpectedTab: "Unexpected tab character."
42        }
43    },
44
45    create(context) {
46        const sourceCode = context.getSourceCode();
47        const allowIndentationTabs = context.options && context.options[0] && context.options[0].allowIndentationTabs;
48
49        return {
50            Program(node) {
51                sourceCode.getLines().forEach((line, index) => {
52                    let match;
53
54                    while ((match = tabRegex.exec(line)) !== null) {
55                        if (allowIndentationTabs && !anyNonWhitespaceRegex.test(line.slice(0, match.index))) {
56                            continue;
57                        }
58
59                        context.report({
60                            node,
61                            loc: {
62                                start: {
63                                    line: index + 1,
64                                    column: match.index
65                                },
66                                end: {
67                                    line: index + 1,
68                                    column: match.index + match[0].length
69                                }
70                            },
71                            messageId: "unexpectedTab"
72                        });
73                    }
74                });
75            }
76        };
77    }
78};
79