Passer au contenu

Migration de v11 à v10

Ce chapitre fournit un ensemble de directives pour migrer de la version @nestjs/graphql 10 à 11. Dans le cadre de cette version majeure, nous avons mis à jour le pilote Apollo pour être compatible avec Apollo Server v4 (au lieu de v3). Note : il y a plusieurs changements de rupture dans Apollo Server v4 (en particulier autour des plugins et des packages de l’écosystème), donc vous devrez mettre à jour votre code en conséquence. Pour plus d’informations, consultez le guide de migration d’Apollo Server v4.

Packages Apollo

Au lieu d’installer le package apollo-server-express, vous devrez installer @apollo/server :

Fenêtre de terminal
$ npm uninstall apollo-server-express
$ npm install @apollo/server

Si vous utilisez l’adaptateur Fastify, vous devrez installer le package @as-integrations/fastify à la place :

Fenêtre de terminal
$ npm uninstall apollo-server-fastify
$ npm install @apollo/server @as-integrations/fastify

Packages Mercurius

Le passage vers Mercurius gateway n’est plus inclus dans le package mercurius. À la place, vous devrez installer le package @mercuriusjs/gateway séparément :

Fenêtre de terminal
$ npm install @mercuriusjs/gateway

De même, pour créer des schémas fédérés, vous devrez installer le package @mercuriusjs/federation :

Fenêtre de terminal
$ npm install @mercuriusjs/federation

Migrer de v10 à v9

Ce chapitre fournit un ensemble de directives pour migrer de la version @nestjs/graphql 9 à 10. L’objectif de cette version majeure est de fournir une bibliothèque centrale plus légère et agnostique par rapport à la plateforme.

Introduction des “packages” de pilote

Dans la dernière version, nous avons décidé de diviser le package @nestjs/graphql en plusieurs bibliothèques distinctes, vous permettant de choisir d’utiliser Apollo (@nestjs/apollo), Mercurius (@nestjs/mercurius), ou une autre bibliothèque GraphQL dans votre projet.

Cela implique que vous devez maintenant spécifier explicitement quel pilote votre application utilisera.

Avant
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
@Module({
imports: [
GraphQLModule.forRoot({
autoSchemaFile: 'schema.gql',
}),
],
})
export class AppModule {}
Après
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
@Module({
imports: [
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
autoSchemaFile: 'schema.gql',
}),
],
})
export class AppModule {}

Plugins

Les plugins Apollo Server vous permettent d’exécuter des opérations personnalisées en réponse à certains événements. Comme il s’agit d’une fonctionnalité exclusive à Apollo, nous l’avons déplacée du package @nestjs/graphql vers le nouveau package @nestjs/apollo, donc vous devrez mettre à jour les imports dans votre application.

Avant
import { Plugin } from '@nestjs/graphql';
Après
import { Plugin } from '@nestjs/apollo';

Directives

La fonctionnalité schemaDirectives a été remplacée par le nouvel API des directives de schéma dans la v8 du package @graphql-tools/schema.

Avant
import { SchemaDirectiveVisitor } from '@graphql-tools/utils';
import { defaultFieldResolver, GraphQLField } from 'graphql';
export class UpperCaseDirective extends SchemaDirectiveVisitor {
visitFieldDefinition(field: GraphQLField<any, any>) {
const { resolve = defaultFieldResolver } = field;
field.resolve = async function (...args) {
const result = await resolve.apply(this, args);
if (typeof result === 'string') {
return result.toUpperCase();
}
return result;
};
}
}
Après
import { getDirective, MapperKind, mapSchema } from '@graphql-tools/utils';
import { defaultFieldResolver, GraphQLSchema } from 'graphql';
export function upperDirectiveTransformer(
schema: GraphQLSchema,
directiveName: string,
) {
return mapSchema(schema, {
[MapperKind.OBJECT_FIELD]: (fieldConfig) => {
const upperDirective = getDirective(schema, fieldConfig, directiveName)?.[0];
if (upperDirective) {
const { resolve = defaultFieldResolver } = fieldConfig;
fieldConfig.resolve = async function (source, args, context, info) {
const result = await resolve(source, args, context, info);
if (typeof result === 'string') {
return result.toUpperCase();
}
return result;
};
}
return fieldConfig;
},
});
}

Pour appliquer cette implémentation de directive à un schéma contenant des directives @upper, utilisez la fonction transformSchema :

Implémentation de la directive
GraphQLModule.forRoot<ApolloDriverConfig>({
...
transformSchema: (schema) => upperDirectiveTransformer(schema, 'upper'),
});

Fédération

Le GraphQLFederationModule a été supprimé et remplacé par la classe de pilote correspondante :

Avant
GraphQLFederationModule.forRoot({
autoSchemaFile: true,
});
Après
GraphQLModule.forRoot<ApolloFederationDriverConfig>({
driver: ApolloFederationDriver,
autoSchemaFile: true,
});

De même, au lieu d’utiliser un GraphQLGatewayModule dédié, il suffit de passer la classe de pilote appropriée à vos paramètres GraphQLModule :

Passage à GraphQLModule
GraphQLModule.forRoot<ApolloGatewayDriverConfig>({
driver: ApolloGatewayDriver,
gateway: {
supergraphSdl: new IntrospectAndCompose({
subgraphs: [
{ name: 'users', url: 'http://localhost:3000/graphql' },
{ name: 'posts', url: 'http://localhost:3001/graphql' },
],
}),
},
});