/** * 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 * @format * @oncall relay */ 'use strict'; import type {$FragmentRef} from '../ReactRelayTypes'; import type {RelayModernFlowtest_badref} from './RelayModernFlowtest_badref.graphql'; import type {RelayModernFlowtest_notref} from './RelayModernFlowtest_notref.graphql'; import type { RelayModernFlowtest_user, RelayModernFlowtest_user$ref, } from './RelayModernFlowtest_user.graphql'; import type { RelayModernFlowtest_users, RelayModernFlowtest_users$ref, } from './RelayModernFlowtest_users.graphql'; const { createContainer: createFragmentContainer, } = require('../ReactRelayFragmentContainer'); const React = require('react'); const {graphql} = require('relay-runtime'); declare function nullthrows(x: ?T): T; class NotReferencedTest_ extends React.Component<{ notref: RelayModernFlowtest_notref, ... }> { render(): React.Node { return null; } } const NotReferencedTest = createFragmentContainer(NotReferencedTest_, { notref: graphql` fragment RelayModernFlowtest_notref on User { id ...RelayModernFlowtest_user } `, }); class BadReferenceTest_ extends React.Component<{ badref: RelayModernFlowtest_badref, ... }> { render(): React.Node { (this.props.badref.id: string); // $FlowExpectedError this.props.badref.name; // $FlowExpectedError The notref fragment was not used. return ; } } const BadReferenceTest = createFragmentContainer(BadReferenceTest_, { badref: graphql` fragment RelayModernFlowtest_badref on User { id # Note: this test includes a reference, but *not the right one*. ...RelayModernFlowtest_user } `, }); declare var someRef: $FragmentRef; ; class SingularTest extends React.Component<{ string: string, onClick: () => void, user: RelayModernFlowtest_user, nullableUser: ?RelayModernFlowtest_user, optionalUser?: RelayModernFlowtest_user, ... }> { render(): React.Node { (nullthrows(this.props.user.name): string); // $FlowExpectedError this.props.nullableUser.name; // $FlowExpectedError this.props.optionalUser.name; (nullthrows(nullthrows(this.props.nullableUser).name): string); (nullthrows(nullthrows(this.props.optionalUser).name): string); return null; } } const SingularTestFragment = createFragmentContainer(SingularTest, { user: graphql` fragment RelayModernFlowtest_user on User { name } `, }); class PluralTest extends React.Component<{ users: RelayModernFlowtest_users, nullableUsers: ?RelayModernFlowtest_users, optionalUsers?: RelayModernFlowtest_users, ... }> { render(): React.Node { const names = this.props.users.map(user => user.name).filter(Boolean); // $FlowExpectedError (names: Array); // $FlowExpectedError (names: Array); return null; } } const PluralTestFragment = createFragmentContainer(PluralTest, { users: graphql` fragment RelayModernFlowtest_users on User @relay(plural: true) { name } `, }); declare var aUserRef: { +$fragmentSpreads: RelayModernFlowtest_user$ref, ... }; declare var oneOfUsersRef: { +$fragmentSpreads: RelayModernFlowtest_users$ref, ... }; declare var usersRef: $ReadOnlyArray<{ +$fragmentSpreads: RelayModernFlowtest_users$ref, ... }>; declare var nonUserRef: { +$fragmentSpreads: {thing: true, ...}, ... }; function cb(): void {} ; // $FlowExpectedError - user is required ; ; ; ; ; ; ; // $FlowExpectedError - onClick is required ; declare var aComplexUserRef: { +$fragmentSpreads: {thing1: true, ...} & RelayModernFlowtest_user$ref & { thing2: true, ... }, ... }; ; // $FlowExpectedError - can't pass null for user ; // $FlowExpectedError - users is required ; // $FlowExpectedError - can't pass non-user refs for user ; ; )} nullableUsers={null} />; ; ; ; ; class AnyTest extends React.Component<{ anything: any, }> {} const AnyTestContainer = createFragmentContainer(AnyTest, {}); ; ; {}} />; // $FlowExpectedError - any other prop can not be passed ; // $FlowExpectedError - anything has to be passed ;