index.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = function (_ref) {
  4. var t = _ref.types;
  5. function makeTrace(fileNameIdentifier, lineNumber) {
  6. var fileLineLiteral = lineNumber != null ? t.numericLiteral(lineNumber) : t.nullLiteral();
  7. var fileNameProperty = t.objectProperty(t.identifier("fileName"), fileNameIdentifier);
  8. var lineNumberProperty = t.objectProperty(t.identifier("lineNumber"), fileLineLiteral);
  9. return t.objectExpression([fileNameProperty, lineNumberProperty]);
  10. }
  11. var visitor = {
  12. JSXOpeningElement: function JSXOpeningElement(path, state) {
  13. var id = t.jSXIdentifier(TRACE_ID);
  14. var location = path.container.openingElement.loc;
  15. if (!location) {
  16. return;
  17. }
  18. var attributes = path.container.openingElement.attributes;
  19. for (var i = 0; i < attributes.length; i++) {
  20. var name = attributes[i].name;
  21. if (name && name.name === TRACE_ID) {
  22. return;
  23. }
  24. }
  25. if (!state.fileNameIdentifier) {
  26. var fileName = state.file.log.filename !== "unknown" ? state.file.log.filename : null;
  27. var fileNameIdentifier = path.scope.generateUidIdentifier(FILE_NAME_VAR);
  28. path.hub.file.scope.push({ id: fileNameIdentifier, init: t.stringLiteral(fileName) });
  29. state.fileNameIdentifier = fileNameIdentifier;
  30. }
  31. var trace = makeTrace(state.fileNameIdentifier, location.start.line);
  32. attributes.push(t.jSXAttribute(id, t.jSXExpressionContainer(trace)));
  33. }
  34. };
  35. return {
  36. visitor: visitor
  37. };
  38. };
  39. var TRACE_ID = "__source";
  40. var FILE_NAME_VAR = "_jsxFileName";
  41. module.exports = exports["default"];