UNPKG

create-vite-apollo-fs

Version:

Generate a fullstack project using Apollo GraphQL (node.js, express), graphql-codegen for Types and React (vite)

72 lines (60 loc) 2.02 kB
// @ts-nocheck import { ApolloServer, BaseContext } from "@apollo/server"; import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer"; import { expressMiddleware } from "@as-integrations/express5"; import { makeExecutableSchema } from "@graphql-tools/schema"; import cors from "cors"; import express from "express"; import { readFileSync } from "fs"; import { useServer } from "graphql-ws/use/ws"; import { createServer } from "http"; import { WebSocketServer } from "ws"; import { resolvers } from "./resolvers"; const __dirname = new URL(".", import.meta.url).pathname; const app = express(); const httpServer = createServer(app); const wsServer = new WebSocketServer({ server: httpServer, path: "/subscriptions", }); const typeDefs = readFileSync(`${__dirname}/schema.graphql`, { encoding: "utf-8", }); const schema = makeExecutableSchema({ typeDefs, resolvers }); const serverCleanup = useServer({ schema }, wsServer); interface MyContext extends BaseContext { token?: String; } const server = new ApolloServer<MyContext>({ schema, plugins: [ ApolloServerPluginDrainHttpServer({ httpServer }), { async serverWillStart() { return { async drainServer() { await serverCleanup.dispose(); }, }; }, }, ], }); await server.start(); app.use( "/graphql", cors<cors.CorsRequest>(), express.json(), expressMiddleware(server, { context: async ({ req }) => ({ token: req.headers.token }), }) ); httpServer.listen(4000, () => { console.log(`🚀 Server ready at http://localhost:4000/graphql`); console.log(`🚀 Subscriptions ready at ws://localhost:4000/subscriptions`); }); // References: // - https://www.apollographql.com/docs/apollo-server/api/standalone // - https://www.apollographql.com/docs/apollo-server/builtin-plugins // - https://www.apollographql.com/docs/apollo-server/data/subscriptions // - https://www.apollographql.com/docs/apollo-server/api/express-middleware