$ npm install @n1ru4l/graphql-live-query
Primitives for adding GraphQL live query operation support to any GraphQL server.
For a usage of those utility functions check out InMemoryLiveQueryStore
(https://github.com/n1ru4l/graphql-live-queries/tree/main/packages/in-memory-live-query-store/src/InMemoryLiveQueryStore.ts).
yarn add -E @n1ru4l/graphql-live-query
GraphQLLiveDirective
Add the @live
directive to your schema.
import { GraphQLSchema, specifiedDirectives } from "graphql";
import { GraphQLLiveDirective } from "@n1ru4l/graphql-live-query";
import { query, mutation, subscription } from "./schema";
const schema = new GraphQLSchema({
query,
mutation,
subscription,
directives: [
GraphQLLiveDirective,
/* Keep @defer/@stream/@if/@skip */ ...specifiedDirectives,
],
});
Note: If you are using a SDL first approach for defining your schema (such as advocated by makeExecutableSchema
) you must add the directly to your type-definitions. In order to be as up to date as possible we recommend using graphql-tools/utils
astFromDirective
together with print
exported from graphql
for generating the SDL from GraphQLLiveDirective
.
Example (on CodeSandbox ):
import { makeExecutableSchema } from "@graphql-tools/schema";
import { astFromDirective } from "@graphql-tools/utils";
import { GraphQLLiveDirective } from "@n1ru4l/graphql-live-query";
import { print, GraphQLSchema } from "graphql";
const typeDefinitions = /* GraphQL */ `
type Query {
ping: Boolean
}
`;
const resolvers = {
Query: {
ping: () => true
}
};
const liveDirectiveTypeDefs = print(
astFromDirective(GraphQLLiveDirective)
);
export const schema = makeExecutableSchema({
typeDefs: [typeDefinitions, liveDirectiveTypeDefs],
resolvers
});
isLiveQueryOperationDefinitionNode
Determine whether a DefinitionNode
is a LiveQueryOperationDefinitionNode
.
import { parse, getOperationAST } from "graphql";
import { isLiveQueryOperationDefinitionNode } from "@n1ru4l/graphql-live-query";
const liveQueryOperationDefinitionNode = getOperationAST(
parse(/* GraphQL */ `
query @live {
me {
id
login
}
}
`)
);
isLiveQueryOperationDefinitionNode(liveQueryOperationDefinitionNode); // true
const queryOperationDefinitionNode = getOperationAST(
parse(/* GraphQL */ `
query {
me {
id
login
}
}
`)
);
isLiveQueryOperationDefinitionNode(queryOperationDefinitionNode); // false
const conditionalLiveQueryDefinitionNode = getOperationAST(
parse(/* GraphQL */ `
query($isClient: Boolean = false) @live(if: $isClient) {
me {
id
login
}
}
`)
);
isLiveQueryOperationDefinitionNode(conditionalLiveQueryDefinitionNode); // false
isLiveQueryOperationDefinitionNode(
conditionalLiveQueryDefinitionNode,
/* variables */ {
isClient: false,
}
); // false
isLiveQueryOperationDefinitionNode(
conditionalLiveQueryDefinitionNode,
/* variables */ {
isClient: true,
}
); // true
NoLiveMixedWithDeferStreamRule
Validation rule for raising a GraphQLError for a operation that use @live
mixed with @defer
and @stream
.
import { parse, validate, specifiedRules } from "graphql";
import { NoLiveMixedWithDeferStreamRule } from "@n1ru4l/graphql-live-query";
import schema from "./schema";
const document = parse(/* GraphQL */ `
query @live {
users @stream {
id
login
}
}
`);
const [error] = validate(schema, document, [
/* default validation rules */ ...specifiedRules,
NoLiveMixedWithDeferStreamRule,
]);
console.log(error); // [GraphQLError: Cannot mix "@stream" with "@live".]
© 2010 - cnpmjs.org x YWFE | Home | YWFE