From 099654efc01a6a94ad6576b8d6568e85278e73d9 Mon Sep 17 00:00:00 2001 From: Yarin Date: Thu, 9 Jan 2020 00:28:46 +0200 Subject: [PATCH 1/3] readme fix (logo in a better pixelation) --- README.md | 19 +++++++++++-------- static/img/polaris-iconsmall.png | Bin 10774 -> 0 bytes static/img/polaris-logo.png | Bin 25504 -> 0 bytes static/img/polariscoolsm.png | Bin 0 -> 25311 bytes 4 files changed, 11 insertions(+), 8 deletions(-) delete mode 100644 static/img/polaris-iconsmall.png delete mode 100644 static/img/polaris-logo.png create mode 100644 static/img/polariscoolsm.png diff --git a/README.md b/README.md index 0b2edbc..e70db02 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,22 @@ -![Polaris-logo](static/img/polaris-logo.png) +

-# polaris-core +![Polaris-logo](static/img/polariscoolsm.png) + +#polaris-core [![NPM version](https://img.shields.io/npm/v/@enigmatis/polaris-core.svg?style=flat-square)](https://www.npmjs.com/package/@enigmatis/polaris-core) [![Build Status](https://travis-ci.com/Enigmatis/polaris-core.svg?branch=master)](https://travis-ci.com/Enigmatis/polaris-core) -This is the core library of polaris. This core is the best way to quickly build a data service based on polaris products. +

+Polaris is a set of libraries that help you create the perfect graphql service, integrated with type orm and the hottest API standards. +polaris-core organizes all of the libraries for you, and let you create your graphql service as easily as it can be. ## Features -- Integration with ApolloServer and Express -- Soft delete -- Realities -- Irrelevant entities -- Data version +- GraphQL service creation (integrated with apollo-server & express) +- Auto soft deletion of entities +- Fetching Deltas of entities (including irrelevant entities) +- Data versioning of entities - Standard errors - Standard logs - Standard GraphQL scalars diff --git a/static/img/polaris-iconsmall.png b/static/img/polaris-iconsmall.png deleted file mode 100644 index 4431879add19ff04c92d21838518d39392c0bc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10774 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 U;P_h_EC2ui07*qoM6N<$f@hh~>i_@% diff --git a/static/img/polaris-logo.png b/static/img/polaris-logo.png deleted file mode 100644 index 4ab7c863e379585c466902662bc98a5bfac18b5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25504 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 diff --git a/static/img/polariscoolsm.png b/static/img/polariscoolsm.png new file mode 100644 index 0000000000000000000000000000000000000000..be2727caab4cb3e3877d703f4e88098fd8817543 GIT binary patch literal 25311 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⪼?3kqd_OMNY{->rA6Ap73 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

T6sgYAzPoQ`E*rq+~R{?^Ss(o_aK=H>!MVNx<#8 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 xw< Date: Fri, 10 Jan 2020 00:12:17 +0200 Subject: [PATCH 2/3] feat: add graphql-vision plugin to polaris-server, and add option to send ApolloServer configurations to the options object --- package-lock.json | 91 ++++++++------------------- package.json | 1 + src/config/polaris-server-config.ts | 10 ++- src/config/polaris-server-options.ts | 8 +-- src/extensions/extensions-listener.ts | 2 +- src/server/polaris-server.ts | 29 ++++++--- 6 files changed, 57 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e1ec19..0487992 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2981,11 +2981,6 @@ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" }, - "arg": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", - "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3528,7 +3523,8 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "buffer-writer": { "version": "2.0.0", @@ -4252,7 +4248,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 +4256,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=" } } }, @@ -4517,11 +4511,6 @@ "streamsearch": "0.1.2" } }, - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" - }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", @@ -5310,8 +5299,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -5332,14 +5320,12 @@ "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" @@ -5354,20 +5340,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", @@ -5484,8 +5467,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5497,7 +5479,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5512,7 +5493,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5520,14 +5500,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5546,7 +5524,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5627,8 +5604,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5640,7 +5616,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5726,8 +5701,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5763,7 +5737,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 +5756,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5827,14 +5799,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -6010,7 +5980,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 +6035,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", @@ -8125,7 +8102,8 @@ "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true }, "makeerror": { "version": "1.0.11", @@ -10336,6 +10314,7 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11259,18 +11238,6 @@ } } }, - "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==", - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - } - }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -11715,8 +11682,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", @@ -12088,11 +12054,6 @@ "camelcase": "^4.1.0" } }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" - }, "zen-observable": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz", 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: '', From 1caa3b264732f094deadd873e5b55b4b6fbafcf3 Mon Sep 17 00:00:00 2001 From: Yarin Date: Fri, 10 Jan 2020 15:16:20 +0200 Subject: [PATCH 3/3] chore: update package log --- package-lock.json | 119 +++++++++++++++++++++++++++++++++------------- 1 file changed, 85 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0487992..a05f200 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2981,6 +2981,11 @@ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" }, + "arg": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", + "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3345,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", @@ -3523,8 +3538,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-writer": { "version": "2.0.0", @@ -4511,6 +4525,11 @@ "streamsearch": "0.1.2" } }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" + }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", @@ -5078,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", @@ -5280,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": { @@ -5332,7 +5359,7 @@ } }, "chownr": { - "version": "1.1.1", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true @@ -5359,7 +5386,7 @@ "optional": true }, "debug": { - "version": "4.1.1", + "version": "3.2.6", "bundled": true, "dev": true, "optional": true, @@ -5386,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": { @@ -5417,7 +5444,7 @@ } }, "glob": { - "version": "7.1.3", + "version": "7.1.6", "bundled": true, "dev": true, "optional": true, @@ -5446,7 +5473,7 @@ } }, "ignore-walk": { - "version": "3.0.1", + "version": "3.0.3", "bundled": true, "dev": true, "optional": true, @@ -5465,7 +5492,7 @@ } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, "dev": true }, @@ -5503,7 +5530,7 @@ "dev": true }, "minipass": { - "version": "2.3.5", + "version": "2.9.0", "bundled": true, "dev": true, "requires": { @@ -5512,12 +5539,12 @@ } }, "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": { @@ -5529,24 +5556,24 @@ } }, "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, @@ -5560,7 +5587,7 @@ "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", - "tar": "^4" + "tar": "^4.4.2" } }, "nopt": { @@ -5574,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, @@ -5649,7 +5685,7 @@ "optional": true }, "process-nextick-args": { - "version": "2.0.0", + "version": "2.0.1", "bundled": true, "dev": true, "optional": true @@ -5690,7 +5726,7 @@ } }, "rimraf": { - "version": "2.6.3", + "version": "2.7.1", "bundled": true, "dev": true, "optional": true, @@ -5716,7 +5752,7 @@ "optional": true }, "semver": { - "version": "5.7.0", + "version": "5.7.1", "bundled": true, "dev": true, "optional": true @@ -5767,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": { @@ -5802,7 +5838,7 @@ "dev": true }, "yallist": { - "version": "3.0.3", + "version": "3.1.1", "bundled": true, "dev": true } @@ -8102,8 +8138,7 @@ "make-error": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" }, "makeerror": { "version": "1.0.11", @@ -10314,7 +10349,6 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11238,6 +11272,18 @@ } } }, + "ts-node": { + "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": "^4.0.0" + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -12054,6 +12100,11 @@ "camelcase": "^4.1.0" } }, + "yn": { + "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", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz",