v4 (latest)
Plugins
TypeScript Support

TypeScript Support

If you are using TypeScript with envelop, you can leverage the ability to infer types and have complete type-safety.

For Plugin Developers

As a plugin developer, you can define the context properties you are contributing. This will make sure to follow across the execution of your plugin, and you can leverage type-safety across all hooks.

export const useMyPlugin = (): Plugin<{ myContext: string }> => {
  return {
    onParse({ context }) {
      // Here, context is typed as { myContext: string }
    },
    onExecute({ args }) {
      // Here, args.contextValue is typed as { myContext: string }
    }
  }
}

For Plugins Users

As a user of a plugin, you get type-inference based on the plugins that you use, for example:

import * as GraphQLJS from 'graphql'
import { envelop, useEngine } from '@envelop/core'
 
// At this point, the context known to envelop is `{ pluginA: string, pluginB: string }`
const getEnveloped = envelop({
  plugins: [
    useEngine(GraphQLJS),
    usePluginA(), // Defined with Plugin<{ pluginA: string }>
    usePluginB() // Defined with Plugin<{ pluginB: string }>
  ]
})
 
server.on('req', async (req, res) => {
  // At this point, the context known to envelop is `{ pluginA: string, pluginB: string, req: Http.IncomingRequest }`
  const { parse, validate, execute, schema, contextFactory } = getEnveloped({ req })
 
  // At this point, the context known to envelop is `{ pluginA: string, pluginB: string, req: Http.IncomingRequest, extra: boolean }`
  const context = await contextFactory({ extra: true })
})