Skip to content

Commit fbd325a

Browse files
committed
Initial implementation of jsx-no-namespace
1 parent da7a045 commit fbd325a

File tree

5 files changed

+152
-0
lines changed

5 files changed

+152
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ Enable the rules that you would like to use.
175175
* [react/jsx-no-comment-textnodes](docs/rules/jsx-no-comment-textnodes.md): Comments inside children section of tag should be placed inside braces
176176
* [react/jsx-no-duplicate-props](docs/rules/jsx-no-duplicate-props.md): Enforce no duplicate props
177177
* [react/jsx-no-literals](docs/rules/jsx-no-literals.md): Prevent using string literals in React component definition
178+
* [react/jsx-no-namespace](docs/rules/jsx-no-namespace.md): Enforce that namespaces are not used in JSX
178179
* [react/jsx-no-script-url](docs/rules/jsx-no-script-url.md): Forbid `javascript:` URLs
179180
* [react/jsx-no-target-blank](docs/rules/jsx-no-target-blank.md): Forbid `target="_blank"` attribute without `rel="noreferrer"`
180181
* [react/jsx-no-undef](docs/rules/jsx-no-undef.md): Disallow undeclared variables in JSX

docs/rules/jsx-no-namespace.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Enforce that namespaces are not used in JSX (react/jsx-no-namespace)
2+
3+
Enforces the absence of a namespace in JSX components, such as with `svg:circle`, as they are not supported in React.
4+
5+
## Rule Details
6+
7+
The following patterns are considered warnings:
8+
9+
```jsx
10+
<ns:TestComponent />
11+
```
12+
13+
```jsx
14+
<Ns:TestComponent />
15+
```
16+
17+
The following patterns are **not** considered warnings:
18+
19+
```jsx
20+
<TestComponent />
21+
```
22+
23+
```jsx
24+
<testComponent />
25+
```
26+
27+
## When not to use
28+
29+
If you are not using JSX.

index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const allRules = {
3535
'jsx-no-comment-textnodes': require('./lib/rules/jsx-no-comment-textnodes'),
3636
'jsx-no-duplicate-props': require('./lib/rules/jsx-no-duplicate-props'),
3737
'jsx-no-literals': require('./lib/rules/jsx-no-literals'),
38+
'jsx-no-namespace': require('./lib/rules/jsx-no-namespace'),
3839
'jsx-no-script-url': require('./lib/rules/jsx-no-script-url'),
3940
'jsx-no-target-blank': require('./lib/rules/jsx-no-target-blank'),
4041
'jsx-no-useless-fragment': require('./lib/rules/jsx-no-useless-fragment'),
@@ -126,6 +127,7 @@ module.exports = {
126127
'react/jsx-key': 2,
127128
'react/jsx-no-comment-textnodes': 2,
128129
'react/jsx-no-duplicate-props': 2,
130+
'react/jsx-no-namespace': 2,
129131
'react/jsx-no-target-blank': 2,
130132
'react/jsx-no-undef': 2,
131133
'react/jsx-uses-react': 2,

lib/rules/jsx-no-namespace.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* @fileoverview Enforce that namespaces are not used in JSX
3+
* @author Yacine Hmito
4+
*/
5+
6+
'use strict';
7+
8+
const elementType = require('jsx-ast-utils/elementType');
9+
const docsUrl = require('../util/docsUrl');
10+
11+
// ------------------------------------------------------------------------------
12+
// Rule Definition
13+
// ------------------------------------------------------------------------------
14+
15+
module.exports = {
16+
meta: {
17+
docs: {
18+
description: 'Enforce that namespaces are not used in JSX',
19+
category: 'Possible Errors',
20+
recommended: true,
21+
url: docsUrl('jsx-no-namespace')
22+
},
23+
24+
schema: [{
25+
type: 'object',
26+
additionalProperties: false
27+
}]
28+
},
29+
30+
create(context) {
31+
return {
32+
JSXOpeningElement(node) {
33+
const name = elementType(node);
34+
if (name.indexOf(':') === -1) return undefined;
35+
const message = `JSX component ${name} must not be in a namespace as React does not support them`;
36+
context.report({node, message});
37+
}
38+
};
39+
}
40+
};
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/**
2+
* @fileoverview Tests for jsx-no-namespace
3+
* @author Yacine Hmito
4+
*/
5+
6+
'use strict';
7+
8+
// ------------------------------------------------------------------------------
9+
// Requirements
10+
// ------------------------------------------------------------------------------
11+
12+
const RuleTester = require('eslint').RuleTester;
13+
const rule = require('../../../lib/rules/jsx-no-namespace');
14+
15+
const parserOptions = {
16+
ecmaVersion: 2018,
17+
sourceType: 'module',
18+
ecmaFeatures: {
19+
jsx: true
20+
}
21+
};
22+
23+
// ------------------------------------------------------------------------------
24+
// Tests
25+
// ------------------------------------------------------------------------------
26+
27+
const ruleTester = new RuleTester({parserOptions});
28+
ruleTester.run('jsx-no-namespace', rule, {
29+
valid: [{
30+
code: '<testcomponent />'
31+
}, {
32+
code: '<testComponent />'
33+
}, {
34+
code: '<test_component />'
35+
}, {
36+
code: '<TestComponent />'
37+
}, {
38+
code: '<object.testcomponent />'
39+
}, {
40+
code: '<object.testComponent />'
41+
}, {
42+
code: '<object.test_component />'
43+
}, {
44+
code: '<object.TestComponent />'
45+
}, {
46+
code: '<Object.testcomponent />'
47+
}, {
48+
code: '<Object.testComponent />'
49+
}, {
50+
code: '<Object.test_component />'
51+
}, {
52+
code: '<Object.TestComponent />'
53+
}],
54+
55+
invalid: [{
56+
code: '<ns:testcomponent />',
57+
errors: [{message: 'JSX component ns:testcomponent must not be in a namespace as React does not support them'}]
58+
}, {
59+
code: '<ns:testComponent />',
60+
errors: [{message: 'JSX component ns:testComponent must not be in a namespace as React does not support them'}]
61+
}, {
62+
code: '<ns:test_component />',
63+
errors: [{message: 'JSX component ns:test_component must not be in a namespace as React does not support them'}]
64+
}, {
65+
code: '<ns:TestComponent />',
66+
errors: [{message: 'JSX component ns:TestComponent must not be in a namespace as React does not support them'}]
67+
}, {
68+
code: '<Ns:testcomponent />',
69+
errors: [{message: 'JSX component Ns:testcomponent must not be in a namespace as React does not support them'}]
70+
}, {
71+
code: '<Ns:testComponent />',
72+
errors: [{message: 'JSX component Ns:testComponent must not be in a namespace as React does not support them'}]
73+
}, {
74+
code: '<Ns:test_component />',
75+
errors: [{message: 'JSX component Ns:test_component must not be in a namespace as React does not support them'}]
76+
}, {
77+
code: '<Ns:TestComponent />',
78+
errors: [{message: 'JSX component Ns:TestComponent must not be in a namespace as React does not support them'}]
79+
}]
80+
});

0 commit comments

Comments
 (0)