NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #3587 most downloaded on npm
Last release 7 days ago
29 Sep 2026
Release timing varies
gaps range from 8 days to 4 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
1820 releases · first in 2021
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
@graphql-yoga/redis-event-target@3.0.4
@graphql-yoga/redis-event-target@3.0.4
Nothing published for this version
@graphql-yoga/typed-event-target@3.0.3
Nothing published for this version
Nothing published for this version
071f946: Fix CommonJS TypeScript resolution with moduleResolution node16 or nodenext
moduleResolution node16 or nodenext22f5ccfb
Thanks @enisdenjo! - Plugins with context generic for correct
inheritanceNothing published for this version
Updated dependencies [787d28a2]
BREAKING CHANGE: Replace getDocumentStringFromContext with getDocumentString
887fc07: BREAKING Require the user to provide a session function by default.
Previously, using the response cache automatically used a global cache. For security reasons there is no longer a default value for the session config property. If you did not set the session function before and want a global cache that is shared by all users, you need to update your code to the following:
import { envelop } from '@envelop/core'
import { useResponseCache } from '@envelop/response-cache'
const getEnveloped = envelop({
plugins: [
// ... other plugins ...
useResponseCache({
// use global cache for all operations
session: () => null
})
]
})
Otherwise, you should return from your cache function a value that uniquely identifies the viewer.
import { envelop } from '@envelop/core'
import { useResponseCache } from '@envelop/response-cache'
const getEnveloped = envelop({
plugins: [
// ... other plugins ...
useResponseCache({
// return null as a fallback for caching the result globally
session: context => context.user?.id ?? null
})
]
})
a5d8dcb: Better default document string storage
Previously non parsed operation document was stored in the context with a symbol to be used "documentString" in the later. But this can be solved with a "WeakMap" so the modification in the context is no longer needed.
BREAKING CHANGE: Replace getDocumentStringFromContext with getDocumentString
However, some users might provide document directly to the execution without parsing it via parse. So in that case, we replaced the context parameter with the execution args including document, variableValues and contextValue to the new getDocumentString.
Now a valid document string should be returned from the new getDocumentString.
Custom document string caching example.
const myCache = new WeakMap<DocumentNode, string>()
// Let's say you keep parse results in somewhere else like below
function parseDocument(document: string): DocumentNode {
const parsedDocument = parse(document)
myCache.set(parsedDocument, document)
return parsedDocument
}
// Then you can interact with your existing caching solution inside the response cache plugin like below
useResponseCache({
getDocumentString(document: DocumentNode): string {
// You can also add a fallback to `graphql-js`'s print function
// to let the plugin works
const possibleDocumentStr = myCache.get(document)
if (!possibleDocumentStr) {
console.warn(`Something might be wrong with my cache setup`)
return print(document)
}
return possibleDocumentStr
}
})
Migration from getDocumentStringFromContext.
So if you use getDocumentStringFromContext like below before;
function getDocumentStringFromContext(contextValue: any) {
return contextValue.myDocumentString
}
You have to change it to the following;
import { print } from 'graphql'
function getDocumentString(executionArgs: ExecutionArgs) {
// We need to fallback to `graphql`'s print to return a value no matter what.
return executionArgs.contextValue.myDocumentString ?? print(executionArgs.document)
}
#1487
dc1e24b5
Thanks @saihaj! - Remove isIntrospectionQuery utility
#1487
dc1e24b5
Thanks @saihaj! - Remove async schema loading plugin. This was a
mistake from beginning as we cannot asynchronously validate and parse since with GraphQL.js
are synchronous in nature.
#1487
dc1e24b5
Thanks @saihaj! - Remove onResolverCalled
We decided to drop onResolverCalled hook and instead provide a new plugin that will let you hook into this phase.
import { parse, validate, execute, subscribe } from 'graphql'
import { envelop, Plugin, useEngine } from '@envelop/core'
+ import { useOnResolve } from '@envelop/on-resolve'
import { onResolverCalled } from './my-resolver'
function useResolve(): Plugin {
return {
- onResolverCalled: onResolverCalled,
+ onPluginInit: ({ addPlugin }) => {
+ addPlugin(useOnResolve(onResolverCalled))
+ },
}
}
const getEnveloped = envelop({
plugins: [
useEngine({ parse, validate, execute, subscribe }),
// ... other plugins ...
useResolve(),
],
});
#1487
dc1e24b5
Thanks @saihaj! - Drop useTiming plugin
This plugin was dependent on tracing the schema. As we no longer support wrap the schema out of the box we decided to drop this plugin.
#1487
dc1e24b5
Thanks @saihaj! - Remove isIntrospectionDocument utility
#1487
dc1e24b5
Thanks @saihaj! - Drop Node v12 support
Node.js v12 is no longer supported by the Node.js team. https://github.com/nodejs/Release/#end-of-life-releases
#1487
dc1e24b5
Thanks @saihaj! - Drop EnvelopError class
To keep the core agnostic from a specific implementation we no longer provide the EnvelopError
class.
#1487
dc1e24b5
Thanks @saihaj! - Remove useAsyncSchema plugin
This was a mistake from beginning as we cannot asynchronously validate and parse since with graphql these functions are synchronous in nature.
#1487
dc1e24b5
Thanks @saihaj! - Remove graphql as a peer dependency
We have built the new envelop to be engine agnostic. graphql-js is no longer a peer
dependency. Now you can use any spec compliant GraphQL engine with envelop and get the benefit
of building a plugin system. We have introduced a new plugin that can be used to customize the
GraphQL Engine.
- import { envelop } from '@envelop/core'
+ import { envelop, useEngine } from '@envelop/core'
+ import { parse, validate, execute, subscribe } from 'graphql';
- const getEnveloped = envelop([ ... ])
+ const getEnveloped = envelop({ plugins: [useEngine({ parse, validate, execute, subscribe })] })
Checkout the migration guide for more details.
#1487
dc1e24b5
Thanks @saihaj! - Rename useLazyLoadedSchema to
useSchemaByContext since the original name was vert misleading.
#1487
dc1e24b5
Thanks @saihaj! - Remove enableIf utility in favor of more type
safe way to conditionally enable plugins. It wasn't a great experience to have a utility
We can easily replace usage like this:
- import { envelop, useMaskedErrors, enableIf } from '@envelop/core'
+ import { envelop, useMaskedErrors } from '@envelop/core'
import { parse, validate, execute, subscribe } from 'graphql'
const isProd = process.env.NODE_ENV === 'production'
const getEnveloped = envelop({
parse,
validate,
execute,
subscribe,
plugins: [
// This plugin is enabled only in production
- enableIf(isProd, useMaskedErrors())
+ isProd && useMaskedErrors()
]
})
#1487
dc1e24b5
Thanks @saihaj! - Remove handleValidationErrors and
handleParseErrors options from useMaskedErrors.
ONLY masking validation errors OR ONLY disabling introspection errors does not make sense, as both can be abused for reverse-engineering the GraphQL schema (see https://github.com/nikitastupin/clairvoyance for reverse-engineering the schema based on validation error suggestions). https://github.com/n1ru4l/envelop/issues/1482#issue-1340015060
Rename formatError function option to maskError
#1487
dc1e24b5
Thanks @saihaj! - Removed orchestrator tracing
GraphQLSchema was wrapped to provide resolvers/fields tracing from the schema. Issue with this
approach was it was very specific to the underlying engine's implementation. With the new version
we no longer want to depend to a specific implementation. Now users can wrap their schemas and add
tracing themselves.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →