in packages/relay-runtime/store/RelayModernSelector.js [68:135]
function getSingularSelector(
fragment: ReaderFragment,
item: mixed,
): ?SingularReaderSelector {
invariant(
typeof item === 'object' && item !== null && !Array.isArray(item),
'RelayModernSelector: Expected value for fragment `%s` to be an object, got ' +
'`%s`.',
fragment.name,
JSON.stringify(item),
);
const dataID = item[ID_KEY];
const fragments = item[FRAGMENTS_KEY];
const mixedOwner = item[FRAGMENT_OWNER_KEY];
const isWithinUnmatchedTypeRefinement =
item[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] === true;
const mixedClientEdgeTraversalPath = item[CLIENT_EDGE_TRAVERSAL_PATH];
if (
typeof dataID === 'string' &&
typeof fragments === 'object' &&
fragments !== null &&
typeof fragments[fragment.name] === 'object' &&
fragments[fragment.name] !== null &&
typeof mixedOwner === 'object' &&
mixedOwner !== null &&
(mixedClientEdgeTraversalPath == null ||
Array.isArray(mixedClientEdgeTraversalPath))
) {
const owner: RequestDescriptor = (mixedOwner: $FlowFixMe);
const clientEdgeTraversalPath: ?ClientEdgeTraversalPath =
(mixedClientEdgeTraversalPath: $FlowFixMe);
const argumentVariables = fragments[fragment.name];
const fragmentVariables = getFragmentVariables(
fragment,
owner.variables,
argumentVariables,
);
return createReaderSelector(
fragment,
dataID,
fragmentVariables,
owner,
isWithinUnmatchedTypeRefinement,
clientEdgeTraversalPath,
);
}
if (__DEV__) {
let stringifiedItem = JSON.stringify(item);
if (stringifiedItem.length > 499) {
stringifiedItem = stringifiedItem.substr(0, 498) + '\u2026';
}
warning(
false,
'RelayModernSelector: Expected object to contain data for fragment `%s`, got ' +
'`%s`. Make sure that the parent operation/fragment included fragment ' +
'`...%s` without `@relay(mask: false)`.',
fragment.name,
stringifiedItem,
fragment.name,
);
}
return null;
}