diff --git a/__tests__/src/getPropValue-babelparser-test.js b/__tests__/src/getPropValue-babelparser-test.js index 823d7d8..4f50db7 100644 --- a/__tests__/src/getPropValue-babelparser-test.js +++ b/__tests__/src/getPropValue-babelparser-test.js @@ -526,7 +526,7 @@ describe('getPropValue', () => { it('should return string representation of callee', () => { const prop = extractProp('
'); - const expected = 'bar'; + const expected = 'bar()'; const actual = getPropValue(prop); assert.equal(actual, expected); @@ -535,7 +535,7 @@ describe('getPropValue', () => { it('should return string representation of callee', () => { const prop = extractProp('
'); - const expected = 'bar.call'; + const expected = 'bar.call()'; const actual = getPropValue(prop); assert.equal(actual, expected); diff --git a/__tests__/src/getPropValue-flowparser-test.js b/__tests__/src/getPropValue-flowparser-test.js index ae88111..81ae7f2 100644 --- a/__tests__/src/getPropValue-flowparser-test.js +++ b/__tests__/src/getPropValue-flowparser-test.js @@ -390,7 +390,7 @@ describe('getPropValue', () => { it('should return string representation of callee', () => { const prop = extractProp('
'); - const expected = 'bar'; + const expected = 'bar()'; const actual = getPropValue(prop); assert.equal(actual, expected); @@ -399,7 +399,7 @@ describe('getPropValue', () => { it('should return string representation of callee', () => { const prop = extractProp('
'); - const expected = 'bar.call'; + const expected = 'bar.call()'; const actual = getPropValue(prop); assert.equal(actual, expected); diff --git a/src/values/expressions/CallExpression.js b/src/values/expressions/CallExpression.js index 6cdeba9..23497f9 100644 --- a/src/values/expressions/CallExpression.js +++ b/src/values/expressions/CallExpression.js @@ -10,5 +10,6 @@ export default function extractValueFromCallExpression(value) { // eslint-disable-next-line global-require const getValue = require('./index.js').default; - return getValue(value.callee); + const args = Array.isArray(value.arguments) ? value.arguments.map((x) => getValue(x)).join(', ') : ''; + return `${getValue(value.callee)}${value.optional ? '?.' : ''}(${args})`; } diff --git a/src/values/expressions/ChainExpression.js b/src/values/expressions/ChainExpression.js new file mode 100644 index 0000000..f3e18ec --- /dev/null +++ b/src/values/expressions/ChainExpression.js @@ -0,0 +1,13 @@ +/** + * Extractor function for a ChainExpression type value node. + * A member expression is accessing a property on an object `obj.property`. + * + * @param - value - AST Value object with type `ChainExpression` + * @returns - The extracted value converted to correct type + * and maintaing `obj?.property` convention. + */ +export default function extractValueFromChainExpression(value) { + // eslint-disable-next-line global-require + const getValue = require('./index.js').default; + return getValue(value.expression); +} diff --git a/src/values/expressions/MemberExpression.js b/src/values/expressions/MemberExpression.js index 38e31fe..e4212bb 100644 --- a/src/values/expressions/MemberExpression.js +++ b/src/values/expressions/MemberExpression.js @@ -9,5 +9,5 @@ export default function extractValueFromMemberExpression(value) { // eslint-disable-next-line global-require const getValue = require('./index.js').default; - return `${getValue(value.object)}.${getValue(value.property)}`; + return `${getValue(value.object)}${value.optional ? '?.' : '.'}${getValue(value.property)}`; } diff --git a/src/values/expressions/index.js b/src/values/expressions/index.js index d0cc0e3..fe255ee 100644 --- a/src/values/expressions/index.js +++ b/src/values/expressions/index.js @@ -6,6 +6,7 @@ import TemplateLiteral from './TemplateLiteral'; import FunctionExpression from './FunctionExpression'; import LogicalExpression from './LogicalExpression'; import MemberExpression from './MemberExpression'; +import ChainExpression from './ChainExpression'; import OptionalCallExpression from './OptionalCallExpression'; import OptionalMemberExpression from './OptionalMemberExpression'; import CallExpression from './CallExpression'; @@ -32,6 +33,7 @@ const TYPES = { FunctionExpression, LogicalExpression, MemberExpression, + ChainExpression, OptionalCallExpression, OptionalMemberExpression, CallExpression,