mirror of
https://github.com/vale981/apollo-server
synced 2025-03-05 17:51:40 -05:00
parent
40e8b55594
commit
fe9564d2cd
10 changed files with 37 additions and 35 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
@ -1,12 +1,14 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
### v0.3.0
|
### v0.3.0
|
||||||
* Refactor HAPI integration to improve the API and make the plugins more idiomatic. ([@nnance](https://github.com/nnance)) in
|
* Refactor Hapi integration to improve the API and make the plugins more idiomatic. ([@nnance](https://github.com/nnance)) in
|
||||||
[PR #127](https://github.com/apollostack/apollo-server/pull/127)
|
[PR #127](https://github.com/apollostack/apollo-server/pull/127)
|
||||||
* Fixed query batching with HAPI integration. Issue #123 ([@nnance](https://github.com/nnance)) in
|
* Fixed query batching with Hapi integration. Issue #123 ([@nnance](https://github.com/nnance)) in
|
||||||
[PR #127](https://github.com/apollostack/apollo-server/pull/127)
|
[PR #127](https://github.com/apollostack/apollo-server/pull/127)
|
||||||
* Add support for route options in HAPI integration. Issue #97. ([@nnance](https://github.com/nnance)) in
|
* Add support for route options in Hapi integration. Issue #97. ([@nnance](https://github.com/nnance)) in
|
||||||
[PR #127](https://github.com/apollostack/apollo-server/pull/127)
|
[PR #127](https://github.com/apollostack/apollo-server/pull/127)
|
||||||
|
* Camelcase Hapi. Issue #129. ([@nnance](https://github.com/nnance)) in
|
||||||
|
[PR #132](https://github.com/apollostack/apollo-server/pull/132)
|
||||||
|
|
||||||
### v0.2.6
|
### v0.2.6
|
||||||
* Expose the OperationStore as part of the public API. ([@nnance](https://github.com/nnance))
|
* Expose the OperationStore as part of the public API. ([@nnance](https://github.com/nnance))
|
||||||
|
@ -21,13 +23,13 @@
|
||||||
|
|
||||||
### v0.2.1
|
### v0.2.1
|
||||||
* Complete refactor of Apollo Server using TypeScript. PR [#41](https://github.com/apollostack/apollo-server/pull/41)
|
* Complete refactor of Apollo Server using TypeScript. PR [#41](https://github.com/apollostack/apollo-server/pull/41)
|
||||||
* Added HAPI integration ([@nnance](https://github.com/nnance) in [#46](https://github.com/apollostack/apollo-server/pull/46))
|
* Added Hapi integration ([@nnance](https://github.com/nnance) in [#46](https://github.com/apollostack/apollo-server/pull/46))
|
||||||
* Added Koa integration ([@HriBB](https://github.com/HriBB) in [#59](https://github.com/apollostack/apollo-server/pull/59))
|
* Added Koa integration ([@HriBB](https://github.com/HriBB) in [#59](https://github.com/apollostack/apollo-server/pull/59))
|
||||||
* Changed express integration to support connect as well ([@helfer](https://github.com/helfer) in [#58](https://github.com/apollostack/apollo-server/pull/58))
|
* Changed express integration to support connect as well ([@helfer](https://github.com/helfer) in [#58](https://github.com/apollostack/apollo-server/pull/58))
|
||||||
* Dropped express-graphql dependency
|
* Dropped express-graphql dependency
|
||||||
* Dropped support for GET requests, only POST requests are allowed now
|
* Dropped support for GET requests, only POST requests are allowed now
|
||||||
* Split GraphiQL into a separate middleware
|
* Split GraphiQL into a separate middleware
|
||||||
* Factored out core to support HAPI, Koa and connect implementations
|
* Factored out core to support Hapi, Koa and connect implementations
|
||||||
* Added support for query batching
|
* Added support for query batching
|
||||||
* Added support for query whitelisting / stored queries
|
* Added support for query whitelisting / stored queries
|
||||||
* Removed body parsing from express integration. Body must be parsed outside of apollo now
|
* Removed body parsing from express integration. Body must be parsed outside of apollo now
|
||||||
|
|
|
@ -16,7 +16,7 @@ At the core of Apollo Server is a function called `runQuery`, which handles pars
|
||||||
The main goals of Apollo Server are (in order of priority):
|
The main goals of Apollo Server are (in order of priority):
|
||||||
|
|
||||||
1. Simplicity: Apollo Server’s core API is very straight forward. It’s one function that does one thing really well (parsing, validating and executing GraphQL queries), and doesn’t do anything else.
|
1. Simplicity: Apollo Server’s core API is very straight forward. It’s one function that does one thing really well (parsing, validating and executing GraphQL queries), and doesn’t do anything else.
|
||||||
2. Flexibility: The core of Apollo Server should be transport-agnostic (e.g. it doesn’t deal with HTTP or Websockets directly. This is will be handled in the wrappers for Express, HAPI, etc.)
|
2. Flexibility: The core of Apollo Server should be transport-agnostic (e.g. it doesn’t deal with HTTP or Websockets directly. This is will be handled in the wrappers for Express, Hapi, etc.)
|
||||||
3. Performance: Apollo server should be be tunable to make it fast in production. One example of this is that it should be able to take pre-stored queries to skip parsing and validation. It should also allow easy integration of profiling tools like Apollo Tracer that help with debugging and optimizing server performance.
|
3. Performance: Apollo server should be be tunable to make it fast in production. One example of this is that it should be able to take pre-stored queries to skip parsing and validation. It should also allow easy integration of profiling tools like Apollo Tracer that help with debugging and optimizing server performance.
|
||||||
|
|
||||||
### Integrations
|
### Integrations
|
||||||
|
@ -24,7 +24,7 @@ The main goals of Apollo Server are (in order of priority):
|
||||||
Apollo Server should come with a set of integrations for different Node.js server frameworks:
|
Apollo Server should come with a set of integrations for different Node.js server frameworks:
|
||||||
|
|
||||||
- Express
|
- Express
|
||||||
- HAPI
|
- Hapi
|
||||||
- Connect
|
- Connect
|
||||||
- Koa
|
- Koa
|
||||||
- ...
|
- ...
|
||||||
|
|
14
README.md
14
README.md
|
@ -1,11 +1,11 @@
|
||||||
# GraphQL Server for Express, Connect, HAPI and Koa
|
# GraphQL Server for Express, Connect, Hapi and Koa
|
||||||
|
|
||||||
[](https://badge.fury.io/js/apollo-server)
|
[](https://badge.fury.io/js/apollo-server)
|
||||||
[](https://travis-ci.org/apollostack/apollo-server)
|
[](https://travis-ci.org/apollostack/apollo-server)
|
||||||
[](https://coveralls.io/github/apollostack/apollo-server?branch=master)
|
[](https://coveralls.io/github/apollostack/apollo-server?branch=master)
|
||||||
[](http://www.apollostack.com/#slack)
|
[](http://www.apollostack.com/#slack)
|
||||||
|
|
||||||
Apollo Server is a community-maintained open-source GraphQL server. It works with all Node.js HTTP server frameworks: Express, Connect, HAPI and Koa.
|
Apollo Server is a community-maintained open-source GraphQL server. It works with all Node.js HTTP server frameworks: Express, Connect, Hapi and Koa.
|
||||||
|
|
||||||
## Principles
|
## Principles
|
||||||
|
|
||||||
|
@ -64,13 +64,13 @@ app.use('/graphql', bodyParser.json(), apolloConnect({ schema: myGraphQLSchema }
|
||||||
app.listen(PORT);
|
app.listen(PORT);
|
||||||
```
|
```
|
||||||
|
|
||||||
### HAPI
|
### Hapi
|
||||||
|
|
||||||
Now with the HAPI plugins `ApolloHAPI` and `GraphiQLHAPI` you can pass a route object that includes options to be applied to the route. The example below enables CORS on the `/graphql` route.
|
Now with the Hapi plugins `ApolloHapi` and `GraphiQLHapi` you can pass a route object that includes options to be applied to the route. The example below enables CORS on the `/graphql` route.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import hapi from 'hapi';
|
import hapi from 'hapi';
|
||||||
import { ApolloHAPI } from 'apollo-server';
|
import { ApolloHapi } from 'apollo-server';
|
||||||
|
|
||||||
const server = new hapi.Server();
|
const server = new hapi.Server();
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ server.connection({
|
||||||
});
|
});
|
||||||
|
|
||||||
server.register({
|
server.register({
|
||||||
register: ApolloHAPI,
|
register: ApolloHapi,
|
||||||
options: {
|
options: {
|
||||||
path: '/graphql',
|
path: '/graphql',
|
||||||
apolloOptions: {
|
apolloOptions: {
|
||||||
|
@ -155,7 +155,7 @@ apolloOptions = {
|
||||||
|
|
||||||
Apollo Server and express-graphql are more or less the same thing (GraphQL middleware for Node.js), but there are a few key differences:
|
Apollo Server and express-graphql are more or less the same thing (GraphQL middleware for Node.js), but there are a few key differences:
|
||||||
|
|
||||||
* express-graphql works with Express and Connect, Apollo Server supports Express, Connect, HAPI and Koa.
|
* express-graphql works with Express and Connect, Apollo Server supports Express, Connect, Hapi and Koa.
|
||||||
* express-graphql's main goal is to be a minimal reference implementation, whereas Apollo Server's goal is to be a complete production-ready GraphQL server.
|
* express-graphql's main goal is to be a minimal reference implementation, whereas Apollo Server's goal is to be a complete production-ready GraphQL server.
|
||||||
* Compared to express-graphql, Apollo Server has a simpler interface and supports exactly one way of passing queries.
|
* Compared to express-graphql, Apollo Server has a simpler interface and supports exactly one way of passing queries.
|
||||||
* Apollo Server separates serving GraphiQL (GraphQL UI) from responding to GraphQL requests.
|
* Apollo Server separates serving GraphiQL (GraphQL UI) from responding to GraphQL requests.
|
||||||
|
|
|
@ -12,7 +12,7 @@ This document contains a rough outline of a roadmap and a few designs for future
|
||||||
* Express integration
|
* Express integration
|
||||||
* Query batching (Express)
|
* Query batching (Express)
|
||||||
* Query whitelisting / stored queries
|
* Query whitelisting / stored queries
|
||||||
* HAPI integration
|
* Hapi integration
|
||||||
* Koa integration
|
* Koa integration
|
||||||
* Connect integration
|
* Connect integration
|
||||||
* Complete rewrite of Apollo Server documentation
|
* Complete rewrite of Apollo Server documentation
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "apollo-server",
|
"name": "apollo-server",
|
||||||
"version": "0.2.8",
|
"version": "0.2.8",
|
||||||
"description": "Production-ready Node.js GraphQL server for Express, HAPI, Koa",
|
"description": "Production-ready Node.js GraphQL server for Express, Hapi, Koa",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"GraphQL",
|
"GraphQL",
|
||||||
"Apollo",
|
"Apollo",
|
||||||
"HAPI",
|
"Hapi",
|
||||||
"Koa",
|
"Koa",
|
||||||
"Express",
|
"Express",
|
||||||
"Javascript"
|
"Javascript"
|
||||||
|
|
|
@ -2,7 +2,7 @@ export { runQuery } from './core/runQuery'
|
||||||
export { renderGraphiQL} from './modules/renderGraphiQL'
|
export { renderGraphiQL} from './modules/renderGraphiQL'
|
||||||
export { OperationStore } from './modules/operationStore'
|
export { OperationStore } from './modules/operationStore'
|
||||||
export { apolloExpress, graphiqlExpress } from './integrations/expressApollo'
|
export { apolloExpress, graphiqlExpress } from './integrations/expressApollo'
|
||||||
export { ApolloHAPI, GraphiQLHAPI } from './integrations/hapiApollo'
|
export { ApolloHapi, GraphiQLHapi } from './integrations/hapiApollo'
|
||||||
export { apolloKoa, graphiqlKoa } from './integrations/koaApollo'
|
export { apolloKoa, graphiqlKoa } from './integrations/koaApollo'
|
||||||
export { apolloConnect, graphiqlConnect } from './integrations/connectApollo'
|
export { apolloConnect, graphiqlConnect } from './integrations/connectApollo'
|
||||||
export { default as ApolloOptions} from './integrations/apolloOptions'
|
export { default as ApolloOptions} from './integrations/apolloOptions'
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import * as hapi from 'hapi';
|
import * as hapi from 'hapi';
|
||||||
import { ApolloHAPI, GraphiQLHAPI, HAPIPluginOptions } from './hapiApollo';
|
import { ApolloHapi, GraphiQLHapi, HapiPluginOptions } from './hapiApollo';
|
||||||
|
|
||||||
import testSuite, { Schema } from './integrations.test';
|
import testSuite, { Schema } from './integrations.test';
|
||||||
|
|
||||||
function createApp(createOptions: HAPIPluginOptions) {
|
function createApp(createOptions: HapiPluginOptions) {
|
||||||
const server = new hapi.Server();
|
const server = new hapi.Server();
|
||||||
|
|
||||||
server.connection({
|
server.connection({
|
||||||
|
@ -12,7 +12,7 @@ function createApp(createOptions: HAPIPluginOptions) {
|
||||||
});
|
});
|
||||||
|
|
||||||
server.register({
|
server.register({
|
||||||
register: ApolloHAPI,
|
register: ApolloHapi,
|
||||||
options: {
|
options: {
|
||||||
apolloOptions: createOptions ? createOptions.apolloOptions : { schema: Schema },
|
apolloOptions: createOptions ? createOptions.apolloOptions : { schema: Schema },
|
||||||
path: '/graphql',
|
path: '/graphql',
|
||||||
|
@ -20,7 +20,7 @@ function createApp(createOptions: HAPIPluginOptions) {
|
||||||
});
|
});
|
||||||
|
|
||||||
server.register({
|
server.register({
|
||||||
register: GraphiQLHAPI,
|
register: GraphiQLHapi,
|
||||||
options: {
|
options: {
|
||||||
path: '/graphiql',
|
path: '/graphiql',
|
||||||
graphiqlOptions: {
|
graphiqlOptions: {
|
||||||
|
@ -32,6 +32,6 @@ function createApp(createOptions: HAPIPluginOptions) {
|
||||||
return server.listener;
|
return server.listener;
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('integration:HAPI', () => {
|
describe('integration:Hapi', () => {
|
||||||
testSuite(createApp);
|
testSuite(createApp);
|
||||||
});
|
});
|
||||||
|
|
|
@ -11,17 +11,17 @@ export interface IRegister {
|
||||||
attributes?: any;
|
attributes?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HAPIOptionsFunction {
|
export interface HapiOptionsFunction {
|
||||||
(req?: Request): ApolloOptions | Promise<ApolloOptions>;
|
(req?: Request): ApolloOptions | Promise<ApolloOptions>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HAPIPluginOptions {
|
export interface HapiPluginOptions {
|
||||||
path: string;
|
path: string;
|
||||||
route?: any;
|
route?: any;
|
||||||
apolloOptions: ApolloOptions | HAPIOptionsFunction;
|
apolloOptions: ApolloOptions | HapiOptionsFunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ApolloHAPI: IRegister = function(server: Server, options: HAPIPluginOptions, next) {
|
const ApolloHapi: IRegister = function(server: Server, options: HapiPluginOptions, next) {
|
||||||
server.method('verifyPayload', verifyPayload);
|
server.method('verifyPayload', verifyPayload);
|
||||||
server.method('getGraphQLParams', getGraphQLParams);
|
server.method('getGraphQLParams', getGraphQLParams);
|
||||||
server.method('getApolloOptions', getApolloOptions);
|
server.method('getApolloOptions', getApolloOptions);
|
||||||
|
@ -68,7 +68,7 @@ const ApolloHAPI: IRegister = function(server: Server, options: HAPIPluginOption
|
||||||
return next();
|
return next();
|
||||||
};
|
};
|
||||||
|
|
||||||
ApolloHAPI.attributes = {
|
ApolloHapi.attributes = {
|
||||||
name: 'graphql',
|
name: 'graphql',
|
||||||
version: '0.0.1',
|
version: '0.0.1',
|
||||||
};
|
};
|
||||||
|
@ -113,7 +113,7 @@ async function getApolloOptions(request: Request, reply: IReply): Promise<{}> {
|
||||||
let optionsObject: ApolloOptions;
|
let optionsObject: ApolloOptions;
|
||||||
if (isOptionsFunction(options)) {
|
if (isOptionsFunction(options)) {
|
||||||
try {
|
try {
|
||||||
const opsFunc: HAPIOptionsFunction = <HAPIOptionsFunction>options;
|
const opsFunc: HapiOptionsFunction = <HapiOptionsFunction>options;
|
||||||
optionsObject = await opsFunc(request);
|
optionsObject = await opsFunc(request);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return reply(createErr(500, `Invalid options provided to ApolloServer: ${e.message}`));
|
return reply(createErr(500, `Invalid options provided to ApolloServer: ${e.message}`));
|
||||||
|
@ -155,7 +155,7 @@ async function processQuery(graphqlParams, optionsObject: ApolloOptions, reply)
|
||||||
return reply(responses);
|
return reply(responses);
|
||||||
}
|
}
|
||||||
|
|
||||||
function isOptionsFunction(arg: ApolloOptions | HAPIOptionsFunction): arg is HAPIOptionsFunction {
|
function isOptionsFunction(arg: ApolloOptions | HapiOptionsFunction): arg is HapiOptionsFunction {
|
||||||
return typeof arg === 'function';
|
return typeof arg === 'function';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ export interface GraphiQLPluginOptions {
|
||||||
graphiqlOptions: GraphiQL.GraphiQLData;
|
graphiqlOptions: GraphiQL.GraphiQLData;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GraphiQLHAPI: IRegister = function(server: Server, options: GraphiQLPluginOptions, next) {
|
const GraphiQLHapi: IRegister = function(server: Server, options: GraphiQLPluginOptions, next) {
|
||||||
server.method('getGraphiQLParams', getGraphiQLParams);
|
server.method('getGraphiQLParams', getGraphiQLParams);
|
||||||
server.method('renderGraphiQL', renderGraphiQL);
|
server.method('renderGraphiQL', renderGraphiQL);
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ const GraphiQLHAPI: IRegister = function(server: Server, options: GraphiQLPlugi
|
||||||
next();
|
next();
|
||||||
};
|
};
|
||||||
|
|
||||||
GraphiQLHAPI.attributes = {
|
GraphiQLHapi.attributes = {
|
||||||
name: 'graphiql',
|
name: 'graphiql',
|
||||||
version: '0.0.1',
|
version: '0.0.1',
|
||||||
};
|
};
|
||||||
|
@ -223,4 +223,4 @@ function renderGraphiQL(route, graphiqlParams: any, reply) {
|
||||||
reply(graphiQLString);
|
reply(graphiQLString);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { ApolloHAPI, GraphiQLHAPI };
|
export { ApolloHapi, GraphiQLHapi };
|
||||||
|
|
|
@ -161,7 +161,7 @@ export default (createApp: CreateAppFunc, destroyApp?: DestroyAppFunc) => {
|
||||||
.send();
|
.send();
|
||||||
return req.then((res) => {
|
return req.then((res) => {
|
||||||
expect(res.status).to.be.oneOf([404, 405]);
|
expect(res.status).to.be.oneOf([404, 405]);
|
||||||
// HAPI doesn't return allow header, so we can't test this.
|
// Hapi doesn't return allow header, so we can't test this.
|
||||||
// return expect(res.headers['allow']).to.equal('POST');
|
// return expect(res.headers['allow']).to.equal('POST');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
// TODO: maybe we should get rid of these tests entirely, and move them to expressApollo.test.ts
|
// TODO: maybe we should get rid of these tests entirely, and move them to expressApollo.test.ts
|
||||||
|
|
||||||
// TODO: wherever possible the tests should be rewritten to make them easily work with HAPI, express, Koa etc.
|
// TODO: wherever possible the tests should be rewritten to make them easily work with Hapi, express, Koa etc.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Below are the HTTP tests from express-graphql. We're using them here to make
|
* Below are the HTTP tests from express-graphql. We're using them here to make
|
||||||
|
|
Loading…
Add table
Reference in a new issue