@javiercrowsoft/graffiti
Version:
Hapi plugin for GraphQL
109 lines (85 loc) • 3.19 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _graphql = require('graphql');
var _boom = require('boom');
var _util = require('../util');
var _package = require('../../package.json');
var _package2 = _interopRequireDefault(_package);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function accepts(_ref, type) {
var headers = _ref.headers;
return headers.accept && headers.accept.includes(type);
}
var plugin = {
register: function register(server) {
var _ref2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var _ref2$graphiql = _ref2.graphiql;
var graphiql = _ref2$graphiql === undefined ? true : _ref2$graphiql;
var _ref2$schema = _ref2.schema;
var schema = _ref2$schema === undefined ? (0, _util.required)() : _ref2$schema;
var _ref2$getSessionData = _ref2.getSessionData;
var getSessionData = _ref2$getSessionData === undefined ? (0, _util.required)() : _ref2$getSessionData;
var _ref2$authSettings = _ref2.authSettings;
var authSettings = _ref2$authSettings === undefined ? (0, _util.required)() : _ref2$authSettings;
var next = arguments[2];
var handler = function handler(request, reply) {
return getSessionData(request, reply, function (err) {
if (err) return reply(err);
var data = request.payload || request.query || {};
var query = data.query;
var variables = data.variables;
if (accepts(request, 'html') && graphiql) {
return reply((0, _util.renderGraphiQL)({ query: query, variables: variables }));
}
if (query && query.includes('mutation') && (0, _util.isGet)(request)) {
return reply((0, _boom.methodNotAllowed)('GraphQL mutation only allowed in POST request.'));
}
var parsedVariables = variables;
try {
parsedVariables = JSON.parse(variables);
} catch (err) {
// ignore
}
return (0, _graphql.graphql)(schema, query, request, request, parsedVariables).then(function (result) {
if (result.errors) {
// const message = result.errors.map((error) => error.message).join('\n');
// reply(badRequest(message));
// return;
result.errors = result.errors.map(function (error) {
return {
message: error.message,
locations: error.locations
};
});
}
reply(result);
}).catch(function (err) {
reply((0, _boom.badRequest)(err));
});
});
};
server.route({
method: 'POST',
path: '/graphql',
config: {
handler: handler,
auth: authSettings // { mode: 'try', strategy: 'session' }
}
});
if (graphiql) {
server.route({
method: 'GET',
path: '/graphql',
config: {
handler: handler,
auth: authSettings // { mode: 'try', strategy: 'session' }
}
});
}
next();
}
};
plugin.register.attributes = { pkg: _package2.default };
exports.default = plugin;