defineProperty static method

void defineProperty(
  1. dynamic value,
  2. dynamic key,
  3. JSPropertyDescriptor descriptor
)

Implementation

static void defineProperty(
    dynamic value, dynamic key, JSPropertyDescriptor descriptor) {
  if (value is! Map) {
    throw InvalidPropertyException(
        'Object.defineProperty target must be a map/object');
  }
  key = _normalizeProperty(key);
  final descriptors = _descriptors(value);
  final existing = descriptors[key];
  if (existing != null) {
    final merged = JSPropertyDescriptor(
      get: descriptor.get ?? existing.get,
      set: descriptor.set ?? existing.set,
      writable:
          descriptor.hasWritable ? descriptor.writable : existing.writable,
      enumerable: descriptor.hasEnumerable
          ? descriptor.enumerable
          : existing.enumerable,
      configurable: descriptor.hasConfigurable
          ? descriptor.configurable
          : existing.configurable,
      hasWritable: true,
      hasEnumerable: true,
      hasConfigurable: true,
    );
    if (descriptor.hasValue || existing.hasValue) {
      merged.value = descriptor.hasValue ? descriptor.value : existing.value;
      merged.hasValue = true;
    }
    descriptor = merged;
  }
  descriptors[key] = descriptor;
  if (!descriptor.isAccessor) {
    value[key] = descriptor.value;
  }
}