Skip to content

homebound-team/graphql-typescript-scalar-type-policies

Repository files navigation

NPM

This is a graphql-code-generator plugin that generates type policies for every field that uses custom scalars.

Overview

Given a config like:

generates:
  integration/graphql-types.ts:
    config:
      scalars:
        Date: "src/dates#Date"
      scalarTypePolicies:
        Date: "src/dates#dateTypePolicy"

And a schema that uses Date fields:

scalar Date

type Author {
    name: String!
    date: Date
}

This plugin generates the following snippet in the output file:

import { dateTypePolicy } from "src/dates";

export const scalarTypePolicies = {
  Author: { fields: { date: dateTypePolicy } },
};

Where the dateTypePolicy const should implement the Apollo Client FieldPolicy.

Which you can then pass to Apollo's InMemoryCache:

new InMemoryCache({ typePolicies: scalarTypePolicies })

And you can implement a field policy like:

export const dateTypePolicy: FieldPolicy<Date, string> = {
  merge: (_, incoming) => {
    if (isNullOrUndefined(incoming)) {
      // It's important for these methods to return null if passed null
      return incoming;
    } else if (incoming instanceof Date) {
      // In tests our mocks already have Date
      return incoming;
    } else {
      return parseISO(incoming as string);
    }
  },
};

Note that this will handle reading data from the cache; to handle submitting custom scalars (i.e. Date) as variables / input to mutations, your custom scalars should implement toJSON(), which Apollo will implicitly calls when putting them on the wire.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published