From 1664cce6811a7aa856e9cf382b3774fd1384d066 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 26 Aug 2019 13:16:22 -0400 Subject: [PATCH] Don't allow JSXNamespacedName to chain (#10366) Eg, `namespace:foo.bar` used to parse but is invalid in the [spec](https://facebook.github.io/jsx/). Also, allow `JSXNamespacedName` in the `JSXOpeningElement`/`JSXClosingElement` builders. --- packages/babel-parser/src/plugins/jsx/index.js | 8 +++++++- .../jsx/errors/member-in-namespace-1/input.js | 1 + .../jsx/errors/member-in-namespace-1/options.json | 3 +++ .../jsx/errors/member-in-namespace-2/input.js | 1 + .../jsx/errors/member-in-namespace-2/options.json | 3 +++ packages/babel-types/src/definitions/jsx.js | 12 ++++++++++-- 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/input.js create mode 100644 packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-1/options.json create mode 100644 packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/input.js create mode 100644 packages/babel-parser/test/fixtures/jsx/errors/member-in-namespace-2/options.json diff --git a/packages/babel-parser/src/plugins/jsx/index.js b/packages/babel-parser/src/plugins/jsx/index.js index 5d3c2ec2ec..4daa31ef54 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 0000000000..abb989b65a --- /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 0000000000..27a7b64d71 --- /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 0000000000..fc13a07cc7 --- /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 0000000000..27a7b64d71 --- /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 776714c873..a088f03c19 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,