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);
};
}