GraphQL implementation for Whook servers
Brings GraphQL to your Whook server!
This module uses Apollo under the hood. Most of its concepts (modules, plugins...) applies to it.
Install the module and its dependencies in your project:
npm i @whook/graphql graphql-tag
Update the types (usually in src/whook.d.ts
):
+import type {
+ WhookGraphQLEnv,
+ WhookGraphQLConfig,
+} from '@whook/graphql';
// ...
declare module 'application-services' {
export interface AppEnvVars
extends BaseAppEnvVars,
WhookBaseEnv,
// (...)
+ WhookGraphQLEnv,
WhookSwaggerUIEnv {}
// (...)
export interface AppConfig
extends WhookBaseConfigs,
// (...)
+ WhookGraphQLConfig,
JWTServiceConfig {}
// ...
}
Declare the plugin into your src/index.ts
file:
+ import { gql } from 'graphql-tag';
+ import type { WhookGraphQLFragmentService } from '@whook/graphql';
// (...)
+ // Add the Apollo Server configuration
+ $.register(constant('GRAPHQL_SERVER_OPTIONS', {
+ csrfPrevention: true,
+ }));
// Setup your own whook plugins or avoid whook defaults by leaving it empty
$.register(
constant('WHOOK_PLUGINS', [
...WHOOK_DEFAULT_PLUGINS,
+ '@whook/graphql',
'@whook/cors',
]),
);
// ...
+ // Declare the GraphQL schema fragments
+ const helloFragment: WhookGraphQLFragmentService = {
+ typeDefs: gql`
+ type Query {
+ hello: String
+ }
+ schema {
+ query: Query
+ }
+ `,
+ resolvers: {
+ Query: {
+ hello: () => 'Hello world!',
+ },
+ },
+ };
+
+ $.register(
+ constant('graphQLFragments', [
+ helloFragment,
+ ]),
+ );
// (...)
The GraphQL fragments can be declared into separated services for more
readability, just create a service to gather them all (usually in
src/services/graphQLFragments.ts
):
import { initializer } from 'knifecycle';
export default initializer(
{
name: 'graphQLFragments',
type: 'service',
inject: ['graphQLUserFragment', 'graphQLMessageFragment'],
singleton: true,
},
async (services) => Object.keys(services).map((key) => services[key]),
);
See this repository tests for more examples.
Initialize the GraphQL service
Kind: global function
Returns: Promise
- A promise of a GraphQL service
Param | Type | Default | Description |
---|---|---|---|
services | Object |
The services the server depends on | |
services.ENV | Object |
The injected ENV value | |
[services.GRAPHQL_SERVER_OPTIONS] |
Object | function
|
The GraphQL options to pass to the server | |
ENV | String |
The process environment | |
[graphQLFragments] | String |
Fragments of GraphQL schemas/resolvers declaration | |
[services.log] | function |
noop |
A logging function |