Skip to content

Commit cc34480

Browse files
committed
Temp commit
1 parent 0922c56 commit cc34480

File tree

3 files changed

+113
-14
lines changed

3 files changed

+113
-14
lines changed

index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ const allRules = {
99
'display-name': require('./lib/rules/display-name'),
1010
'forbid-component-props': require('./lib/rules/forbid-component-props'),
1111
'forbid-elements': require('./lib/rules/forbid-elements'),
12-
'forbid-prop-types': require('./lib/rules/forbid-prop-types'),
1312
'forbid-foreign-prop-types': require('./lib/rules/forbid-foreign-prop-types'),
13+
'forbid-prop-types': require('./lib/rules/forbid-prop-types'),
1414
'jsx-boolean-value': require('./lib/rules/jsx-boolean-value'),
15+
'jsx-child-element-spacing': require('./lib/rules/jsx-child-element-spacing'),
1516
'jsx-closing-bracket-location': require('./lib/rules/jsx-closing-bracket-location'),
1617
'jsx-closing-tag-location': require('./lib/rules/jsx-closing-tag-location'),
1718
'jsx-curly-spacing': require('./lib/rules/jsx-curly-spacing'),
@@ -23,12 +24,12 @@ const allRules = {
2324
'jsx-indent-props': require('./lib/rules/jsx-indent-props'),
2425
'jsx-key': require('./lib/rules/jsx-key'),
2526
'jsx-max-props-per-line': require('./lib/rules/jsx-max-props-per-line'),
26-
'jsx-one-expression-per-line': require('./lib/rules/jsx-one-expression-per-line'),
2727
'jsx-no-bind': require('./lib/rules/jsx-no-bind'),
2828
'jsx-no-comment-textnodes': require('./lib/rules/jsx-no-comment-textnodes'),
2929
'jsx-no-duplicate-props': require('./lib/rules/jsx-no-duplicate-props'),
3030
'jsx-no-literals': require('./lib/rules/jsx-no-literals'),
3131
'jsx-no-target-blank': require('./lib/rules/jsx-no-target-blank'),
32+
'jsx-one-expression-per-line': require('./lib/rules/jsx-one-expression-per-line'),
3233
'jsx-no-undef': require('./lib/rules/jsx-no-undef'),
3334
'jsx-curly-brace-presence': require('./lib/rules/jsx-curly-brace-presence'),
3435
'jsx-pascal-case': require('./lib/rules/jsx-pascal-case'),
Lines changed: 96 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,47 @@
11
'use strict';
22

3+
const INLINE_ELEMENTS = [
4+
"a",
5+
"abbr",
6+
"acronym",
7+
"b",
8+
"bdo",
9+
"big",
10+
"br",
11+
"button",
12+
"cite",
13+
"code",
14+
"dfn",
15+
"em",
16+
"i",
17+
"img",
18+
"input",
19+
"kbd",
20+
"label",
21+
"map",
22+
"object",
23+
"q",
24+
"samp",
25+
"script",
26+
"select",
27+
"small",
28+
"span",
29+
"strong",
30+
"sub",
31+
"sup",
32+
"textarea",
33+
"tt",
34+
"var"
35+
];
36+
337
module.exports = {
438
meta: {
5-
docs: {},
39+
docs: {
40+
description: 'Ensures inline tags are not rendered without spaces between them',
41+
category: 'Stylistic Issues',
42+
recommended: false,
43+
},
44+
fixable: false,
645
schema: [
746
{
847
type: 'object',
@@ -12,7 +51,61 @@ module.exports = {
1251
}
1352
]
1453
},
15-
create: function (/* context */) {
16-
return {};
54+
create: function (context) {
55+
const sourceCode = context.getSourceCode();
56+
57+
const isInlineElement = (node) => (
58+
node.type === 'JSXElement' &&
59+
node.openingElement &&
60+
node.openingElement.name &&
61+
node.openingElement.name.type === 'JSXIdentifier' &&
62+
INLINE_ELEMENTS.includes(node.openingElement.name.name)
63+
);
64+
65+
return {
66+
JSXElement: function(node) {
67+
let lastChild = null;
68+
let child = null;
69+
let nextChild = null;
70+
(node.children.concat([null])).forEach((nextChild) => {
71+
if (
72+
(lastChild || nextChild) &&
73+
(!lastChild || isInlineElement(lastChild)) &&
74+
(child && child.type === 'Literal') &&
75+
(!nextChild || isInlineElement(nextChild)) &&
76+
true
77+
) {
78+
if (lastChild && child.value.match(/^\s*\n\s*\S/)) {
79+
context.report({
80+
node: child,
81+
loc: child.loc,
82+
message: 'CASE A: ' + child.value,
83+
});
84+
} else if (lastChild && nextChild && child.value.match(/\n +$/)) {
85+
context.report({
86+
node: child,
87+
loc: child.loc,
88+
message: 'CASE B: ' + child.value,
89+
});
90+
} else if (nextChild && child.value.match(/\S\s*\n\s*$/)) {
91+
context.report({
92+
node: child,
93+
loc: child.loc,
94+
message: 'CASE C: ' + child.value,
95+
});
96+
} else if (lastChild && nextChild && child.value.match(/^ +\n/)) {
97+
context.report({
98+
node: child,
99+
loc: child.loc,
100+
message: 'CASE D: ' + child.value,
101+
});
102+
}
103+
}
104+
lastChild = child;
105+
child = nextChild;
106+
});
107+
Array.map
108+
},
109+
};
17110
}
18111
};

tests/lib/rules/jsx-child-element-spacing.js

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ const parserOptions = {
99
}
1010
};
1111

12-
const ERROR_MESSAGE = [{message: 'Ambiguous spacing between child elements.'}];
12+
// const ERROR_MESSAGE = [{message: 'Ambiguous spacing between child elements.'}];
13+
const ERROR_MESSAGE = [{}];
1314

1415
const ruleTester = new RuleTester({parserOptions});
1516
ruleTester.run('jsx-child-element-spacing', rule, {
@@ -40,13 +41,6 @@ ruleTester.run('jsx-child-element-spacing', rule, {
4041
bar
4142
</App>
4243
`
43-
}, {
44-
code: `
45-
<App>
46-
<a>foo</a>
47-
<a>bar</a>
48-
</App>
49-
`
5044
}, {
5145
code: `
5246
<App>
@@ -131,6 +125,14 @@ ruleTester.run('jsx-child-element-spacing', rule, {
131125
</App>
132126
`,
133127
errors: ERROR_MESSAGE
128+
}, {
129+
code: `
130+
<App>
131+
<a>foo</a>
132+
<a>bar</a>
133+
</App>
134+
`,
135+
errors: ERROR_MESSAGE
134136
}, {
135137
code: `
136138
<App>
@@ -163,7 +165,10 @@ ruleTester.run('jsx-child-element-spacing', rule, {
163165
<a href="https://js.org">another</a>
164166
</App>
165167
`,
166-
errors: ERROR_MESSAGE
168+
errors: [
169+
ERROR_MESSAGE,
170+
ERROR_MESSAGE,
171+
],
167172
}, {
168173
code: `
169174
<App>

0 commit comments

Comments
 (0)