@whook/graphql
TypeScript icon, indicating that this package has built-in type declarations

16.1.0 • Public • Published

@whook/graphql

GraphQL implementation for Whook servers

GitHub license

Brings GraphQL to your Whook server!

This module uses Apollo under the hood. Most of its concepts (modules, plugins...) applies to it.

Quick setup

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.

API

initGraphQL(services, ENV, [graphQLFragments]) ⇒ Promise

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

Authors

License

MIT

Package Sidebar

Install

npm i @whook/graphql

Weekly Downloads

3

Version

16.1.0

License

MIT

Unpacked Size

153 kB

Total Files

23

Last publish

Collaborators

  • nfroidure