TSNonNullExpression.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = extractValueFromTSNonNullExpression;
  6. var extractValueFromThisExpression = require('./ThisExpression').default;
  7. var extractValueFromCallExpression = require('./CallExpression').default;
  8. function navigate(obj, prop, value) {
  9. if (value.computed) {
  10. return value.optional ? obj + '?.[' + prop + ']' : obj + '[' + prop + ']';
  11. }
  12. return value.optional ? obj + '?.' + prop : obj + '.' + prop;
  13. }
  14. /**
  15. * Extractor function for a TSNonNullExpression type value node.
  16. * A TSNonNullExpression is accessing a TypeScript Non-Null Assertion
  17. * Operator !
  18. *
  19. * @param - value - AST Value object with type `TSNonNullExpression`
  20. * @returns - The extracted value converted to correct type
  21. * and maintaing `obj.property` convention.
  22. */
  23. function extractValueFromTSNonNullExpression(value) {
  24. // eslint-disable-next-line global-require
  25. // const getValue = require('.').default;
  26. var errorMessage = 'The prop value with an expression type of TSNonNullExpression could not be resolved. Please file an issue ( https://github.com/jsx-eslint/jsx-ast-utils/issues/new ) to get this fixed immediately.';
  27. // it's just the name
  28. if (value.type === 'Identifier') {
  29. var name = value.name;
  30. return name;
  31. }
  32. if (value.type === 'Literal') {
  33. return value.value;
  34. }
  35. if (value.type === 'TSAsExpression') {
  36. return extractValueFromTSNonNullExpression(value.expression);
  37. }
  38. if (value.type === 'CallExpression') {
  39. return extractValueFromCallExpression(value);
  40. }
  41. if (value.type === 'ThisExpression') {
  42. return extractValueFromThisExpression();
  43. }
  44. // does not contains properties & is not parenthesized
  45. if (value.type === 'TSNonNullExpression' && (!value.extra || value.extra.parenthesized === false)) {
  46. var expression = value.expression;
  47. return extractValueFromTSNonNullExpression(expression) + '!';
  48. }
  49. // does not contains properties & is parenthesized
  50. if (value.type === 'TSNonNullExpression' && value.extra && value.extra.parenthesized === true) {
  51. var _expression = value.expression;
  52. return '(' + extractValueFromTSNonNullExpression(_expression) + '!' + ')';
  53. }
  54. if (value.type === 'MemberExpression') {
  55. // contains a property & is not parenthesized
  56. if (!value.extra || value.extra.parenthesized === false) {
  57. return navigate(extractValueFromTSNonNullExpression(value.object), extractValueFromTSNonNullExpression(value.property), value);
  58. }
  59. // contains a property & is parenthesized
  60. if (value.extra && value.extra.parenthesized === true) {
  61. var result = navigate(extractValueFromTSNonNullExpression(value.object), extractValueFromTSNonNullExpression(value.property), value);
  62. return '(' + result + ')';
  63. }
  64. }
  65. // try to fail silently, if specs for TSNonNullExpression change
  66. // not throw, only log error. Similar to how it was done previously
  67. if (value.expression) {
  68. var _expression2 = value.expression;
  69. while (_expression2) {
  70. if (_expression2.type === 'Identifier') {
  71. // eslint-disable-next-line no-console
  72. console.error(errorMessage);
  73. return _expression2.name;
  74. }
  75. var _expression3 = _expression2;
  76. _expression2 = _expression3.expression;
  77. }
  78. }
  79. // eslint-disable-next-line no-console
  80. console.error(errorMessage);
  81. return '';
  82. }