UNPKG

2.83 kBJavaScriptView Raw
1/**
2 * @fileoverview Rule to check multiple var declarations per line
3 * @author Alberto Rodríguez
4 */
5"use strict";
6
7//------------------------------------------------------------------------------
8// Rule Definition
9//------------------------------------------------------------------------------
10
11module.exports = {
12 meta: {
13 type: "suggestion",
14
15 docs: {
16 description: "require or disallow newlines around variable declarations",
17 category: "Stylistic Issues",
18 recommended: false,
19 url: "https://eslint.org/docs/rules/one-var-declaration-per-line"
20 },
21
22 schema: [
23 {
24 enum: ["always", "initializations"]
25 }
26 ],
27
28 fixable: "whitespace",
29
30 messages: {
31 expectVarOnNewline: "Expected variable declaration to be on a new line."
32 }
33 },
34
35 create(context) {
36
37 const always = context.options[0] === "always";
38
39 //--------------------------------------------------------------------------
40 // Helpers
41 //--------------------------------------------------------------------------
42
43
44 /**
45 * Determine if provided keyword is a variant of for specifiers
46 * @private
47 * @param {string} keyword keyword to test
48 * @returns {boolean} True if `keyword` is a variant of for specifier
49 */
50 function isForTypeSpecifier(keyword) {
51 return keyword === "ForStatement" || keyword === "ForInStatement" || keyword === "ForOfStatement";
52 }
53
54 /**
55 * Checks newlines around variable declarations.
56 * @private
57 * @param {ASTNode} node `VariableDeclaration` node to test
58 * @returns {void}
59 */
60 function checkForNewLine(node) {
61 if (isForTypeSpecifier(node.parent.type)) {
62 return;
63 }
64
65 const declarations = node.declarations;
66 let prev;
67
68 declarations.forEach(current => {
69 if (prev && prev.loc.end.line === current.loc.start.line) {
70 if (always || prev.init || current.init) {
71 context.report({
72 node,
73 messageId: "expectVarOnNewline",
74 loc: current.loc,
75 fix: fixer => fixer.insertTextBefore(current, "\n")
76 });
77 }
78 }
79 prev = current;
80 });
81 }
82
83 //--------------------------------------------------------------------------
84 // Public
85 //--------------------------------------------------------------------------
86
87 return {
88 VariableDeclaration: checkForNewLine
89 };
90
91 }
92};