@powership/server
Version:
1 lines • 9.51 kB
Source Map (JSON)
{"version":3,"file":"graphqlHandler.mjs","names":["nodePath","createGraphQLSchema","isProduction","graphql","renderPlaygroundPage","ServerLogs","createRouteHandler","maskErrors","generateTypes","createGraphQLHandlers","definition","resolvers","path","playgroundAPIUrl","IS_PROD","resolversList","Object","values","schema","data","graphQLHandler","onRequest","request","response","close","method","assign","genPlaygroudResponse","operationName","query","variables","body","errors","contextValue","source","variableValues","statusCode","JSON","stringify","e","typesPath","join","mockPath","typesHandler","headers","append","mockHandler","html","title","endpoint","shareEnabled","settings","replace","console","error"],"sources":["../../src/graphql/graphqlHandler.ts"],"sourcesContent":["import nodePath from 'path';\n\nimport { createGraphQLSchema, Resolver } from '@powership/schema';\nimport { AnyRecord, isProduction } from '@powership/utils';\nimport { graphql } from 'graphql';\nimport { renderPlaygroundPage } from 'graphql-playground-html';\n\nimport { Handler } from '../Server';\nimport { ServerLogs } from '../ServerLogs';\nimport { createRouteHandler } from '../createRouteHandler';\n\nimport { maskErrors } from './errorHandler';\nimport { generateTypes } from './generateTypes';\n\nexport type ResolversRecord = Record<string, Resolver<any, any, any>>;\n\nexport type GraphqlHandlerOptions<Resolvers extends ResolversRecord> = {\n path?: string; // defaults to /api/graphql\n playgroundAPIUrl?: string; // defaults path value\n resolvers: Resolvers;\n};\n\nexport function createGraphQLHandlers<Resolvers extends ResolversRecord>(\n definition: GraphqlHandlerOptions<Resolvers>\n): Handler[] {\n const { resolvers, path = '/graphql', playgroundAPIUrl = path } = definition;\n\n const IS_PROD = isProduction();\n\n const resolversList = Object.values(resolvers);\n\n const schema = createGraphQLSchema(resolversList);\n maskErrors(schema);\n\n const data = { schema, resolvers, definition, resolversList } as const;\n\n const graphQLHandler = createRouteHandler(\n path,\n async function onRequest({ request, response, close }) {\n // Determine whether we should render GraphiQL instead of returning an API response\n if (request.method === 'GET') {\n Object.assign(response, genPlaygroudResponse(playgroundAPIUrl));\n close(response);\n return;\n } else if (request.method === 'POST') {\n const { operationName, query, variables } = request.body as AnyRecord;\n\n try {\n const { data, errors } = await graphql({\n contextValue: request,\n schema,\n source: query,\n variableValues: variables,\n operationName,\n });\n\n response.statusCode = 200;\n response.body = JSON.stringify({ data, errors });\n\n close(response);\n } catch (e) {\n close(500);\n }\n }\n },\n data\n );\n\n const typesPath = nodePath.join(path, 'types');\n const mockPath = nodePath.join(path, 'mock');\n\n const typesHandler = createRouteHandler(\n typesPath,\n async function ({ response, close }) {\n response.body = await generateTypes(schema);\n response.statusCode = 200;\n response.headers.append('Content-Type', 'text/typescript');\n return close(response);\n }\n );\n\n const mockHandler = createRouteHandler(\n mockPath,\n async function ({ response, close }) {\n if (IS_PROD) {\n response.statusCode = 'METHOD_NOT_ALLOWED';\n response.body = 'NOT_ALLOWED_IN_PRODUCTION';\n return close(response);\n }\n\n response.body = '';\n\n response.statusCode = 200;\n response.headers.append('Content-type', 'text/html');\n close(response);\n }\n );\n\n // const utilsHandler = createRouteHandler(\n // utilsPath,\n // async function ({ response, request, close }) {\n // const body: any = request.body;\n //\n // const json =\n // typeof body.json === 'string'\n // ? JSON.parse(body.json.trim())\n // : body.json || {};\n //\n // const page = await powershipUtilsResolver({\n // ...body,\n // json,\n // url: request.urlObject.pathname,\n // });\n //\n // response.body = page.body;\n // response.headers.set('Content-Type', page.headers['Content-Type']);\n // response.statusCode = page.statusCode;\n //\n // return close(response);\n // }\n // );\n\n return [\n // utilsHandler,\n typesHandler,\n mockHandler,\n graphQLHandler, //\n ];\n}\n\nfunction genPlaygroudResponse(playgroundAPIUrl: string) {\n let html = renderPlaygroundPage({\n title: 'GraphQL',\n endpoint: playgroundAPIUrl,\n // @ts-ignore\n // https://github.com/graphql/graphql-playground/pull/1401/files#\n shareEnabled: true,\n settings: {\n 'editor.cursorShape': 'line',\n 'editor.fontFamily':\n \"'Source Code Pro', 'Consolas', 'Inconsolata', 'Droid Sans Mono', 'Monaco', monospace\",\n 'editor.fontSize': 14,\n 'editor.reuseHeaders': true,\n 'editor.theme': 'dark',\n 'general.betaUpdates': false,\n // @ts-ignore\n 'prettier.printWidth': 80,\n 'prettier.tabWidth': 2,\n 'prettier.useTabs': false,\n 'request.credentials': 'include',\n 'request.globalHeaders': {},\n 'schema.disableComments': true,\n 'schema.polling.enable': true,\n 'schema.polling.endpointFilter': '*localhost*',\n 'schema.polling.interval': 10000,\n 'tracing.hideTracingResponse': true,\n 'tracing.tracingSupported': true,\n },\n });\n\n html = html.replace(\n '</body>',\n `\n window.addEventListener('load', function (event) {\n document.title = \"Playground\"\n });\n </body>`\n );\n\n try {\n return {\n body: html,\n statusCode: 200,\n headers: { 'Content-Type': 'text/html' },\n };\n } catch (e) {\n console.error(e);\n ServerLogs.error(e);\n return {\n body: 'INVALID_REQUEST',\n statusCode: 400,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}