transform-classic.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _helperPluginUtils = require("@babel/helper-plugin-utils");
  7. var _pluginSyntaxJsx = _interopRequireDefault(require("@babel/plugin-syntax-jsx"));
  8. var _helperBuilderReactJsx = _interopRequireDefault(require("@babel/helper-builder-react-jsx"));
  9. var _core = require("@babel/core");
  10. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  11. const DEFAULT = {
  12. pragma: "React.createElement",
  13. pragmaFrag: "React.Fragment"
  14. };
  15. var _default = (0, _helperPluginUtils.declare)((api, options) => {
  16. const THROW_IF_NAMESPACE = options.throwIfNamespace === undefined ? true : !!options.throwIfNamespace;
  17. const PRAGMA_DEFAULT = options.pragma || DEFAULT.pragma;
  18. const PRAGMA_FRAG_DEFAULT = options.pragmaFrag || DEFAULT.pragmaFrag;
  19. const PURE_ANNOTATION = options.pure;
  20. const JSX_ANNOTATION_REGEX = /\*?\s*@jsx\s+([^\s]+)/;
  21. const JSX_FRAG_ANNOTATION_REGEX = /\*?\s*@jsxFrag\s+([^\s]+)/;
  22. const createIdentifierParser = id => () => {
  23. return id.split(".").map(name => _core.types.identifier(name)).reduce((object, property) => _core.types.memberExpression(object, property));
  24. };
  25. const visitor = (0, _helperBuilderReactJsx.default)({
  26. pre(state) {
  27. const tagName = state.tagName;
  28. const args = state.args;
  29. if (_core.types.react.isCompatTag(tagName)) {
  30. args.push(_core.types.stringLiteral(tagName));
  31. } else {
  32. args.push(state.tagExpr);
  33. }
  34. },
  35. post(state, pass) {
  36. state.callee = pass.get("jsxIdentifier")();
  37. state.pure = PURE_ANNOTATION != null ? PURE_ANNOTATION : pass.get("pragma") === DEFAULT.pragma;
  38. },
  39. throwIfNamespace: THROW_IF_NAMESPACE
  40. });
  41. visitor.Program = {
  42. enter(path, state) {
  43. const {
  44. file
  45. } = state;
  46. let pragma = PRAGMA_DEFAULT;
  47. let pragmaFrag = PRAGMA_FRAG_DEFAULT;
  48. let pragmaSet = !!options.pragma;
  49. let pragmaFragSet = !!options.pragma;
  50. if (file.ast.comments) {
  51. for (const comment of file.ast.comments) {
  52. const jsxMatches = JSX_ANNOTATION_REGEX.exec(comment.value);
  53. if (jsxMatches) {
  54. pragma = jsxMatches[1];
  55. pragmaSet = true;
  56. }
  57. const jsxFragMatches = JSX_FRAG_ANNOTATION_REGEX.exec(comment.value);
  58. if (jsxFragMatches) {
  59. pragmaFrag = jsxFragMatches[1];
  60. pragmaFragSet = true;
  61. }
  62. }
  63. }
  64. state.set("jsxIdentifier", createIdentifierParser(pragma));
  65. state.set("jsxFragIdentifier", createIdentifierParser(pragmaFrag));
  66. state.set("usedFragment", false);
  67. state.set("pragma", pragma);
  68. state.set("pragmaSet", pragmaSet);
  69. state.set("pragmaFragSet", pragmaFragSet);
  70. },
  71. exit(path, state) {
  72. if (state.get("pragmaSet") && state.get("usedFragment") && !state.get("pragmaFragSet")) {
  73. throw new Error("transform-react-jsx: pragma has been set but " + "pragmaFrag has not been set");
  74. }
  75. }
  76. };
  77. visitor.JSXAttribute = function (path) {
  78. if (_core.types.isJSXElement(path.node.value)) {
  79. path.node.value = _core.types.jsxExpressionContainer(path.node.value);
  80. }
  81. };
  82. return {
  83. name: "transform-react-jsx",
  84. inherits: _pluginSyntaxJsx.default,
  85. visitor
  86. };
  87. });
  88. exports.default = _default;