skm_ts

Generate typescript types from your graphql schema gql files.

Usage no npm install needed!

<script type="module">
  import skmTs from 'https://cdn.skypack.dev/skm_ts';
</script>

README

skm_ts

Generate typescript types from your graphql schema gql files.

Usage

> npm i -g skm_ts
> skm_ts --help

  Generate typescript types from your graphql schema gql files.

  Usage
    $ skm_ts ./*.gql -s Json:object -o ./src/skm.ts

  Options
    --scalar, -s  Define Graphql scalar type to TS type.(eg: Json:object)
    --output, -o  The output typescript file path
    --help        Print this help

It will transform from

scalar Date
scalar Json

enum Publisher {
  COLUMBIA_UNIVERSITY_PRESS
  NANJING_UNIVERSITY_PRESS
  XXX_PRESS
}

type Book {
  id: ID!
  title: String!
  publisher: Publisher!
  author: Person!
}

type Person {
  id: ID!
  name: String!
  books(title_like: String, publisher: Publisher, offset: Int!=0, limit: Int!=20): [Book!]!
}

type Query {
  books(author_id: ID, title_like: String, publisher: Publisher, offset: Int!=0, limit: Int!=20): [Book!]!
  persons(name_like: String, offset: Int!=0, limit: Int!=20): [Person!]!
}

type Mutation {
  add_person(name: String!): Person!
  add_book(title: String!, publisher: Publisher!, author_id: ID!): Book!
}

schema {
  query: Query
  mutation: Mutation
}

to

export enum Publisher {
  COLUMBIA_UNIVERSITY_PRESS="COLUMBIA_UNIVERSITY_PRESS",
  NANJING_UNIVERSITY_PRESS="NANJING_UNIVERSITY_PRESS",
  XXX_PRESS="XXX_PRESS",
}

export namespace Mutation {

  export interface add_book {
    author_id: string;
    publisher: Publisher;
    title: string;
  }
  
  export interface add_person {
    name: string;
  }
  
}

export namespace Person {

  export interface books {
    limit: number;
    offset: number;
    publisher: Publisher | null;
    title_like: string | null;
  }
  
}

export namespace Query {

  export interface books {
    author_id: string | null;
    limit: number;
    offset: number;
    publisher: Publisher | null;
    title_like: string | null;
  }
  
  export interface persons {
    limit: number;
    name_like: string | null;
    offset: number;
  }
  
}

Or you can view test/*.gql files and test/test.ts to see what types it will generate.

Then, in your resolver:

// skm_ts schema.gql -s Json:object -o src/skm.ts
import * as skm from './skm.ts';

const Mutation = {
  add_book: async (root, args: skm.Mutation.add_book, ctx) => {
    // args has right type
  },
  add_person: async (root, args: skm.Mutation.add_person, ctx) => {
    // args has right type
  },
}