index.js 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
  6. exports.default = extract;
  7. exports.extractLiteral = extractLiteral;
  8. var _Literal = require('../Literal');
  9. var _Literal2 = _interopRequireDefault(_Literal);
  10. var _JSXElement = require('../JSXElement');
  11. var _JSXElement2 = _interopRequireDefault(_JSXElement);
  12. var _JSXFragment = require('../JSXFragment');
  13. var _JSXFragment2 = _interopRequireDefault(_JSXFragment);
  14. var _JSXText = require('../JSXText');
  15. var _JSXText2 = _interopRequireDefault(_JSXText);
  16. var _Identifier = require('./Identifier');
  17. var _Identifier2 = _interopRequireDefault(_Identifier);
  18. var _TaggedTemplateExpression = require('./TaggedTemplateExpression');
  19. var _TaggedTemplateExpression2 = _interopRequireDefault(_TaggedTemplateExpression);
  20. var _TemplateLiteral = require('./TemplateLiteral');
  21. var _TemplateLiteral2 = _interopRequireDefault(_TemplateLiteral);
  22. var _FunctionExpression = require('./FunctionExpression');
  23. var _FunctionExpression2 = _interopRequireDefault(_FunctionExpression);
  24. var _LogicalExpression = require('./LogicalExpression');
  25. var _LogicalExpression2 = _interopRequireDefault(_LogicalExpression);
  26. var _MemberExpression = require('./MemberExpression');
  27. var _MemberExpression2 = _interopRequireDefault(_MemberExpression);
  28. var _ChainExpression = require('./ChainExpression');
  29. var _ChainExpression2 = _interopRequireDefault(_ChainExpression);
  30. var _OptionalCallExpression = require('./OptionalCallExpression');
  31. var _OptionalCallExpression2 = _interopRequireDefault(_OptionalCallExpression);
  32. var _OptionalMemberExpression = require('./OptionalMemberExpression');
  33. var _OptionalMemberExpression2 = _interopRequireDefault(_OptionalMemberExpression);
  34. var _CallExpression = require('./CallExpression');
  35. var _CallExpression2 = _interopRequireDefault(_CallExpression);
  36. var _UnaryExpression = require('./UnaryExpression');
  37. var _UnaryExpression2 = _interopRequireDefault(_UnaryExpression);
  38. var _ThisExpression = require('./ThisExpression');
  39. var _ThisExpression2 = _interopRequireDefault(_ThisExpression);
  40. var _ConditionalExpression = require('./ConditionalExpression');
  41. var _ConditionalExpression2 = _interopRequireDefault(_ConditionalExpression);
  42. var _BinaryExpression = require('./BinaryExpression');
  43. var _BinaryExpression2 = _interopRequireDefault(_BinaryExpression);
  44. var _ObjectExpression = require('./ObjectExpression');
  45. var _ObjectExpression2 = _interopRequireDefault(_ObjectExpression);
  46. var _NewExpression = require('./NewExpression');
  47. var _NewExpression2 = _interopRequireDefault(_NewExpression);
  48. var _UpdateExpression = require('./UpdateExpression');
  49. var _UpdateExpression2 = _interopRequireDefault(_UpdateExpression);
  50. var _ArrayExpression = require('./ArrayExpression');
  51. var _ArrayExpression2 = _interopRequireDefault(_ArrayExpression);
  52. var _BindExpression = require('./BindExpression');
  53. var _BindExpression2 = _interopRequireDefault(_BindExpression);
  54. var _SpreadElement = require('./SpreadElement');
  55. var _SpreadElement2 = _interopRequireDefault(_SpreadElement);
  56. var _TypeCastExpression = require('./TypeCastExpression');
  57. var _TypeCastExpression2 = _interopRequireDefault(_TypeCastExpression);
  58. var _SequenceExpression = require('./SequenceExpression');
  59. var _SequenceExpression2 = _interopRequireDefault(_SequenceExpression);
  60. var _TSNonNullExpression = require('./TSNonNullExpression');
  61. var _TSNonNullExpression2 = _interopRequireDefault(_TSNonNullExpression);
  62. var _AssignmentExpression = require('./AssignmentExpression');
  63. var _AssignmentExpression2 = _interopRequireDefault(_AssignmentExpression);
  64. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  65. // Composition map of types to their extractor functions.
  66. var TYPES = {
  67. Identifier: _Identifier2.default,
  68. Literal: _Literal2.default,
  69. JSXElement: _JSXElement2.default,
  70. JSXFragment: _JSXFragment2.default,
  71. JSXText: _JSXText2.default,
  72. TaggedTemplateExpression: _TaggedTemplateExpression2.default,
  73. TemplateLiteral: _TemplateLiteral2.default,
  74. ArrowFunctionExpression: _FunctionExpression2.default,
  75. FunctionExpression: _FunctionExpression2.default,
  76. LogicalExpression: _LogicalExpression2.default,
  77. MemberExpression: _MemberExpression2.default,
  78. ChainExpression: _ChainExpression2.default,
  79. OptionalCallExpression: _OptionalCallExpression2.default,
  80. OptionalMemberExpression: _OptionalMemberExpression2.default,
  81. CallExpression: _CallExpression2.default,
  82. UnaryExpression: _UnaryExpression2.default,
  83. ThisExpression: _ThisExpression2.default,
  84. ConditionalExpression: _ConditionalExpression2.default,
  85. BinaryExpression: _BinaryExpression2.default,
  86. ObjectExpression: _ObjectExpression2.default,
  87. NewExpression: _NewExpression2.default,
  88. UpdateExpression: _UpdateExpression2.default,
  89. ArrayExpression: _ArrayExpression2.default,
  90. BindExpression: _BindExpression2.default,
  91. SpreadElement: _SpreadElement2.default,
  92. TypeCastExpression: _TypeCastExpression2.default,
  93. SequenceExpression: _SequenceExpression2.default,
  94. TSNonNullExpression: _TSNonNullExpression2.default,
  95. AssignmentExpression: _AssignmentExpression2.default
  96. };
  97. var noop = function noop() {
  98. return null;
  99. };
  100. var errorMessage = function errorMessage(expression) {
  101. return 'The prop value with an expression type of ' + expression + ' could not be resolved. Please file an issue ( https://github.com/jsx-eslint/jsx-ast-utils/issues/new ) to get this fixed immediately.';
  102. };
  103. /**
  104. * This function maps an AST value node
  105. * to its correct extractor function for its
  106. * given type.
  107. *
  108. * This will map correctly for *all* possible expression types.
  109. *
  110. * @param - value - AST Value object with type `JSXExpressionContainer`
  111. * @returns The extracted value.
  112. */
  113. function extract(value) {
  114. // Value will not have the expression property when we recurse.
  115. // The type for expression on ArrowFunctionExpression is a boolean.
  116. var expression = void 0;
  117. if (typeof value.expression !== 'boolean' && value.expression) {
  118. expression = value.expression; // eslint-disable-line prefer-destructuring
  119. } else {
  120. expression = value;
  121. }
  122. var _expression = expression,
  123. type = _expression.type;
  124. // Typescript NonNull Expression is wrapped & it would end up in the wrong extractor
  125. if (expression.object && expression.object.type === 'TSNonNullExpression') {
  126. type = 'TSNonNullExpression';
  127. }
  128. while (type === 'TSAsExpression') {
  129. var _expression2 = expression;
  130. type = _expression2.type;
  131. if (expression.expression) {
  132. var _expression3 = expression;
  133. expression = _expression3.expression;
  134. }
  135. }
  136. if (TYPES[type] === undefined) {
  137. // eslint-disable-next-line no-console
  138. console.error(errorMessage(type));
  139. return null;
  140. }
  141. return TYPES[type](expression);
  142. }
  143. // Composition map of types to their extractor functions to handle literals.
  144. var LITERAL_TYPES = _extends({}, TYPES, {
  145. Literal: function Literal(value) {
  146. var extractedVal = TYPES.Literal.call(undefined, value);
  147. var isNull = extractedVal === null;
  148. // This will be convention for attributes that have null
  149. // value explicitly defined (<div prop={null} /> maps to 'null').
  150. return isNull ? 'null' : extractedVal;
  151. },
  152. Identifier: function Identifier(value) {
  153. var isUndefined = TYPES.Identifier.call(undefined, value) === undefined;
  154. return isUndefined ? undefined : null;
  155. },
  156. JSXElement: noop,
  157. JSXFragment: noop,
  158. JSXText: noop,
  159. ArrowFunctionExpression: noop,
  160. FunctionExpression: noop,
  161. LogicalExpression: noop,
  162. MemberExpression: noop,
  163. OptionalCallExpression: noop,
  164. OptionalMemberExpression: noop,
  165. CallExpression: noop,
  166. UnaryExpression: function UnaryExpression(value) {
  167. var extractedVal = TYPES.UnaryExpression.call(undefined, value);
  168. return extractedVal === undefined ? null : extractedVal;
  169. },
  170. UpdateExpression: function UpdateExpression(value) {
  171. var extractedVal = TYPES.UpdateExpression.call(undefined, value);
  172. return extractedVal === undefined ? null : extractedVal;
  173. },
  174. ThisExpression: noop,
  175. ConditionalExpression: noop,
  176. BinaryExpression: noop,
  177. ObjectExpression: noop,
  178. NewExpression: noop,
  179. ArrayExpression: function ArrayExpression(value) {
  180. var extractedVal = TYPES.ArrayExpression.call(undefined, value);
  181. return extractedVal.filter(function (val) {
  182. return val !== null;
  183. });
  184. },
  185. BindExpression: noop,
  186. SpreadElement: noop,
  187. TSNonNullExpression: noop,
  188. TSAsExpression: noop,
  189. TypeCastExpression: noop,
  190. SequenceExpression: noop,
  191. ChainExpression: noop
  192. });
  193. /**
  194. * This function maps an AST value node
  195. * to its correct extractor function for its
  196. * given type.
  197. *
  198. * This will map correctly for *some* possible types that map to literals.
  199. *
  200. * @param - value - AST Value object with type `JSXExpressionContainer`
  201. * @returns The extracted value.
  202. */
  203. function extractLiteral(value) {
  204. // Value will not have the expression property when we recurse.
  205. var expression = value.expression || value;
  206. var type = expression.type;
  207. if (LITERAL_TYPES[type] === undefined) {
  208. // eslint-disable-next-line no-console
  209. console.error(errorMessage(type));
  210. return null;
  211. }
  212. return LITERAL_TYPES[type](expression);
  213. }