packages/relay-runtime/util/ReaderNode.js (236 lines of code) (raw):
/**
* 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.
*
* @flow strict-local
* @format
*/
// flowlint ambiguous-object-type:error
'use strict';
import type {ConnectionMetadata} from '../handlers/connection/ConnectionHandler';
import type {ConcreteRequest} from './RelayConcreteNode';
export type ReaderFragmentSpread = {|
+kind: 'FragmentSpread',
+name: string,
+args?: ?$ReadOnlyArray<ReaderArgument>,
|};
export type ReaderInlineDataFragmentSpread = {|
+kind: 'InlineDataFragmentSpread',
+name: string,
+selections: $ReadOnlyArray<ReaderSelection>,
|};
export type ReaderFragment = {|
+kind: 'Fragment',
+name: string,
+type: string,
+abstractKey?: ?string,
+metadata?: ?{|
+connection?: $ReadOnlyArray<ConnectionMetadata>,
+mask?: boolean,
+plural?: boolean,
+refetch?: ReaderRefetchMetadata,
|},
+argumentDefinitions: $ReadOnlyArray<ReaderArgumentDefinition>,
+selections: $ReadOnlyArray<ReaderSelection>,
|};
// Marker type for a @refetchable fragment
export type ReaderRefetchableFragment = {|
...ReaderFragment,
+metadata: {|
+connection?: [ConnectionMetadata],
+refetch: ReaderRefetchMetadata,
|},
|};
// Marker Type for a @refetchable fragment with a single use of @connection
export type ReaderPaginationFragment = {|
...ReaderFragment,
+metadata: {|
+connection: [ConnectionMetadata],
+refetch: {|
...ReaderRefetchMetadata,
connection: ReaderPaginationMetadata,
|},
|},
|};
export type ReaderRefetchMetadata = {|
+connection?: ?ReaderPaginationMetadata,
+operation: string | ConcreteRequest,
+fragmentPathInResult: Array<string>,
+identifierField?: ?string,
|};
// Stricter form of ConnectionMetadata
export type ReaderPaginationMetadata = {|
+backward: {|
+count: string,
+cursor: string,
|} | null,
+forward: {|
+count: string,
+cursor: string,
|} | null,
+path: $ReadOnlyArray<string>,
|};
export type ReaderInlineDataFragment = {|
+kind: 'InlineDataFragment',
+name: string,
|};
export type ReaderArgument =
| ReaderListValueArgument
| ReaderLiteralArgument
| ReaderObjectValueArgument
| ReaderVariableArgument;
export type ReaderArgumentDefinition = ReaderLocalArgument | ReaderRootArgument;
export type ReaderCondition = {|
+kind: 'Condition',
+passingValue: boolean,
+condition: string,
+selections: $ReadOnlyArray<ReaderSelection>,
|};
export type ReaderClientExtension = {|
+kind: 'ClientExtension',
+selections: $ReadOnlyArray<ReaderSelection>,
|};
export type ReaderField =
| ReaderScalarField
| ReaderLinkedField
| ReaderRelayResolver
| ReaderRelayLiveResolver;
export type ReaderRootArgument = {|
+kind: 'RootArgument',
+name: string,
|};
export type ReaderInlineFragment = {|
+kind: 'InlineFragment',
+selections: $ReadOnlyArray<ReaderSelection>,
+type: string,
+abstractKey?: ?string,
|};
export type ReaderLinkedField = {|
+kind: 'LinkedField',
+alias?: ?string,
+name: string,
+storageKey?: ?string,
+args?: ?$ReadOnlyArray<ReaderArgument>,
+concreteType?: ?string,
+plural: boolean,
+selections: $ReadOnlyArray<ReaderSelection>,
|};
export type ReaderActorChange = {|
+kind: 'ActorChange',
+alias?: ?string,
+name: string,
+storageKey?: ?string,
+args?: ?$ReadOnlyArray<ReaderArgument>,
+fragmentSpread: ReaderFragmentSpread,
|};
export type ReaderModuleImport = {|
+args?: ?$ReadOnlyArray<ReaderArgument>,
+kind: 'ModuleImport',
+documentName: string,
+fragmentPropName: string,
+fragmentName: string,
|};
export type ReaderListValueArgument = {|
+kind: 'ListValue',
+name: string,
+items: $ReadOnlyArray<ReaderArgument | null>,
|};
export type ReaderLiteralArgument = {|
+kind: 'Literal',
+name: string,
+type?: ?string,
+value: mixed,
|};
export type ReaderLocalArgument = {|
+kind: 'LocalArgument',
+name: string,
+defaultValue: mixed,
|};
export type ReaderObjectValueArgument = {|
+kind: 'ObjectValue',
+name: string,
+fields: $ReadOnlyArray<ReaderArgument>,
|};
export type ReaderNode =
| ReaderCondition
| ReaderLinkedField
| ReaderFragment
| ReaderInlineFragment;
export type ReaderScalarField = {|
+kind: 'ScalarField',
+alias?: ?string,
+name: string,
+args?: ?$ReadOnlyArray<ReaderArgument>,
+storageKey?: ?string,
|};
export type ReaderFlightField = {|
+kind: 'FlightField',
+alias: ?string,
+name: string,
+args: ?$ReadOnlyArray<ReaderArgument>,
+storageKey: ?string,
|};
export type ReaderDefer = {|
+kind: 'Defer',
+selections: $ReadOnlyArray<ReaderSelection>,
|};
export type ReaderStream = {|
+kind: 'Stream',
+selections: $ReadOnlyArray<ReaderSelection>,
|};
export type RequiredFieldAction = 'NONE' | 'LOG' | 'THROW';
export type ReaderRequiredField = {|
+kind: 'RequiredField',
+field: ReaderField,
+action: RequiredFieldAction,
+path: string,
|};
export type ReaderRelayResolver = {|
+kind: 'RelayResolver',
+alias: ?string,
+name: string,
+fragment: ReaderFragmentSpread,
+path: string,
+resolverModule: (rootKey: {
+$data?: any, // flowlint-line unclear-type:off
+$fragmentSpreads: any, // flowlint-line unclear-type:off
+$fragmentRefs: any, // flowlint-line unclear-type:off
...
}) => mixed,
|};
export type ReaderRelayLiveResolver = {|
+kind: 'RelayLiveResolver',
+alias: ?string,
+name: string,
+fragment: ReaderFragmentSpread,
+path: string,
+resolverModule: (rootKey: {
+$data?: any, // flowlint-line unclear-type:off
+$fragmentSpreads: any, // flowlint-line unclear-type:off
+$fragmentRefs: any, // flowlint-line unclear-type:off
...
}) => mixed,
|};
export type ReaderClientEdgeToClientObject = {|
+kind: 'ClientEdgeToClientObject',
+concreteType: string,
+linkedField: ReaderLinkedField,
+backingField: ReaderRelayResolver | ReaderClientExtension,
|};
export type ReaderClientEdgeToServerObject = {|
+kind: 'ClientEdgeToServerObject',
+linkedField: ReaderLinkedField,
+operation: ConcreteRequest,
+backingField: ReaderRelayResolver | ReaderClientExtension,
|};
export type ReaderSelection =
| ReaderCondition
| ReaderClientEdgeToClientObject
| ReaderClientEdgeToServerObject
| ReaderClientExtension
| ReaderDefer
| ReaderField
| ReaderActorChange
| ReaderFlightField
| ReaderFragmentSpread
| ReaderInlineDataFragmentSpread
| ReaderInlineFragment
| ReaderModuleImport
| ReaderStream
| ReaderRequiredField
| ReaderRelayResolver;
export type ReaderVariableArgument = {|
+kind: 'Variable',
+name: string,
+type?: ?string,
+variableName: string,
|};