From 7c4eb905d57ecd0e81ff63895f74e3ecaf377627 Mon Sep 17 00:00:00 2001 From: Dan Caddigan Date: Sat, 26 Jan 2019 12:17:47 -0500 Subject: [PATCH] fix(reverts): revert a few changes that caused issues (#45) * Revert "feat(app): rename app to server (#44)" This reverts commit aa279f45130ca9f643b6726f8ee109817d8b0830. * Revert "fix(generated): refactor generated files (#43)" This reverts commit 533d8383422fee5805009e51b25a8a8b50ed6ee8. --- README.md | 6 +- examples/1-simple-model/src/index.ts | 6 +- examples/2-complex-example/package.json | 1 - .../src/{server.ts => app.ts} | 6 +- examples/2-complex-example/src/index.test.ts | 10 +- examples/2-complex-example/src/index.ts | 6 +- examples/2-complex-example/tools/generate.ts | 19 --- examples/2-complex-example/tools/seed.ts | 16 ++- examples/2-complex-example/warthog.sqlite.tmp | 0 .../3-one-to-many-relationship/src/index.ts | 8 +- .../4-many-to-many-relationship/src/index.ts | 8 +- package.json | 1 - src/core/{server.ts => app.ts} | 112 ++++++++++++------ src/core/code-generator.ts | 101 ---------------- src/core/index.ts | 2 +- src/torm/createConnection.ts | 66 +++++------ yarn.lock | 30 ----- 17 files changed, 135 insertions(+), 263 deletions(-) rename examples/2-complex-example/src/{server.ts => app.ts} (84%) delete mode 100644 examples/2-complex-example/tools/generate.ts delete mode 100644 examples/2-complex-example/warthog.sqlite.tmp rename src/core/{server.ts => app.ts} (68%) delete mode 100644 src/core/code-generator.ts diff --git a/README.md b/README.md index a9a44bc4..f8abb61e 100644 --- a/README.md +++ b/README.md @@ -79,11 +79,11 @@ export class UserResolver extends BaseResolver { import 'reflect-metadata'; import { Container } from 'typedi'; -import { Server } from 'warthog'; +import { App } from 'warthog'; async function bootstrap() { - const server = new Server({ container: Container }); - return server.start(); + const app = new App({ container: Container }); + return app.start(); } bootstrap() diff --git a/examples/1-simple-model/src/index.ts b/examples/1-simple-model/src/index.ts index 3daa4b0d..e3c8113f 100644 --- a/examples/1-simple-model/src/index.ts +++ b/examples/1-simple-model/src/index.ts @@ -4,15 +4,15 @@ import { Container } from 'typedi'; dotenv.config(); -import { Server } from '../../../src/'; +import { App } from '../../../src/'; async function bootstrap() { - const server = new Server({ + const app = new App({ container: Container, warthogImportPath: '../../../src' // Path written in generated classes }); - return server.start(); + return app.start(); } bootstrap().catch((error: Error) => { diff --git a/examples/2-complex-example/package.json b/examples/2-complex-example/package.json index 58471b26..f71f5d1a 100644 --- a/examples/2-complex-example/package.json +++ b/examples/2-complex-example/package.json @@ -7,7 +7,6 @@ "db:create": "createdbjs $(dotenv -p TYPEORM_DATABASE) 2>&1 || :", "db:drop": "dropdbjs $(dotenv -p TYPEORM_DATABASE) 2>&1 || :", "db:seed:dev": "dotenv -- ts-node tools/seed.ts", - "generate:code": "dotenv -- ts-node tools/generate.ts", "lint": "tslint --fix -c ./tslint.json -p ./tsconfig.json", "playground:open": "open http://localhost:$(dotenv -p APP_PORT)/playground", "start": "yarn start:ts", diff --git a/examples/2-complex-example/src/server.ts b/examples/2-complex-example/src/app.ts similarity index 84% rename from examples/2-complex-example/src/server.ts rename to examples/2-complex-example/src/app.ts index 360edac1..c67c223a 100644 --- a/examples/2-complex-example/src/server.ts +++ b/examples/2-complex-example/src/app.ts @@ -2,7 +2,7 @@ import 'reflect-metadata'; import { Container } from 'typedi'; -import { BaseContext, Server } from '../../../src/'; +import { App, BaseContext } from '../../../src/'; // import { User } from './modules/user/user.model'; @@ -14,8 +14,8 @@ interface Context extends BaseContext { }; } -export function getServer(AppOptions = {}, dbOptions = {}) { - return new Server( +export function getApp(AppOptions = {}, dbOptions = {}) { + return new App( { container: Container, // Inject a fake user. In a real app you'd parse a JWT to add the user diff --git a/examples/2-complex-example/src/index.test.ts b/examples/2-complex-example/src/index.test.ts index 97b2daac..151484dc 100644 --- a/examples/2-complex-example/src/index.test.ts +++ b/examples/2-complex-example/src/index.test.ts @@ -3,18 +3,18 @@ import 'reflect-metadata'; import { Binding } from '../generated/binding'; +import { getApp } from './app'; import { User } from './modules/user/user.model'; -import { getServer } from './server'; -const server = getServer({}, { logging: false }); +const app = getApp({}, { logging: false }); let binding: Binding; let testUser: User; beforeAll(async done => { console.error = jest.fn(); - await server.start(); - binding = ((await server.getBinding()) as unknown) as Binding; // TODO: clean this up + await app.start(); + binding = ((await app.getBinding()) as unknown) as Binding; // TODO: clean this up const key = new Date().getTime(); @@ -34,7 +34,7 @@ beforeAll(async done => { afterAll(async done => { (console.error as any).mockRestore(); - await server.stop(); + await app.stop(); done(); }); diff --git a/examples/2-complex-example/src/index.ts b/examples/2-complex-example/src/index.ts index 9dc07850..04ac7a6d 100644 --- a/examples/2-complex-example/src/index.ts +++ b/examples/2-complex-example/src/index.ts @@ -2,13 +2,13 @@ import 'reflect-metadata'; import * as dotenv from 'dotenv'; -import { getServer } from './server'; +import { getApp } from './app'; dotenv.config(); async function bootstrap() { - const server = getServer(); - await server.start(); + const app = getApp(); + await app.start(); } bootstrap().catch((error: Error) => { diff --git a/examples/2-complex-example/tools/generate.ts b/examples/2-complex-example/tools/generate.ts deleted file mode 100644 index d08cd3d6..00000000 --- a/examples/2-complex-example/tools/generate.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as Debug from 'debug'; - -import { getServer } from '../src/server'; - -const logger = Debug('warthog:generate'); - -async function generate() { - return getServer({ mockDBConnection: true }).generateFiles(); -} - -generate() - .then(result => { - logger(result); - return process.exit(0); - }) - .catch(err => { - console.log(err); - return process.exit(1); - }); diff --git a/examples/2-complex-example/tools/seed.ts b/examples/2-complex-example/tools/seed.ts index fc2acca8..54fc96fb 100644 --- a/examples/2-complex-example/tools/seed.ts +++ b/examples/2-complex-example/tools/seed.ts @@ -1,7 +1,7 @@ import * as Debug from 'debug'; import * as Faker from 'faker'; -import { getServer } from '../src/server'; +import { getApp } from '../src/app'; if (process.env.NODE_ENV !== 'development') { throw 'Seeding only available in development environment'; @@ -12,10 +12,10 @@ const logger = Debug('warthog:seed'); const NUM_USERS = 100; async function seedDatabase() { - const server = getServer(); - await server.start(); + const app = getApp(); + await app.start(); - const binding = await server.getBinding(); + const binding = await app.getBinding(); for (let index = 0; index < NUM_USERS; index++) { const random = new Date() @@ -24,9 +24,7 @@ async function seedDatabase() { .substring(8, 13); const firstName = Faker.name.firstName(); const lastName = Faker.name.lastName(); - const email = `${firstName - .substr(0, 1) - .toLowerCase()}${lastName.toLowerCase()}-${random}@fakeemail.com`; + const email = `${firstName.substr(0, 1).toLowerCase()}${lastName.toLowerCase()}-${random}@fakeemail.com`; try { const user = await binding.mutation.createUser( @@ -45,7 +43,7 @@ async function seedDatabase() { } } - return server.stop(); + return app.stop(); } seedDatabase() @@ -54,6 +52,6 @@ seedDatabase() return process.exit(0); }) .catch(err => { - console.log(err); + logger(err); return process.exit(1); }); diff --git a/examples/2-complex-example/warthog.sqlite.tmp b/examples/2-complex-example/warthog.sqlite.tmp deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/3-one-to-many-relationship/src/index.ts b/examples/3-one-to-many-relationship/src/index.ts index c4bf5a7e..3c8cf12f 100644 --- a/examples/3-one-to-many-relationship/src/index.ts +++ b/examples/3-one-to-many-relationship/src/index.ts @@ -1,18 +1,18 @@ -import * as dotenv from 'dotenv'; import 'reflect-metadata'; +import * as dotenv from 'dotenv'; import { Container } from 'typedi'; dotenv.config(); -import { Server } from '../../../src/'; +import { App } from '../../../src/'; async function bootstrap() { - const server = new Server({ + const app = new App({ container: Container, warthogImportPath: '../../../src' // Path written in generated classes }); - await server.start(); + await app.start(); } bootstrap().catch((error: Error) => { diff --git a/examples/4-many-to-many-relationship/src/index.ts b/examples/4-many-to-many-relationship/src/index.ts index c4bf5a7e..3c8cf12f 100644 --- a/examples/4-many-to-many-relationship/src/index.ts +++ b/examples/4-many-to-many-relationship/src/index.ts @@ -1,18 +1,18 @@ -import * as dotenv from 'dotenv'; import 'reflect-metadata'; +import * as dotenv from 'dotenv'; import { Container } from 'typedi'; dotenv.config(); -import { Server } from '../../../src/'; +import { App } from '../../../src/'; async function bootstrap() { - const server = new Server({ + const app = new App({ container: Container, warthogImportPath: '../../../src' // Path written in generated classes }); - await server.start(); + await app.start(); } bootstrap().catch((error: Error) => { diff --git a/package.json b/package.json index 0e9a6035..3fe2c939 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,6 @@ "pg": "^7.7.1", "reflect-metadata": "^0.1.12", "shortid": "^2.2.14", - "sqlite3": "^4.0.6", "ts-node": "^7.0.1", "type-graphql": "^0.16.0", "typedi": "^0.8.0", diff --git a/src/core/server.ts b/src/core/app.ts similarity index 68% rename from src/core/server.ts rename to src/core/app.ts index 40f17cef..53722e43 100644 --- a/src/core/server.ts +++ b/src/core/app.ts @@ -4,10 +4,12 @@ import { ApolloServer } from 'apollo-server-express'; import { Request } from 'express'; import express = require('express'); -import { GraphQLSchema } from 'graphql'; +import { writeFileSync } from 'fs'; +import { GraphQLSchema, printSchema } from 'graphql'; import { Binding } from 'graphql-binding'; import { Server as HttpServer } from 'http'; import { Server as HttpsServer } from 'https'; +import * as mkdirp from 'mkdirp'; import opn = require('opn'); import * as path from 'path'; import { AuthChecker, buildSchema, useContainer as TypeGraphQLUseContainer } from 'type-graphql'; // formatArgumentValidationError @@ -15,45 +17,42 @@ import { Container } from 'typedi'; import { Connection, ConnectionOptions, useContainer as TypeORMUseContainer } from 'typeorm'; import { logger, Logger } from '../core/logger'; -import { getRemoteBinding } from '../gql'; +import { generateBindingFile, getRemoteBinding } from '../gql'; import { DataLoaderMiddleware, healthCheckMiddleware } from '../middleware'; +import { SchemaGenerator } from '../schema/'; import { authChecker } from '../tgql'; -import { createDBConnection, mockDBConnection } from '../torm'; -import { CodeGenerator } from './code-generator'; +import { createDBConnection } from '../torm'; import { BaseContext } from './Context'; import { Maybe } from './types'; -export interface ServerOptions { - container: Container; - +export interface AppOptions { authChecker?: AuthChecker; + container: Container; context?: (request: Request) => object; host?: string; generatedFolder?: string; middlewares?: any[]; // TODO: fix - mockDBConnection?: boolean; openPlayground?: boolean; port?: string | number; - resolversPath?: string[]; warthogImportPath?: string; } -export class Server { +export class App { appHost: string; appPort: number; authChecker: AuthChecker; connection!: Connection; container: Container; + context: (request: Request) => object; generatedFolder: string; graphQLServer!: ApolloServer; httpServer!: HttpServer | HttpsServer; logger: Logger; - mockDBConnection: boolean = false; schema?: GraphQLSchema; constructor( - private appOptions: ServerOptions, + private appOptions: AppOptions, private dbOptions: Partial = {} ) { if (!process.env.NODE_ENV) { @@ -71,7 +70,9 @@ export class Server { throw new Error('`host` is required'); } this.appHost = host; + this.appPort = parseInt(String(this.appOptions.port || process.env.APP_PORT), 10) || 4000; + this.authChecker = this.appOptions.authChecker || authChecker; // Use https://github.com/inxilpro/node-app-root-path to find project root @@ -80,15 +81,26 @@ export class Server { Container.set('warthog:generatedFolder', this.generatedFolder); this.logger = Container.has('LOGGER') ? Container.get('LOGGER') : logger; + + const returnEmpty = () => { + return {}; + }; + + this.context = this.appOptions.context || returnEmpty; + + this.createGeneratedFolder(); + } + + createGeneratedFolder() { + return mkdirp.sync(this.generatedFolder); } async establishDBConnection(): Promise { if (!this.connection) { - // Asking for a mock connection will not connect to your preferred DB and will instead - // connect to sqlite so that you can still access all metadata - const connectionFn = this.appOptions.mockDBConnection ? mockDBConnection : createDBConnection; - - this.connection = await connectionFn(this.dbOptions); + if (typeof this.dbOptions.synchronize === 'undefined') { + this.dbOptions = { ...this.dbOptions, synchronize: process.env.NODE_ENV === 'development' }; + } + this.connection = await createDBConnection(this.dbOptions); } return this.connection; @@ -101,6 +113,13 @@ export class Server { }); } + async generateBinding() { + const schemaFilePath = path.join(this.generatedFolder, 'schema.graphql'); + const outputBindingPath = path.join(this.generatedFolder, 'binding.ts'); + + return generateBindingFile(schemaFilePath, outputBindingPath); + } + async buildGraphQLSchema(): Promise { if (!this.schema) { this.schema = await buildSchema({ @@ -115,24 +134,12 @@ export class Server { return this.schema; } - async generateFiles(): Promise { - await this.establishDBConnection(); - - await new CodeGenerator(this.connection, this.generatedFolder, { - resolversPath: this.appOptions.resolversPath, - warthogImportPath: this.appOptions.warthogImportPath - }).generate(); - } - async start() { + await this.writeGeneratedIndexFile(); await this.establishDBConnection(); - await this.generateFiles(); - - const contextGetter = - this.appOptions.context || - (() => { - return {}; - }); + await this.writeGeneratedTSTypes(); + await this.writeSchemaFile(); + await this.generateBinding(); this.graphQLServer = new ApolloServer({ context: (options: { req: Request }) => { @@ -144,7 +151,7 @@ export class Server { }, request: options.req, // Allows consumer to add to the context object - ex. context.user - ...contextGetter(options.req) + ...this.context(options.req) }; }, schema: this.schema @@ -190,7 +197,38 @@ export class Server { // Otherwise, only open in development return process.env.NODE_ENV === 'development'; } -} -// Backwards compatability. This was renamed. -export const App = Server; + private async writeGeneratedTSTypes() { + const generatedTSTypes = await this.getGeneratedTypes(); + + return this.writeToGeneratedFolder('classes.ts', generatedTSTypes); + } + + private async getGeneratedTypes() { + await this.establishDBConnection(); + + return SchemaGenerator.generate( + this.connection.entityMetadatas, + this.appOptions.warthogImportPath + ); + } + + private async writeSchemaFile() { + await this.buildGraphQLSchema(); + + return this.writeToGeneratedFolder('schema.graphql', printSchema(this.schema as GraphQLSchema)); + } + + // Write an index file that loads `classes` so that you can just import `../../generated` + // in your resolvers + private async writeGeneratedIndexFile() { + return this.writeToGeneratedFolder('index.ts', `export * from './classes';`); + } + + private async writeToGeneratedFolder(filename: string, contents: string) { + return writeFileSync(path.join(this.generatedFolder, filename), contents, { + encoding: 'utf8', + flag: 'w' + }); + } +} diff --git a/src/core/code-generator.ts b/src/core/code-generator.ts deleted file mode 100644 index 304f521c..00000000 --- a/src/core/code-generator.ts +++ /dev/null @@ -1,101 +0,0 @@ -// TODO-MVP: Add custom scalars such as graphql-iso-date -// import { GraphQLDate, GraphQLDateTime, GraphQLTime } from 'graphql-iso-date'; - -import { writeFileSync } from 'fs'; -import { GraphQLSchema, printSchema } from 'graphql'; -import * as mkdirp from 'mkdirp'; -import * as path from 'path'; -import { buildSchema } from 'type-graphql'; -import { Connection } from 'typeorm'; - -import { generateBindingFile } from '../gql'; -import { SchemaGenerator } from '../schema'; -import { authChecker } from '../tgql'; - -interface CodeGeneratorOptions { - warthogImportPath?: string; - resolversPath?: string[]; -} - -export class CodeGenerator { - resolversPath: string[]; - schema?: GraphQLSchema; - - constructor( - private connection: Connection, - private generatedFolder: string, - private options: CodeGeneratorOptions - ) { - if (!connection) { - throw new Error('FileGenerator: connection is required'); - } - - // Use https://github.com/inxilpro/node-app-root-path to find project root - this.generatedFolder = this.generatedFolder || path.join(process.cwd(), 'generated'); - this.resolversPath = this.options.resolversPath || [process.cwd() + '/**/*.resolver.ts']; - this.createGeneratedFolder(); - } - - createGeneratedFolder() { - return mkdirp.sync(this.generatedFolder); - } - - async generate() { - await this.writeGeneratedIndexFile(); - await this.writeGeneratedTSTypes(); - await this.writeSchemaFile(); - await this.generateBinding(); - } - - private async generateBinding() { - const schemaFilePath = path.join(this.generatedFolder, 'schema.graphql'); - const outputBindingPath = path.join(this.generatedFolder, 'binding.ts'); - - return generateBindingFile(schemaFilePath, outputBindingPath); - } - - private async buildGraphQLSchema(): Promise { - if (!this.schema) { - this.schema = await buildSchema({ - // Note: using the base authChecker here just to generated the .graphql file - // it's not actually being utilized here - authChecker, - resolvers: this.resolversPath - }); - } - - return this.schema; - } - - private async writeGeneratedTSTypes() { - const generatedTSTypes = await this.getGeneratedTypes(); - - return this.writeToGeneratedFolder('classes.ts', generatedTSTypes); - } - - private async getGeneratedTypes() { - return SchemaGenerator.generate( - this.connection.entityMetadatas, - this.options.warthogImportPath - ); - } - - private async writeSchemaFile() { - await this.buildGraphQLSchema(); - - return this.writeToGeneratedFolder('schema.graphql', printSchema(this.schema as GraphQLSchema)); - } - - // Write an index file that loads `classes` so that you can just import `../../generated` - // in your resolvers - private async writeGeneratedIndexFile() { - return this.writeToGeneratedFolder('index.ts', `export * from './classes';`); - } - - private async writeToGeneratedFolder(filename: string, contents: string) { - return writeFileSync(path.join(this.generatedFolder, filename), contents, { - encoding: 'utf8', - flag: 'w' - }); - } -} diff --git a/src/core/index.ts b/src/core/index.ts index 2f401b00..6dd5a23e 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -1,4 +1,4 @@ -export * from './server'; +export * from './app'; export * from './BaseModel'; export * from './Context'; export * from './types'; diff --git a/src/torm/createConnection.ts b/src/torm/createConnection.ts index 537cf40e..1017992a 100644 --- a/src/torm/createConnection.ts +++ b/src/torm/createConnection.ts @@ -2,33 +2,34 @@ import { ConnectionOptions, createConnection } from 'typeorm'; import { SnakeNamingStrategy } from './SnakeNamingStrategy'; -const BASE_DB_CONFIG = { - cli: { - entitiesDir: 'src/models', - migrationsDir: 'src/migration', - subscribersDir: 'src/subscriber' - }, - database: process.env.TYPEORM_DATABASE, - entities: process.env.TYPEORM_ENTITIES || ['src/**/*.model.ts'], - host: process.env.TYPEORM_HOST || 'localhost', - logger: 'advanced-console', - logging: process.env.TYPEORM_LOGGING || 'all', - migrations: ['src/migration/**/*.ts'], - namingStrategy: new SnakeNamingStrategy(), - password: process.env.TYPEORM_PASSWORD, - port: parseInt(process.env.TYPEORM_PORT || '', 10) || 5432, - subscribers: ['src/**/*.model.ts'], - synchronize: - typeof process.env.TYPEORM_SYNCHRONIZE !== 'undefined' - ? process.env.TYPEORM_SYNCHRONIZE - : process.env.NODE_ENV === 'development', - type: 'postgres', - username: process.env.TYPEORM_USERNAME -}; - export const createDBConnection = (dbOptions: Partial = {}) => { + // TODO: Fix any + const baseConfig: any = { + cli: { + entitiesDir: 'src/models', + migrationsDir: 'src/migration', + subscribersDir: 'src/subscriber' + }, + database: process.env.TYPEORM_DATABASE, + entities: process.env.TYPEORM_ENTITIES || ['src/**/*.model.ts'], + host: process.env.TYPEORM_HOST || 'localhost', + logger: 'advanced-console', + logging: process.env.TYPEORM_LOGGING || 'all', + migrations: ['src/migration/**/*.ts'], + namingStrategy: new SnakeNamingStrategy(), + password: process.env.TYPEORM_PASSWORD, + port: parseInt(process.env.TYPEORM_PORT || '', 10) || 5432, + subscribers: ['src/**/*.model.ts'], + synchronize: + typeof process.env.TYPEORM_SYNCHRONIZE !== 'undefined' + ? process.env.TYPEORM_SYNCHRONIZE + : process.env.NODE_ENV === 'development', + type: 'postgres', + username: process.env.TYPEORM_USERNAME + }; + const config = { - ...BASE_DB_CONFIG, + ...baseConfig, ...dbOptions }; @@ -36,18 +37,5 @@ export const createDBConnection = (dbOptions: Partial = {}) = throw new Error("createConnection: 'database' is required"); } - return createConnection(config as any); // TODO: fix any. It is complaining about `type` -}; - -// Provide a sort of mock DB connection that will create a sqlite DB, but will expose -// all of the TypeORM entity metadata for us. Ideally, we'd recreate all of the -// TypeORM decorators, but for now, using this "mock" connection and reading from their -// entity metadata is a decent hack -export const mockDBConnection = (dbOptions: Partial = {}) => { - return createDBConnection({ - ...dbOptions, - database: 'warthog.sqlite.tmp', - synchronize: false, - type: 'sqlite' - } as any); + return createConnection(config); }; diff --git a/yarn.lock b/yarn.lock index 5bce78d8..5e4e6ec9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5315,11 +5315,6 @@ nan@^2.9.2: resolved "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== -nan@~2.10.0: - version "2.10.0" - resolved "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== - nanoid@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/nanoid/-/nanoid-2.0.0.tgz#e1ab4a4b024a38d15531ba34a712a201540de639" @@ -5441,22 +5436,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-pre-gyp@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" - integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - nodecredstash@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/nodecredstash/-/nodecredstash-2.0.2.tgz#2a36ae12534c4e975aafde1deafdd85773eb5dcb" @@ -7445,15 +7424,6 @@ sprintf-js@~1.0.2: resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sqlite3@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.6.tgz#e587b583b5acc6cb38d4437dedb2572359c080ad" - integrity sha512-EqBXxHdKiwvNMRCgml86VTL5TK1i0IKiumnfxykX0gh6H6jaKijAXvE9O1N7+omfNSawR2fOmIyJZcfe8HYWpw== - dependencies: - nan "~2.10.0" - node-pre-gyp "^0.11.0" - request "^2.87.0" - sshpk@^1.7.0: version "1.16.0" resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de"