function rangeDelete()

in packages/relay-runtime/mutations/RelayDeclarativeMutationConfig.js [238:308]


function rangeDelete(
  config: RangeDeleteConfig,
  request: ConcreteRequest,
): ?SelectorStoreUpdater<mixed> {
  const {parentID, connectionKeys, pathToConnection, deletedIDFieldName} =
    config;
  if (!parentID) {
    warning(
      false,
      'RelayDeclarativeMutationConfig: For mutation config RANGE_DELETE ' +
        'to work you must include a parentID',
    );
    return null;
  }
  const rootField = getRootField(request);
  if (!rootField) {
    return null;
  }
  return (store: RecordSourceSelectorProxy, data: ?mixed) => {
    if (!data) {
      return;
    }
    const deleteIDs = [];
    // the type of data should come from a type parameter associated with ConcreteRequest,
    // but ConcreteRequest does not contain a type parameter. Hence, we use a FlowFixMe.
    // $FlowFixMe[incompatible-use] see above
    let deletedIDField = data[rootField];

    if (deletedIDField && Array.isArray(deletedIDFieldName)) {
      for (const eachField of deletedIDFieldName) {
        if (deletedIDField && typeof deletedIDField === 'object') {
          deletedIDField = deletedIDField[eachField];
        }
      }
      if (Array.isArray(deletedIDField)) {
        deletedIDField.forEach(idObject => {
          if (
            idObject &&
            idObject.id &&
            typeof idObject === 'object' &&
            typeof idObject.id === 'string'
          ) {
            deleteIDs.push(idObject.id);
          }
        });
      } else if (
        deletedIDField &&
        deletedIDField.id &&
        typeof deletedIDField.id === 'string'
      ) {
        deleteIDs.push(deletedIDField.id);
      }
    } else if (
      deletedIDField &&
      typeof deletedIDFieldName === 'string' &&
      typeof deletedIDField === 'object'
    ) {
      deletedIDField = deletedIDField[deletedIDFieldName];
      if (typeof deletedIDField === 'string') {
        deleteIDs.push(deletedIDField);
      } else if (Array.isArray(deletedIDField)) {
        deletedIDField.forEach(id => {
          if (typeof id === 'string') {
            deleteIDs.push(id);
          }
        });
      }
    }
    deleteNode(parentID, connectionKeys, pathToConnection, store, deleteIDs);
  };
}