diff --git a/package-lock.json b/package-lock.json index 9e1ec19..a05f200 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3350,6 +3350,16 @@ "tweetnacl": "^0.14.3" } }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -4252,7 +4262,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", - "dev": true, "requires": { "node-fetch": "2.1.2", "whatwg-fetch": "2.0.4" @@ -4261,8 +4270,7 @@ "node-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", - "dev": true + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" } } }, @@ -5089,6 +5097,13 @@ "moment": "^2.11.2" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5291,14 +5306,15 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", "dev": true, "optional": true, "requires": { + "bindings": "^1.5.0", "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "node-pre-gyp": "*" }, "dependencies": { "abbrev": { @@ -5310,8 +5326,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -5332,21 +5347,19 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.1.1", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true @@ -5354,20 +5367,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -5376,7 +5386,7 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "3.2.6", "bundled": true, "dev": true, "optional": true, @@ -5403,12 +5413,12 @@ "optional": true }, "fs-minipass": { - "version": "1.2.5", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -5434,7 +5444,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.6", "bundled": true, "dev": true, "optional": true, @@ -5463,7 +5473,7 @@ } }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "dev": true, "optional": true, @@ -5482,10 +5492,9 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5497,7 +5506,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5512,7 +5520,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5520,56 +5527,53 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.2.1", + "version": "1.3.3", "bundled": true, "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } }, "ms": { - "version": "2.1.1", + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.3.0", + "version": "2.4.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^4.1.0", + "debug": "^3.2.6", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.12.0", + "version": "0.14.0", "bundled": true, "dev": true, "optional": true, @@ -5583,7 +5587,7 @@ "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^4" + "tar": "^4.4.2" } }, "nopt": { @@ -5597,13 +5601,22 @@ } }, "npm-bundled": { - "version": "1.0.6", + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.4.1", + "version": "1.4.7", "bundled": true, "dev": true, "optional": true, @@ -5627,8 +5640,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5640,7 +5652,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5674,7 +5685,7 @@ "optional": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "dev": true, "optional": true @@ -5715,7 +5726,7 @@ } }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "dev": true, "optional": true, @@ -5726,8 +5737,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5742,7 +5752,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true, "dev": true, "optional": true @@ -5763,7 +5773,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5783,7 +5792,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5795,18 +5803,18 @@ "optional": true }, "tar": { - "version": "4.4.8", + "version": "4.4.13", "bundled": true, "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "util-deprecate": { @@ -5827,14 +5835,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { - "version": "3.0.3", + "version": "3.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -6010,7 +6016,6 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", - "dev": true, "requires": { "cross-fetch": "2.2.2" } @@ -6066,6 +6071,14 @@ "object-path": "^0.11.4" } }, + "graphql-vision-plugin": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/graphql-vision-plugin/-/graphql-vision-plugin-0.1.2.tgz", + "integrity": "sha512-PnS2mKHJ61EO6d3eGpbUV0NlMlFCsIT4yKd6R5mhDEzGTADrSN8XwG+Uh6PHtaqbemZNmuQrPnVEFaQ/TslBxQ==", + "requires": { + "graphql-request": "^1.8.2" + } + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -11260,15 +11273,15 @@ } }, "ts-node": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.5.4.tgz", - "integrity": "sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.0.tgz", + "integrity": "sha512-NVJ/5ZjrxCS445zMIxGWiieTZoWcHbqtVKa+1V7opSmOFCYi7fvkugEXZBC9IvUnEzNewZWy8dw0u6iSTridpA==", "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "yn": "^4.0.0" } }, "tslib": { @@ -11715,8 +11728,7 @@ "whatwg-fetch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", - "dev": true + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -12089,9 +12101,9 @@ } }, "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", + "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==" }, "zen-observable": { "version": "0.8.14", diff --git a/package.json b/package.json index e4689a2..0e5f118 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "express": "^4.17.1", "graphql": "^14.5.8", "graphql-middleware": "^4.0.2", + "graphql-vision-plugin": "^0.1.2", "http-status": "^1.4.2", "ip": "^1.1.5", "ts-node": "^8.5.4", diff --git a/src/config/polaris-server-config.ts b/src/config/polaris-server-config.ts index 3d72305..70e57a3 100644 --- a/src/config/polaris-server-config.ts +++ b/src/config/polaris-server-config.ts @@ -1,17 +1,15 @@ import { ApplicationProperties, LoggerConfiguration } from '@enigmatis/polaris-logs'; import { Connection } from '@enigmatis/polaris-typeorm'; -import { DocumentNode } from 'graphql'; -import { IResolvers } from 'graphql-tools'; +import { ApolloServerExpressConfig } from 'apollo-server-express'; import { MiddlewareConfiguration } from '../index'; -export interface PolarisServerConfig { - typeDefs: DocumentNode | DocumentNode[] | string | string[]; - resolvers: IResolvers | IResolvers[]; +export interface PolarisServerConfig extends ApolloServerExpressConfig { port: number; applicationProperties: ApplicationProperties; loggerConfiguration: LoggerConfiguration; - middlewareConfiguration: MiddlewareConfiguration; + middlewareConfiguration?: MiddlewareConfiguration; customMiddlewares?: any[]; + visionServer?: string; customContext?: (context: any) => any; connection?: Connection; } diff --git a/src/config/polaris-server-options.ts b/src/config/polaris-server-options.ts index edc9695..7985886 100644 --- a/src/config/polaris-server-options.ts +++ b/src/config/polaris-server-options.ts @@ -1,17 +1,15 @@ import { ApplicationProperties, LoggerConfiguration } from '@enigmatis/polaris-logs'; import { Connection } from '@enigmatis/polaris-typeorm'; -import { DocumentNode } from 'graphql'; -import { IResolvers } from 'graphql-tools'; +import { ApolloServerExpressConfig } from 'apollo-server-express'; import { MiddlewareConfiguration } from '../index'; -export interface PolarisServerOptions { - typeDefs: DocumentNode | DocumentNode[] | string | string[]; - resolvers: IResolvers | IResolvers[]; +export interface PolarisServerOptions extends ApolloServerExpressConfig { port: number; applicationProperties?: ApplicationProperties; loggerConfiguration?: LoggerConfiguration; middlewareConfiguration?: MiddlewareConfiguration; customMiddlewares?: any[]; + visionServer?: string; customContext?: (context: any) => any; connection?: Connection; } diff --git a/src/extensions/extensions-listener.ts b/src/extensions/extensions-listener.ts index 2f2204b..857e2f6 100644 --- a/src/extensions/extensions-listener.ts +++ b/src/extensions/extensions-listener.ts @@ -16,7 +16,7 @@ export class ExtensionsListener implements GraphQLRequestListener { }: { context: PolarisGraphQLContext; response: any } = requestContext; if (context.returnedExtensions) { this.logger.debug('extensions were set to response'); - response.extensions = context.returnedExtensions; + response.extensions = { ...response.extensions, ...context.returnedExtensions }; } return requestContext; } diff --git a/src/server/polaris-server.ts b/src/server/polaris-server.ts index 6086756..530e53d 100644 --- a/src/server/polaris-server.ts +++ b/src/server/polaris-server.ts @@ -1,9 +1,11 @@ import { PolarisGraphQLLogger } from '@enigmatis/polaris-graphql-logger'; import { makeExecutablePolarisSchema } from '@enigmatis/polaris-schema'; -import { ApolloServer } from 'apollo-server-express'; +import { ApolloServer, ApolloServerExpressConfig } from 'apollo-server-express'; +import { ApolloServerPlugin } from 'apollo-server-plugin-base'; import * as express from 'express'; import { GraphQLSchema } from 'graphql'; import { applyMiddleware } from 'graphql-middleware'; +import GraphQLVisionPlugin from 'graphql-vision-plugin'; import * as http from 'http'; import * as path from 'path'; import { formatError, PolarisServerOptions } from '..'; @@ -28,6 +30,7 @@ export class PolarisServer { config.middlewareConfiguration || getDefaultMiddlewareConfiguration(), loggerConfiguration: config.loggerConfiguration || getDefaultLoggerConfiguration(), applicationProperties: config.applicationProperties || { version: 'v1' }, + tracing: config.tracing || config.visionServer !== undefined || false, }; } @@ -37,7 +40,6 @@ export class PolarisServer { constructor(config: PolarisServerOptions) { this.polarisServerConfig = PolarisServer.getActualConfiguration(config); - this.polarisGraphQLLogger = new PolarisGraphQLLogger( this.polarisServerConfig.loggerConfiguration, this.polarisServerConfig.applicationProperties, @@ -76,15 +78,28 @@ export class PolarisServer { this.polarisGraphQLLogger.info('Server stopped'); } - private getApolloServerConfigurations(serverContext: (context: any) => any) { + private getApolloServerConfigurations( + serverContext: (context: any) => any, + ): ApolloServerExpressConfig { + const plugins: Array ApolloServerPlugin)> = [ + new ExtensionsPlugin(this.polarisGraphQLLogger), + new ResponseHeadersPlugin(this.polarisGraphQLLogger), + ]; + + if (this.polarisServerConfig.plugins) { + plugins.push(...this.polarisServerConfig.plugins); + } + + if (this.polarisServerConfig.visionServer) { + plugins.push(new GraphQLVisionPlugin(this.polarisServerConfig.visionServer)); + } + return { + ...this.polarisServerConfig, schema: this.getSchemaWithMiddlewares(), formatError, context: (ctx: any) => serverContext(ctx), - plugins: [ - new ExtensionsPlugin(this.polarisGraphQLLogger), - new ResponseHeadersPlugin(this.polarisGraphQLLogger), - ], + plugins, playground: { cdnUrl: '', version: '',