From 51bb7e9be6882eae783e1145dc7a4f8f1eb3c352 Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Wed, 25 Jun 2014 17:38:37 -0700 Subject: [PATCH 1/3] Allow for custom fallback tags. This lets you pass an optional set of fallback tags into the react jsx transpiler. This may be useful -- transformer -- transform(... { fallbackTags: { MyCustomXML: { FooNode: true, BarNode: true } } }); -- source -- /** @jsx MyCustomXML */ -- compiled -- /** @jsx MyCustomXML */ MyCustomXML.FooNode(null, MyCustomXML.BarNode()); --- .../transforms/__tests__/react-test.js | 29 +++++++++++++++++++ vendor/fbtransform/transforms/react.js | 6 +++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/vendor/fbtransform/transforms/__tests__/react-test.js b/vendor/fbtransform/transforms/__tests__/react-test.js index 546db630d78..4b52741f5e8 100644 --- a/vendor/fbtransform/transforms/__tests__/react-test.js +++ b/vendor/fbtransform/transforms/__tests__/react-test.js @@ -357,4 +357,33 @@ describe('react jsx', function() { expect(() => transform(code)).toThrow(); }); + it('should allow custom fallback nodes', function() { + var code = [ + '/**', + ' * @jsx Custom.XML', + ' */', + '', + '
', + ' ', + '' + ].join('\n'); + var result = [ + '/**', + ' * @jsx Custom.XML', + ' */', + 'Custom.XML.CustomNode(null,', + ' div(null),', + ' Component(null)', + ');' + ].join('\n'); + + expect(() => transform(code, { + fallbackTags: { + 'Custom.XML': { + CustomNode: true + } + } + }).code).toBe(result); + }); + }); diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js index c79eaa85f56..fbe3d151676 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -61,10 +61,14 @@ function visitReactTag(traverse, object, path, state) { throw new Error('Namespace tags are not supported. ReactJSX is not XML.'); } + var fallbackTags = + (state.g.opts.fallbackTags && state.g.opts.fallbackTags[jsxObjIdent]) || + FALLBACK_TAGS; + // Only identifiers can be fallback tags. XJSMemberExpressions are not. var isFallbackTag = nameObject.type === Syntax.XJSIdentifier && - FALLBACK_TAGS.hasOwnProperty(nameObject.name); + fallbackTags.hasOwnProperty(nameObject.name); utils.append(isFallbackTag ? jsxObjIdent + '.' : '', state); From a18e5f021df6eb493f6ca54b34106394127b6c4e Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Wed, 25 Jun 2014 17:55:43 -0700 Subject: [PATCH 2/3] @zpao feedback, using hasOwnProperty --- vendor/fbtransform/transforms/react.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js index fbe3d151676..341a3b3c00e 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -62,7 +62,8 @@ function visitReactTag(traverse, object, path, state) { } var fallbackTags = - (state.g.opts.fallbackTags && state.g.opts.fallbackTags[jsxObjIdent]) || + (state.g.opts.fallbackTags && + state.g.opts.fallbackTags.hasOwnProperty(jsxObjIdent)) || FALLBACK_TAGS; // Only identifiers can be fallback tags. XJSMemberExpressions are not. From 03bef18cead4498616a143d07053b91360ca8815 Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Wed, 25 Jun 2014 20:44:57 -0700 Subject: [PATCH 3/3] Fix tests --- vendor/fbtransform/transforms/react.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js index 341a3b3c00e..c50e36a083d 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -61,9 +61,11 @@ function visitReactTag(traverse, object, path, state) { throw new Error('Namespace tags are not supported. ReactJSX is not XML.'); } + var customFallbackTags = state.g.opts.fallbackTags; var fallbackTags = - (state.g.opts.fallbackTags && - state.g.opts.fallbackTags.hasOwnProperty(jsxObjIdent)) || + (customFallbackTags && + customFallbackTags.hasOwnProperty(jsxObjIdent) && + customFallbackTags[jsxObjIdent]) || FALLBACK_TAGS; // Only identifiers can be fallback tags. XJSMemberExpressions are not.