code: function apivalueFromValue(value) {
    const composedValue = (componentKind) => {
      const elements = value[componentKind].map((it) => {
        const apiValue = apivalueFromValue(it);
        const value = apiValue && apiValue.value;
  
        return value;
      });
  
      return {
        type: value.type().toString(),
        value: elements
      };
    };
  
    if (value === null) {
      return null;
    }
    if (value.isInteger()) {
      return {
        type: i18n('TYPE:Integer'),
        value: value.asNumber()
      };
    } else if (value.isBoolean()) {
      return {
        type: i18n('TYPE:Bool'),
        value: boolFromValue(value)
      };
    } else if (value.isString()) {
      return {
        type: i18n('TYPE:String'),
        value: value.string
      };
    } else if (value.isTuple()) {
      return composedValue('components');
    } else if (value.isList()) {
      return composedValue('elements');
    } else if (value.isStructure()) {
      return {
        type: value.typeName,
        value: value.toString()
      };
    } else {
      return {
        type: value.type().toString(),
        value: value.toString()
      };
    }
  }
docs: /* Backwards-compatible type/value with special cases for some types