Index: frontend/node_modules/jsx-ast-utils/lib/elementType.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/elementType.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/elementType.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,48 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = elementType;
+function resolveMemberExpressions() {
+  var object = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+  var property = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+  if (object.type === 'JSXMemberExpression') {
+    return resolveMemberExpressions(object.object, object.property) + '.' + property.name;
+  }
+
+  return object.name + '.' + property.name;
+}
+
+/**
+ * Returns the tagName associated with a JSXElement.
+ */
+function elementType() {
+  var node = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+  var name = node.name;
+
+
+  if (node.type === 'JSXOpeningFragment') {
+    return '<>';
+  }
+
+  if (!name) {
+    throw new Error('The argument provided is not a JSXElement node.');
+  }
+
+  if (name.type === 'JSXMemberExpression') {
+    var _name$object = name.object,
+        object = _name$object === undefined ? {} : _name$object,
+        _name$property = name.property,
+        property = _name$property === undefined ? {} : _name$property;
+
+    return resolveMemberExpressions(object, property);
+  }
+
+  if (name.type === 'JSXNamespacedName') {
+    return name.namespace.name + ':' + name.name.name;
+  }
+
+  return node.name.name;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/eventHandlers.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/eventHandlers.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/eventHandlers.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,40 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.eventHandlersByType = undefined;
+
+var _arrayPrototype = require('array.prototype.flat');
+
+var _arrayPrototype2 = _interopRequireDefault(_arrayPrototype);
+
+var _object = require('object.values');
+
+var _object2 = _interopRequireDefault(_object);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Common event handlers for JSX element event binding.
+ */
+
+var eventHandlersByType = {
+  clipboard: ['onCopy', 'onCut', 'onPaste'],
+  composition: ['onCompositionEnd', 'onCompositionStart', 'onCompositionUpdate'],
+  keyboard: ['onKeyDown', 'onKeyPress', 'onKeyUp'],
+  focus: ['onFocus', 'onBlur'],
+  form: ['onChange', 'onInput', 'onSubmit'],
+  mouse: ['onClick', 'onContextMenu', 'onDblClick', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragExit', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp'],
+  selection: ['onSelect'],
+  touch: ['onTouchCancel', 'onTouchEnd', 'onTouchMove', 'onTouchStart'],
+  ui: ['onScroll'],
+  wheel: ['onWheel'],
+  media: ['onAbort', 'onCanPlay', 'onCanPlayThrough', 'onDurationChange', 'onEmptied', 'onEncrypted', 'onEnded', 'onError', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onSeeked', 'onSeeking', 'onStalled', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting'],
+  image: ['onLoad', 'onError'],
+  animation: ['onAnimationStart', 'onAnimationEnd', 'onAnimationIteration'],
+  transition: ['onTransitionEnd']
+};
+
+exports.default = (0, _arrayPrototype2.default)((0, _object2.default)(eventHandlersByType));
+exports.eventHandlersByType = eventHandlersByType;
Index: frontend/node_modules/jsx-ast-utils/lib/getProp.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/getProp.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/getProp.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,115 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+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 = getProp;
+
+var _propName = require('./propName');
+
+var _propName2 = _interopRequireDefault(_propName);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
+
+var DEFAULT_OPTIONS = {
+  ignoreCase: true
+};
+
+/**
+ * Returns the JSXAttribute itself or undefined, indicating the prop
+ * is not present on the JSXOpeningElement.
+ *
+ */
+function getProp() {
+  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+  var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
+
+  function getName(name) {
+    return options.ignoreCase ? name.toUpperCase() : name;
+  }
+  var propToFind = getName(prop);
+  function isPropToFind(property) {
+    return property.type === 'Property' && property.key.type === 'Identifier' && propToFind === getName(property.key.name);
+  }
+
+  var foundAttribute = props.find(function (attribute) {
+    // If the props contain a spread prop, try to find the property in the object expression.
+    if (attribute.type === 'JSXSpreadAttribute') {
+      return attribute.argument.type === 'ObjectExpression' && propToFind !== getName('key') // https://github.com/reactjs/rfcs/pull/107
+      && attribute.argument.properties.some(isPropToFind);
+    }
+
+    return propToFind === getName((0, _propName2.default)(attribute));
+  });
+
+  if (foundAttribute && foundAttribute.type === 'JSXSpreadAttribute') {
+    return propertyToJSXAttribute(foundAttribute.argument.properties.find(isPropToFind));
+  }
+
+  return foundAttribute;
+}
+
+function propertyToJSXAttribute(node) {
+  var key = node.key,
+      value = node.value;
+
+  return _extends({
+    type: 'JSXAttribute',
+    name: _extends({ type: 'JSXIdentifier', name: key.name }, getBaseProps(key)),
+    value: value.type === 'Literal' ? adjustRangeOfNode(value) : _extends({ type: 'JSXExpressionContainer', expression: adjustExpressionRange(value) }, getBaseProps(value))
+  }, getBaseProps(node));
+}
+
+function adjustRangeOfNode(node) {
+  var _ref = node.range || [node.start, node.end],
+      _ref2 = _slicedToArray(_ref, 2),
+      start = _ref2[0],
+      end = _ref2[1];
+
+  return _extends({}, node, {
+    end: undefined,
+    range: [start, end],
+    start: undefined
+  });
+}
+
+function adjustExpressionRange(_ref3) {
+  var expressions = _ref3.expressions,
+      quasis = _ref3.quasis,
+      expression = _objectWithoutProperties(_ref3, ['expressions', 'quasis']);
+
+  return _extends({}, adjustRangeOfNode(expression), expressions ? { expressions: expressions.map(adjustRangeOfNode) } : {}, quasis ? { quasis: quasis.map(adjustRangeOfNode) } : {});
+}
+
+function getBaseProps(_ref4) {
+  var loc = _ref4.loc,
+      node = _objectWithoutProperties(_ref4, ['loc']);
+
+  var _adjustRangeOfNode = adjustRangeOfNode(node),
+      range = _adjustRangeOfNode.range;
+
+  return {
+    loc: getBaseLocation(loc),
+    range: range
+  };
+}
+
+function getBaseLocation(_ref5) {
+  var start = _ref5.start,
+      end = _ref5.end,
+      source = _ref5.source,
+      filename = _ref5.filename;
+
+  return _extends({
+    start: start,
+    end: end
+  }, source !== undefined ? { source: source } : {}, filename !== undefined ? { filename: filename } : {});
+}
Index: frontend/node_modules/jsx-ast-utils/lib/getPropValue.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/getPropValue.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/getPropValue.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,57 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = getPropValue;
+exports.getLiteralPropValue = getLiteralPropValue;
+
+var _values = require('./values');
+
+var _values2 = _interopRequireDefault(_values);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var extractValue = function extractValue(attribute, extractor) {
+  if (attribute && attribute.type === 'JSXAttribute') {
+    if (attribute.value === null) {
+      // Null valued attributes imply truthiness.
+      // For example: <div aria-hidden />
+      // See: https://facebook.github.io/react/docs/jsx-in-depth.html#boolean-attributes
+      return true;
+    }
+
+    return extractor(attribute.value);
+  }
+
+  return undefined;
+};
+
+/**
+ * Returns the value of a given attribute.
+ * Different types of attributes have their associated
+ * values in different properties on the object.
+ *
+ * This function should return the most *closely* associated
+ * value with the intention of the JSX.
+ *
+ * @param attribute - The JSXAttribute collected by AST parser.
+ */
+function getPropValue(attribute) {
+  return extractValue(attribute, _values2.default);
+}
+
+/**
+ * Returns the value of a given attribute.
+ * Different types of attributes have their associated
+ * values in different properties on the object.
+ *
+ * This function should return a value only if we can extract
+ * a literal value from its attribute (i.e. values that have generic
+ * types in JavaScript - strings, numbers, booleans, etc.)
+ *
+ * @param attribute - The JSXAttribute collected by AST parser.
+ */
+function getLiteralPropValue(attribute) {
+  return extractValue(attribute, _values.getLiteralValue);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/hasProp.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/hasProp.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/hasProp.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,74 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = hasProp;
+exports.hasAnyProp = hasAnyProp;
+exports.hasEveryProp = hasEveryProp;
+
+var _propName = require('./propName');
+
+var _propName2 = _interopRequireDefault(_propName);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var DEFAULT_OPTIONS = {
+  spreadStrict: true,
+  ignoreCase: true
+};
+
+/**
+ * Returns boolean indicating whether an prop exists on the props
+ * property of a JSX element node.
+ */
+function hasProp() {
+  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+  var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
+  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
+
+  var propToCheck = options.ignoreCase ? prop.toUpperCase() : prop;
+
+  return props.some(function (attribute) {
+    // If the props contain a spread prop, then refer to strict param.
+    if (attribute.type === 'JSXSpreadAttribute') {
+      return !options.spreadStrict;
+    }
+
+    var currentProp = options.ignoreCase ? (0, _propName2.default)(attribute).toUpperCase() : (0, _propName2.default)(attribute);
+
+    return propToCheck === currentProp;
+  });
+}
+
+/**
+ * Given the props on a node and a list of props to check, this returns a boolean
+ * indicating if any of them exist on the node.
+ */
+function hasAnyProp() {
+  var nodeProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
+
+  var propsToCheck = typeof props === 'string' ? props.split(' ') : props;
+
+  return propsToCheck.some(function (prop) {
+    return hasProp(nodeProps, prop, options);
+  });
+}
+
+/**
+ * Given the props on a node and a list of props to check, this returns a boolean
+ * indicating if all of them exist on the node
+ */
+function hasEveryProp() {
+  var nodeProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+  var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_OPTIONS;
+
+  var propsToCheck = typeof props === 'string' ? props.split(' ') : props;
+
+  return propsToCheck.every(function (prop) {
+    return hasProp(nodeProps, prop, options);
+  });
+}
Index: frontend/node_modules/jsx-ast-utils/lib/index.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,40 @@
+'use strict';
+
+var _hasProp = require('./hasProp');
+
+var _hasProp2 = _interopRequireDefault(_hasProp);
+
+var _elementType = require('./elementType');
+
+var _elementType2 = _interopRequireDefault(_elementType);
+
+var _eventHandlers = require('./eventHandlers');
+
+var _eventHandlers2 = _interopRequireDefault(_eventHandlers);
+
+var _getProp = require('./getProp');
+
+var _getProp2 = _interopRequireDefault(_getProp);
+
+var _getPropValue = require('./getPropValue');
+
+var _getPropValue2 = _interopRequireDefault(_getPropValue);
+
+var _propName = require('./propName');
+
+var _propName2 = _interopRequireDefault(_propName);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+module.exports = {
+  hasProp: _hasProp2.default,
+  hasAnyProp: _hasProp.hasAnyProp,
+  hasEveryProp: _hasProp.hasEveryProp,
+  elementType: _elementType2.default,
+  eventHandlers: _eventHandlers2.default,
+  eventHandlersByType: _eventHandlers.eventHandlersByType,
+  getProp: _getProp2.default,
+  getPropValue: _getPropValue2.default,
+  getLiteralPropValue: _getPropValue.getLiteralPropValue,
+  propName: _propName2.default
+};
Index: frontend/node_modules/jsx-ast-utils/lib/propName.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/propName.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/propName.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,22 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = propName;
+/**
+ * Returns the name of the prop given the JSXAttribute object.
+ */
+function propName() {
+  var prop = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+  if (!prop.type || prop.type !== 'JSXAttribute') {
+    throw new Error('The prop must be a JSXAttribute collected by the AST parser.');
+  }
+
+  if (prop.name.type === 'JSXNamespacedName') {
+    return prop.name.namespace.name + ':' + prop.name.name.name;
+  }
+
+  return prop.name.name;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/JSXElement.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/JSXElement.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/JSXElement.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,23 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromJSXElement;
+/**
+ * Extractor function for a JSXElement type value node.
+ *
+ * Returns self-closing element with correct name.
+ */
+function extractValueFromJSXElement(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+
+  var Tag = value.openingElement.name.name;
+  if (value.openingElement.selfClosing) {
+    return '<' + Tag + ' />';
+  }
+  return '<' + Tag + '>' + [].concat(value.children).map(function (x) {
+    return getValue(x);
+  }).join('') + '</' + Tag + '>';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/JSXFragment.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/JSXFragment.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/JSXFragment.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,22 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromJSXFragment;
+/**
+ * Extractor function for a JSXFragment type value node.
+ *
+ * Returns self-closing element with correct name.
+ */
+function extractValueFromJSXFragment(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+
+  if (value.children.length === 0) {
+    return '<></>';
+  }
+  return '<>' + [].concat(value.children).map(function (x) {
+    return getValue(x);
+  }).join('') + '</>';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/JSXText.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/JSXText.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/JSXText.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromJSXText;
+/**
+ * Extractor function for a JSXText type value node.
+ *
+ * Returns self-closing element with correct name.
+ */
+function extractValueFromJSXText(value) {
+  return value.raw;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/Literal.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/Literal.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/Literal.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,27 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromLiteral;
+/**
+ * Extractor function for a Literal type value node.
+ *
+ * @param - value - AST Value object with type `Literal`
+ * @returns { String|Boolean } - The extracted value converted to correct type.
+ */
+function extractValueFromLiteral(value) {
+  var extractedValue = value.value;
+
+
+  var normalizedStringValue = typeof extractedValue === 'string' && extractedValue.toLowerCase();
+  if (normalizedStringValue === 'true') {
+    return true;
+  }
+
+  if (normalizedStringValue === 'false') {
+    return false;
+  }
+
+  return extractedValue;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/ArrayExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/ArrayExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/ArrayExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromArrayExpression;
+/**
+ * Extractor function for an ArrayExpression type value node.
+ * An array expression is an expression with [] syntax.
+ *
+ * @returns - An array of the extracted elements.
+ */
+function extractValueFromArrayExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return value.elements.map(function (element) {
+    if (element === null) return undefined;
+    return getValue(element);
+  });
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/AssignmentExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/AssignmentExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/AssignmentExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromAssignmentExpression;
+/**
+ * Extractor function for a AssignmentExpression type value node.
+ * An assignment expression looks like `x = y` or `x += y` in expression position.
+ * This will return the assignment as the value.
+ *
+ * @param - value - AST Value object with type `AssignmentExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromAssignmentExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return getValue(value.left) + ' ' + value.operator + ' ' + getValue(value.right);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/BinaryExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/BinaryExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/BinaryExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,78 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromBinaryExpression;
+/**
+ * Extractor function for a BinaryExpression type value node.
+ * A binary expression has a left and right side separated by an operator
+ * such as `a + b`.
+ *
+ * @param - value - AST Value object with type `BinaryExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromBinaryExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var operator = value.operator,
+      left = value.left,
+      right = value.right;
+
+  var leftVal = getValue(left);
+  var rightVal = getValue(right);
+
+  switch (operator) {
+    case '==':
+      return leftVal == rightVal; // eslint-disable-line
+    case '!=':
+      return leftVal != rightVal; // eslint-disable-line
+    case '===':
+      return leftVal === rightVal;
+    case '!==':
+      return leftVal !== rightVal;
+    case '<':
+      return leftVal < rightVal;
+    case '<=':
+      return leftVal <= rightVal;
+    case '>':
+      return leftVal > rightVal;
+    case '>=':
+      return leftVal >= rightVal;
+    case '<<':
+      return leftVal << rightVal; // eslint-disable-line no-bitwise
+    case '>>':
+      return leftVal >> rightVal; // eslint-disable-line no-bitwise
+    case '>>>':
+      return leftVal >>> rightVal; // eslint-disable-line no-bitwise
+    case '+':
+      return leftVal + rightVal;
+    case '-':
+      return leftVal - rightVal;
+    case '*':
+      return leftVal * rightVal;
+    case '/':
+      return leftVal / rightVal;
+    case '%':
+      return leftVal % rightVal;
+    case '|':
+      return leftVal | rightVal; // eslint-disable-line no-bitwise
+    case '^':
+      return leftVal ^ rightVal; // eslint-disable-line no-bitwise
+    case '&':
+      return leftVal & rightVal; // eslint-disable-line no-bitwise
+    case 'in':
+      try {
+        return leftVal in rightVal;
+      } catch (err) {
+        return false;
+      }
+    case 'instanceof':
+      if (typeof rightVal !== 'function') {
+        return false;
+      }
+      return leftVal instanceof rightVal;
+    default:
+      return undefined;
+  }
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/BindExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/BindExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/BindExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromBindExpression;
+/**
+ * Extractor function for a BindExpression type value node.
+ * A bind expression looks like `::this.foo`
+ * This will return `this.foo.bind(this)` as the value to indicate its existence,
+ * since we can not execute the function this.foo.bind(this) in a static environment.
+ *
+ * @param - value - AST Value object with type `BindExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromBindExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var callee = getValue(value.callee);
+
+  // If value.object === null, the callee must be a MemberExpression.
+  // https://github.com/babel/babylon/blob/master/ast/spec.md#bindexpression
+  var object = value.object === null ? getValue(value.callee.object) : getValue(value.object);
+
+  if (value.object && value.object.property) {
+    return object + '.' + callee + '.bind(' + object + ')';
+  }
+
+  return callee + '.bind(' + object + ')';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/CallExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/CallExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/CallExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,23 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromCallExpression;
+/**
+ * Extractor function for a CallExpression type value node.
+ * A call expression looks like `bar()`
+ * This will return `bar` as the value to indicate its existence,
+ * since we can not execute the function bar in a static environment.
+ *
+ * @param - value - AST Value object with type `CallExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromCallExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var args = Array.isArray(value.arguments) ? value.arguments.map(function (x) {
+    return getValue(x);
+  }).join(', ') : '';
+  return '' + getValue(value.callee) + (value.optional ? '?.' : '') + '(' + args + ')';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/ChainExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/ChainExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/ChainExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromChainExpression;
+/**
+ * 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.
+ */
+function extractValueFromChainExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return getValue(value.expression || value);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/ConditionalExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/ConditionalExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/ConditionalExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,22 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromConditionalExpression;
+/**
+ * Extractor function for a ConditionalExpression type value node.
+ *
+ * @param - value - AST Value object with type `ConditionalExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromConditionalExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var test = value.test,
+      alternate = value.alternate,
+      consequent = value.consequent;
+
+
+  return getValue(test) ? getValue(consequent) : getValue(alternate);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/FunctionExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/FunctionExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/FunctionExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromFunctionExpression;
+/**
+ * Extractor function for a FunctionExpression type value node.
+ * Statically, we can't execute the given function, so just return a function
+ * to indicate that the value is present.
+ *
+ * @param - value - AST Value object with type `FunctionExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromFunctionExpression(value) {
+  return function () {
+    return value;
+  };
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/Identifier.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/Identifier.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/Identifier.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,35 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromIdentifier;
+var JS_RESERVED = {
+  Array: Array,
+  Date: Date,
+  Infinity: Infinity,
+  Math: Math,
+  Number: Number,
+  Object: Object,
+  String: String,
+  undefined: undefined
+};
+
+/**
+ * Extractor function for a Identifier type value node.
+ * An Identifier is usually a reference to a variable.
+ * Just return variable name to determine its existence.
+ *
+ * @param - value - AST Value object with type `Identifier`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromIdentifier(value) {
+  var name = value.name;
+
+
+  if (Object.hasOwnProperty.call(JS_RESERVED, name)) {
+    return JS_RESERVED[name];
+  }
+
+  return name;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/LogicalExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/LogicalExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/LogicalExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,33 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromLogicalExpression;
+/**
+ * Extractor function for a LogicalExpression type value node.
+ * A logical expression is `a && b` or `a || b`, so we evaluate both sides
+ * and return the extracted value of the expression.
+ *
+ * @param - value - AST Value object with type `LogicalExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromLogicalExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var operator = value.operator,
+      left = value.left,
+      right = value.right;
+
+  var leftVal = getValue(left);
+  var rightVal = getValue(right);
+
+  if (operator === '&&') {
+    return leftVal && rightVal;
+  }
+  if (operator === '??') {
+    // return leftVal ?? rightVal; // TODO: update to babel 7
+    return leftVal === null || typeof leftVal === 'undefined' ? rightVal : leftVal;
+  }
+  return leftVal || rightVal;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/MemberExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/MemberExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/MemberExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromMemberExpression;
+/**
+ * Extractor function for a MemberExpression type value node.
+ * A member expression is accessing a property on an object `obj.property`.
+ *
+ * @param - value - AST Value object with type `MemberExpression`
+ * @returns - The extracted value converted to correct type
+ *  and maintaing `obj.property` convention.
+ */
+function extractValueFromMemberExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return '' + getValue(value.object) + (value.optional ? '?.' : '.') + getValue(value.property);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/NewExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/NewExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/NewExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromNewExpression;
+/**
+ * Extractor function for a NewExpression type value node.
+ * A new expression instantiates an object with `new` keyword.
+ *
+ * @returns - an empty object.
+ */
+function extractValueFromNewExpression() {
+  return new Object(); // eslint-disable-line
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/ObjectExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/ObjectExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/ObjectExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,36 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromObjectExpression;
+
+var _object = require('object.assign');
+
+var _object2 = _interopRequireDefault(_object);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+/**
+ * Extractor function for an ObjectExpression type value node.
+ * An object expression is using {}.
+ *
+ * @returns - a representation of the object
+ */
+function extractValueFromObjectExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return value.properties.reduce(function (obj, property) {
+    // Support types: SpreadProperty and ExperimentalSpreadProperty
+    if (/^(?:Experimental)?Spread(?:Property|Element)$/.test(property.type)) {
+      if (property.argument.type === 'ObjectExpression') {
+        return (0, _object2.default)({}, obj, extractValueFromObjectExpression(property.argument));
+      }
+    } else {
+      return (0, _object2.default)({}, obj, _defineProperty({}, getValue(property.key), getValue(property.value)));
+    }
+    return obj;
+  }, {});
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/OptionalCallExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/OptionalCallExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/OptionalCallExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromOptionalCallExpression;
+/**
+ * Extractor function for a OptionalCallExpression type value node.
+ * A member expression is accessing a property on an object `obj.property` and invoking it.
+ *
+ * @param - value - AST Value object with type `OptionalCallExpression`
+ * @returns - The extracted value converted to correct type
+ *  and maintaing `obj.property?.()` convention.
+ */
+function extractValueFromOptionalCallExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return getValue(value.callee) + '?.(' + value.arguments.map(function (x) {
+    return getValue(x);
+  }).join(', ') + ')';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/OptionalMemberExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/OptionalMemberExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/OptionalMemberExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromOptionalMemberExpression;
+/**
+ * Extractor function for a OptionalMemberExpression type value node.
+ * A member expression is accessing a property on an object `obj.property`.
+ *
+ * @param - value - AST Value object with type `OptionalMemberExpression`
+ * @returns - The extracted value converted to correct type
+ *  and maintaing `obj?.property` convention.
+ */
+function extractValueFromOptionalMemberExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return getValue(value.object) + '?.' + getValue(value.property);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/SequenceExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/SequenceExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/SequenceExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromSequenceExpression;
+/**
+ * Extractor function for a SequenceExpression type value node.
+ * A Sequence expression is an object with an attribute named
+ * expressions which contains an array of different types
+ *  of expression objects.
+ *
+ * @returns - An array of the extracted elements.
+ */
+function extractValueFromSequenceExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return value.expressions.map(function (element) {
+    return getValue(element);
+  });
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/SpreadElement.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/SpreadElement.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/SpreadElement.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,17 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromSpreadElement;
+/**
+ * Extractor function for a SpreadElement type value node.
+ * We can't statically evaluate an array spread, so just return
+ * undefined.
+ *
+ * @param - value - AST Value object with type `SpreadElement`
+ * @returns - An prototypeless object.
+ */
+function extractValueFromSpreadElement() {
+  return undefined;
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/TSNonNullExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/TSNonNullExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/TSNonNullExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,100 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromTSNonNullExpression;
+var extractValueFromThisExpression = require('./ThisExpression').default;
+var extractValueFromCallExpression = require('./CallExpression').default;
+
+function navigate(obj, prop, value) {
+  if (value.computed) {
+    return value.optional ? obj + '?.[' + prop + ']' : obj + '[' + prop + ']';
+  }
+  return value.optional ? obj + '?.' + prop : obj + '.' + prop;
+}
+
+/**
+ * Extractor function for a TSNonNullExpression type value node.
+ * A TSNonNullExpression is accessing a TypeScript Non-Null Assertion
+ * Operator !
+ *
+ * @param - value - AST Value object with type `TSNonNullExpression`
+ * @returns - The extracted value converted to correct type
+ *  and maintaing `obj.property` convention.
+ */
+function extractValueFromTSNonNullExpression(value) {
+  // eslint-disable-next-line global-require
+  // const getValue = require('.').default;
+  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.';
+
+  // it's just the name
+  if (value.type === 'Identifier') {
+    var name = value.name;
+
+    return name;
+  }
+
+  if (value.type === 'Literal') {
+    return value.value;
+  }
+
+  if (value.type === 'TSAsExpression') {
+    return extractValueFromTSNonNullExpression(value.expression);
+  }
+
+  if (value.type === 'CallExpression') {
+    return extractValueFromCallExpression(value);
+  }
+
+  if (value.type === 'ThisExpression') {
+    return extractValueFromThisExpression();
+  }
+
+  // does not contains properties & is not parenthesized
+  if (value.type === 'TSNonNullExpression' && (!value.extra || value.extra.parenthesized === false)) {
+    var expression = value.expression;
+
+    return extractValueFromTSNonNullExpression(expression) + '!';
+  }
+
+  // does not contains properties & is parenthesized
+  if (value.type === 'TSNonNullExpression' && value.extra && value.extra.parenthesized === true) {
+    var _expression = value.expression;
+
+    return '(' + extractValueFromTSNonNullExpression(_expression) + '!' + ')';
+  }
+
+  if (value.type === 'MemberExpression') {
+    // contains a property & is not parenthesized
+    if (!value.extra || value.extra.parenthesized === false) {
+      return navigate(extractValueFromTSNonNullExpression(value.object), extractValueFromTSNonNullExpression(value.property), value);
+    }
+
+    // contains a property & is parenthesized
+    if (value.extra && value.extra.parenthesized === true) {
+      var result = navigate(extractValueFromTSNonNullExpression(value.object), extractValueFromTSNonNullExpression(value.property), value);
+      return '(' + result + ')';
+    }
+  }
+
+  // try to fail silently, if specs for TSNonNullExpression change
+  // not throw, only log error. Similar to how it was done previously
+  if (value.expression) {
+    var _expression2 = value.expression;
+
+    while (_expression2) {
+      if (_expression2.type === 'Identifier') {
+        // eslint-disable-next-line no-console
+        console.error(errorMessage);
+        return _expression2.name;
+      }
+      var _expression3 = _expression2;
+      _expression2 = _expression3.expression;
+    }
+  }
+
+  // eslint-disable-next-line no-console
+  console.error(errorMessage);
+  return '';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/TaggedTemplateExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/TaggedTemplateExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/TaggedTemplateExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromTaggedTemplateExpression;
+
+var _TemplateLiteral = require('./TemplateLiteral');
+
+var _TemplateLiteral2 = _interopRequireDefault(_TemplateLiteral);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/**
+ * Returns the string value of a tagged template literal object.
+ * Redirects the bulk of the work to `TemplateLiteral`.
+ */
+function extractValueFromTaggedTemplateExpression(value) {
+  return (0, _TemplateLiteral2.default)(value.quasi);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/TemplateLiteral.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/TemplateLiteral.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/TemplateLiteral.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,46 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromTemplateLiteral;
+function sortStarts(a, b) {
+  return (a.range ? a.range[0] : a.start) - (b.range ? b.range[0] : b.start);
+}
+
+/**
+ * Returns the string value of a template literal object.
+ * Tries to build it as best as it can based on the passed
+ * prop. For instance `This is a ${prop}` will return 'This is a {prop}'.
+ *
+ * If the template literal builds to undefined (`${undefined}`), then
+ * this should return "undefined".
+ */
+function extractValueFromTemplateLiteral(value) {
+  var quasis = value.quasis,
+      expressions = value.expressions;
+
+  var partitions = quasis.concat(expressions);
+
+  return partitions.sort(sortStarts).map(function (_ref) {
+    var type = _ref.type,
+        _ref$value = _ref.value;
+    _ref$value = _ref$value === undefined ? {} : _ref$value;
+    var raw = _ref$value.raw,
+        name = _ref.name;
+
+    if (type === 'TemplateElement') {
+      return raw;
+    }
+
+    if (type === 'Identifier') {
+      return name === 'undefined' ? name : '{' + name + '}';
+    }
+
+    if (type.indexOf('Expression') > -1) {
+      return '{' + type + '}';
+    }
+
+    return '';
+  }).join('');
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/ThisExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/ThisExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/ThisExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromThisExpression;
+/**
+ * Extractor function for a ThisExpression type value node.
+ * A this expression is using `this` as an identifier.
+ *
+ * @returns - 'this' as a string.
+ */
+function extractValueFromThisExpression() {
+  return 'this';
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/TypeCastExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/TypeCastExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/TypeCastExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromTypeCastExpression;
+/**
+ * Extractor function for a TypeCastExpression type value node.
+ * A type cast expression looks like `(this.handleClick: (event: MouseEvent) => void))`
+ * This will return the expression `this.handleClick`.
+ *
+ * @param - value - AST Value object with type `TypeCastExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromTypeCastExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  return getValue(value.expression);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/UnaryExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/UnaryExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/UnaryExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,39 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromUnaryExpression;
+/**
+ * Extractor function for a UnaryExpression type value node.
+ * A unary expression is an expression with a unary operator.
+ * For example, !"foobar" will evaluate to false, so this will return false.
+ *
+ * @param - value - AST Value object with type `UnaryExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromUnaryExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var operator = value.operator,
+      argument = value.argument;
+
+
+  switch (operator) {
+    case '-':
+      return -getValue(argument);
+    case '+':
+      return +getValue(argument); // eslint-disable-line no-implicit-coercion
+    case '!':
+      return !getValue(argument);
+    case '~':
+      return ~getValue(argument); // eslint-disable-line no-bitwise
+    case 'delete':
+      // I believe delete statements evaluate to true.
+      return true;
+    case 'typeof':
+    case 'void':
+    default:
+      return undefined;
+  }
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/UpdateExpression.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/UpdateExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/UpdateExpression.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,33 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = extractValueFromUpdateExpression;
+/**
+ * Extractor function for an UpdateExpression type value node.
+ * An update expression is an expression with an update operator.
+ * For example, foo++ will evaluate to foo + 1.
+ *
+ * @param - value - AST Value object with type `UpdateExpression`
+ * @returns - The extracted value converted to correct type.
+ */
+function extractValueFromUpdateExpression(value) {
+  // eslint-disable-next-line global-require
+  var getValue = require('.').default;
+  var operator = value.operator,
+      argument = value.argument,
+      prefix = value.prefix;
+
+
+  var val = getValue(argument);
+
+  switch (operator) {
+    case '++':
+      return prefix ? ++val : val++; // eslint-disable-line no-plusplus
+    case '--':
+      return prefix ? --val : val--; // eslint-disable-line no-plusplus
+    default:
+      return undefined;
+  }
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/expressions/index.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/expressions/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/expressions/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,288 @@
+'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 _JSXFragment = require('../JSXFragment');
+
+var _JSXFragment2 = _interopRequireDefault(_JSXFragment);
+
+var _JSXText = require('../JSXText');
+
+var _JSXText2 = _interopRequireDefault(_JSXText);
+
+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,
+  JSXFragment: _JSXFragment2.default,
+  JSXText: _JSXText2.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 an issue ( https://github.com/jsx-eslint/jsx-ast-utils/issues/new ) 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 (<div prop={null} /> 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,
+  JSXFragment: noop,
+  JSXText: 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,
+  ChainExpression: 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);
+}
Index: frontend/node_modules/jsx-ast-utils/lib/values/index.js
===================================================================
--- frontend/node_modules/jsx-ast-utils/lib/values/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsx-ast-utils/lib/values/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,76 @@
+'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 = getValue;
+exports.getLiteralValue = getLiteralValue;
+
+var _Literal = require('./Literal');
+
+var _Literal2 = _interopRequireDefault(_Literal);
+
+var _JSXElement = require('./JSXElement');
+
+var _JSXElement2 = _interopRequireDefault(_JSXElement);
+
+var _JSXText = require('./JSXText');
+
+var _JSXText2 = _interopRequireDefault(_JSXText);
+
+var _JSXFragment = require('./JSXFragment');
+
+var _JSXFragment2 = _interopRequireDefault(_JSXFragment);
+
+var _expressions = require('./expressions');
+
+var _expressions2 = _interopRequireDefault(_expressions);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// Composition map of types to their extractor functions.
+var TYPES = {
+  Literal: _Literal2.default,
+  JSXElement: _JSXElement2.default,
+  JSXExpressionContainer: _expressions2.default,
+  JSXText: _JSXText2.default,
+  JSXFragment: _JSXFragment2.default
+};
+
+// Composition map of types to their extractor functions to handle literals.
+var LITERAL_TYPES = _extends({}, TYPES, {
+  JSXElement: function JSXElement() {
+    return null;
+  },
+  JSXExpressionContainer: _expressions.extractLiteral
+});
+
+/**
+ * This function maps an AST value node
+ * to its correct extractor function for its
+ * given type.
+ *
+ * This will map correctly for *all* possible types.
+ *
+ * @param value - AST Value object on a JSX Attribute.
+ */
+function getValue(value) {
+  if (!TYPES[value.type]) console.log(value.type);
+  return TYPES[value.type](value);
+}
+
+/**
+ * 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 on a JSX Attribute.
+ */
+function getLiteralValue(value) {
+  return LITERAL_TYPES[value.type](value);
+}
