1
0
mirror of https://github.com/tcgdex/cards-database.git synced 2025-04-24 03:42:13 +00:00

66 lines
1.9 KiB
TypeScript

import express from 'express'
import fs from 'node:fs'
import { buildSchema, type GraphQLError } from 'graphql'
import { createHandler } from 'graphql-http/lib/use/express'
import { type ruruHTML as RuruHTML } from 'ruru/dist/server'
/** @ts-expect-error typing is not correctly mapped (real type at ruru/dist/server.d.ts) */
import { makeHTMLParts, ruruHTML as tmp } from 'ruru/server'
import resolver from './resolver'
const ruruHTML: typeof RuruHTML = tmp
// Init Express Router
const router = express.Router()
/**
* Drawbacks
* Attack.damage is a string instead of possibly being a number or a string
*/
const schema = buildSchema(fs.readFileSync('./public/v2/graphql.gql', 'utf-8'))
// Error Logging for debugging
function graphQLErrorHandle(error: Readonly<GraphQLError | Error>) {
if (process.env.NODE_ENV !== 'production') {
console.error(error)
}
if (!('source' in error)) {
const columns = (process?.stdout?.columns ?? 32) - 7
const dashes = ''.padEnd(columns / 2, '-')
console.error(`\x1b[91m${dashes} ERROR ${dashes}\x1b[0m`)
console.error('GraphQL Error')
console.error(error.message)
console.error(`\x1b[91m${dashes} ERROR ${dashes}\x1b[0m`)
} else if (error.source) {
const columns = (process?.stdout?.columns ?? 32) - 7
const dashes = ''.padEnd(columns / 2, '-')
console.error(`\x1b[91m${dashes} ERROR ${dashes}\x1b[0m`)
console.error('GraphQL Error')
console.error(error.message)
console.error(error.source?.body)
console.error(`\x1b[91m${dashes} ERROR ${dashes}\x1b[0m`)
}
return error
}
const graphql = createHandler({
schema: schema,
rootValue: resolver,
formatError: graphQLErrorHandle
})
// Add graphql to the route
router.get('/', (_, res) => {
res.type('html')
res.end(ruruHTML({ endpoint: '/v2/graphql' }, {
...makeHTMLParts(),
titleTag: '<title>GraphiQL - TCGdex API V2</title>'
}))
})
router.post('/', graphql)
export default router