You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

jsx.js 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. "use strict";;
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. var es7_1 = __importDefault(require("./es7"));
  7. var types_1 = __importDefault(require("../lib/types"));
  8. var shared_1 = __importDefault(require("../lib/shared"));
  9. function default_1(fork) {
  10. fork.use(es7_1.default);
  11. var types = fork.use(types_1.default);
  12. var def = types.Type.def;
  13. var or = types.Type.or;
  14. var defaults = fork.use(shared_1.default).defaults;
  15. def("JSXAttribute")
  16. .bases("Node")
  17. .build("name", "value")
  18. .field("name", or(def("JSXIdentifier"), def("JSXNamespacedName")))
  19. .field("value", or(def("Literal"), // attr="value"
  20. def("JSXExpressionContainer"), // attr={value}
  21. null // attr= or just attr
  22. ), defaults["null"]);
  23. def("JSXIdentifier")
  24. .bases("Identifier")
  25. .build("name")
  26. .field("name", String);
  27. def("JSXNamespacedName")
  28. .bases("Node")
  29. .build("namespace", "name")
  30. .field("namespace", def("JSXIdentifier"))
  31. .field("name", def("JSXIdentifier"));
  32. def("JSXMemberExpression")
  33. .bases("MemberExpression")
  34. .build("object", "property")
  35. .field("object", or(def("JSXIdentifier"), def("JSXMemberExpression")))
  36. .field("property", def("JSXIdentifier"))
  37. .field("computed", Boolean, defaults.false);
  38. var JSXElementName = or(def("JSXIdentifier"), def("JSXNamespacedName"), def("JSXMemberExpression"));
  39. def("JSXSpreadAttribute")
  40. .bases("Node")
  41. .build("argument")
  42. .field("argument", def("Expression"));
  43. var JSXAttributes = [or(def("JSXAttribute"), def("JSXSpreadAttribute"))];
  44. def("JSXExpressionContainer")
  45. .bases("Expression")
  46. .build("expression")
  47. .field("expression", def("Expression"));
  48. def("JSXElement")
  49. .bases("Expression")
  50. .build("openingElement", "closingElement", "children")
  51. .field("openingElement", def("JSXOpeningElement"))
  52. .field("closingElement", or(def("JSXClosingElement"), null), defaults["null"])
  53. .field("children", [or(def("JSXElement"), def("JSXExpressionContainer"), def("JSXFragment"), def("JSXText"), def("Literal") // TODO Esprima should return JSXText instead.
  54. )], defaults.emptyArray)
  55. .field("name", JSXElementName, function () {
  56. // Little-known fact: the `this` object inside a default function
  57. // is none other than the partially-built object itself, and any
  58. // fields initialized directly from builder function arguments
  59. // (like openingElement, closingElement, and children) are
  60. // guaranteed to be available.
  61. return this.openingElement.name;
  62. }, true) // hidden from traversal
  63. .field("selfClosing", Boolean, function () {
  64. return this.openingElement.selfClosing;
  65. }, true) // hidden from traversal
  66. .field("attributes", JSXAttributes, function () {
  67. return this.openingElement.attributes;
  68. }, true); // hidden from traversal
  69. def("JSXOpeningElement")
  70. .bases("Node") // TODO Does this make sense? Can't really be an JSXElement.
  71. .build("name", "attributes", "selfClosing")
  72. .field("name", JSXElementName)
  73. .field("attributes", JSXAttributes, defaults.emptyArray)
  74. .field("selfClosing", Boolean, defaults["false"]);
  75. def("JSXClosingElement")
  76. .bases("Node") // TODO Same concern.
  77. .build("name")
  78. .field("name", JSXElementName);
  79. def("JSXFragment")
  80. .bases("Expression")
  81. .build("openingElement", "closingElement", "children")
  82. .field("openingElement", def("JSXOpeningFragment"))
  83. .field("closingElement", def("JSXClosingFragment"))
  84. .field("children", [or(def("JSXElement"), def("JSXExpressionContainer"), def("JSXFragment"), def("JSXText"), def("Literal") // TODO Esprima should return JSXText instead.
  85. )], defaults.emptyArray);
  86. def("JSXOpeningFragment")
  87. .bases("Node") // TODO Same concern.
  88. .build();
  89. def("JSXClosingFragment")
  90. .bases("Node") // TODO Same concern.
  91. .build();
  92. def("JSXText")
  93. .bases("Literal")
  94. .build("value")
  95. .field("value", String);
  96. def("JSXEmptyExpression").bases("Expression").build();
  97. // This PR has caused many people issues, but supporting it seems like a
  98. // good idea anyway: https://github.com/babel/babel/pull/4988
  99. def("JSXSpreadChild")
  100. .bases("Expression")
  101. .build("expression")
  102. .field("expression", def("Expression"));
  103. }
  104. exports.default = default_1;
  105. module.exports = exports["default"];