diff --git a/packages/babel-parser/src/plugins/jsx/index.js b/packages/babel-parser/src/plugins/jsx/index.js index 5d3c2ec2ece1..4daa31ef545d 100644 --- a/packages/babel-parser/src/plugins/jsx/index.js +++ b/packages/babel-parser/src/plugins/jsx/index.js @@ -250,10 +250,16 @@ export default (superClass: Class): Class => // Parses element name in any form - namespaced, member // or single identifier. - jsxParseElementName(): N.JSXNamespacedName | N.JSXMemberExpression { + jsxParseElementName(): + | N.JSXIdentifier + | N.JSXNamespacedName + | N.JSXMemberExpression { const startPos = this.state.start; const startLoc = this.state.startLoc; let node = this.jsxParseNamespacedName(); + if (node.type === "JSXNamespacedName") { + return node; + } while (this.eat(tt.dot)) { const newNode = this.startNodeAt(startPos, startLoc); newNode.object = node; diff --git a/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/input.js b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/input.js new file mode 100644 index 000000000000..abb989b65a36 --- /dev/null +++ b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/input.js @@ -0,0 +1 @@ + diff --git a/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/options.json b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/options.json new file mode 100644 index 000000000000..27a7b64d71d4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:4)" +} diff --git a/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/input.js b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/input.js new file mode 100644 index 000000000000..fc13a07cc754 --- /dev/null +++ b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/input.js @@ -0,0 +1 @@ + diff --git a/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/options.json b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/options.json new file mode 100644 index 000000000000..27a7b64d71d4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:4)" +} diff --git a/packages/babel-types/src/definitions/jsx.js b/packages/babel-types/src/definitions/jsx.js index 776714c873f7..a088f03c1929 100644 --- a/packages/babel-types/src/definitions/jsx.js +++ b/packages/babel-types/src/definitions/jsx.js @@ -30,7 +30,11 @@ defineType("JSXClosingElement", { aliases: ["JSX", "Immutable"], fields: { name: { - validate: assertNodeType("JSXIdentifier", "JSXMemberExpression"), + validate: assertNodeType( + "JSXIdentifier", + "JSXMemberExpression", + "JSXNamespacedName", + ), }, }, }); @@ -130,7 +134,11 @@ defineType("JSXOpeningElement", { aliases: ["JSX", "Immutable"], fields: { name: { - validate: assertNodeType("JSXIdentifier", "JSXMemberExpression"), + validate: assertNodeType( + "JSXIdentifier", + "JSXMemberExpression", + "JSXNamespacedName", + ), }, selfClosing: { default: false,