From 852fbc34b6687eb3c8511e5f97d0912023a81784 Mon Sep 17 00:00:00 2001 From: Gordy French Date: Thu, 12 Sep 2024 10:10:12 -0700 Subject: [PATCH] Improve edge resolver error messages Differential Revision: D62516826 fbshipit-source-id: 0bec759c1a16f64f5e18c2f52e3190fdf42d97eb --- packages/relay-runtime/store/RelayReader.js | 69 +++++-- .../store/__tests__/RelayReader-test.js | 58 +++++- ...ldsForFragmentsUserFriendsQuery.graphql.js | 180 ++++++++++++++++++ ...DataIsAvailableUserFriendsQuery.graphql.js | 154 +++++++++++++++ ...ngForConnectionUserFriendsQuery.graphql.js | 154 +++++++++++++++ ...issingInTheNodeUserFriendsQuery.graphql.js | 161 ++++++++++++++++ 6 files changed, 751 insertions(+), 25 deletions(-) create mode 100644 packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery.graphql.js create mode 100644 packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery.graphql.js create mode 100644 packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery.graphql.js create mode 100644 packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery.graphql.js diff --git a/packages/relay-runtime/store/RelayReader.js b/packages/relay-runtime/store/RelayReader.js index beee1a9f6a5b1..564fe4013b25e 100644 --- a/packages/relay-runtime/store/RelayReader.js +++ b/packages/relay-runtime/store/RelayReader.js @@ -840,12 +840,15 @@ class RelayReader { if (field.linkedField.plural) { invariant( Array.isArray(clientEdgeResolverResponse), - 'Expected plural Client Edge Relay Resolver to return an array containing IDs or objects with shape {id}.', + 'Expected plural Client Edge Relay Resolver at `%s` in `%s` to return an array containing IDs or objects with shape {id}.', + backingField.path, + this._owner.identifier, ); let storeIDs: $ReadOnlyArray; invariant( field.kind === 'ClientEdgeToClientObject', - 'Unexpected Client Edge to plural server type. This should be prevented by the compiler.', + 'Unexpected Client Edge to plural server type `%s`. This should be prevented by the compiler.', + field.kind, ); if (field.backingField.normalizationInfo == null) { // @edgeTo case where we need to ensure that the record has `id` field @@ -853,9 +856,15 @@ class RelayReader { const concreteType = field.concreteType ?? itemResponse.__typename; invariant( typeof concreteType === 'string', - 'Expected resolver modeling an edge to an abstract type to return an object with a `__typename` property.', + 'Expected resolver for field at `%s` in `%s` modeling an edge to an abstract type to return an object with a `__typename` property.', + backingField.path, + this._owner.identifier, + ); + const localId = extractIdFromResponse( + itemResponse, + backingField.path, + this._owner.identifier, ); - const localId = extractIdFromResponse(itemResponse); const id = this._resolverCache.ensureClientRecord( localId, concreteType, @@ -866,9 +875,11 @@ class RelayReader { const modelResolver = modelResolvers[concreteType]; invariant( modelResolver !== undefined, - `Invalid \`__typename\` returned by resolver. Expected one of ${Object.keys( - modelResolvers, - ).join(', ')} but got \`${concreteType}\`.`, + 'Invalid `__typename` returned by resolver at `%s` in `%s`. Expected one of %s but got `%s`.', + backingField.path, + this._owner.identifier, + Object.keys(modelResolvers).join(', '), + concreteType, ); const model = this._readResolverFieldImpl(modelResolver, id); return model != null ? id : null; @@ -877,7 +888,9 @@ class RelayReader { }); } else { // The normalization process in LiveResolverCache should take care of generating the correct ID. - storeIDs = clientEdgeResolverResponse.map(extractIdFromResponse); + storeIDs = clientEdgeResolverResponse.map(obj => + extractIdFromResponse(obj, backingField.path, this._owner.identifier), + ); } this._clientEdgeTraversalPath.push(null); const edgeValues = this._readLinkedIds( @@ -890,7 +903,11 @@ class RelayReader { data[fieldName] = edgeValues; return edgeValues; } else { - const id = extractIdFromResponse(clientEdgeResolverResponse); + const id = extractIdFromResponse( + clientEdgeResolverResponse, + backingField.path, + this._owner.identifier, + ); let storeID: DataID; const concreteType = field.concreteType ?? clientEdgeResolverResponse.__typename; @@ -899,7 +916,9 @@ class RelayReader { if (field.backingField.normalizationInfo == null) { invariant( typeof concreteType === 'string', - 'Expected resolver modeling an edge to an abstract type to return an object with a `__typename` property.', + 'Expected resolver for field at `%s` in `%s` modeling an edge to an abstract type to return an object with a `__typename` property.', + backingField.path, + this._owner.identifier, ); // @edgeTo case where we need to ensure that the record has `id` field storeID = this._resolverCache.ensureClientRecord(id, concreteType); @@ -921,14 +940,18 @@ class RelayReader { if (modelResolvers != null) { invariant( typeof concreteType === 'string', - 'Expected resolver modeling an edge to an abstract type to return an object with a `__typename` property.', + 'Expected resolver for field at `%s` in `%s` modeling an edge to an abstract type to return an object with a `__typename` property.', + backingField.path, + this._owner.identifier, ); const modelResolver = modelResolvers[concreteType]; invariant( modelResolver !== undefined, - `Invalid \`__typename\` returned by resolver. Expected one of ${Object.keys( - modelResolvers, - ).join(', ')} but got \`${concreteType}\`.`, + 'Invalid `__typename` returned by resolver at `%s` in `%s`. Expected one of %s but got `%s`.', + backingField.path, + this._owner.identifier, + Object.keys(modelResolvers).join(', '), + concreteType, ); const model = this._readResolverFieldImpl(modelResolver, storeID); if (model == null) { @@ -943,9 +966,10 @@ class RelayReader { const prevData = data[fieldName]; invariant( prevData == null || typeof prevData === 'object', - 'RelayReader(): Expected data for field `%s` on record `%s` ' + + 'RelayReader(): Expected data for field at `%s` in `%s` on record `%s` ' + 'to be an object, got `%s`.', - fieldName, + backingField.path, + this._owner.identifier, RelayModernRecord.getDataID(record), prevData, ); @@ -999,9 +1023,10 @@ class RelayReader { const prevData = data[fieldName]; invariant( prevData == null || typeof prevData === 'object', - 'RelayReader(): Expected data for field `%s` on record `%s` ' + + 'RelayReader(): Expected data for field `%s` at `%s` on record `%s` ' + 'to be an object, got `%s`.', fieldName, + this._owner.identifier, RelayModernRecord.getDataID(record), prevData, ); @@ -1437,7 +1462,11 @@ function getResolverValue( return [resolverResult, resolverError]; } -function extractIdFromResponse(individualResponse: mixed): string { +function extractIdFromResponse( + individualResponse: mixed, + path: string, + owner: string, +): string { if (typeof individualResponse === 'string') { return individualResponse; } else if ( @@ -1449,7 +1478,9 @@ function extractIdFromResponse(individualResponse: mixed): string { } invariant( false, - 'Expected object returned from an edge resolver to be a string or an object with an `id` property', + 'Expected object returned from edge resolver to be a string or an object with an `id` property at path %s in %s,', + path, + owner, ); } diff --git a/packages/relay-runtime/store/__tests__/RelayReader-test.js b/packages/relay-runtime/store/__tests__/RelayReader-test.js index d42ddff5702fe..84ac5df44516e 100644 --- a/packages/relay-runtime/store/__tests__/RelayReader-test.js +++ b/packages/relay-runtime/store/__tests__/RelayReader-test.js @@ -488,9 +488,15 @@ describe('RelayReader', () => { } } `; + const owner = createOperationDescriptor(UserFriends, {id: '1'}); const {data, seenRecords} = read( source, - createReaderSelector(UserFriends.fragment, ROOT_ID, {id: '1'}), + createReaderSelector( + UserFriends.fragment, + ROOT_ID, + {id: '1'}, + owner.request, + ), ); expect(data).toEqual({ node: { @@ -544,6 +550,13 @@ describe('RelayReader', () => { }, }; source = RelayRecordSource.create(records); + const UserQuery = graphql` + query RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery { + me { + ...RelayReaderTestReadsHandleFieldsForFragmentsUserFriends + } + } + `; const UserFriends = graphql` fragment RelayReaderTestReadsHandleFieldsForFragmentsUserFriends on User { friends(first: 1) @__clientField(handle: "bestFriends") { @@ -557,9 +570,10 @@ describe('RelayReader', () => { } } `; + const owner = createOperationDescriptor(UserQuery, {}); const {data, seenRecords} = read( source, - createReaderSelector(UserFriends, '1', {}), + createReaderSelector(UserFriends, '1', {}, owner.request), ); expect(data).toEqual({ friends: { @@ -746,9 +760,10 @@ describe('RelayReader', () => { }, }; source = RelayRecordSource.create(storeData); + const owner = createOperationDescriptor(BarQuery, {}); const {data, seenRecords, isMissingData} = read( source, - createReaderSelector(BarFragment, '1', {}), + createReaderSelector(BarFragment, '1', {}, owner.request), ); expect(data).toEqual({ id: '1', @@ -1192,6 +1207,14 @@ describe('RelayReader', () => { }); it('should have `isMissingData = false` if data is available', () => { + const UserQuery = graphql` + query RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery { + me { + ...RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends + } + } + `; + const UserFriends = graphql` fragment RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends on User { id @@ -1205,9 +1228,12 @@ describe('RelayReader', () => { } } `; + + const owner = createOperationDescriptor(UserQuery, {}); + const {data, isMissingData} = read( source, - createReaderSelector(UserFriends, '1', {}), + createReaderSelector(UserFriends, '1', {}, owner.request), ); expect(data.friends.edges).toEqual([ { @@ -1228,6 +1254,14 @@ describe('RelayReader', () => { }); it('should have `isMissingData = true` if data is missing in the node', () => { + const UserQuery = graphql` + query RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery { + me { + ...RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends + } + } + `; + const UserFriends = graphql` fragment RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends on User { id @@ -1242,9 +1276,11 @@ describe('RelayReader', () => { } } `; + + const owner = createOperationDescriptor(UserQuery, {}); const {data, isMissingData} = read( source, - createReaderSelector(UserFriends, '1', {}), + createReaderSelector(UserFriends, '1', {}, owner.request), ); expect(data.friends.edges).toEqual([ { @@ -1265,6 +1301,14 @@ describe('RelayReader', () => { }); it('should have `isMissingData = true` if data is missing for connection', () => { + const UserQuery = graphql` + query RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery { + me { + ...RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends + } + } + `; + const UserFriends = graphql` fragment RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends on User { id @@ -1278,9 +1322,11 @@ describe('RelayReader', () => { } } `; + + const owner = createOperationDescriptor(UserQuery, {}); const {data, isMissingData} = read( source, - createReaderSelector(UserFriends, '2', {}), + createReaderSelector(UserFriends, '2', {}, owner.request), ); expect(data.id).toBe('2'); expect(data.friends.edges).not.toBeDefined(); diff --git a/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery.graphql.js b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery.graphql.js new file mode 100644 index 0000000000000..870baba32c0db --- /dev/null +++ b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery.graphql.js @@ -0,0 +1,180 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @oncall relay + * + * @generated SignedSource<<3da2f5b9435639cb76f7c803e4954131>> + * @flow + * @lightSyntaxTransform + * @nogrep + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest, Query } from 'relay-runtime'; +import type { RelayReaderTestReadsHandleFieldsForFragmentsUserFriends$fragmentType } from "./RelayReaderTestReadsHandleFieldsForFragmentsUserFriends.graphql"; +export type RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery$variables = {||}; +export type RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery$data = {| + +me: ?{| + +$fragmentSpreads: RelayReaderTestReadsHandleFieldsForFragmentsUserFriends$fragmentType, + |}, +|}; +export type RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery = {| + response: RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery$data, + variables: RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery$variables, +|}; +*/ + +var node/*: ConcreteRequest*/ = (function(){ +var v0 = [ + { + "kind": "Literal", + "name": "first", + "value": 1 + } +], +v1 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "RelayReaderTestReadsHandleFieldsForFragmentsUserFriends" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + { + "alias": null, + "args": (v0/*: any*/), + "concreteType": "FriendsConnection", + "kind": "LinkedField", + "name": "friends", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "FriendsEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v1/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "name", + "storageKey": null + }, + { + "alias": null, + "args": null, + "filters": null, + "handle": "friendsName", + "key": "", + "kind": "ScalarHandle", + "name": "name" + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "friends(first:1)" + }, + { + "alias": null, + "args": (v0/*: any*/), + "filters": null, + "handle": "bestFriends", + "key": "", + "kind": "LinkedHandle", + "name": "friends" + }, + (v1/*: any*/) + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "04a9cda59f7028eff9df663725d00531", + "id": null, + "metadata": {}, + "name": "RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery", + "operationKind": "query", + "text": "query RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery {\n me {\n ...RelayReaderTestReadsHandleFieldsForFragmentsUserFriends\n id\n }\n}\n\nfragment RelayReaderTestReadsHandleFieldsForFragmentsUserFriends on User {\n friends(first: 1) {\n edges {\n cursor\n node {\n id\n name\n }\n }\n }\n}\n" + } +}; +})(); + +if (__DEV__) { + (node/*: any*/).hash = "2ac225f5ec97e79b7c664322027462a2"; +} + +module.exports = ((node/*: any*/)/*: Query< + RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery$variables, + RelayReaderTestReadsHandleFieldsForFragmentsUserFriendsQuery$data, +>*/); diff --git a/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery.graphql.js b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery.graphql.js new file mode 100644 index 0000000000000..a275780d7475a --- /dev/null +++ b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery.graphql.js @@ -0,0 +1,154 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @oncall relay + * + * @generated SignedSource<<7949315a649e3ddda87be498f46a167f>> + * @flow + * @lightSyntaxTransform + * @nogrep + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest, Query } from 'relay-runtime'; +import type { RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends$fragmentType } from "./RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends.graphql"; +export type RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery$variables = {||}; +export type RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery$data = {| + +me: ?{| + +$fragmentSpreads: RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends$fragmentType, + |}, +|}; +export type RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery = {| + response: RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery$data, + variables: RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery$variables, +|}; +*/ + +var node/*: ConcreteRequest*/ = (function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 3 + } + ], + "concreteType": "FriendsConnection", + "kind": "LinkedField", + "name": "friends", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "FriendsEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v0/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "friends(first:3)" + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "b1df23d18d90f111792745c7a373ee14", + "id": null, + "metadata": {}, + "name": "RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery", + "operationKind": "query", + "text": "query RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery {\n me {\n ...RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends\n id\n }\n}\n\nfragment RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriends on User {\n id\n friends(first: 3) {\n edges {\n cursor\n node {\n id\n }\n }\n }\n}\n" + } +}; +})(); + +if (__DEV__) { + (node/*: any*/).hash = "5c8e7c278a183816c699d12ac87c1d8c"; +} + +module.exports = ((node/*: any*/)/*: Query< + RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery$variables, + RelayReaderTestShouldHaveIsmissingdataFalseIfDataIsAvailableUserFriendsQuery$data, +>*/); diff --git a/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery.graphql.js b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery.graphql.js new file mode 100644 index 0000000000000..1066b8e878f6b --- /dev/null +++ b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery.graphql.js @@ -0,0 +1,154 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @oncall relay + * + * @generated SignedSource<<65b227d4e5c373ef846c22bb076e3c96>> + * @flow + * @lightSyntaxTransform + * @nogrep + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest, Query } from 'relay-runtime'; +import type { RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends$fragmentType } from "./RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends.graphql"; +export type RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery$variables = {||}; +export type RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery$data = {| + +me: ?{| + +$fragmentSpreads: RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends$fragmentType, + |}, +|}; +export type RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery = {| + response: RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery$data, + variables: RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery$variables, +|}; +*/ + +var node/*: ConcreteRequest*/ = (function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 2 + } + ], + "concreteType": "FriendsConnection", + "kind": "LinkedField", + "name": "friends", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "FriendsEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v0/*: any*/) + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "friends(first:2)" + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "c528c045e3d8ad2f2ff1dce0f213a19e", + "id": null, + "metadata": {}, + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery", + "operationKind": "query", + "text": "query RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery {\n me {\n ...RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends\n id\n }\n}\n\nfragment RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriends on User {\n id\n friends(first: 2) {\n edges {\n cursor\n node {\n id\n }\n }\n }\n}\n" + } +}; +})(); + +if (__DEV__) { + (node/*: any*/).hash = "3ca7efe977c8bd18c27ec28ba9d040f8"; +} + +module.exports = ((node/*: any*/)/*: Query< + RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery$variables, + RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingForConnectionUserFriendsQuery$data, +>*/); diff --git a/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery.graphql.js b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery.graphql.js new file mode 100644 index 0000000000000..ae368eb65a7be --- /dev/null +++ b/packages/relay-runtime/store/__tests__/__generated__/RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery.graphql.js @@ -0,0 +1,161 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @oncall relay + * + * @generated SignedSource<<04eebefbaf375908d1f9e84f8dee11d5>> + * @flow + * @lightSyntaxTransform + * @nogrep + */ + +/* eslint-disable */ + +'use strict'; + +/*:: +import type { ConcreteRequest, Query } from 'relay-runtime'; +import type { RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends$fragmentType } from "./RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends.graphql"; +export type RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery$variables = {||}; +export type RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery$data = {| + +me: ?{| + +$fragmentSpreads: RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends$fragmentType, + |}, +|}; +export type RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery = {| + response: RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery$data, + variables: RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery$variables, +|}; +*/ + +var node/*: ConcreteRequest*/ = (function(){ +var v0 = { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "id", + "storageKey": null +}; +return { + "fragment": { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + { + "args": null, + "kind": "FragmentSpread", + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends" + } + ], + "storageKey": null + } + ], + "type": "Query", + "abstractKey": null + }, + "kind": "Request", + "operation": { + "argumentDefinitions": [], + "kind": "Operation", + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery", + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "me", + "plural": false, + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": [ + { + "kind": "Literal", + "name": "first", + "value": 3 + } + ], + "concreteType": "FriendsConnection", + "kind": "LinkedField", + "name": "friends", + "plural": false, + "selections": [ + { + "alias": null, + "args": null, + "concreteType": "FriendsEdge", + "kind": "LinkedField", + "name": "edges", + "plural": true, + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "cursor", + "storageKey": null + }, + { + "alias": null, + "args": null, + "concreteType": "User", + "kind": "LinkedField", + "name": "node", + "plural": false, + "selections": [ + (v0/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "username", + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": null + } + ], + "storageKey": "friends(first:3)" + } + ], + "storageKey": null + } + ] + }, + "params": { + "cacheID": "181cf39858e38ab34c867bb9babe40ff", + "id": null, + "metadata": {}, + "name": "RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery", + "operationKind": "query", + "text": "query RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery {\n me {\n ...RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends\n id\n }\n}\n\nfragment RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriends on User {\n id\n friends(first: 3) {\n edges {\n cursor\n node {\n id\n username\n }\n }\n }\n}\n" + } +}; +})(); + +if (__DEV__) { + (node/*: any*/).hash = "a102208572f3af09ec9422e0d2071dc7"; +} + +module.exports = ((node/*: any*/)/*: Query< + RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery$variables, + RelayReaderTestShouldHaveIsmissingdataTrueIfDataIsMissingInTheNodeUserFriendsQuery$data, +>*/);