code: function (node, name, expected) {
      {
        var propertyInfo = DOMProperty_1.getPropertyInfo(name);
        if (propertyInfo) {
          var mutationMethod = propertyInfo.mutationMethod;
          if (mutationMethod || propertyInfo.mustUseProperty) {
            return node[propertyInfo.propertyName];
          } else {
            var attributeName = propertyInfo.attributeName;
  
            var stringValue = null;
  
            if (propertyInfo.hasOverloadedBooleanValue) {
              if (node.hasAttribute(attributeName)) {
                var value = node.getAttribute(attributeName);
                if (value === '') {
                  return true;
                }
                if (shouldIgnoreValue(propertyInfo, expected)) {
                  return value;
                }
                if (value === '' + expected) {
                  return expected;
                }
                return value;
              }
            } else if (node.hasAttribute(attributeName)) {
              if (shouldIgnoreValue(propertyInfo, expected)) {
                // We had an attribute but shouldn't have had one, so read it
                // for the error message.
                return node.getAttribute(attributeName);
              }
              if (propertyInfo.hasBooleanValue) {
                // If this was a boolean, it doesn't matter what the value is
                // the fact that we have it is the same as the expected.
                return expected;
              }
              // Even if this property uses a namespace we use getAttribute
              // because we assume its namespaced name is the same as our config.
              // To use getAttributeNS we need the local name which we don't have
              // in our config atm.
              stringValue = node.getAttribute(attributeName);
            }
  
            if (shouldIgnoreValue(propertyInfo, expected)) {
              return stringValue === null ? expected : stringValue;
            } else if (stringValue === '' + expected) {
              return expected;
            } else {
              return stringValue;
            }
          }
        }
      }
    }
docs: Get the value for a property on a node. Only used in DEV for SSR validation.
  The "expected" argument is used as a hint of what the expected value is.
  Some properties have multiple equivalent values.