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;