'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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; }; exports.default = extract; exports.extractLiteral = extractLiteral; var _Literal = require('../Literal'); var _Literal2 = _interopRequireDefault(_Literal); var _JSXElement = require('../JSXElement'); var _JSXElement2 = _interopRequireDefault(_JSXElement); var _Identifier = require('./Identifier'); var _Identifier2 = _interopRequireDefault(_Identifier); var _TaggedTemplateExpression = require('./TaggedTemplateExpression'); var _TaggedTemplateExpression2 = _interopRequireDefault(_TaggedTemplateExpression); var _TemplateLiteral = require('./TemplateLiteral'); var _TemplateLiteral2 = _interopRequireDefault(_TemplateLiteral); var _FunctionExpression = require('./FunctionExpression'); var _FunctionExpression2 = _interopRequireDefault(_FunctionExpression); var _LogicalExpression = require('./LogicalExpression'); var _LogicalExpression2 = _interopRequireDefault(_LogicalExpression); var _MemberExpression = require('./MemberExpression'); var _MemberExpression2 = _interopRequireDefault(_MemberExpression); var _ChainExpression = require('./ChainExpression'); var _ChainExpression2 = _interopRequireDefault(_ChainExpression); var _OptionalCallExpression = require('./OptionalCallExpression'); var _OptionalCallExpression2 = _interopRequireDefault(_OptionalCallExpression); var _OptionalMemberExpression = require('./OptionalMemberExpression'); var _OptionalMemberExpression2 = _interopRequireDefault(_OptionalMemberExpression); var _CallExpression = require('./CallExpression'); var _CallExpression2 = _interopRequireDefault(_CallExpression); var _UnaryExpression = require('./UnaryExpression'); var _UnaryExpression2 = _interopRequireDefault(_UnaryExpression); var _ThisExpression = require('./ThisExpression'); var _ThisExpression2 = _interopRequireDefault(_ThisExpression); var _ConditionalExpression = require('./ConditionalExpression'); var _ConditionalExpression2 = _interopRequireDefault(_ConditionalExpression); var _BinaryExpression = require('./BinaryExpression'); var _BinaryExpression2 = _interopRequireDefault(_BinaryExpression); var _ObjectExpression = require('./ObjectExpression'); var _ObjectExpression2 = _interopRequireDefault(_ObjectExpression); var _NewExpression = require('./NewExpression'); var _NewExpression2 = _interopRequireDefault(_NewExpression); var _UpdateExpression = require('./UpdateExpression'); var _UpdateExpression2 = _interopRequireDefault(_UpdateExpression); var _ArrayExpression = require('./ArrayExpression'); var _ArrayExpression2 = _interopRequireDefault(_ArrayExpression); var _BindExpression = require('./BindExpression'); var _BindExpression2 = _interopRequireDefault(_BindExpression); var _SpreadElement = require('./SpreadElement'); var _SpreadElement2 = _interopRequireDefault(_SpreadElement); var _TypeCastExpression = require('./TypeCastExpression'); var _TypeCastExpression2 = _interopRequireDefault(_TypeCastExpression); var _SequenceExpression = require('./SequenceExpression'); var _SequenceExpression2 = _interopRequireDefault(_SequenceExpression); var _TSNonNullExpression = require('./TSNonNullExpression'); var _TSNonNullExpression2 = _interopRequireDefault(_TSNonNullExpression); var _AssignmentExpression = require('./AssignmentExpression'); var _AssignmentExpression2 = _interopRequireDefault(_AssignmentExpression); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Composition map of types to their extractor functions. var TYPES = { Identifier: _Identifier2.default, Literal: _Literal2.default, JSXElement: _JSXElement2.default, TaggedTemplateExpression: _TaggedTemplateExpression2.default, TemplateLiteral: _TemplateLiteral2.default, ArrowFunctionExpression: _FunctionExpression2.default, FunctionExpression: _FunctionExpression2.default, LogicalExpression: _LogicalExpression2.default, MemberExpression: _MemberExpression2.default, ChainExpression: _ChainExpression2.default, OptionalCallExpression: _OptionalCallExpression2.default, OptionalMemberExpression: _OptionalMemberExpression2.default, CallExpression: _CallExpression2.default, UnaryExpression: _UnaryExpression2.default, ThisExpression: _ThisExpression2.default, ConditionalExpression: _ConditionalExpression2.default, BinaryExpression: _BinaryExpression2.default, ObjectExpression: _ObjectExpression2.default, NewExpression: _NewExpression2.default, UpdateExpression: _UpdateExpression2.default, ArrayExpression: _ArrayExpression2.default, BindExpression: _BindExpression2.default, SpreadElement: _SpreadElement2.default, TypeCastExpression: _TypeCastExpression2.default, SequenceExpression: _SequenceExpression2.default, TSNonNullExpression: _TSNonNullExpression2.default, AssignmentExpression: _AssignmentExpression2.default }; var noop = function noop() { return null; }; var errorMessage = function errorMessage(expression) { return 'The prop value with an expression type of ' + expression + ' could not be resolved. Please file issue to get this fixed immediately.'; }; /** * This function maps an AST value node * to its correct extractor function for its * given type. * * This will map correctly for *all* possible expression types. * * @param - value - AST Value object with type `JSXExpressionContainer` * @returns The extracted value. */ function extract(value) { // Value will not have the expression property when we recurse. // The type for expression on ArrowFunctionExpression is a boolean. var expression = void 0; if (typeof value.expression !== 'boolean' && value.expression) { expression = value.expression; // eslint-disable-line prefer-destructuring } else { expression = value; } var _expression = expression, type = _expression.type; // Typescript NonNull Expression is wrapped & it would end up in the wrong extractor if (expression.object && expression.object.type === 'TSNonNullExpression') { type = 'TSNonNullExpression'; } while (type === 'TSAsExpression') { var _expression2 = expression; type = _expression2.type; if (expression.expression) { var _expression3 = expression; expression = _expression3.expression; } } if (TYPES[type] === undefined) { // eslint-disable-next-line no-console console.error(errorMessage(type)); return null; } return TYPES[type](expression); } // Composition map of types to their extractor functions to handle literals. var LITERAL_TYPES = _extends({}, TYPES, { Literal: function Literal(value) { var extractedVal = TYPES.Literal.call(undefined, value); var isNull = extractedVal === null; // This will be convention for attributes that have null // value explicitly defined (
maps to 'null'). return isNull ? 'null' : extractedVal; }, Identifier: function Identifier(value) { var isUndefined = TYPES.Identifier.call(undefined, value) === undefined; return isUndefined ? undefined : null; }, JSXElement: noop, ArrowFunctionExpression: noop, FunctionExpression: noop, LogicalExpression: noop, MemberExpression: noop, OptionalCallExpression: noop, OptionalMemberExpression: noop, CallExpression: noop, UnaryExpression: function UnaryExpression(value) { var extractedVal = TYPES.UnaryExpression.call(undefined, value); return extractedVal === undefined ? null : extractedVal; }, UpdateExpression: function UpdateExpression(value) { var extractedVal = TYPES.UpdateExpression.call(undefined, value); return extractedVal === undefined ? null : extractedVal; }, ThisExpression: noop, ConditionalExpression: noop, BinaryExpression: noop, ObjectExpression: noop, NewExpression: noop, ArrayExpression: function ArrayExpression(value) { var extractedVal = TYPES.ArrayExpression.call(undefined, value); return extractedVal.filter(function (val) { return val !== null; }); }, BindExpression: noop, SpreadElement: noop, TSNonNullExpression: noop, TSAsExpression: noop, TypeCastExpression: noop, SequenceExpression: noop }); /** * This function maps an AST value node * to its correct extractor function for its * given type. * * This will map correctly for *some* possible types that map to literals. * * @param - value - AST Value object with type `JSXExpressionContainer` * @returns The extracted value. */ function extractLiteral(value) { // Value will not have the expression property when we recurse. var expression = value.expression || value; var type = expression.type; if (LITERAL_TYPES[type] === undefined) { // eslint-disable-next-line no-console console.error(errorMessage(type)); return null; } return LITERAL_TYPES[type](expression); }