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..c50e36a083d 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -61,10 +61,17 @@ 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 = + (customFallbackTags && + customFallbackTags.hasOwnProperty(jsxObjIdent) && + customFallbackTags[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);