Skip to content

timkendall/tql

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
src
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

TQL

๐Ÿšง We are getting close to 1.0 but this is still pre-production software at this point, see the current limitations.

tql is a TypeScript GraphQL query builder.

  • ๐Ÿ”’ Fully Type-safe - Operation results and variables are fully type-safe thanks to TypeScript's advanced type-system.
  • ๐Ÿ”Œ Backendless: - Integrate with any GraphQL client to execute queries.
  • ๐Ÿ”ฎ Automatic Variables: - Variable definitions are automatically derived based on usage.
  • ๐Ÿ“ Inline Documentation: JSDoc comments provide descriptions and deprecation warnings for fields directly in your editor.
  • โšก Single Dependency: graphql-js is our single runtime (peer) dependency.

Try it Out

Try out our pre-compiled Star Wars GraphQL SDK on CodeSandbox!

Installation

  1. npm install @timkendall/tql@beta

  2. Generate an SDK with npx @timkendall/tql-gen <schema> -o sdk.ts

<schema> can be a path to local file or an http endpoint url.

Usage

Import selector functions to start defining queries ๐ŸŽ‰

import { useQuery } from '@apollo/client'

// SDK generated in previous setup
import { character, query, $ } from './starwars'

// define reusable selections
const CHARACTER = character(t => [
  t.id(),
  t.name(),
  t.appearsIn(),
])

const QUERY = query((t) => [
  t.reviews({ episode: Episode.EMPIRE }, (t) => [
    t.stars(),
    t.commentary(),
  ]),

  t.human({ id: $('id') }, (t) => [
    t.__typename(),
    t.id(),
    t.name(),
    t.appearsIn(),
    t.homePlanet(),

    // deprecated field should be properly picked-up by your editor
    t.mass(),

    t.friends((t) => <const>[
      t.__typename(),
      
      ...CHARACTER,
      // or
      CHARACTER.toInlineFragment(),

      t.on("Human", (t) => [t.homePlanet()]),
      t.on("Droid", (t) => [t.primaryFunction()]),
    ]),

    t.starships((t) => [t.id(), t.name()]),
  ]),
]).toQuery({ name: 'Example' })

// type-safe result and variables ๐Ÿ‘
const { data } = useQuery(QUERY, { variables: { id: '1011' }})

Inspiration

I was inspired by the features and DSL's of graphql-nexus, graphql_ppx, gqless, and caliban.

License

MIT