UNPKG

2.38 kBJavaScriptView Raw
1/**
2 * @fileoverview Disallow multiple spaces between inline JSX props
3 * @author Adrian Moennich
4 */
5
6'use strict';
7
8const docsUrl = require('../util/docsUrl');
9
10// ------------------------------------------------------------------------------
11// Rule Definition
12// ------------------------------------------------------------------------------
13
14module.exports = {
15 meta: {
16 docs: {
17 description: 'Disallow multiple spaces between inline JSX props',
18 category: 'Stylistic Issues',
19 recommended: false,
20 url: docsUrl('jsx-props-no-multi-spaces')
21 },
22 fixable: 'code',
23 schema: []
24 },
25
26 create(context) {
27 function getPropName(propNode) {
28 switch (propNode.type) {
29 case 'JSXSpreadAttribute':
30 return context.getSourceCode().getText(propNode.argument);
31 case 'JSXIdentifier':
32 return propNode.name;
33 case 'JSXMemberExpression':
34 return `${getPropName(propNode.object)}.${propNode.property.name}`;
35 default:
36 return propNode.name.name;
37 }
38 }
39
40 function checkSpacing(prev, node) {
41 if (prev.loc.end.line !== node.loc.end.line) {
42 return;
43 }
44 const between = context.getSourceCode().text.slice(prev.range[1], node.range[0]);
45 if (between !== ' ') {
46 context.report({
47 node,
48 message: `Expected only one space between "${getPropName(prev)}" and "${getPropName(node)}"`,
49 fix(fixer) {
50 return fixer.replaceTextRange([prev.range[1], node.range[0]], ' ');
51 }
52 });
53 }
54 }
55
56 function containsGenericType(node) {
57 const containsTypeParams = typeof node.typeParameters !== 'undefined';
58 return containsTypeParams && node.typeParameters.type === 'TSTypeParameterInstantiation';
59 }
60
61 function getGenericNode(node) {
62 const name = node.name;
63 if (containsGenericType(node)) {
64 const type = node.typeParameters;
65
66 return Object.assign(
67 {},
68 node,
69 {
70 range: [
71 name.range[0],
72 type.range[1]
73 ]
74 }
75 );
76 }
77
78 return name;
79 }
80
81 return {
82 JSXOpeningElement(node) {
83 node.attributes.reduce((prev, prop) => {
84 checkSpacing(prev, prop);
85 return prop;
86 }, getGenericNode(node));
87 }
88 };
89 }
90};