New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

graphi

Package Overview
Dependencies
Maintainers
1
Versions
37
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

graphi - npm Package Compare versions

Comparing version 4.1.0 to 5.0.0

29

lib/index.js

@@ -17,3 +17,3 @@ 'use strict';

module.exports = function (server, options, next) {
exports.register = function (server, options) {
const settings = Object.assign({}, internals.defaults, options);

@@ -53,13 +53,8 @@

}
next();
};
exports.pkg = Package;
module.exports.attributes = {
pkg: Package
};
internals.graphqlHandler = async function (request, reply) {
internals.graphqlHandler = async function (request, h) {
const source = request.method.toUpperCase() === 'GET' ? request.query : request.payload;

@@ -70,3 +65,3 @@

if (variables && variables.isBoom) {
return reply(variables);
return variables;
}

@@ -78,3 +73,3 @@

} catch (err) {
return reply(Boom.badRequest('invalid GraqhQL request', err));
return Boom.badRequest('invalid GraqhQL request', err);
}

@@ -84,3 +79,3 @@

if (errors.length) {
return reply(Boom.badRequest(errors.join(', ')));
return Boom.badRequest(errors.join(', '));
}

@@ -90,10 +85,10 @@

const result = await Graphql.execute(this.schema, queryAST, this.resolvers, request, variables, operationName);
if (result && result.errors) {
if (result.errors) {
request.log(['error', 'graqhql-error'], result);
}
reply(result).type('application/json');
return result;
} catch (ex) {
request.log(['error', 'graqhql-error'], ex);
reply(ex).type('application/json');
return ex;
}

@@ -116,3 +111,3 @@ };

internals.graphiqlHandler = function (request, reply) {
internals.graphiqlHandler = function (request, h) {
const query = request.query;

@@ -122,3 +117,3 @@ const variables = query.variables || '{}';

reply(Graphiql.renderGraphiQL({
return Graphiql.renderGraphiQL({
endpointURL: prefix + this.settings.graphqlPath,

@@ -128,3 +123,3 @@ query: query.query,

operationName: query.operationName
}));
});
};
{
"name": "graphi",
"version": "4.1.0",
"version": "5.0.0",
"description": "hapi graphql plugin",

@@ -28,13 +28,13 @@ "main": "lib",

"devDependencies": {
"belly-button": "^4.0.0",
"code": "^5.1.2",
"hapi": "^16.5.0",
"lab": "^15.1.2",
"scalars": "^0.1.0"
"belly-button": "4.x.x",
"code": "5.x.x",
"hapi": "17.x.x",
"lab": "15.x.x",
"scalars": "0.x.x"
},
"dependencies": {
"boom": "^5.2.0",
"graphql": "^0.11.7",
"graphql-server-module-graphiql": "^1.2.0"
"boom": "7.x.x",
"graphql": "0.11.x",
"graphql-server-module-graphiql": "1.2.x"
}
}

@@ -30,3 +30,3 @@ # graphi

const getPerson = function (args, request) {
return Promise.resolve({ firstname: 'billy', lastname: 'jean' });
return { firstname: 'billy', lastname: 'jean' };
};

@@ -38,7 +38,4 @@

const server = new Hapi.Server();
server.connection();
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
// server is ready to be started
});
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
```

@@ -59,3 +56,3 @@

resolve: (root, { firstname }, request) => {
return Promise.resolve(firstname);
return firstname;
}

@@ -67,7 +64,4 @@ }

const server = new Hapi.Server();
server.connection();
server.register({ register: Graphi, options: { schema } }, (err) => {
// server is ready to be started
});
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema } });
```

@@ -20,15 +20,8 @@ 'use strict';

describe('graphi', () => {
it('can be registered with hapi', () => {
const server = new Hapi.Server();
server.connection();
return new Promise((resolve) => {
server.register(Graphi, (err) => {
expect(err).to.not.exist();
resolve();
});
});
it('can be registered with hapi', async () => {
const server = Hapi.server();
await server.register(Graphi);
});
it('will handle graphql GET requests with promise resolver', () => {
it('will handle graphql GET requests with promise resolver', async () => {
const schema = `

@@ -48,3 +41,3 @@ type Person {

expect(request.path).to.equal('/graphql');
return Promise.resolve({ firstname: 'tom', lastname: 'arnold' });
return { firstname: 'tom', lastname: 'arnold' };
};

@@ -56,20 +49,12 @@

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=%7B%22hi%22%3A%20true%7D';
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=%7B%22hi%22%3A%20true%7D';
server.inject({ method: 'GET', url }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.data.person.lastname).to.equal('arnold');
resolve();
});
});
});
const res = await server.inject({ method: 'GET', url });
expect(res.statusCode).to.equal(200);
expect(res.result.data.person.lastname).to.equal('arnold');
});
it('will handle graphql GET requests GraphQL instance schema', () => {
it('will handle graphql GET requests GraphQL instance schema', async () => {
const schema = new GraphQLSchema({

@@ -85,3 +70,3 @@ query: new GraphQLObjectType({

resolve: (root, { firstname }, request) => {
return Promise.resolve(firstname);
return firstname;
}

@@ -93,20 +78,12 @@ }

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema } });
const url = '/graphql?query=' + encodeURIComponent('{ person(firstname: "tom")}');
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema } }, (err) => {
expect(err).to.not.exist();
const url = '/graphql?query=' + encodeURIComponent('{ person(firstname: "tom")}');
server.inject({ method: 'GET', url }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.data.person).to.equal('tom');
resolve();
});
});
});
const res = await server.inject({ method: 'GET', url });
expect(res.statusCode).to.equal(200);
expect(res.result.data.person).to.equal('tom');
});
it('will handle graphql POST requests with query', () => {
it('will handle graphql POST requests with query', async () => {
const schema = `

@@ -127,3 +104,3 @@ type Person {

expect(request.path).to.equal('/graphql');
return Promise.resolve({ firstname: '', lastname: 'jean', email: 'what' });
return { firstname: '', lastname: 'jean', email: 'what' };
};

@@ -135,19 +112,12 @@

const server = new Hapi.Server();
server.connection();
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const payload = { query: 'query { person(firstname: "billy") { lastname, email } }' };
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const payload = { query: 'query { person(firstname: "billy") { lastname, email } }' };
server.inject({ method: 'POST', url: '/graphql', payload }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.data.person.lastname).to.equal('jean');
resolve();
});
});
});
const res = await server.inject({ method: 'POST', url: '/graphql', payload });
expect(res.statusCode).to.equal(200);
expect(res.result.data.person.lastname).to.equal('jean');
});
it('will handle graphql POST requests with query using GraphQL schema objects', () => {
it('will handle graphql POST requests with query using GraphQL schema objects', async () => {
const schema = new GraphQL.GraphQLSchema({

@@ -162,3 +132,3 @@ query: new GraphQL.GraphQLObjectType({

expect(args.firstname).to.equal('billy');
return Promise.resolve('jean');
return 'jean';
}

@@ -170,20 +140,12 @@ }

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema } });
const payload = { query: 'query { person(firstname: "billy") }' };
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema } }, (err) => {
expect(err).to.not.exist();
const payload = { query: 'query { person(firstname: "billy") }' };
server.inject({ method: 'POST', url: '/graphql', payload }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.data.person).to.equal('jean');
resolve();
});
});
});
const res = await server.inject({ method: 'POST', url: '/graphql', payload });
expect(res.statusCode).to.equal(200);
expect(res.result.data.person).to.equal('jean');
});
it('will handle graphql POST requests with mutations', () => {
it('will handle graphql POST requests with mutations', async () => {
const schema = `

@@ -208,3 +170,3 @@ type Person {

expect(request.path).to.equal('/graphql');
return Promise.resolve({ firstname: 'billy', lastname: 'jean' });
return { firstname: 'billy', lastname: 'jean' };
};

@@ -216,3 +178,3 @@

expect(request.path).to.equal('/graphql');
return Promise.resolve({ firstname: 'billy', lastname: 'jean' });
return { firstname: 'billy', lastname: 'jean' };
};

@@ -225,20 +187,12 @@

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const payload = { query: 'mutation { createPerson(firstname: "billy", lastname: "jean") { lastname } }' };
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const payload = { query: 'mutation { createPerson(firstname: "billy", lastname: "jean") { lastname } }' };
server.inject({ method: 'POST', url: '/graphql', payload }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.data.createPerson.lastname).to.equal('jean');
resolve();
});
});
});
const res = await server.inject({ method: 'POST', url: '/graphql', payload });
expect(res.statusCode).to.equal(200);
expect(res.result.data.createPerson.lastname).to.equal('jean');
});
it('will error with requests that include unknown directives', () => {
it('will error with requests that include unknown directives', async () => {
const schema = `

@@ -258,3 +212,3 @@ type Person {

expect(request.path).to.equal('/graphql');
return Promise.resolve({ firstname: '', lastname: 'jean' });
return { firstname: '', lastname: 'jean' };
};

@@ -266,20 +220,12 @@

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const payload = { query: 'query { person(firstname: "billy") { lastname @foo(min: 2) } }' };
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const payload = { query: 'query { person(firstname: "billy") { lastname @foo(min: 2) } }' };
server.inject({ method: 'POST', url: '/graphql', payload }, (res) => {
expect(res.statusCode).to.equal(400);
expect(res.result.message).to.contain('Unknown directive');
resolve();
});
});
});
const res = await server.inject({ method: 'POST', url: '/graphql', payload });
expect(res.statusCode).to.equal(400);
expect(res.result.message).to.contain('Unknown directive');
});
it('will handle graphql GET requests with invalid variables', () => {
it('will handle graphql GET requests with invalid variables', async () => {
const schema = `

@@ -306,19 +252,11 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=invalid';
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=invalid';
server.inject({ method: 'GET', url }, (res) => {
expect(res.statusCode).to.equal(400);
resolve();
});
});
});
const res = await server.inject({ method: 'GET', url });
expect(res.statusCode).to.equal(400);
});
it('will wrap 400 errors', () => {
it('will wrap 400 errors', async () => {
const schema = `

@@ -345,19 +283,40 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
server.register({ plugin: Graphi, options: { schema, resolvers } });
const url = '/graphql?query={}';
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const url = '/graphql?query={}';
const res = await server.inject({ method: 'GET', url });
expect(res.statusCode).to.equal(400);
});
server.inject({ method: 'GET', url }, (res) => {
expect(res.statusCode).to.equal(400);
resolve();
});
});
});
it('will log result with errors property', async () => {
const schema = `
type Person {
firstname: String!
lastname: String!
}
type Query {
person(firstname: String!): Person!
}
`;
const getPerson = function (args, request) {
expect(args.firstname).to.equal('tom');
expect(request.path).to.equal('/graphql');
return { errors: [new Error()] };
};
const resolvers = {
person: getPerson
};
const server = Hapi.server();
server.register({ plugin: Graphi, options: { schema, resolvers } });
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=%7B%22hi%22%3A%20true%7D';
await server.inject({ method: 'GET', url });
});
it('will wrap errors with a promise resolver', () => {
it('will wrap errors with a promise resolver', async () => {
const schema = `

@@ -384,20 +343,43 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D';
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D';
const res = await server.inject({ method: 'GET', url });
expect(res.statusCode).to.equal(200);
expect(res.result.errors).to.exist();
});
server.inject({ method: 'GET', url }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.errors).to.exist();
resolve();
});
});
});
it('will wrap errors thrown in resolver', async () => {
const schema = `
type Person {
firstname: String!
lastname: String!
}
type Query {
person(firstname: String!): Person!
}
`;
const getPerson = function (args, request) {
expect(args.firstname).to.equal('tom');
expect(request.path).to.equal('/graphql');
throw new Error('my custom error');
};
const resolvers = {
person: getPerson
};
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const url = '/graphql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D';
const res = await server.inject({ method: 'GET', url });
expect(res.statusCode).to.equal(200);
expect(res.result.errors).to.exist();
});
it('will serve the GraphiQL UI', () => {
it('will serve the GraphiQL UI', async () => {
const schema = `

@@ -422,19 +404,11 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } }, { routes: { prefix: '/test' } });
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, { routes: { prefix: '/test' } }, (err) => {
expect(err).to.not.exist();
server.inject({ method: 'GET', url: '/test/graphiql' }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result).to.contain('<html>');
resolve();
});
});
});
const res = await server.inject({ method: 'GET', url: '/test/graphiql' });
expect(res.statusCode).to.equal(200);
expect(res.result).to.contain('<html>');
});
it('will serve the GraphiQL UI prepopulated with the query', () => {
it('will serve the GraphiQL UI prepopulated with the query', async () => {
const schema = `

@@ -459,19 +433,11 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
server.inject({ method: 'GET', url: '/graphiql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=%7B%22hi%22%3A%20true%7D' }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result).to.contain('person');
resolve();
});
});
});
const res = await server.inject({ method: 'GET', url: '/graphiql?query=%7B%0A%20%20person(firstname%3A%22tom%22)%20%7B%0A%20%20%20%20lastname%0A%20%20%7D%0A%7D&variables=%7B%22hi%22%3A%20true%7D' });
expect(res.statusCode).to.equal(200);
expect(res.result).to.contain('person');
});
it('can disable GraphiQL UI', () => {
it('can disable GraphiQL UI', async () => {
const schema = `

@@ -496,18 +462,10 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers, graphiqlPath: false } });
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers, graphiqlPath: false } }, (err) => {
expect(err).to.not.exist();
server.inject({ method: 'GET', url: '/graphiql' }, (res) => {
expect(res.statusCode).to.equal(404);
resolve();
});
});
});
const res = await server.inject({ method: 'GET', url: '/graphiql' });
expect(res.statusCode).to.equal(404);
});
it('will handle nested queries', () => {
it('will handle nested queries', async () => {
const schema = `

@@ -543,23 +501,15 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
const payload = {
query: 'query GetPersonsFriend($firstname: String!, $friendsFirstname: String!) { person(firstname: $firstname) { friends(firstname: $friendsFirstname) { lastname } } }',
variables: { firstname: 'billy', friendsFirstname: 'michael' }
};
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const payload = {
query: 'query GetPersonsFriend($firstname: String!, $friendsFirstname: String!) { person(firstname: $firstname) { friends(firstname: $friendsFirstname) { lastname } } }',
variables: { firstname: 'billy', friendsFirstname: 'michael' }
};
server.inject({ method: 'POST', url: '/graphql', payload }, (res) => {
expect(res.statusCode).to.equal(200);
expect(res.result.data.person.friends[0].lastname).to.equal('jackson');
resolve();
});
});
});
const res = await server.inject({ method: 'POST', url: '/graphql', payload });
expect(res.statusCode).to.equal(200);
expect(res.result.data.person.friends[0].lastname).to.equal('jackson');
});
it('will handle invalid queries in POST request', () => {
it('will handle invalid queries in POST request', async () => {
const schema = `

@@ -595,20 +545,13 @@ type Person {

const server = new Hapi.Server();
server.connection();
const server = Hapi.server();
await server.register({ plugin: Graphi, options: { schema, resolvers } });
return new Promise((resolve) => {
server.register({ register: Graphi, options: { schema, resolvers } }, (err) => {
expect(err).to.not.exist();
const payload = {
query: 'query GetPersonsF} }',
variables: { firstname: 'billy', friendsFirstname: 'michael' }
};
const payload = {
query: 'query GetPersonsF} }',
variables: { firstname: 'billy', friendsFirstname: 'michael' }
};
server.inject({ method: 'POST', url: '/graphql', payload }, (res) => {
expect(res.statusCode).to.equal(400);
resolve();
});
});
});
const res = await server.inject({ method: 'POST', url: '/graphql', payload });
expect(res.statusCode).to.equal(400);
});
});
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc