diff --git a/packages/examples/package.json b/packages/examples/package.json index 5b27961..fdfcd7c 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -24,8 +24,8 @@ "graphql": "^15.5.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-relay": "^17.0.0", - "relay-runtime": "^17.0.0" + "react-relay": "^18.0.0", + "relay-runtime": "^18.0.0" }, "devDependencies": { "@babel/core": "^7.20.2", @@ -54,11 +54,12 @@ "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@types/react-relay": "^16.0.0", - "@types/relay-runtime": "^17.0.0", + "@types/relay-runtime": "^18.0.0", "esbuild-loader": "^3.0.1", "monorepo-scripts": "*", "prop-types": "15.8.1", - "relay-compiler": "^17.0.0", + "relay-compiler": "^18.0.0", + "relay-test-utils": "^18.0.0", "storybook": "^7.6.19", "typescript": "^5.6.0" }, diff --git a/packages/examples/src/relay/Feedback/__generated__/FeedbackComponent_LikeMutation.graphql.ts b/packages/examples/src/relay/Feedback/__generated__/FeedbackComponent_LikeMutation.graphql.ts index 8555b48..ef7911c 100644 --- a/packages/examples/src/relay/Feedback/__generated__/FeedbackComponent_LikeMutation.graphql.ts +++ b/packages/examples/src/relay/Feedback/__generated__/FeedbackComponent_LikeMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<9e8cbc821d04a9dc43d1118707b7cece>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { ConcreteRequest, Mutation } from 'relay-runtime'; +import { ConcreteRequest } from 'relay-runtime'; export type FeedbackLikeInput = { doesViewerLike: boolean; feedbackId: string; diff --git a/packages/examples/src/relay/Feedback/__generated__/FeedbackContainerQuery.graphql.ts b/packages/examples/src/relay/Feedback/__generated__/FeedbackContainerQuery.graphql.ts index ad10e53..f2de9ff 100644 --- a/packages/examples/src/relay/Feedback/__generated__/FeedbackContainerQuery.graphql.ts +++ b/packages/examples/src/relay/Feedback/__generated__/FeedbackContainerQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { ConcreteRequest, Query } from 'relay-runtime'; +import { ConcreteRequest } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; export type FeedbackContainerQuery$variables = { id: string; diff --git a/packages/examples/src/relay/Feedback/__generated__/FeedbackStoryQuery.graphql.ts b/packages/examples/src/relay/Feedback/__generated__/FeedbackStoryQuery.graphql.ts index 2b336b1..05b4cfd 100644 --- a/packages/examples/src/relay/Feedback/__generated__/FeedbackStoryQuery.graphql.ts +++ b/packages/examples/src/relay/Feedback/__generated__/FeedbackStoryQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<25ffc163fef147c94d952bb9a33226e3>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { ConcreteRequest, Query } from 'relay-runtime'; +import { ConcreteRequest } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; export type FeedbackStoryQuery$variables = { id: string; diff --git a/packages/examples/src/relay/Feedback/__generated__/Feedback_feedbackFragment.graphql.ts b/packages/examples/src/relay/Feedback/__generated__/Feedback_feedbackFragment.graphql.ts index 871dee5..0f01e21 100644 --- a/packages/examples/src/relay/Feedback/__generated__/Feedback_feedbackFragment.graphql.ts +++ b/packages/examples/src/relay/Feedback/__generated__/Feedback_feedbackFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<9a9e9576834b9673626fc27f4e27f924>> + * @generated SignedSource<<63e21ec3b051b3e4642bf81fc2a9e0e3>> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { Fragment, ReaderFragment } from 'relay-runtime'; +import { ReaderFragment } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; export type Feedback_feedbackFragment$data = { readonly doesViewerLike: boolean; diff --git a/packages/examples/src/relay/pure-relay/Feedback.stories.tsx b/packages/examples/src/relay/pure-relay/Feedback.stories.tsx index 8ae5880..5b03ab7 100644 --- a/packages/examples/src/relay/pure-relay/Feedback.stories.tsx +++ b/packages/examples/src/relay/pure-relay/Feedback.stories.tsx @@ -2,13 +2,13 @@ import { graphql } from "react-relay"; import { getNovaDecorator, getNovaEnvironmentForStory, - MockPayloadGenerator as PayloadGenerator, type WithNovaEnvironment, EventingProvider, getOperationName, getOperationType, type StoryObjWithoutFragmentRefs, } from "@nova/react-test-utils/relay"; +import { MockPayloadGenerator } from "relay-test-utils"; import type { Meta } from "@storybook/react"; import { userEvent, waitFor, within, expect } from "@storybook/test"; import type { TypeMap } from "../../__generated__/schema.all.interface"; @@ -21,12 +21,24 @@ import { RecordSource, Store } from "relay-runtime"; const schema = getSchema(); -const MockPayloadGenerator = new PayloadGenerator(schema); const novaDecorator = getNovaDecorator(schema, { getEnvironmentOptions: () => ({ store: new Store(new RecordSource()), }), + // We add this to verify scenario of using relay's MockPayloadGenerator + generateFunction: (operation, mockResolvers) => { + const result = MockPayloadGenerator.generateWithDefer( + operation, + mockResolvers ?? null, + { + mockClientData: true, + generateDeferredPayload: true, + }, + ); + + return result; + }, }); const meta = { @@ -106,7 +118,7 @@ export const Like: Story = { const operation = mock.getMostRecentOperation(); await expect(operation).toBeDefined(); }); - await mock.resolveMostRecentOperation((operation) => { + mock.resolveMostRecentOperation((operation) => { return MockPayloadGenerator.generate(operation, likeResolvers); }); }, @@ -127,7 +139,7 @@ export const ArtificialFailureToShowcaseDecoratorBehaviorInCaseOfADevCausedError const operation = mock.getMostRecentOperation(); await expect(operation).toBeDefined(); }); - await mock.rejectMostRecentOperation(new Error("Query failed")); + mock.rejectMostRecentOperation(new Error("Query failed")); }, }; @@ -152,7 +164,7 @@ export const LikeFailure: Story = { const operationType = getOperationType(operation); expect(operationName).toEqual("FeedbackStoryRelayQuery"); expect(operationType).toEqual("query"); - await mock.resolveMostRecentOperation((operation) => { + mock.resolveMostRecentOperation((operation) => { return MockPayloadGenerator.generate(operation, { Feedback: () => sampleFeedback, }); @@ -168,7 +180,7 @@ export const LikeFailure: Story = { const nextOperationType = getOperationType(nextOperation); expect(nextOperationName).toEqual("FeedbackComponent_RelayLikeMutation"); expect(nextOperationType).toEqual("mutation"); - await mock.rejectMostRecentOperation(new Error("Like failed")); + mock.rejectMostRecentOperation(new Error("Like failed")); await container.findByText("Something went wrong"); }, }; diff --git a/packages/examples/src/relay/pure-relay/__generated__/FeedbackComponent_RelayLikeMutation.graphql.ts b/packages/examples/src/relay/pure-relay/__generated__/FeedbackComponent_RelayLikeMutation.graphql.ts index 95a6d97..3a97bf1 100644 --- a/packages/examples/src/relay/pure-relay/__generated__/FeedbackComponent_RelayLikeMutation.graphql.ts +++ b/packages/examples/src/relay/pure-relay/__generated__/FeedbackComponent_RelayLikeMutation.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<> + * @generated SignedSource<<1c15be7b18f58b4ef9382754b9ba1ad7>> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { ConcreteRequest, Mutation } from 'relay-runtime'; +import { ConcreteRequest } from 'relay-runtime'; export type FeedbackLikeInput = { doesViewerLike: boolean; feedbackId: string; diff --git a/packages/examples/src/relay/pure-relay/__generated__/FeedbackStoryRelayQuery.graphql.ts b/packages/examples/src/relay/pure-relay/__generated__/FeedbackStoryRelayQuery.graphql.ts index b58b020..69fa697 100644 --- a/packages/examples/src/relay/pure-relay/__generated__/FeedbackStoryRelayQuery.graphql.ts +++ b/packages/examples/src/relay/pure-relay/__generated__/FeedbackStoryRelayQuery.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<8ca401641ed05d5f1f3a338005137520>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { ConcreteRequest, Query } from 'relay-runtime'; +import { ConcreteRequest } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; export type FeedbackStoryRelayQuery$variables = { id: string; diff --git a/packages/examples/src/relay/pure-relay/__generated__/Feedback_feedbackRelayFragment.graphql.ts b/packages/examples/src/relay/pure-relay/__generated__/Feedback_feedbackRelayFragment.graphql.ts index b21abd1..9db4616 100644 --- a/packages/examples/src/relay/pure-relay/__generated__/Feedback_feedbackRelayFragment.graphql.ts +++ b/packages/examples/src/relay/pure-relay/__generated__/Feedback_feedbackRelayFragment.graphql.ts @@ -1,5 +1,5 @@ /** - * @generated SignedSource<<857e369af95fed51d17a8de7c72bbc62>> + * @generated SignedSource<> * @lightSyntaxTransform * @nogrep */ @@ -8,7 +8,7 @@ /* eslint-disable */ // @ts-nocheck -import { Fragment, ReaderFragment } from 'relay-runtime'; +import { ReaderFragment } from 'relay-runtime'; import { FragmentRefs } from "relay-runtime"; export type Feedback_feedbackRelayFragment$data = { readonly doesViewerLike: boolean; diff --git a/packages/nova-react-test-utils/README.md b/packages/nova-react-test-utils/README.md index c442530..4faa5ea 100644 --- a/packages/nova-react-test-utils/README.md +++ b/packages/nova-react-test-utils/README.md @@ -279,6 +279,56 @@ const meta = { The second parameter of `getNovaDecorator` is an `options` object of type `Partial` from `relay-test-utils`. +### (Pure relay or Nova with Relay) How can I make sure the mock data is generated for client extensions? + +The current default generator doesn't support client extensions. However, you can use the `generateFunction` option to provide your own generator. Here is an example of how you can use the `MockPayloadGenerator` from `relay-test-utils` to generate data for client extensions: + +```tsx +import { MockPayloadGenerator } from "relay-test-utils"; +import { getNovaDecorator } from "@nova/react-test-utils/relay"; + +const novaDecorator = getNovaDecorator(schema, { + generateFunction: (operation, mockResolvers) => { + const result = MockPayloadGenerator.generate( + operation, + mockResolvers ?? null, + { + mockClientData: true, // this makes sure data for client extensions is generated + }, + ); + + return result; + }, +}); +``` + +### (Pure relay or Nova with Relay) How can I make sure the mock data is generated with deferred payloads? + +The current default generator doesn't return deferred payloads. However, similarly as in example above you can use the `generateFunction` option to provide your own generator which does. + +```tsx +import { MockPayloadGenerator } from "relay-test-utils"; +import { getNovaDecorator } from "@nova/react-test-utils/relay"; + +const novaDecorator = getNovaDecorator(schema, { + getEnvironmentOptions: () => ({ + store: new Store(new RecordSource()), + }), + generateFunction: (operation, mockResolvers) => { + const result = MockPayloadGenerator.generateWithDefer( + operation, + mockResolvers ?? null, + { + mockClientData: true, + generateDeferredPayload: true, // this makes sure mock data is array of deferred payloads, not a single response + }, + ); + + return result; + }, +}); +``` + #### How can I mock query/mutation/subscription? - [Query example](../examples/src/relay/Feedback/FeedbackContainer.stories.ts#L30) @@ -306,7 +356,7 @@ graphql.mock.queueOperationResolver((operation) => { return MockPayloadGenerator.generate(operation); } }); -``` +```` #### Can I reuse the setup I made for stories somehow in unit tests? diff --git a/packages/nova-react-test-utils/package.json b/packages/nova-react-test-utils/package.json index 466834f..c3cde15 100644 --- a/packages/nova-react-test-utils/package.json +++ b/packages/nova-react-test-utils/package.json @@ -22,7 +22,8 @@ "react-relay": ">16", "relay-runtime": ">16", "relay-test-utils": ">16", - "@types/react-relay": ">16" + "@types/react-relay": ">16", + "@types/relay-test-utils": ">16" }, "peerDependenciesMeta": { "@apollo/client": { @@ -82,13 +83,13 @@ "@testing-library/react": "^15.0.0", "@types/jest": "^29.2.0", "@types/react-relay": "^16.0.0", - "@types/relay-test-utils": "^17.0.0", + "@types/relay-test-utils": "^18.0.0", "@types/react-test-renderer": "^18.3.0", "monorepo-scripts": "*", "react": "^18.3.1", - "react-relay": "^17.0.0", - "relay-runtime": "^17.0.0", - "relay-test-utils": "^17.0.0", + "react-relay": "^18.0.0", + "relay-runtime": "^18.0.0", + "relay-test-utils": "^18.0.0", "react-test-renderer": "^18.3.1" }, "repository": { diff --git a/packages/nova-react-test-utils/src/relay/storybook-nova-decorator-relay.tsx b/packages/nova-react-test-utils/src/relay/storybook-nova-decorator-relay.tsx index c3b0008..feed96e 100644 --- a/packages/nova-react-test-utils/src/relay/storybook-nova-decorator-relay.tsx +++ b/packages/nova-react-test-utils/src/relay/storybook-nova-decorator-relay.tsx @@ -9,15 +9,34 @@ import { novaGraphql } from "./nova-relay-graphql"; import { RelayMockPayloadGenerator } from "./test-utils"; import * as React from "react"; import { RelayEnvironmentProvider } from "react-relay"; -import { createMockEnvironment } from "relay-test-utils"; +import { + createMockEnvironment, + type MockPayloadGenerator, +} from "relay-test-utils"; import type { GraphQLSchema } from "graphql"; import type { ReactRenderer } from "@storybook/react"; import type { PlayFunctionContext } from "@storybook/types"; import type { NovaMockEnvironment } from "./nova-mock-environment"; import type { EnvironmentConfig } from "relay-runtime"; +// We need this as `generateWithDefer` is overloaded and we want to get most relaxed return type +type OverloadedReturnType = + T extends { (...args: any[]) : infer R; (...args: any[]) : infer R } ? R : + T extends (...args: any[]) => infer R ? R : any + +type GraphitationGenerateArgs = Parameters< + RelayMockPayloadGenerator["generate"] +>; + +// We put very relaxed constraints on the return type here, because we want users to be able to use +// Relay's payload generator for example for having returned deferred payloads or mocking client extensions, +// which doesn't work with graphitation's payload generator. +type RelayGenerateReturn = + | ReturnType<(typeof MockPayloadGenerator)["generate"]> + | OverloadedReturnType<(typeof MockPayloadGenerator)["generateWithDefer"]>; + type Options = { getEnvironmentOptions?: () => Partial } & { - generateFunction?: typeof RelayMockPayloadGenerator.prototype.generate; + generateFunction?: (...args: GraphitationGenerateArgs) => RelayGenerateReturn; }; export const getNovaRelayDecorator: ( diff --git a/packages/nova-react-test-utils/src/relay/test-utils.tsx b/packages/nova-react-test-utils/src/relay/test-utils.tsx index a3d70d7..118185f 100644 --- a/packages/nova-react-test-utils/src/relay/test-utils.tsx +++ b/packages/nova-react-test-utils/src/relay/test-utils.tsx @@ -19,7 +19,7 @@ export class RelayMockPayloadGenerator { public generate( operation: RelayOperationDescriptor, - mockResolvers?: MockResolvers, + mockResolvers?: MockResolvers | null, generateId?: () => number, ): ReturnType { if (!operation.request.node.params.text) { diff --git a/yarn.lock b/yarn.lock index ad3013f..cba7282 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1121,10 +1121,10 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.25.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== dependencies: regenerator-runtime "^0.14.0" @@ -3856,15 +3856,15 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/relay-runtime@*", "@types/relay-runtime@>16", "@types/relay-runtime@^17.0.0": - version "17.0.4" - resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-17.0.4.tgz#428526fc3e6dfb6e0a5730c38ad521cb1eea189b" - integrity sha512-fB77br4lXlBYM/HpI6VI6KCrj5pw0LiAnkZOkffjirNYso+dzXGWkeIm0G0MGszD8WY1et+r1Uj2TA6rscBXNQ== +"@types/relay-runtime@*", "@types/relay-runtime@>16", "@types/relay-runtime@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/relay-runtime/-/relay-runtime-18.0.0.tgz#d48dd4552ab480281a679c47d98fc02e304460f6" + integrity sha512-LK9NAw/WsdiMtQU+SxnhFd2bA6HfRsjniAENdznA8BKbGGvcMi0K8Gyq/XtoNmCMR9jxzO9rqFTksKkiXgsGYg== -"@types/relay-test-utils@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@types/relay-test-utils/-/relay-test-utils-17.0.0.tgz#a427470f26f808b4962c8d0a66c2d9af25db156e" - integrity sha512-q+Nq3RpJ4fKcRfJQTK/IvKg4cmrJkbboR8V4hxlEW5MkMTNqGCOJ4xlKagSTsLycovw3Eea6fNmmBSaMlKRwCw== +"@types/relay-test-utils@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/relay-test-utils/-/relay-test-utils-18.0.0.tgz#a3d86503bc6d27c039e721514c78259541658f23" + integrity sha512-sg++buiunZkj0MkL1/Q6w4p19ut3USC5BQnWJ1D4Bp4pNOrck4nhVDIyklm/ilVyM0wCbvROa5wL+nsYVo4Frw== dependencies: "@types/react" "*" "@types/react-relay" "*" @@ -9682,16 +9682,16 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-relay@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-17.0.0.tgz#1f8b6aefaa73b8af8378300d419289a57a6f94c9" - integrity sha512-Kn0CMiKZtWc+EisFPmzuZ53RtDeLlJO+EUVJwqxNkOs5g1jDjVi1v+k48kHeTyim2X43Rr0S2aeailllci5SgQ== +react-relay@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-relay/-/react-relay-18.1.0.tgz#fd19a6b786c251f4005423403d67cc3d5cc42c42" + integrity sha512-kqRbWid1A+B5HyvS05zwQacBhgWbIAlclTOO4CEWTwq0Sz00rZP1S9Bfcrl0ViImNKZHNa8+2I27409v9Sw1bQ== dependencies: - "@babel/runtime" "^7.0.0" + "@babel/runtime" "^7.25.0" fbjs "^3.0.2" invariant "^2.2.4" nullthrows "^1.1.1" - relay-runtime "17.0.0" + relay-runtime "18.1.0" react-remove-scroll-bar@^2.3.3: version "2.3.6" @@ -9907,10 +9907,10 @@ relay-compiler@^12.0.0: signedsource "^1.0.0" yargs "^15.3.1" -relay-compiler@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-17.0.0.tgz#5013e83267f45d78e24232ae7da90ed5ad3c1116" - integrity sha512-U2e/R0o40HJOQ13pwkvToqWqk6J3ASMyHmcxixVMZKfcwcpsTTOiKob215ZRh+4bqPwkNy97+V9CuzJ5hJmGtw== +relay-compiler@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-18.1.0.tgz#ae6f82a3c967d6e2bb35c4e7971acae0b6a36e47" + integrity sha512-DGWIORIij0TIys/Xd5W/iToqTv7UcN6fqCPDqwYhLnfU7ukdK8rpk7f6RCYvhyZG71e7a1b3TLGOQY8A3XE3yg== relay-runtime@12.0.0: version "12.0.0" @@ -9921,24 +9921,24 @@ relay-runtime@12.0.0: fbjs "^3.0.0" invariant "^2.2.4" -relay-runtime@17.0.0, relay-runtime@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-17.0.0.tgz#771084ea3b44f2f1eb578da861511a5558c4e07b" - integrity sha512-7b2R3G3DP7VHq7/1ltwQfYn3KkTHIB2NNt3KijIZoNQ73avwpOXBEL0MelSXwq8L+K8lcgAW5VAT7o0LUhnJPQ== +relay-runtime@18.1.0, relay-runtime@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-18.1.0.tgz#62f03669e70d499b6b7d688fa61780b312843bf9" + integrity sha512-C3Ct6mty9ZD93KnzHLP4mFw9T3zqPL5VwFaNPRvVgdJYSwQT2dfzWz1336fWwMgAXIQGZIqIjedeamjy6P4ZkA== dependencies: - "@babel/runtime" "^7.0.0" + "@babel/runtime" "^7.25.0" fbjs "^3.0.2" invariant "^2.2.4" -relay-test-utils@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/relay-test-utils/-/relay-test-utils-17.0.0.tgz#898a9bae9614a8b641eff04e597e4637322bd94f" - integrity sha512-u6mv7P1bmMP1Ex5uxSaUu0pJMXEs/0c8Y3LPHyfPTQ9LghMd6OtPP/45C2Z8vczMxhDIZivQM+8KwrjC25CwEg== +relay-test-utils@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/relay-test-utils/-/relay-test-utils-18.1.0.tgz#3fcfcc3af13ffc9dc854d373934e32a30f0212b4" + integrity sha512-gm0mnVsZq5vyRerGI0DQJDKAVBjuQJUPCHAtc1DQDjmUG/9xxadmCidCCqzjPBFyhYqj3kPKC86yJIMNpnpt0g== dependencies: - "@babel/runtime" "^7.0.0" + "@babel/runtime" "^7.25.0" fbjs "^3.0.2" invariant "^2.2.4" - relay-runtime "17.0.0" + relay-runtime "18.1.0" remark-external-links@^8.0.0: version "8.0.0"