From d692a8f512522832b086ba7614147b72874c7620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juno=20Su=C3=A1rez?= Date: Mon, 5 Oct 2020 15:37:30 -0700 Subject: [PATCH] Implement ChainExpression type and update MemberExpression --- src/values/expressions/ChainExpression.js | 12 ++++++++++++ src/values/expressions/MemberExpression.js | 6 ++++-- src/values/expressions/index.js | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 src/values/expressions/ChainExpression.js diff --git a/src/values/expressions/ChainExpression.js b/src/values/expressions/ChainExpression.js new file mode 100644 index 0000000..abe2b25 --- /dev/null +++ b/src/values/expressions/ChainExpression.js @@ -0,0 +1,12 @@ +/** + * 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 + */ +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..1c7d933 100644 --- a/src/values/expressions/MemberExpression.js +++ b/src/values/expressions/MemberExpression.js @@ -4,10 +4,12 @@ * * @param - value - AST Value object with type `MemberExpression` * @returns - The extracted value converted to correct type - * and maintaing `obj.property` convention. + * and maintaing `obj.property` convention, + * or `obj?.property` if it occurs in a `ChainExpression`. */ export default function extractValueFromMemberExpression(value) { // eslint-disable-next-line global-require const getValue = require('./index.js').default; - return `${getValue(value.object)}.${getValue(value.property)}`; + const separator = value.optional ? '?.' : '.'; + return `${getValue(value.object)}${separator}${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,