Migrating to 2.2.65 - graphql-utils depreciation
From 2.2.60 on, the @faststore/graphql-utils is officially deprecated. It was previously used internally by @faststore/core to handle GraphQL optimizations and GraphQL definitions.
The @faststore/graphql-utils has been replaced by open-source solutions maintained by the community that are now re-exported from @faststore/core. There are minor breaking changes on how developers should write GraphQL definitions and invoke queries and mutations, which were introduced in version 2.2.60.
The gql helper
Previously, it was possible to import the gql helper function directly from @faststore/graphql-utils - although it was not recommended. This will now throw an error. See the example below:
// src/fragments/ClientProduct.tsx
import { gql } from '@faststore/graphql-utils'
export const fragment = gql`
fragment ClientProduct on Query {
product(locator: $locator) {
id: productID
breadcrumbList {
itemListElement {
item
name
position
}
}
}
}
`The code above should be re-written to accomodate the changes in the gql helper, which should be imported from @faststore/core/api and be invoked as a function - with the argument between parentesis. This also applies to query and mutation definitions inside the components. See the re-written code below:
// src/fragments/ClientProduct.tsx
import { gql } from '@faststore/core/api'
export const fragment = gql(`
fragment ClientProduct on Query {
product(locator: $locator) {
id: productID
breadcrumbList {
itemListElement {
item
name
position
}
}
}
}
`)The useQuery hook
Another change was made on how queries and mutations were invoked. Previously, it was possible to invoke queries and mutations by using their names - such as MyCustomQuery in the example below - just by providing it to the useQuery hook. This is no longer possible, as queries and mutations are now invoked using more secure hashes which are randomly generated. Here's an example:
import { useQuery_unstable as useQuery } from '@faststore/core/experimental'
const query = gql(`
query MyCustomQuery {
customQuery() {
data
}
}
`)
// The useQuery call will now throw an error
function CustomComponent() {
// ...
const result = useQuery(`MyCustomQuery`, variables)
// ...
}To fix it, developers should pass the query or mutation object - result of the gql call - to useQuery directly.
import { gql } from '@faststore/core/api'
import { useQuery_unstable as useQuery } from '@faststore/core/experimental'
const query = gql(`
query MyCustomQuery {
customQuery() {
data
}
}
`)
// useQuery apropriately calls MyCustomQuery
function CustomComponent() {
// ...
const result = useQuery(query, variables)
// ...
}Calling a query or mutation defined by @faststore/core
Sometimes a custom component needs to call a query or mutation defined by @faststore/core, such as ClientManyProductsQuery. In those cases, developers should replace the useQuery hook call by a call to the specific hook for that query. The availability for such hooks is limited, and we're working to provide support for them. See the example below.
import { useClientManyProducts_unstable as useClientManyProducts } from '@faststore/core/experimental'
// ClientManyProductsQuery will be called with the variables passed by CustomComponent
function CustomComponent() {
// ...
const result = useClientManyProducts(variables)
// ...
}