diff --git a/packages/babel-plugin-transform-react-jsx-source/src/index.js b/packages/babel-plugin-transform-react-jsx-source/src/index.js index 700f4c2014..6ebbdc4b57 100644 --- a/packages/babel-plugin-transform-react-jsx-source/src/index.js +++ b/packages/babel-plugin-transform-react-jsx-source/src/index.js @@ -26,29 +26,27 @@ export default function ({ types: t }) { return t.objectExpression([fileNameProperty, lineNumberProperty]); } - let jsxVisitor = { - JSXOpeningElement(node) { + let visitor = { + JSXOpeningElement(node, state) { + if (!state.fileNameIdentifier) { + const fileName = state.file.log.filename !== "unknown" + ? state.file.log.filename + : null; + + const fileNameIdentifier = node.scope.generateUidIdentifier(FILE_NAME_VAR); + node.hub.file.scope.push({id: fileNameIdentifier, init: t.stringLiteral(fileName)}); + state.fileNameIdentifier = fileNameIdentifier; + } + const id = t.jSXIdentifier(TRACE_ID); const location = node.container.openingElement.loc; // undefined for generated elements if (location) { - const trace = makeTrace(this.fileNameIdentifier, location.start.line); + const trace = makeTrace(state.fileNameIdentifier, location.start.line); node.container.openingElement.attributes.push(t.jSXAttribute(id, t.jSXExpressionContainer(trace))); } } }; - let visitor = { - Program(node, state) { - const fileName = state.file.log.filename !== "unknown" - ? state.file.log.filename - : null; - - const fileNameIdentifier = node.scope.generateUidIdentifier(FILE_NAME_VAR); - node.scope.push({id: fileNameIdentifier, init: t.stringLiteral(fileName)}); - node.traverse(jsxVisitor, {fileNameIdentifier}); - }, - }; - return { visitor }; diff --git a/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js index 96cddc9cb0..1be6cdb0e8 100644 --- a/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js +++ b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/basic-sample/exec.js @@ -1,14 +1,14 @@ -var res = transform( +var actual = transform( 'var x = ', Object.assign({}, opts, { filename: '/fake/path/mock.js' }) -); +).code; var expected = multiline([ - 'var __jsxFileName = "/fake/path/mock.js";', + 'var _jsxFileName = "/fake/path/mock.js";', 'var x = ;', ]); -assert.equal(expected, res.code); +assert.equal(actual, expected); diff --git a/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/no-jsx/actual.js b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/no-jsx/actual.js new file mode 100644 index 0000000000..9649b01724 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/no-jsx/actual.js @@ -0,0 +1 @@ +var x = 42; diff --git a/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/no-jsx/expected.js b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/no-jsx/expected.js new file mode 100644 index 0000000000..9649b01724 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx-source/test/fixtures/react-source/no-jsx/expected.js @@ -0,0 +1 @@ +var x = 42;