diff --git a/packages/apollo-datasource-rest/package.json b/packages/apollo-datasource-rest/package.json index 1e8aa687..e4429c45 100644 --- a/packages/apollo-datasource-rest/package.json +++ b/packages/apollo-datasource-rest/package.json @@ -23,6 +23,7 @@ "node": ">=6" }, "dependencies": { + "apollo-datasource": "^2.0.0-rc.7", "apollo-server-caching": "^2.0.0-rc.7", "apollo-server-env": "^2.0.0-rc.7", "apollo-server-errors": "^2.0.0-rc.7", diff --git a/packages/apollo-datasource-rest/src/RESTDataSource.ts b/packages/apollo-datasource-rest/src/RESTDataSource.ts index 25881b36..d6d1be6d 100644 --- a/packages/apollo-datasource-rest/src/RESTDataSource.ts +++ b/packages/apollo-datasource-rest/src/RESTDataSource.ts @@ -9,6 +9,9 @@ import { URLSearchParamsInit, } from 'apollo-server-env'; +import { DataSource } from 'apollo-datasource'; + +import { KeyValueCache } from 'apollo-server-caching'; import { HTTPCache } from './HTTPCache'; import { @@ -29,10 +32,15 @@ export { Request }; type ValueOrPromise = T | Promise; -export abstract class RESTDataSource { +export abstract class RESTDataSource extends DataSource { httpCache!: HTTPCache; context!: TContext; + initialize(context: TContext, cache: KeyValueCache): void { + this.context = context; + this.httpCache = new HTTPCache(cache); + } + baseURL?: string; protected willSendRequest?(request: RequestOptions): ValueOrPromise; diff --git a/packages/apollo-datasource/.npmignore b/packages/apollo-datasource/.npmignore new file mode 100644 index 00000000..a165046d --- /dev/null +++ b/packages/apollo-datasource/.npmignore @@ -0,0 +1,6 @@ +* +!src/**/* +!dist/**/* +dist/**/*.test.* +!package.json +!README.md diff --git a/packages/apollo-datasource/package.json b/packages/apollo-datasource/package.json new file mode 100644 index 00000000..475d13c8 --- /dev/null +++ b/packages/apollo-datasource/package.json @@ -0,0 +1,57 @@ +{ + "name": "apollo-datasource", + "version": "2.0.0-rc.7", + "author": "opensource@apollographql.com", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/apollographql/apollo-server/tree/master/packages/apollo-datasource" + }, + "homepage": "https://github.com/apollographql/apollo-server#readme", + "bugs": { + "url": "https://github.com/apollographql/apollo-server/issues" + }, + "scripts": { + "clean": "rm -rf dist", + "compile": "tsc", + "prepublish": "npm run clean && npm run compile", + "test": "jest --verbose" + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "engines": { + "node": ">=6" + }, + "dependencies": { + "apollo-server-caching": "^2.0.0-rc.7", + "apollo-server-env": "^2.0.0-rc.7" + }, + "devDependencies": { + "@types/jest": "^23.1.2", + "jest": "^23.2.0", + "ts-jest": "^22.4.6" + }, + "jest": { + "testEnvironment": "node", + "setupFiles": [ + "/node_modules/apollo-server-env/dist/index.js" + ], + "transform": { + "^.+\\.(ts|js)$": "ts-jest" + }, + "moduleFileExtensions": [ + "ts", + "js", + "json" + ], + "testRegex": "apollo-datasource-rest/src/__tests__/.*$", + "roots": [ + "../../" + ], + "globals": { + "ts-jest": { + "skipBabel": true + } + } + } +} diff --git a/packages/apollo-datasource/src/index.ts b/packages/apollo-datasource/src/index.ts new file mode 100644 index 00000000..a98ddd4d --- /dev/null +++ b/packages/apollo-datasource/src/index.ts @@ -0,0 +1,5 @@ +import { KeyValueCache } from 'apollo-server-caching'; + +export abstract class DataSource { + abstract initialize(context: TContext, cache: KeyValueCache): void; +} diff --git a/packages/apollo-datasource/tsconfig.json b/packages/apollo-datasource/tsconfig.json new file mode 100644 index 00000000..700fb9c5 --- /dev/null +++ b/packages/apollo-datasource/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "removeComments": true, + "strict": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUnusedParameters": true, + "noUnusedLocals": true, + "types": ["node", "jest"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/__tests__/*", "**/__mocks__/*"] +} diff --git a/packages/apollo-server-core/package.json b/packages/apollo-server-core/package.json index 4b5204e5..edf9fdad 100644 --- a/packages/apollo-server-core/package.json +++ b/packages/apollo-server-core/package.json @@ -30,7 +30,7 @@ "dependencies": { "@types/ws": "^5.1.2", "apollo-cache-control": "^0.2.0-rc.0", - "apollo-datasource-rest": "^2.0.0-rc.7", + "apollo-datasource": "^2.0.0-rc.7", "apollo-engine-reporting": "^0.0.0-rc.1", "apollo-server-caching": "^2.0.0-rc.7", "apollo-server-env": "^2.0.0-rc.7", diff --git a/packages/apollo-server-core/src/graphqlOptions.ts b/packages/apollo-server-core/src/graphqlOptions.ts index d547cd66..c63f0d80 100644 --- a/packages/apollo-server-core/src/graphqlOptions.ts +++ b/packages/apollo-server-core/src/graphqlOptions.ts @@ -7,6 +7,7 @@ import { HttpHeaderCalculation } from './caching'; import { GraphQLExtension } from 'graphql-extensions'; import { CacheControlExtensionOptions } from 'apollo-cache-control'; import { KeyValueCache } from 'apollo-server-caching'; +import { DataSource } from 'apollo-datasource'; /* * GraphQLServerOptions @@ -50,10 +51,6 @@ export interface GraphQLServerOptions< persistedQueries?: PersistedQueryOptions; } -export interface DataSource { - context: TContext; -} - export type DataSources = { [name: string]: DataSource; }; diff --git a/packages/apollo-server-core/src/runHttpQuery.ts b/packages/apollo-server-core/src/runHttpQuery.ts index 6c3993c6..c420bb3a 100644 --- a/packages/apollo-server-core/src/runHttpQuery.ts +++ b/packages/apollo-server-core/src/runHttpQuery.ts @@ -1,7 +1,6 @@ import { ExecutionResult } from 'graphql'; const sha256 = require('hash.js/lib/hash/sha/256'); -import { HTTPCache } from 'apollo-datasource-rest'; import { CacheControlExtensionOptions } from 'apollo-cache-control'; import { omit } from 'lodash'; @@ -338,12 +337,8 @@ export async function runHttpQuery( if (optionsObject.dataSources) { const dataSources = optionsObject.dataSources() || {}; - // we use the cache provided to the request and add the Http semantics on top - const httpCache = new HTTPCache(optionsObject.cache); - for (const dataSource of Object.values(dataSources)) { - dataSource.context = context; - (dataSource as any).httpCache = httpCache; + dataSource.initialize(context, optionsObject.cache!); } if ('dataSources' in context) {