diff --git a/src/rules/namespace.js b/src/rules/namespace.js
index 93e5891594..05e6e19ed1 100644
--- a/src/rules/namespace.js
+++ b/src/rules/namespace.js
@@ -58,7 +58,7 @@ module.exports = {
return
}
- for (let specifier of declaration.specifiers) {
+ for (const specifier of declaration.specifiers) {
switch (specifier.type) {
case 'ImportNamespaceSpecifier':
if (!imports.size) {
@@ -160,8 +160,12 @@ module.exports = {
if (pattern.type !== 'ObjectPattern') return
- for (let property of pattern.properties) {
- if (property.type === 'ExperimentalRestProperty' || !property.key) {
+ for (const property of pattern.properties) {
+ if (
+ property.type === 'ExperimentalRestProperty'
+ || property.type === 'RestElement'
+ || !property.key
+ ) {
continue
}
@@ -189,6 +193,17 @@ module.exports = {
testKey(id, namespaces.get(init.name))
},
+
+ 'JSXMemberExpression': function({object, property}) {
+ if (!namespaces.has(object.name)) return
+ var namespace = namespaces.get(object.name)
+ if (!namespace.has(property.name)) {
+ context.report({
+ node: property,
+ message: makeMessage(property, [object.name]),
+ })
+ }
+ },
}
},
}
diff --git a/tests/src/rules/namespace.js b/tests/src/rules/namespace.js
index 1cfee2b54d..7fa8cfcdb9 100644
--- a/tests/src/rules/namespace.js
+++ b/tests/src/rules/namespace.js
@@ -104,6 +104,16 @@ const valid = [
parser: 'babel-eslint',
}),
+ // JSX
+ test({
+ code: 'import * as Names from "./named-exports"; const Foo = ',
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ }),
+
...SYNTAX_CASES,
]
@@ -185,6 +195,17 @@ const invalid = [
errors: [`'default' not found in imported namespace 'ree'.`],
}),
+ // JSX
+ test({
+ code: 'import * as Names from "./named-exports"; const Foo = ',
+ errors: [error('e', 'Names')],
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ }),
+
]
///////////////////////