diff --git a/.gitignore b/.gitignore index 4e43788..311b9a6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ dev.sqlite3 db ./output dist +log/all-logs-readable.log +yarn-error.log +bin/test-model-generator.js + diff --git a/README.md b/README.md index a6002d8..8b755e7 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,8 @@ type User { } ``` -You could update the generated `CreateUserInput` input object to take a `password` field: +The generator automatically adjusts your schema and code in the following way: +It adjusts the generated `CreateUserInput` input object to take a `password` field: ```graphql input CreateUserInput { @@ -125,7 +126,7 @@ input CreateUserInput { } ``` -And then update the generated `User` model to hash that password and store it: +And in updates the generated `User` model to hash that password and store it: ```js import bcrypt from 'bcrypt'; @@ -151,7 +152,112 @@ class User { } ``` -### Client side code +So the "User" type is treated differently as any other default type. + +## Authorization + +create-graphql-server can also handle authorizations. There are two ways to control authorizations: +* Authorization by User-Roles +* Authorization by Document-Roles + +**User-Roles** are stored in the User type. They group a number of users together, having all the same authorizations, defined with their role they play. Use it to define a user as a "super-administrator", "administrator", "publisher", "editor" or a "default-user". You are free to define your own names and numbers of User-Roles. + +**Document-Roles** are stored in document fields which are referencing a User._id. They are there, to define fine grained authorizations for individual documents based on single user level. Use it to define an "owner", "creator", author" or "coauthor" of a document. Define the authorization they are allowed to do with this specific document. Here, the userId will be stored in the corresponding document field instead. If a user wants the specific authorization, it is tested, if this userId is stored in the document, if so, he gains access, if not, it is not allowed. + +You can combine both models to define your authorization logic. + +Add authorization logic by using a simple @authorize directive within your type definition. Use the following syntax: +```javascript +type ... +@authorize( + : [] + : [] + : [] +) +... +: String @authRole("") // User-Role: Stores the Role name in the User type +: User @authRole("") // Document-Role: Stores Single UserId +: [User] @authRole("") // Document-Role: Stores Multiple UserIds +... +``` + +A \ can be any name, you want to use for, to describe the authorizations of a group of users. A user can be assigned this \ in a user type of any \. You have to mark the relevant field name with the directive @authRole("\"). + +A list of authorizations can be: +* create: role is authorized to create a record of this type. +* read: role is authorized to readOne and readMany of this type. + * readOne: role is authorized to only readOne of this type. + * readMany: role is authorized to readMany of this type. +* update: role is authorized to update a record of this type. +* delete: role is authorized to delete a record of this type. + +You can add any number of roles within a @authorize directive. + +There is one pre-defined User-Role called "world". The world role includes all users, signed-in and not signed-in anonymous users. Use this role to define an authorization-list valid for all users. + +#### Example on type User +```javascript +type User + +@authorize( + admin: ["create", "read", "update", "delete"] // User-Role + this: ["read", "update", "delete"] // Document-Role +) + +{ + role: String @authRole("admin") + username: String! + + bio: String + notify: Boolean + + tweets(minLikes: Int): [Tweet!] @hasMany(as: "author") + liked: [Tweet!] @belongsToMany + + following: [User!] @belongsToMany + followers: [User!] @hasAndBelongsToMany(as: "following") +} +``` + +#### Example on type Tweet + +```javascript +type Tweet + +@authorize( + admin: ["create", "read", "update", "delete"], // User-Role + world: ["read"] // User-Role + author: ["create", "read", "update", "delete"], // Document-Role + coauthors: ["read", "update"], // Document-Role +) + +{ + author: User! @unmodifiable @belongsTo @authRole("author") + coauthors: [User] @belongsTo @authRole("coauthors") + body: String! + + likers: [User!] @hasAndBelongsToMany(as: "liked") +} +``` + +If you add these types with the create-graphql-server command-line-interface: +```bash +create-graphql-server add-type path/to/input.graphql +``` + +It will add automatically the authorization code in the model/\.js files. Have a look into the generated code or in the test application: "test/output-app/model/User.js". + +You can manually change the code to protect also single fields of a type. Do it by the usage of this function: +```javascript +// userRole secretField document +docToInsert = protectFields(me, ['admin'], ['role'], docToInsert, { User: this.context.User }); +``` +By this, only a User (me) with role "admin" is allowed to access the field "docToInsert.role". For any other user, this field is removed from the docToInsert during the protectFields run. + +## Example Implementation +[Please have a look at the example implementation.](https://github.com/tmeasday/create-graphql-server/tree/master/test/output-app) + +## Client side code To create users, simply call your generated `createUser` mutation (you may want to add authorization to the resolver, feel free to modify it). diff --git a/bin/create-graphql-server.js b/bin/create-graphql-server.js index b34fc6d..6088b04 100755 --- a/bin/create-graphql-server.js +++ b/bin/create-graphql-server.js @@ -92,7 +92,6 @@ function getFileUpdateList(inputSchemaFile, mode) { // provide a dummy type file just with the type name inputSchemaStr = `type ${adjustTypeName(inputSchemaFile)} {}`; } - // generate code therefore in memory first const { typeName, diff --git a/bin/gentest.js b/bin/gentest.js new file mode 100755 index 0000000..9fe88d1 --- /dev/null +++ b/bin/gentest.js @@ -0,0 +1,39 @@ +#!/usr/bin/env babel-node --inspect +/* eslint-disable no-console */ +var exec = require('child_process').exec; +import fs from 'fs'; +import path from 'path'; +import os from 'os'; +import minimist from 'minimist'; +import generate from '../generate'; + +const argv = minimist(process.argv.slice(2)); +const commands = argv._; +const file = commands[0] || path.join('test', 'input', 'User.graphql'); +const targetDir = commands[1] || os.tmpdir(); +const inputSchemaStr = fs.readFileSync(file, 'utf8'); +const { + typeName, + TypeName, + outputSchemaStr, + resolversStr, + modelStr, +} = generate(inputSchemaStr); + +console.log('\n\INPUT:\n\n', inputSchemaStr); +console.log('\n\nSCHEMA:\n\n', outputSchemaStr); +console.log('\n\MODEL:\n\n', modelStr); +console.log('\n\RESOLVER:\n\n', resolversStr, '\n\n'); +writeFile(file, inputSchemaStr, '.input'); +writeFile(file, outputSchemaStr, '.graphql'); +writeFile(file, modelStr, '.model.js'); +writeFile(file, resolversStr, '.resolver.js'); + +process.exit(0); + +function writeFile(file, data, type) { + const newPath = path.join(targetDir, path.basename(file, '.graphql') + type); + console.log('writing to file and opening file in sublime editor...', newPath); + fs.writeFileSync(newPath, data, 'utf8'); + exec(`subl ${newPath}`); +} diff --git a/circle.yml b/circle.yml index a976c20..03e07b7 100644 --- a/circle.yml +++ b/circle.yml @@ -4,7 +4,6 @@ dependencies: - yarn: pwd: test/output-app - test: pre: - npm start /tmp/app-output: diff --git a/generate/index.js b/generate/index.js index 0574627..3834c9a 100644 --- a/generate/index.js +++ b/generate/index.js @@ -1,26 +1,23 @@ // We are in an intermediate step where we aren't actually generating files // but we are generating code. - import { parse, print } from 'graphql'; - -import generateSchema from './schema'; -import generateResolvers from './resolvers'; -import generateModel from './model'; import { lcFirst } from './util/capitalization'; +import generateModel from './model'; +import generateResolvers from './resolvers'; +import generateSchema from './schema'; export default function generate(inputSchemaStr) { const inputSchema = parse(inputSchemaStr); - const type = inputSchema.definitions[0]; const TypeName = type.name.value; - + const typeName = lcFirst(TypeName); const outputSchema = generateSchema(inputSchema); const outputSchemaStr = print(outputSchema); const resolversStr = generateResolvers(inputSchema); const modelStr = generateModel(inputSchema); - + return { - typeName: lcFirst(TypeName), + typeName, TypeName, outputSchemaStr, resolversStr, diff --git a/generate/model/index.js b/generate/model/index.js index cfbb1cb..c7aeebb 100644 --- a/generate/model/index.js +++ b/generate/model/index.js @@ -1,107 +1,25 @@ -import fs from 'fs'; import { print } from 'recast'; +import { templateToAst } from '../util/read'; +import getCode from '../util/getCode'; +import { MODEL } from '../util/constants'; +import { modulePath } from 'create-graphql-server-authorization'; -import { templateToAst } from '../read'; -import { lcFirst } from '../util/capitalization'; -import generatePerField from '../util/generatePerField'; - -function read(name) { - return fs.readFileSync(`${__dirname}/templates/${name}.js.template`, 'utf8'); -} - -const templates = { - base: read('base'), - singularAssociation: read('singularAssociation'), - paginatedAssociation: read('paginatedAssociation'), -}; - -function buildAst(template, { - typeName, - fieldName, - argsStr, - ReturnTypeName, - query, -}) { - const argsWithDefaultsStr = argsStr - .replace('lastCreatedAt', 'lastCreatedAt = 0') - .replace('limit', 'limit = 10'); - return templateToAst(template, { - typeName, - fieldName, - argsStr: argsWithDefaultsStr, - ReturnTypeName, - query, - }); +export default function generateModel(inputSchema) { + const ast = generateModelAst(inputSchema); + return print(ast, { trailingComma: true }).code; } - -const generators = { - base({ typeName, TypeName }) { - return templateToAst(templates.base, { typeName, TypeName }); - }, - belongsTo(replacements) { - return buildAst(templates.singularAssociation, replacements); - }, - belongsToMany(replacements) { - const { typeName, fieldName } = replacements; - return buildAst(templates.paginatedAssociation, { - ...replacements, - query: `_id: { $in: ${typeName}.${fieldName}Ids || [] }`, - }); - }, - // TODO: write test and implement - // hasOne({ typeName, fieldName, ReturnTypeName }, { as }) { - // return templateToAst(templates.singularAssociation, { - // typeName, - // fieldName, - // ReturnTypeName, - // }); - // }, - hasMany(replacements, { as }) { - const { typeName } = replacements; - return buildAst(templates.paginatedAssociation, { - ...replacements, - query: `${as || typeName}Id: ${typeName}._id`, - }); - }, - hasAndBelongsToMany(replacements, { as }) { - const { typeName } = replacements; - return buildAst(templates.paginatedAssociation, { - ...replacements, - query: `${as || typeName}Ids: ${typeName}._id`, - }); - }, -}; - export function generateModelAst(inputSchema) { - const type = inputSchema.definitions[0]; - const TypeName = type.name.value; - const typeName = lcFirst(TypeName); - - const ast = generators.base({ TypeName, typeName }); - // XXX: rather than hardcoding in array indices it would be less brittle to - // walk the tree using https://github.com/benjamn/ast-types - const classMethodsAst = ast.program.body[2] // export - .declaration // class declaration - .body.body; - - const findOneMethod = classMethodsAst.find(m => m.key.name === 'all'); - let nextIndex = classMethodsAst.indexOf(findOneMethod) + 1; - - - generatePerField(type, generators).forEach((resolverFunctionAst) => { - const classMethodAst = resolverFunctionAst.program.body[0] // class declaration - .body.body[0]; // classMethod - - classMethodsAst.splice(nextIndex, 0, classMethodAst); - nextIndex += 1; + const templateCode = getCode(MODEL, { + inputSchema, + basePath: [__dirname, 'templates'], + authPath: [modulePath, 'templates', 'model', 'auth'] }); - return ast; -} + // validate syntax of generated template code + const replacements = {}; + const ast = templateToAst(templateCode, replacements); -export default function generateModel(inputSchema) { - const ast = generateModelAst(inputSchema); - return print(ast, { trailingComma: true }).code; + return ast; } diff --git a/generate/model/templates/README.md b/generate/model/templates/README.md new file mode 100644 index 0000000..56c9898 --- /dev/null +++ b/generate/model/templates/README.md @@ -0,0 +1,12 @@ +In order to enable different authorization concepts, +the templates with a specific and opinionated authorization concept +are factored out, in a own npm module. You will find those templates +in the following npm module: + +** node_modules/create-graphql-server-authorization/templates/auth ** + +Please feel free to fork create-graphql-server-authorization +and implement your own authorization concept there, or add your own +templates here. + + diff --git a/generate/model/templates/base.js.template b/generate/model/templates/base.js.template deleted file mode 100644 index 0d5d4c2..0000000 --- a/generate/model/templates/base.js.template +++ /dev/null @@ -1,49 +0,0 @@ -import DataLoader from 'dataloader'; -import findByIds from 'mongo-find-by-ids'; - -export default class TypeName { - constructor(context) { - this.context = context; - this.collection = context.db.collection('typeName'); - this.pubsub = context.pubsub; - this.loader = new DataLoader(ids => findByIds(this.collection, ids)); - } - - findOneById(id) { - return this.loader.load(id); - } - - all({ lastCreatedAt = 0, limit = 10 }) { - return this.collection.find({ - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); - } - - async insert(doc) { - const docToInsert = Object.assign({}, doc, { - createdAt: Date.now(), - updatedAt: Date.now(), - }); - const id = (await this.collection.insertOne(docToInsert)).insertedId; - this.pubsub.publish('typeNameInserted', await this.findOneById(id)); - return id; - } - - async updateById(id, doc) { - const ret = await this.collection.update({ _id: id }, { - $set: Object.assign({}, doc, { - updatedAt: Date.now(), - }), - }); - this.loader.clear(id); - this.pubsub.publish('typeNameUpdated', await this.findOneById(id)); - return ret; - } - - async removeById(id) { - const ret = this.collection.remove({ _id: id }); - this.loader.clear(id); - this.pubsub.publish('typeNameRemoved', id); - return ret; - } -} diff --git a/generate/model/templates/common/defaultPaginatedField.template b/generate/model/templates/common/defaultPaginatedField.template new file mode 100644 index 0000000..d7727e1 --- /dev/null +++ b/generate/model/templates/common/defaultPaginatedField.template @@ -0,0 +1,9 @@ + + {{fieldName}}({{typeName}}, {{{argsString}}}, me, resolver) { + const baseQuery = { {{query}} }; + return this.context.{{ReturnTypeName}}.find( + {{argsFields}}, + me, + resolver + ); + } diff --git a/generate/model/templates/common/defaultSingularField.template b/generate/model/templates/common/defaultSingularField.template new file mode 100644 index 0000000..1393488 --- /dev/null +++ b/generate/model/templates/common/defaultSingularField.template @@ -0,0 +1,8 @@ + + {{fieldName}}({{typeName}}, me, resolver) { + return this.context.{{ReturnTypeName}}.findOneById( + {{typeName}}.{{fieldName}}Id, + me, + resolver + ); + } diff --git a/generate/model/templates/default/default.template b/generate/model/templates/default/default.template new file mode 100644 index 0000000..fe0b47b --- /dev/null +++ b/generate/model/templates/default/default.template @@ -0,0 +1,12 @@ +{{!-- If authorization is switched on, the authorize variable is true --}} +{{!-- so it loads the template in the file "authorize_default", --}} +{{!-- which you will find in the npm module: --}} +{{!-- node_modules/create-graphql-server-authorization/templates --}} +{{!-- If the type has no @authorize directive --}} +{{!-- then the default generator is processed and --}} +{{!-- the template default_default here is loaded --}} +{{#if authorize }} +{{> authorize_default }} +{{else }} +{{> default_default }} +{{/if }} \ No newline at end of file diff --git a/generate/model/templates/default/default_default.template b/generate/model/templates/default/default_default.template new file mode 100644 index 0000000..b4cf383 --- /dev/null +++ b/generate/model/templates/default/default_default.template @@ -0,0 +1,82 @@ +/* eslint-disable prettier */ +import DataLoader from 'dataloader'; + +export default class {{TypeName}} { + constructor(context) { + this.context = context; + this.collection = context.db.collection('{{typeName}}'); + this.pubsub = context.pubsub; + this.loader = new DataLoader(ids => + this.context.findByIds(this.collection, ids) + ); + } + + async findOneById(id) { + if (!this.loader) { + return null; + } + return await this.loader.load(id); + } + + find({ lastCreatedAt = 0, limit = 10, baseQuery = {} }) { + const finalQuery = { ...baseQuery, createdAt: { $gt: lastCreatedAt } }; + return this.collection + .find(finalQuery) + .sort({ createdAt: 1 }) + .limit(limit) + .toArray(); + } +{{#each singularFields }} +{{> defaultSingularField }} +{{/each}} +{{#each paginatedFields }} +{{> defaultPaginatedField }} +{{/each}} + + async insert(doc) { + const docToInsert = Object.assign({}, doc, { + createdAt: Date.now(), + updatedAt: Date.now() + }); + const id = (await this.collection.insertOne(docToInsert)).insertedId; + if (!id) { + throw new Error(`insert {{typeName}} not possible.`); + } + this.context.log.debug(`inserted {{typeName}} ${id}.`); + const insertedDoc = this.findOneById(id); + this.pubsub.publish('{{typeName}}Inserted', insertedDoc); + return insertedDoc; + } + + async updateById(id, doc) { + const docToUpdate = { + $set: Object.assign({}, doc, { + updatedAt: Date.now() + }) + }; + const baseQuery = { _id: id }; + const finalQuery = { ...baseQuery }; + const result = await this.collection.updateOne(finalQuery, docToUpdate); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`update {{typeName}} not possible for ${id}.`); + } + this.context.log.debug(`updated {{typeName}} ${id}.`); + this.loader.clear(id); + const updatedDoc = this.findOneById(id); + this.pubsub.publish('{{typeName}}Updated', updatedDoc); + return updatedDoc; + } + + async removeById(id) { + const baseQuery = { _id: id }; + const finalQuery = { ...baseQuery }; + const result = await this.collection.remove(finalQuery); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`remove {{typeName}} not possible for ${id}.`); + } + this.context.log.debug(`removed {{typeName}} ${id}.`); + this.loader.clear(id); + this.pubsub.publish('{{typeName}}Removed', id); + return result; + } +} diff --git a/generate/model/templates/paginatedAssociation.js.template b/generate/model/templates/paginatedAssociation.js.template deleted file mode 100644 index f5b948d..0000000 --- a/generate/model/templates/paginatedAssociation.js.template +++ /dev/null @@ -1,9 +0,0 @@ -class PaginatedAssociation { - fieldName(typeName, argsStr) { - return this.context.ReturnTypeName.collection.find({ - query, - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); - } - -} diff --git a/generate/model/templates/singularAssociation.js.template b/generate/model/templates/singularAssociation.js.template deleted file mode 100644 index 4e6c0a2..0000000 --- a/generate/model/templates/singularAssociation.js.template +++ /dev/null @@ -1,6 +0,0 @@ -class SingularAssociation { - fieldName(typeName) { - return this.context.ReturnTypeName.findOneById(typeName.fieldNameId); - } - -} diff --git a/generate/model/templates/user/default_user.template b/generate/model/templates/user/default_user.template new file mode 100644 index 0000000..1777934 --- /dev/null +++ b/generate/model/templates/user/default_user.template @@ -0,0 +1,88 @@ +/* eslint-disable prettier */ +import DataLoader from 'dataloader'; +import bcrypt from 'bcrypt'; +const SALT_ROUNDS = 10; + +export default class {{TypeName}} { + constructor(context) { + this.context = context; + this.collection = context.db.collection('{{typeName}}'); + this.pubsub = context.pubsub; + this.loader = new DataLoader(ids => + this.context.findByIds(this.collection, ids) + ); + } + + async findOneById(id) { + if (!this.loader) { + return null; + } + return await this.loader.load(id); + } + + find({ lastCreatedAt = 0, limit = 10, baseQuery = {} }{{#if authorize}}, me, resolver{{/if}}) { + const finalQuery = { ...baseQuery, createdAt: { $gt: lastCreatedAt } }; + return this.collection + .find(finalQuery) + .sort({ createdAt: 1 }) + .limit(limit) + .toArray(); + } +{{#each singularFields}} +{{> defaultSingularField }} +{{/each}} +{{#each paginatedFields}} +{{> defaultPaginatedField }} +{{/each}} + + async insert(doc) { + // We don't want to store passwords in plaintext + const { password, ...rest } = doc; + const hash = await bcrypt.hash(password, SALT_ROUNDS); + const docToInsert = Object.assign({}, rest, { + hash, + createdAt: Date.now(), + updatedAt: Date.now() + }); + const id = (await this.collection.insertOne(docToInsert)).insertedId; + if (!id) { + throw new Error(`insert {{typeName}} not possible.`); + } + this.context.log.debug(`inserted {{typeName}} ${id}.`); + const insertedDoc = this.findOneById(id); + this.pubsub.publish('{{typeName}}Inserted', insertedDoc); + return insertedDoc; + } + + async updateById(id, doc) { + const docToUpdate = { + $set: Object.assign({}, doc, { + updatedAt: Date.now() + }) + }; + const baseQuery = { _id: id }; + const finalQuery = { ...baseQuery }; + const result = await this.collection.updateOne(finalQuery, docToUpdate); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`update {{typeName}} not possible for ${id}.`); + } + this.context.log.debug(`updated {{typeName}} ${id}.`); + this.loader.clear(id); + const updatedDoc = this.findOneById(id); + this.pubsub.publish('{{typeName}}Updated', updatedDoc); + return updatedDoc; + } + + async removeById(id) { + const baseQuery = { _id: id }; + const finalQuery = { ...baseQuery }; + const result = await this.collection.remove(finalQuery); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`remove {{typeName}} not possible for ${id}.`); + } + this.context.log.debug(`removed {{typeName}} ${id}.`); + this.loader.clear(id); + this.pubsub.publish('{{typeName}}Removed', id); + return result; + } +} diff --git a/generate/model/templates/user/user.template b/generate/model/templates/user/user.template new file mode 100644 index 0000000..84c8caf --- /dev/null +++ b/generate/model/templates/user/user.template @@ -0,0 +1,12 @@ +{{!-- If authorization is switched on, the authorize variable is true --}} +{{!-- so it loads the template in the file "authorize_user", --}} +{{!-- which you will find in the npm module: --}} +{{!-- node_modules/create-graphql-server-authorization/templates --}} +{{!-- If the type has no @authorize directive --}} +{{!-- then the default generator is processed and --}} +{{!-- the template default_user here is loaded --}} +{{#if authorize }} +{{> authorize_user }} +{{else }} +{{> default_user }} +{{/if }} \ No newline at end of file diff --git a/generate/resolvers/index.js b/generate/resolvers/index.js index b983b3c..a5a65d9 100644 --- a/generate/resolvers/index.js +++ b/generate/resolvers/index.js @@ -1,62 +1,24 @@ -import fs from 'fs'; -import { print } from 'recast'; + import { print } from 'recast'; + import getCode from '../util/getCode'; + import { templateToAst } from '../util/read'; + import { RESOLVER } from '../util/constants'; + import { modulePath } from 'create-graphql-server-authorization'; -import { templateToAst } from '../read'; -import generatePerField from '../util/generatePerField'; -import { lcFirst } from '../util/capitalization'; - -function read(name) { - return fs.readFileSync(`${__dirname}/templates/${name}.js.template`, 'utf8'); -} - -const templates = { - base: read('base'), - fieldOfType: read('fieldOfType'), - paginatedField: read('paginatedField'), -}; - -function generateResolver(template) { - return ({ TypeName, typeName, fieldName, argsStr }) => { - return templateToAst(template, { typeName, TypeName, fieldName, argsStr }); - }; +export default function generateResolvers(inputSchema) { + const ast = generateResolversAst(inputSchema) + return print(ast, { trailingComma: true }).code; } -const generators = { - base({ typeName, TypeName }) { - return templateToAst(templates.base, { typeName, TypeName }); - }, - belongsTo: generateResolver(templates.fieldOfType), - belongsToMany: generateResolver(templates.paginatedField), - hasOne: generateResolver(templates.fieldOfType), - hasMany: generateResolver(templates.paginatedField), - hasAndBelongsToMany: generateResolver(templates.paginatedField), -}; - export function generateResolversAst(inputSchema) { - const type = inputSchema.definitions[0]; - const TypeName = type.name.value; - const typeName = lcFirst(TypeName); - - const ast = generators.base({ TypeName, typeName }); - - // XXX: rather than hardcoding in array indices it would be less brittle to - // walk the tree using https://github.com/benjamn/ast-types - const typeResolversAst = ast.program.body[0] // const - .declarations[0].init // object expression - .properties[0].value; // object value - - generatePerField(type, generators).forEach((resolverFunctionAst) => { - const resolverProperty = resolverFunctionAst.program.body[0] // variable declaration - .declarations[0].init // object expression - .properties[0]; - - typeResolversAst.properties.push(resolverProperty); + const templateCode = getCode(RESOLVER, { + inputSchema, + basePath: [__dirname, 'templates'], + authPath: [modulePath, 'templates','resolver', 'auth'] }); - return ast; -} + // validate syntax of generated template code + const replacements = {}; + const ast = templateToAst(templateCode, replacements); -export default function generateResolvers(inputSchema) { - const ast = generateResolversAst(inputSchema); - return print(ast, { trailingComma: true }).code; + return ast; } diff --git a/generate/resolvers/templates/README.md b/generate/resolvers/templates/README.md new file mode 100644 index 0000000..56c9898 --- /dev/null +++ b/generate/resolvers/templates/README.md @@ -0,0 +1,12 @@ +In order to enable different authorization concepts, +the templates with a specific and opinionated authorization concept +are factored out, in a own npm module. You will find those templates +in the following npm module: + +** node_modules/create-graphql-server-authorization/templates/auth ** + +Please feel free to fork create-graphql-server-authorization +and implement your own authorization concept there, or add your own +templates here. + + diff --git a/generate/resolvers/templates/base.js.template b/generate/resolvers/templates/base.js.template deleted file mode 100644 index 158c416..0000000 --- a/generate/resolvers/templates/base.js.template +++ /dev/null @@ -1,38 +0,0 @@ -const resolvers = { - TypeName: { - id(typeName) { - return typeName._id; - }, - }, - Query: { - typeNames(root, { lastCreatedAt, limit }, { TypeName }) { - return TypeName.all({ lastCreatedAt, limit }); - }, - - typeName(root, { id }, { TypeName }) { - return TypeName.findOneById(id); - }, - }, - Mutation: { - async createTypeName(root, { input }, { TypeName }) { - const id = await TypeName.insert(input); - return TypeName.findOneById(id); - }, - - async updateTypeName(root, { id, input }, { TypeName }) { - await TypeName.updateById(id, input); - return TypeName.findOneById(id); - }, - - removeTypeName(root, { id }, { TypeName }) { - return TypeName.removeById(id); - }, - }, - Subscription: { - typeNameCreated: typeName => typeName, - typeNameUpdated: typeName => typeName, - typeNameRemoved: id => id, - }, -}; - -export default resolvers; diff --git a/generate/resolvers/templates/common/defaultPaginatedField.template b/generate/resolvers/templates/common/defaultPaginatedField.template new file mode 100644 index 0000000..2c02c6a --- /dev/null +++ b/generate/resolvers/templates/common/defaultPaginatedField.template @@ -0,0 +1,4 @@ + + {{fieldName}}({{typeName}}, args, { {{TypeName}}, me }) { + return {{TypeName}}.{{fieldName}}({{typeName}}, args, me, '{{typeName}} {{fieldName}}'); + }, diff --git a/generate/resolvers/templates/common/defaultSingularField.template b/generate/resolvers/templates/common/defaultSingularField.template new file mode 100644 index 0000000..d7b3173 --- /dev/null +++ b/generate/resolvers/templates/common/defaultSingularField.template @@ -0,0 +1,4 @@ + + {{fieldName}}({{typeName}}, args, { {{TypeName}}, me }) { + return {{TypeName}}.{{fieldName}}({{typeName}}, me, '{{typeName}} {{fieldName}}'); + }, diff --git a/generate/resolvers/templates/default/default.template b/generate/resolvers/templates/default/default.template new file mode 100644 index 0000000..fe0b47b --- /dev/null +++ b/generate/resolvers/templates/default/default.template @@ -0,0 +1,12 @@ +{{!-- If authorization is switched on, the authorize variable is true --}} +{{!-- so it loads the template in the file "authorize_default", --}} +{{!-- which you will find in the npm module: --}} +{{!-- node_modules/create-graphql-server-authorization/templates --}} +{{!-- If the type has no @authorize directive --}} +{{!-- then the default generator is processed and --}} +{{!-- the template default_default here is loaded --}} +{{#if authorize }} +{{> authorize_default }} +{{else }} +{{> default_default }} +{{/if }} \ No newline at end of file diff --git a/generate/resolvers/templates/default/default_default.template b/generate/resolvers/templates/default/default_default.template new file mode 100644 index 0000000..8e7cb64 --- /dev/null +++ b/generate/resolvers/templates/default/default_default.template @@ -0,0 +1,44 @@ +/* eslint-disable prettier */ +/* eslint comma-dangle: [2, "only-multiline"] */ +const resolvers = { + {{TypeName}}: { + id({{typeName}}) { + return {{typeName}}._id; + }, +{{#each singularFields}} +{{> defaultSingularField }} +{{/each}} +{{#each paginatedFields}} +{{> defaultPaginatedField }} +{{/each}} + }, + Query: { + {{typeName}}s(root, { lastCreatedAt, limit }, { {{TypeName}}, me }) { + return {{TypeName}}.find({ lastCreatedAt, limit }, me, '{{typeName}}s'); + }, + + {{typeName}}(root, { id }, { {{TypeName}}, me }) { + return {{TypeName}}.findOneById(id, me, '{{typeName}}'); + } + }, + Mutation: { + async create{{TypeName}}(root, { input }, { {{TypeName}}, me }) { + return await {{TypeName}}.insert(input, me, 'create{{TypeName}}'); + }, + + async update{{TypeName}}(root, { id, input }, { {{TypeName}}, me }) { + return await {{TypeName}}.updateById(id, input, me, 'update{{TypeName}}'); + }, + + async remove{{TypeName}}(root, { id }, { {{TypeName}}, me }) { + return await {{TypeName}}.removeById(id, me, 'remove{{TypeName}}'); + } + }, + Subscription: { + {{typeName}}Created: {{typeName}} => {{typeName}}, + {{typeName}}Updated: {{typeName}} => {{typeName}}, + {{typeName}}Removed: id => id + } +}; + +export default resolvers; diff --git a/generate/resolvers/templates/fieldOfType.js.template b/generate/resolvers/templates/fieldOfType.js.template deleted file mode 100644 index fc74321..0000000 --- a/generate/resolvers/templates/fieldOfType.js.template +++ /dev/null @@ -1,5 +0,0 @@ -const fieldOfType = { - fieldName(typeName, argsStr, { TypeName }) { - return TypeName.fieldName(typeName); - }, -}; diff --git a/generate/resolvers/templates/paginatedField.js.template b/generate/resolvers/templates/paginatedField.js.template deleted file mode 100644 index 1850e56..0000000 --- a/generate/resolvers/templates/paginatedField.js.template +++ /dev/null @@ -1,5 +0,0 @@ -const paginatedField = { - fieldName(typeName, argsStr, { TypeName }) { - return TypeName.fieldName(typeName, argsStr); - }, -}; diff --git a/generate/schema/index.js b/generate/schema/index.js index 2ef641d..399f39d 100644 --- a/generate/schema/index.js +++ b/generate/schema/index.js @@ -2,6 +2,10 @@ import assert from 'assert'; import cloneDeep from 'lodash.clonedeep'; import includes from 'lodash.includes'; +import { + enhanceSchemaForAuthorization +} from 'create-graphql-server-authorization'; + import { buildField, buildTypeExtension, @@ -11,6 +15,7 @@ import { applyCustomDirectives, idArgument, SCALAR_TYPE_NAMES, + getBaseType } from '../util/graphql'; /* eslint-disable no-param-reassign */ @@ -31,8 +36,8 @@ export default function generateSchema(inputSchema) { const directivesByName = {}; field.directives.forEach((directive) => { directivesByName[directive.name.value] = directive; - applyCustomDirectives(field); }); + applyCustomDirectives(field); // XXX: Not sure if this the correct logic but it makes my tests pass // TODO: check for @unmodifiable @@ -43,18 +48,54 @@ export default function generateSchema(inputSchema) { inputTypeModifier = '!'; } + // Simple Fields if (possibleInputType.kind === 'NamedType') { const isScalarField = includes(SCALAR_TYPE_NAMES, possibleInputType.name.value); - let inputField; + let CreateInputField = ''; + let UpdateInputField = ''; if (isScalarField || !!directivesByName.enum) { - inputField = field; + // take field as it was entered + CreateInputField = field; + // on updates, on NonNullable entered fields, the user should be able to decide, if he wants to update + UpdateInputField = buildField(`${field.name.value}`, [], `${getBaseType(field.type).name.value}`); } else { - inputField = buildField(`${field.name.value}Id`, [], `ObjID${inputTypeModifier}`); + CreateInputField = buildField(`${field.name.value}Id`, [], `ObjID${inputTypeModifier}`); + // same here, otherwise we always have to update fields, even if we don't want to update them + UpdateInputField = buildField(`${field.name.value}Id`, [], `ObjID`); } - createInputFields.push(inputField); + createInputFields.push(CreateInputField); if (!directivesByName.unmodifiable) { - updateInputFields.push(inputField); + updateInputFields.push(UpdateInputField); + } + } + + // Fields containing List of values + if (possibleInputType.kind === 'ListType') { + + if (possibleInputType.type.kind === 'NonNullType') { + possibleInputType = possibleInputType.type; + inputTypeModifier = '!'; + } + + if (possibleInputType.type.kind === 'NamedType') { + possibleInputType = possibleInputType.type; + } + + const isScalarField = includes(SCALAR_TYPE_NAMES, possibleInputType.name.value); + let CreateInputField = ''; + let UpdateInputField = ''; + if (isScalarField || !!directivesByName.enum) { + CreateInputField = `[${field}]`; + UpdateInputField = `[${field}]`; + } else { + CreateInputField = buildField(`${field.name.value}Ids`, [], `[ObjID${inputTypeModifier}]`); + UpdateInputField = buildField(`${field.name.value}Ids`, [], `[ObjID]`); + } + + createInputFields.push(CreateInputField); + if (!directivesByName.unmodifiable) { + updateInputFields.push(UpdateInputField); } } @@ -107,5 +148,8 @@ export default function generateSchema(inputSchema) { ]) )); - return outputSchema; -} + // enhance with Authorization + const outputSchemaWithAuth = enhanceSchemaForAuthorization(outputSchema); + + return outputSchemaWithAuth; +} \ No newline at end of file diff --git a/generate/util/capitalization.js b/generate/util/capitalization.js index c09c38d..61032aa 100644 --- a/generate/util/capitalization.js +++ b/generate/util/capitalization.js @@ -1,7 +1,21 @@ +/** + * converts first character of string to lower case + * @private + * @param {string} str - string + * @return {string} converted_string - first character is lower case + */ + export function lcFirst(str) { return str[0].toLowerCase() + str.substring(1); } +/** + * converts first character of string to upper case + * @private + * @param {string} str - string + * @return {string} converted_string - first character is upper case + */ + export function ucFirst(str) { return str[0].toUpperCase() + str.substring(1); } diff --git a/generate/util/constants.js b/generate/util/constants.js new file mode 100644 index 0000000..f175853 --- /dev/null +++ b/generate/util/constants.js @@ -0,0 +1,96 @@ +// @flow +/* eslint-disable max-len */ +/* eslint-disable flowtype/no-weak-types */ + +// kinds from graphql language +export { + NAME, + ARGUMENT, + NAMED_TYPE, + LIST_TYPE, + NON_NULL_TYPE, + FIELD_DEFINITION, + DIRECTIVE, + LIST, + STRING +} from 'graphql/language/kinds'; + +// files encoding +export const ENCODING = 'utf8'; + +// templates naming +export const TEMPLATE_EXTENSION = '.template'; +export const TEMPLATES_DIR = 'templates'; +export const TEMPLATES_MODEL_DIR = 'model'; +export const TEMPLATES_RESOLVER_DIR = 'resolver'; +export const TEMPLATES_AUTH_DIR = 'auth'; +export const TEMPLATES_COMMON_DIR = 'common'; +export const TEMPLATES_DEFAULT_DIR = 'default'; +export const TEMPLATES_DEFAULT_TEMPLATE = 'default'; +export const MODEL = 'model'; +export const RESOLVER = 'resolver'; +export const SCHEMA = 'schema'; + +// for field associations +export const SINGULAR = 'singular'; +export const PAGINATED = 'paginated'; + +// name of the @authorize directive, which triggers authorization logic +export const AUTHORIZE_DIRECTIVE = 'authorize'; + +// authorization modes +export const CREATE = 'create'; +export const READ = 'read'; // 'read' means both, 'readOne' and 'readMany' +export const READ_ONE = 'readOne'; +export const READ_MANY = 'readMany'; +export const UPDATE = 'update'; +export const DELETE = 'delete'; + +// valid input modes from @authorize directive +export const MODES = [CREATE, READ, READ_ONE, READ_MANY, UPDATE, DELETE]; + +// valid output mode for code generator +export const CODE_MODES = [CREATE, READ_ONE, READ_MANY, UPDATE, DELETE]; + +// for the role definitions +export const AUTH_ROLE = 'authRole'; +export const USER_ROLE = 'userRole'; +export const DOC_ROLE = 'docRole'; +export const FOR = 'for'; +export const USER_MODEL = 'user'; +export const STRING_LITERAL = 'String'; +export const STRING_LIST = '[String]'; +export const USER_LITERAL = 'User'; +export const USER_LIST = '[User]'; +export const ROLE_FIELD_DEFAULT = 'role'; + +// handling of id +export const ID_FIELD = '_id'; +export const ID_SINGULAR = 'Id'; +export const ID_PLURAL = 'Ids'; + +// special roles +export const THIS = 'this'; +export const WORLD = 'world'; +export const NO_ROLE = ''; +export const NO_USER = ''; + +// loglevel, maximum logfile size, maximum number of logfiles +export const LOG_LEVEL = 'debug'; +export const LOG_MAX_FILES = 5; +export const LOG_MAX_SIZE = 5; + +// test directories (in npm module create-graphql-create-server-authorization) +export const SRC_DIR = 'src'; +export const TEST_DIR = '__tests__'; +export const TEST_GQL_DATA = 'data'; +export const TEST_CODE = 'code'; +export const TEST_MODEL = 'model'; +export const TEST_RESOLVER = 'resolver'; +export const TEST_GQL_EXTENSION = '.graphql'; +export const TEST_EXPECTED_CODE = 'expected'; +export const TEST_GENERATED_CODE = 'generated'; +export const TEST_MODEL_EXTENSION = '.js'; +export const TEST_MODEL_EXTENSION2 = 'model'; +export const TEST_RESOLVER_EXTENSION = '.js'; +export const TEST_RESOLVER_EXTENSION2 = 'resolver'; diff --git a/generate/util/generatePerField.js b/generate/util/generatePerField.js index 7819919..d55cef7 100644 --- a/generate/util/generatePerField.js +++ b/generate/util/generatePerField.js @@ -6,6 +6,7 @@ import { isScalarField, applyCustomDirectives, } from './graphql'; + import { lcFirst } from './capitalization'; export default function generatePerField(type, generators) { @@ -16,16 +17,23 @@ export default function generatePerField(type, generators) { // We should probably find a way to use generatePerField for the schema too. const ignoreField = (field) => { const directivesByName = {}; - field.directives.forEach((d) => { directivesByName[d.name.value] = d; }); + if (field.directives) { + field.directives.forEach(d => { directivesByName[d.name.value] = d; }); + } return !isScalarField(field) && !directivesByName.enum; }; return type.fields.filter(ignoreField).map((originalField) => { const field = cloneDeep(originalField); - applyCustomDirectives(field); + if (field.directives) { + applyCustomDirectives(field); + } // find the first directive on the field that has a generator - const directive = field.directives.find(d => !!generators[d.name.value]); + let directive; + if (field.directives) { + directive = field.directives.find(d => !!generators[d.name.value]); + } const fieldName = field.name.value; const ReturnTypeName = getBaseType(field.type).name.value; diff --git a/generate/util/getCode.js b/generate/util/getCode.js new file mode 100644 index 0000000..6727a54 --- /dev/null +++ b/generate/util/getCode.js @@ -0,0 +1,199 @@ +// @flow +import path from 'path'; +import Handlebars from 'handlebars'; +import getContext from './getContext'; +import getPartials from './getPartials'; +import getName from './getName'; + +import { + ENCODING, + USER_LITERAL, + TEMPLATE_EXTENSION, + TEMPLATES_DIR, + TEMPLATES_MODEL_DIR, + TEMPLATES_COMMON_DIR, + TEMPLATES_DEFAULT_DIR, + TEMPLATES_AUTH_DIR, + TEMPLATES_DEFAULT_TEMPLATE, + MODEL, + RESOLVER +} from './constants'; + +/** + * get generated code from template partials + * @public + * @param {string} codeType - the code to be generated: MODEL || RESOLVER + * @param {Object} config - configuration object + * @property {object} inputSchema - schema of the type + * @property {string} userType - the user type + * @property {string} defaultTemplate - name of the start template + * @property {array} basePath - path to the base templates directory + * @property {string} baseExtension - file extension '.template' + * @property {string} baseEncoding - base file encoding 'utf8' + * @property {string} baseCommonDir - commonly used template partials + * @property {string} baseDefaultDir - default directory for templates + * @property {function} baseGetNameFunc - calculate the name of a partial + * @property {array} authPath - path to the authorization templates directory + * @property {string} authExtension - auth file encoding 'utf8' + * @property {string} authEncoding - auth file encoding + * @property {string} authCommonDir - commonly used auth template partials + * @property {string} authDefaultDir - default directory for auth templates + * @property {function} authGetNameFunc - calculate tne name of a partial + * @return {string} code - generated code for a model + */ + +export default function getCode(codeType, { + userType = USER_LITERAL, + inputSchema = {}, + defaultTemplate = TEMPLATES_DEFAULT_TEMPLATE, + basePath = [TEMPLATES_DIR, TEMPLATES_MODEL_DIR, TEMPLATES_DEFAULT_DIR], + baseExtension = TEMPLATE_EXTENSION, + baseEncoding = ENCODING, + baseCommonDir = TEMPLATES_COMMON_DIR, + baseDefaultDir = TEMPLATES_DEFAULT_DIR, + baseGetNameFunc = getName, + authPath = [TEMPLATES_DIR, TEMPLATES_MODEL_DIR, TEMPLATES_AUTH_DIR], + authExtension = TEMPLATE_EXTENSION, + authEncoding = ENCODING, + authCommonDir = TEMPLATES_COMMON_DIR, + authDefaultDir = TEMPLATES_DEFAULT_DIR, + authGetNameFunc = getName +}) { + // partials dictionary for template resolution + const partials = {}; + + // adds helpers to handlebars + registerHandlebarsHelpers(); + + // define the compiler + function compile(templates) { + templates.forEach(partial => { + partials[partial.name] = Handlebars.compile(partial.source); + Handlebars.registerPartial(partial.name, partials[partial.name]); + }); + } + + // getting data context + const context = getContext(inputSchema, userType, codeType); + const TypeName = context.TypeName; + const typeName = context.typeName; + let startTemplate = typeName; + + logPath(authPath, authCommonDir); + // getting auth common partial templates (might be in an npm module) + const authCommonPartials = getPartials({ + basePath: authPath, + directoryPath: [authCommonDir], + extension: authExtension, + encoding: authEncoding, + getNameFunc: authGetNameFunc + }); + + logPath(authPath, typeName); + // getting auth type specific partial templates (might be in an npm module) + let authTypePartials = getPartials({ + basePath: authPath, + directoryPath: [typeName], + extension: authExtension, + encoding: authEncoding, + getNameFunc: authGetNameFunc + }); + + // fallback to auth default partial templates (might be in an npm module) + if (authTypePartials.length === 0) { + logPath(authPath, authDefaultDir); + authTypePartials = getPartials({ + basePath: authPath, + directoryPath: [authDefaultDir], + extension: authExtension, + encoding: authEncoding, + getNameFunc: authGetNameFunc + }); + } + + logPath(basePath, baseCommonDir); + // getting common partial templates + const baseCommonPartials = getPartials({ + basePath, + directoryPath: [baseCommonDir], + extension: baseExtension, + encoding: baseEncoding, + getNameFunc: baseGetNameFunc + }); + + logPath(basePath, typeName); + // getting type specific partial templates + let baseTypePartials = getPartials({ + basePath, + directoryPath: [typeName], + extension: baseExtension, + encoding: baseEncoding, + getNameFunc: baseGetNameFunc + }); + + // fallback to default partial templates, + // if there are no type specific templates found + if (baseTypePartials.length === 0) { + logPath(basePath, baseDefaultDir); + baseTypePartials = getPartials({ + basePath, + directoryPath: [baseDefaultDir], + extension: baseExtension, + encoding: baseEncoding, + getNameFunc: baseGetNameFunc + }); + // reset start template to the default template, + // as type specific template does not exist + startTemplate = defaultTemplate; + } + + // compile all auth partials + compile(authCommonPartials); + compile(authTypePartials); + + // compile all base partials + compile(baseCommonPartials); + compile(baseTypePartials); + + console.log('Found the following templates:', JSON.stringify(Object.keys(partials), null, 2)); + console.log(`Generating ${codeType} for type "${TypeName}" with template "${startTemplate}"`); + + // run start template with data context + const code = partials[startTemplate](context); + + // return the final code + return code; + } + +/** + * registers a helper, which could be used in the templates + * @example + * {{#foreach}} + * {{#if $last}} console.log('this was the last element') {{/if}} + * {{#if $notLast}} console.log('this was not the last one') {{/if}} + * {{/foreach}} + * + */ + +function registerHandlebarsHelpers() { + Handlebars.registerHelper('foreach', function(arr, options) { + if (options.inverse && !arr.length) { + return options.inverse(this); + } + return arr + .map(function(item, index) { + item.$index = index; + item.$first = index === 0; + item.$last = index === arr.length - 1; + item.$notFirst = index !== 0; + item.$notLast = index !== arr.length - 1; + return options.fn(item); + }) + .join(''); + }); +} + +function logPath(abspath, dir) { + const directory = path.join(...abspath, dir); + console.log(`searching templates in "${directory}"`); +} \ No newline at end of file diff --git a/generate/util/getContext.js b/generate/util/getContext.js new file mode 100644 index 0000000..228cf71 --- /dev/null +++ b/generate/util/getContext.js @@ -0,0 +1,229 @@ +// @flow +/* eslint-disable max-len */ +import { + getRoles, + isAuthorizeDirectiveDefined +} from 'create-graphql-server-authorization'; + +import { lcFirst, ucFirst } from './capitalization'; +import generatePerField from './generatePerField'; + +import { + CREATE, + USER_LITERAL, + ROLE_FIELD_DEFAULT, + SINGULAR, + PAGINATED, + MODEL, + RESOLVER, + SCHEMA + } from './constants'; + +/** + * gets context for later template compilation + * reads schema and determines data context for code replacements + * @public + * @param {Object} inputSchema - schema of the type + * @param {string} User - name of the user model for User model context + * @param {string} codeType - to distinguish MODEL/RESOLVER runs + * @return {Object} templateContext - data context for template compilation + * + * @property {boolean} authorize - if authorization logic is there + * @property {boolean} isUserType- if it is the User type + * @property {string} typeName - name of the type with starting lower case + * @property {string} TypeName - name of the type with starting upper case + * @property {string} User - name of the user model + * @property {Object} userRoles - authorizations matrix for userRole + * @property {Object} docRoles - authorization matrix for docRole + * @property {string} firstUserRole - the role for protectFields + * @property {string} roleField - field name where the userRole is stored + * @property {array} singularFields - fields array + * @property {array} paginatedFields - fields array + * @property {object} schema - schema definition + */ + +export default function getContext( + inputSchema = {}, User = USER_LITERAL, codeType = MODEL) { + // for field generation + // prepare template context for later compilation + const authorize = isAuthorizeDirectiveDefined(inputSchema); + + // read TypeName out of inputSchema + const TypeName = inputSchema.definitions[0].name.value; + const typeName = lcFirst(TypeName); + const isUserType = TypeName === User; + + // getting the role definitions out of the @authorize directive + const { userRoles, docRoles, roleFieldName } = getRoles( + authorize, + inputSchema + ); + + // get generated fields for resolvers and models + const { singularFields, paginatedFields } = getFields(inputSchema, codeType); + + // prepare protectFields only on for the "User" type as an example + // roleField shouldn't be empty + // it checks, if the field is there + // it takes the first found userRole into the protectFields as a suggestion + // to the programmer, assuming this is the most important role, + // with higher authorization (see in README.md) + const firstUserRole = userRoles[CREATE][0] ? userRoles[CREATE][0] : ``; + const roleField = roleFieldName + ? `${roleFieldName}` + : `${ROLE_FIELD_DEFAULT}`; + + // create proper strings for the roles, for template injection + Object.keys(userRoles).forEach(mode => { + userRoles[mode] = prepareString(userRoles[mode]); + }); + Object.keys(userRoles).forEach(mode => { + docRoles[mode] = prepareString(docRoles[mode]); + }); + + // this is the returned data context for the later template processing + return { + authorize, + isUserType, + typeName, + TypeName, + User, + userRoles, + docRoles, + firstUserRole, + roleField, + singularFields, + paginatedFields + }; +} + +/** + * prepares contexts for singular and paginated field associations + * @param {Object} inputSchema - schema of the type + * @param {string} codeType - to distinguish between MODEL/RESOLVER + * @return {Object} fields - fields for associations + * @property singularFields - fields for singular associations + * @property paginatedFields - fields for paginated associations + */ + +function getFields(inputSchema, codeType) { + const type = inputSchema.definitions[0]; + + // prepare singular and paginated field arrays for the field templates + const singularFields = []; + const paginatedFields = []; + + // generators for the different field association types: + const generators = { + + // singular association @belongsTo + belongsTo(replacements) { + const field = buildFieldContext(SINGULAR, replacements, codeType); + singularFields.push(field); + return field; + }, + + // paginated association @belongsToMany + belongsToMany(replacements) { + const { typeName, fieldName } = replacements; + const field = buildFieldContext(PAGINATED, { + ...replacements, + query: `_id: { $in: ${typeName}.${fieldName}Ids || [] }` + }, codeType); + paginatedFields.push(field); + return field; + }, + + // paginated association @hasMany + hasMany(replacements, { as }) { + const { typeName } = replacements; + const field = buildFieldContext(PAGINATED, { + ...replacements, + query: `${as || typeName}Id: ${typeName}._id` + }, codeType); + paginatedFields.push(field); + return field; + }, + + // paginated association @hasAndBelongsToMany + hasAndBelongsToMany(replacements, { as }) { + const { typeName } = replacements; + const field = buildFieldContext(PAGINATED, { + ...replacements, + query: `${as || typeName}Ids: ${typeName}._id` + }, codeType); + paginatedFields.push(field); + return field; + } + }; + + generatePerField(type, generators); + + return { singularFields, paginatedFields }; +} + +/** + * builds a field's context + * + * @param {string} fieldtype - SINGULAR or PAGINATED field type + * @param {object} context - context for the template partial + * + * @property {string} typeName - name of the type + * @property {string} fieldName - name of the field + * @property {string} argsStr - arguments of the field + * @property {string} ReturnTypeName - type to build association with + * @property {string} query - query for the data access to the referenced type + * + * @param {string} codeType - to distinguish between MODEL/RESOLVER + * @return {Object} field - field for an association + * + * @property {string} fieldType - SINGULAR or PAGINATED + * @property {string} fieldName - name of the field + * @property {string} typeName - name of the type with first lower character + * @property {string} TypeName - name of the type with first upper character + * @property {string} ReturnTypeName - name of the type to associate + * @property {string} argsString - argument string for parameters + * @property {string} argsFields - fields to pass on to the association + * @property {string} query - which fields to query during association + */ + +function buildFieldContext(fieldType, { + typeName, fieldName, argsStr, ReturnTypeName, query }, codeType) { + // clone the string + let argFields = (' ' + argsStr).slice(1); + + // populate some arguments with defaults + const argsWithDefaultsStr = argsStr + .replace('lastCreatedAt', 'lastCreatedAt = 0') + .replace('limit', 'limit = 10'); + + // prepares a fields string to pass on to the referenced type + if (fieldType === PAGINATED && argFields !== '') { + argFields = argFields.replace('{ ', '{ baseQuery, '); + } + + // returns the build field context + return { + fieldType: fieldType || '', + fieldName: fieldName || '', + typeName: typeName || '', + TypeName: ucFirst(typeName) || '', + ReturnTypeName: ReturnTypeName || '', + argsString: argsWithDefaultsStr || '', + argsFields: argFields || '', + query: query || '' + }; +} + +/** + * prepare roles for code generator + * convert array to String value + * replace " by ' + * @private + * @param {array} role - name of role + * @return {string} roleString - role string + */ + +function prepareString(role) { + return JSON.stringify(role).replace(/"/g, "'").replace(/,/g, ', '); +} diff --git a/generate/util/getName.js b/generate/util/getName.js new file mode 100644 index 0000000..dab4987 --- /dev/null +++ b/generate/util/getName.js @@ -0,0 +1,29 @@ +// @flow +import path from 'path'; + +/** + * It defines the name of a found partial template + * by its directory hierarchy level and its file name. + * These names are used to identify and distinguish partial names + * @private + * @param {array} directoryPath - partials directory name parts + * @param {string} filename - file name of the partial template + * @param {string} extension - file extension + * @return {string} name - name of the partial + * + * @example + * partial template names: found in directory hierarchy: + * name = hello {basePath}/hello.template + * name = auth_hello {basePath}/auth/hello.template + * name = auth_special_hello {basePath}/auth/special/hello.template + */ + +export default function getName(directoryPath, filename, extension) { + const dirClone = [...directoryPath]; + let prefix = ''; + if (dirClone.length > 1) { + dirClone.shift(); + prefix = dirClone.reduce((str, dir) => str.concat(dir, '_'), ''); + } + return prefix.concat(path.basename(filename, extension)); +} diff --git a/generate/util/getPartials.js b/generate/util/getPartials.js new file mode 100644 index 0000000..5ff873e --- /dev/null +++ b/generate/util/getPartials.js @@ -0,0 +1,92 @@ +// @flow +import fs from 'fs'; +import path from 'path'; +import getName from './getName'; +import { TEMPLATE_EXTENSION, ENCODING } from './constants'; + +/** + * reads all available partials of a template directory + * into a partial template registry + * @public + * @param {Object} configPartial - configuration object + * @property {array} basePath - base directory to start reading + * @property {array} directoryPath - partials directory name parts + * @property {array} extension - extension name for template files '.template' + * @property {array} encoding - encoding of template files 'utf8' + * @property {Function} getNameFunc - optional, + * otherwise getDefaultName function is used + * @return {array} partials - repository with all partials + * + * @example + * partials = [ + * { + * "name": "hello", + * "path": "templates/default/hello.template", + * "source": "console.log('Hello World')" + * } + * ] + */ + +export default function getPartials({ + basePath = [], + directoryPath = [], + extension = TEMPLATE_EXTENSION, + encoding = ENCODING, + getNameFunc = getName +}) { + // collect all found partials in this partials array + let partials = []; + + // prepare directory name + const partialsDirectory = path.join(...basePath, ...directoryPath); + + // checks if name is an existing directory + if (!fs.existsSync(partialsDirectory) || + !fs.statSync(partialsDirectory).isDirectory() ) { + return partials; + } + + // for easier reading as function: process directory tree recursively + function filter_and_recursion_processing(file) { + const filePath = path.join(...basePath, ...directoryPath, file); + + if (path.extname(file) === extension) { + // partial file is found, passing through filter, process it later + return file; + + } else if (fs.statSync(filePath).isDirectory()) { + // directory found, do recursion and get processed partials back + partials = partials.concat( + getPartials({ + basePath, + directoryPath: [...directoryPath, file], + extension, + encoding, + getNameFunc + }) + ); + } + + return false; + } + + // for easier reading as function: process a partial template + function partial_processing(file) { + const partial = {}; + + partial.name = getNameFunc(directoryPath, file, extension); + partial.path = path.join(...basePath, ...directoryPath, file); + partial.source = fs.readFileSync(partial.path, encoding); + + partials.push(partial); + } + + // read directory tree, filter for '.template' files, sort them, process them + fs + .readdirSync(partialsDirectory) + .filter(filter_and_recursion_processing) + .sort() + .forEach(partial_processing); + + return partials; +} diff --git a/generate/util/graphql.js b/generate/util/graphql.js index 73568fa..c16c0ca 100644 --- a/generate/util/graphql.js +++ b/generate/util/graphql.js @@ -69,6 +69,7 @@ export function buildField(name, args, typeName) { kind: 'FieldDefinition', name: buildName(name), arguments: args, + directives: [], type: buildTypeReference(typeName), }; } diff --git a/generate/read.js b/generate/util/read.js similarity index 74% rename from generate/read.js rename to generate/util/read.js index 97e2f1c..7675257 100644 --- a/generate/read.js +++ b/generate/util/read.js @@ -7,9 +7,18 @@ export default function readInput(path) { return parse(fs.readFileSync(path, 'utf8')); } +export function readString(path) { + return fs.readFileSync(path, 'utf8'); +} + const babylonParser = { parse(code) { - return babylon.parse(code, { sourceType: 'module' }); + return babylon.parse(code, { + sourceType: 'module', + plugins: [ + 'objectRestSpread' + ] + }); }, }; diff --git a/package.json b/package.json index eea5dbe..fed94c8 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,14 @@ "test-add-update-remove": "./test/test-add-update-remove.sh", "clean": "rm -rf dist/*", "build": "npm run clean && babel bin --out-dir dist/bin && babel generate -D --out-dir dist/generate && cp -r skel dist", - "prepublish": "npm run build" + "prepublish": "npm run build", + "gentest": "babel-node bin/gentest.js -- " + }, + "config": { + "logfile": "log/all-logs-readable.log", + "loglevel": "debug", + "maxsize": 5, + "maxfiles": 5 }, "author": "Tom Coleman", "license": "MIT", @@ -34,7 +41,7 @@ "babel-register": "6.16.3", "chai": "^3.5.0", "chai-diff": "^1.0.1", - "eslint": "3.8.1", + "eslint": "^4.0.0", "eslint-config-airbnb": "12.0.0", "eslint-plugin-babel": "3.3.0", "eslint-plugin-import": "1.16.0", @@ -47,9 +54,16 @@ "babylon": "^6.14.1", "chalk": "^1.1.3", "cpr": "^2.0.0", + "create-graphql-server-authorization": "^0.0.45", + "create-graphql-server-find-by-ids": "^0.0.4", + "create-graphql-server-logging": "^0.0.3", + "dataloader": "^1.3.0", "denodeify": "^1.2.1", "escape-string-regexp": "^1.0.5", + "global": "^4.3.2", "graphql": "0.7.2", + "handlebars": "^4.0.10", + "lodash": "^4.17.4", "lodash.clonedeep": "^4.5.0", "lodash.includes": "^4.3.0", "lodash.merge": "^4.6.0", diff --git a/skel/.gitignore b/skel/.gitignore index 50ffcff..04d877b 100644 --- a/skel/.gitignore +++ b/skel/.gitignore @@ -1,3 +1,7 @@ node_modules /db /input +log/all-logs-readable.log +.DS_Store +log/ +yarn-error.log diff --git a/skel/README.md b/skel/README.md new file mode 100644 index 0000000..fc7ed96 --- /dev/null +++ b/skel/README.md @@ -0,0 +1,285 @@ +# create-graphql-server +This is a generated create-graphql-server app. + +* Authentication: Identifies an user +* Authorization: Defines all actions a user is allowed to perform + +## Implementing Authentication +The authentication is performed in those locations: +* ./server/index.js +* ./server/authenticate.js +* ./model/index.js + +### ./server/index.js +In the server, the database is started, and the UserCollection is defined. That's where the server accesses the user documents in the database. + +In ```js authenticate(app, UserCollection)``` the authentication is prepared and processed. Later, if a user sends a 'graphql' request, the user is determined with ```js passport.authenticate(...)```. After that, the user is whether an anonymous user or an authenticated user. You find the identified user in the object "me". Then the type models have to be initialized with the user "me" authorizations: ```js req.context = addModelsToContext({... me ...})```. + +By-the-way: The server/index.js is able to access the User collection directly by the following two lines. This is used in the server/authenticate.js during authenticate. +```js +... +const UserCollection = db.collection('user'); +... +authenticate(app, UserCollection); +... +``` + +### ./model/index.js +If there is a User model generated, then we load it as the first model. It defines the model, which will be used in the other models as well, to perform the authorization checks. + +```javascript +const models = {}; + +export default function addModelsToContext(context) { + const newContext = Object.assign({}, context); + + // User model has to be first, to initialize the other models with correct authorizations + if (models['User']){ + newContext['User'] = new models['User'](newContext); + } + + Object.keys(models).forEach((key) => { + if (key !== 'User') newContext[key] = new models[key](newContext); + }); + return newContext; +} + +import Tweet from './Tweet'; +models.Tweet = Tweet; + +import User from './User'; +models.User = User; +``` + +### ./server/authenticate.js +Here, the real identification of an user is performed. After a user requested a '/login' url with user and password. The user's email is searched in the database. If it is there, it checks if the user's encrypted hash is equal to the encrypted password. If so, a user is identified and a JWT token is generated and transfered back to the requesting user. This JWT token is usually stored in the client's browsers local storage and added to the next call in the Authorization header. With all the next requests of that user, he sends an header like... +```javacript +authorization JWT calculated.JWT.token +``` +This JWT token is decrypted with an internal secret KEY to get the user id. This user is then read from the cache/database within userFromPayload and returned to the request as the user object "me", which is then used in all "/graphql" calls. + +```javascript +import passport from 'passport'; +import { Strategy, ExtractJwt } from 'passport-jwt'; +import jwt from 'jwt-simple'; +import { ObjectId } from 'mongodb'; +import nodeify from 'nodeify'; +import bcrypt from 'bcrypt'; +import DataLoader from 'dataloader'; +import { findByIds } from 'create-graphql-server-find-by-ids'; + +const KEY = 'test-key'; +let Loader; + +async function userFromPayload(request, jwtPayload) { + if (!jwtPayload.userId) { + throw new Error('No userId in JWT'); + } + return await Loader.load(ObjectId(jwtPayload.userId)); +} + +passport.use(new Strategy({ + jwtFromRequest: ExtractJwt.fromAuthHeader(), + secretOrKey: KEY, + passReqToCallback: true, +}, (request, jwtPayload, done) => { + nodeify(userFromPayload(request, jwtPayload), done); +})); + +export default function addPassport(app, User) { + Loader = new DataLoader(ids => findByIds(User, ids)); + + app.use(passport.initialize()); + + app.post('/login', async (req, res, next) => { + try { + const { email, password } = req.body; + + if (!email || !password) { + throw new Error('Username or password not set on request'); + } + + const user = await User.findOne({ email }); + if (!user || !(await bcrypt.compare(password, user.hash))) { + throw new Error('User not found matching email/password combination'); + } + + const payload = { + userId: user._id.toString(), + }; + + const token = jwt.encode(payload, KEY); + res.json({ token }); + } catch (e) { + next(e); + } + }); +} +``` + +## Implementing Authorizations +Use the @authorize directive in a \.graphql input file, to define which authorizations should be generated by create-graphql-server. You can define user-roles and document-roles to control authorizations. + +* user-roles: e.g. User.role = "admin", all admins are allowed to do create, read, update, delete,... +* document-roles: e.g. Tweet.authorId = User._id, only authors are allowed to create, update, delete a document + +Use the following syntax for the Tweet.graphql input file:: +```javascript +type Tweet + +@authorize( + admin: ["create", "read", "update", "delete"], + author: ["create", "read", "update", "delete"], + coauthors: ["read", "update"], + world: ["read"] +) + +{ + author: User! @unmodifiable @belongsTo @authRole(for: ["author"]) + coauthors: [User] @belongsTo @authRole(for: ["coauthors"]) + body: String! + + likers: [User!] @hasAndBelongsToMany(as: "liked") +} +``` + +This has the following meaning: +* user-roles: "admin", "world" are created. (user-roles don't have own fields of type User or [User] in the document). + Thus it will check, if the logged in user has a role "admin". Or if there is a special role "world", which just means every known or unknown user is allowed. For "world" authorization you don't have to be logged in. + So each "admin" user will be able to create, read, update or delete the Tweet document. + Everyone ("world") will be allowed to read all Tweets. +* document-roles: "author", "coauthors" are created. (Document-roles have a corresponding field in the document.) + Look for the fields with the directive @authRole("...") + Only the author of a Tweet is allowed to create, read, update, delete its single Tweet. + Only a coauthor of a Tweet is allowed to read and update a Tweet, but he is not allowed to create a Tweet for a different author, and also not to delete a tweet of a different user. + +and for the User.graphql input file: +```javascript +type User + +@authorize( + admin: ["create", "read", "update", "delete"] + this: ["read", "update", "delete"] +) + +{ + role: String @authRole(for: ["admin"]) + username: String! + + bio: String + notify: Boolean + + tweets(minLikes: Int): [Tweet!] @hasMany(as: "author") + liked: [Tweet!] @belongsToMany + + following: [User!] @belongsToMany + followers: [User!] @hasAndBelongsToMany(as: "following") +} +``` + +This has the following meaning: +* user-role: "admin", is created. (user roles don't have own fields of type User or [User] in the document) + It is a String field with: **role: String! @authRole("admin")** + This will check, if the logged in user has a role "admin". + So each "admin" user will be able to create, read, update or delete any User document. +* document-role: "this", is created (document roles have own fields in the document, but this is a special case for the field _id, which is not shown in the input type, but will be generated in the later schema file.) + Only the user id of "this" meaning _id is allowed to readOne, update, delete its single User document. + +Use create-graphql-server command to generate the according schema, resolver, model files with the create-graphql-server command line interface. After its generation, you will find the generated files in the sub folders: schema, resolvers, model. The generated model files will use the following functions to implement the authorization logic. + +## create-graphql-server-authorization +Install it with: +```bash +npm install create-graphql-server-authorization +``` +[Github: create-graphql-server-authorization](https://github.com/tobkle/create-graphql-server-authorization) + +[Please have a look in the API documentation.](https://tobkle.github.io/create-graphql-server-authorization/) + +This uses the following functions from that module: + +### function authlog +A logging function that understands "resolvers", "modes" and "users". Simple wrapper around whatever logging function we use. + +### function findByIds (create-graphql-server-find-by-ids) +This is an extended version of [mongo-find-by-ids](https://github.com/tmeasday/mongo-find-by-ids). +The enhancement is only to provide an additional authQuery object, to extend the query to meet additional authorizations. + +### function protectFields +Use function protectFields to protect single fields from access. Provide signed in user in "me", the authorized User roles for the protected field(s) - meaning the user who is allowed to access the field -, provide an array with protected fields, and the current document object, which is to be checked for protected fields and the User model context. + +### function checkAuthDoc +Use function checkAuthDoc to check and get back the document. Especially used in insert operations, to figure out, if the toBeInsertedDoc is valid to be added by this userRole, docRole and action. + +### function loggedIn +Use function loggedIn, to check if a user is logged in. + +### function queryForRoles +Use function queryForRoles to generate an authQuery object. + +It expects the following arguments with the meanings: +* **me:** this is the logged in user object out of the resolver's context +* **userRoles:** an array with userRoles, which was generated by the @authorize directives in the .graphql file +* **docRoles:** an array with docRoles, which was generated by the @authorize directives in the .graphql file +* **User:** User context to access the User model +* **logger:** logging function e.g. ```js authlog(resolver, mode, me) ``` + * **resolver:** this is a string with the resolver's name, optional, only for easier debugging + * **mode:** this is the current mode of operation: + * **create:** insert a record to the database + * **read:** read a record or many records from the database + * **readOne:** read only a single record from the database + * **readMany:** read many records from the the database + * **update:** update a record in the database + * **delete:** remove a record from the database + * **me:** the user object, who is executing the request, and who is checked for authorization + +### function userRoleAuthorized +This helper function is used by queryForRoles, and decides, if a user gains the authorization by its role. +For example: If a user has a field "role" in his user document and it contains the value "admin". So it checks if a user's role is admin, and allows all operations for admins. + +### function fieldContainsUserId +This helper function is used in the models and checks, if the provided field of types: array, object or string contains the userId. + +### ./resolver/User.js +In the resolver interfaces, there are different objects: +* the root object "tweet", contains the document fields +* the args object "args", contains arguments from the graphql query/mutation +* the context object "Tweet", contains the access to the database model of the Tweet collection +* the context object "me", contains the current logged in user -if logged in-, which is provided from the server's passport implementation +* the last argument in the resolver function is the resolver's name, which is optional and only to enhance the logging in debugging mode by additional information. If you have to analyze authorization outcomes, this helps a lot to figure out, which resolvers authorization rule fired. + +### ./resolver/Tweet.js +In the resolver interfaces, there are different objects: +* the root object "tweet", contains the document fields +* the args object "args", contains arguments from the graphql query/mutation +* the context object "Tweet", contains the access to the database model of the Tweet collection +* the context object "me", contains the current logged in user -if logged in-, which is provided from the server's passport implementation +* the last argument in the resolver function is the resolver's name, which is optional and only to enhance the logging in debugging mode by additional information. If you have to analyze authorization outcomes, this helps a lot to figure out, which resolvers authorization rule fired. + +### Testing +If you run within the project root at least one time, it generates the database and adds the seed tweet and user documents once during each run. +```bash +yarn end-to-end-test +``` +It executes many pre-defined tests with different user-roles and document-roles. May be you want to add additional tests to enhance the security of the logic. + +If you want to test with the http://localhost:3000/graphiql frontend, best download the following app: +```bash +brew cask install graphiql +``` +...and have a look into the file **./test/output-app-end-to-end/scripts/JWTs.txt**, or generate this file by running: +```bash +cd ./test/output-app-end-to-end/scripts +babel-node ./generateJWT.js > JWTs.txt +``` +This generates JWT tokens for the different test users from the ./test/seeds/User.json. Copy the wanted JWT token of the different users, and start the GraphiQL app with the following entries: + +* GraphQL endpoint: ```http://localhost:3000/graphql``` +* Method: ```POST``` +* Edit HTTP headers: + * Header name: ```authorization``` + * Header value: ```JWT the-copied-token``` + +...and write and execute your queries/mutations in the GraphiQL window. + +If you use different user's JWT tokens, you can simulate the different user roles such as "admin", "editor" and "user" manually. diff --git a/skel/model/index.js b/skel/model/index.js index 7789776..b35e315 100644 --- a/skel/model/index.js +++ b/skel/model/index.js @@ -2,8 +2,14 @@ const models = {}; export default function addModelsToContext(context) { const newContext = Object.assign({}, context); + + // User model has to be first, to initialize the other models with correct authorizations + if (models['User']){ + newContext['User'] = new models['User'](newContext); + } + Object.keys(models).forEach((key) => { - newContext[key] = new models[key](newContext); + if (key !== 'User') newContext[key] = new models[key](newContext); }); return newContext; } diff --git a/skel/package.json b/skel/package.json index 59a94c8..0f9b8e9 100644 --- a/skel/package.json +++ b/skel/package.json @@ -5,6 +5,12 @@ "scripts": { "start": "babel-node index.js" }, + "config": { + "logfile": "log/all-logs-readable.log", + "loglevel": "debug", + "maxsize": 5, + "maxfiles": 5 + }, "private": true, "author": "", "license": "MIT", @@ -33,6 +39,9 @@ "bcrypt": "^1.0.2", "body-parser": "1.15.2", "cors": "^2.8.1", + "create-graphql-server-authorization": "^0.0.45", + "create-graphql-server-find-by-ids": "^0.0.4", + "create-graphql-server-logging": "^0.0.3", "dataloader": "^1.2.0", "denodeify": "^1.2.1", "dotenv": "2.0.0", @@ -45,11 +54,12 @@ "graphql-tools": "^0.8.2", "jwt-simple": "^0.5.1", "lodash": "4.16.4", - "mongo-find-by-ids": "^1.0.0", "mongodb": "^2.2.11", + "morgan": "^1.8.2", "nodeify": "^1.0.1", "passport": "^0.3.2", "passport-jwt": "^2.2.1", - "subscriptions-transport-ws": "0.2.6" + "subscriptions-transport-ws": "0.2.6", + "winston": "^2.3.1" } } diff --git a/skel/server/authenticate.js b/skel/server/authenticate.js index 266dcd6..2559482 100644 --- a/skel/server/authenticate.js +++ b/skel/server/authenticate.js @@ -4,15 +4,17 @@ import jwt from 'jwt-simple'; import { ObjectId } from 'mongodb'; import nodeify from 'nodeify'; import bcrypt from 'bcrypt'; +import DataLoader from 'dataloader'; +import { findByIds } from 'create-graphql-server-find-by-ids'; -const KEY = '~key~'; +const KEY = 'test-key'; +let Loader; async function userFromPayload(request, jwtPayload) { if (!jwtPayload.userId) { throw new Error('No userId in JWT'); } - - return await request.context.User.findOneById(ObjectId(jwtPayload.userId)); + return await Loader.load(ObjectId(jwtPayload.userId)); } passport.use(new Strategy({ @@ -23,7 +25,9 @@ passport.use(new Strategy({ nodeify(userFromPayload(request, jwtPayload), done); })); -export default function addPassport(app) { +export default function addPassport(app, User) { + Loader = new DataLoader(ids => findByIds(User, ids)); + app.use(passport.initialize()); app.post('/login', async (req, res, next) => { @@ -34,7 +38,7 @@ export default function addPassport(app) { throw new Error('Username or password not set on request'); } - const user = await req.context.User.collection.findOne({ email }); + const user = await User.findOne({ email }); if (!user || !(await bcrypt.compare(password, user.hash))) { throw new Error('User not found matching email/password combination'); } diff --git a/skel/server/index.js b/skel/server/index.js index faafc9d..ca7be63 100644 --- a/skel/server/index.js +++ b/skel/server/index.js @@ -7,14 +7,22 @@ import { makeExecutableSchema } from 'graphql-tools'; import { MongoClient } from 'mongodb'; import cors from 'cors'; import passport from 'passport'; - +import morgan from 'morgan'; +import { findByIds } from 'create-graphql-server-find-by-ids'; +import { getLogFilename, logger } from 'create-graphql-server-logging'; import typeDefs from '../schema'; import resolvers from '../resolvers'; import addModelsToContext from '../model'; import authenticate from './authenticate'; - +import { parse, print } from 'graphql'; import { pubsub, subscriptionManager } from './subscriptions'; +const log = logger(getLogFilename()); +const stream = { + write: function(message, encoding) { + // log.debug(message); + } +}; const schema = makeExecutableSchema({ typeDefs, resolvers }); const { @@ -26,34 +34,40 @@ const { async function startServer() { + log.info('Logger started'); + const db = await MongoClient.connect(MONGO_URL); + const UserCollection = db.collection('user'); const app = express().use('*', cors()); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); + app.use(morgan("dev", { "stream": stream })); - app.use((req, res, next) => { - req.context = addModelsToContext({ db, pubsub }); - next(); - }); - - authenticate(app); + authenticate(app, UserCollection); app.use('/graphql', (req, res, next) => { - passport.authenticate('jwt', { session: false }, (err, user) => { + passport.authenticate('jwt', { session: false }, (err, me) => { + req.context = addModelsToContext({ + db, pubsub, me, UserCollection, findByIds, log + }); graphqlExpress(() => { // Get the query, the same way express-graphql does it // https://github.com/graphql/express-graphql/blob/3fa6e68582d6d933d37fa9e841da5d2aa39261cd/src/index.js#L257 + const {variables, operationName} = req.body; + const {_id, username, role} = me; const query = req.query.query || req.body.query; - if (query && query.length > 2000) { + log.debug('-'.repeat(80)); + log.debug(`Request:\nUser: "${(username) ? username: ''}", role: "${(role) ? role : ''}", id: "${(_id) ? _id : ''}",\nOperation: "${operationName ? operationName : ''}", variables: "${variables ? JSON.stringify(variables) : ''}",\nQuery:\n${print(parse(query))}`); + if (query && query.length > 4000) { // None of our app's queries are this long // Probably indicates someone trying to send an overly expensive query + log.error('Query too large.'); throw new Error('Query too large.'); } - return { schema, - context: Object.assign({ user }, req.context), + context: Object.assign({ me }, req.context), debug: true, formatError(e) { console.log(e); diff --git a/skel/yarn.lock b/skel/yarn.lock deleted file mode 100644 index ce8e5db..0000000 --- a/skel/yarn.lock +++ /dev/null @@ -1,4192 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/express-serve-static-core@*": - version "4.0.39" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.39.tgz#45157f96480d46f254648f45b2c6d70bd9fc9f54" - dependencies: - "@types/node" "*" - -"@types/express@^4.0.33": - version "4.0.34" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.34.tgz#cdc0afd69d70d2295b81b3aa47f26f672afcde1c" - dependencies: - "@types/express-serve-static-core" "*" - "@types/serve-static" "*" - -"@types/mime@*": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" - -"@types/node@*", "@types/node@^6.0.38": - version "6.0.51" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.51.tgz#84cbf25111516ec9304d0b61469dc0fa9d12ba32" - -"@types/serve-static@*": - version "1.7.31" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a" - dependencies: - "@types/express-serve-static-core" "*" - "@types/mime" "*" - -abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - -accepts@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - -acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" - -agent-base@2: - version "2.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" - dependencies: - extend "~3.0.0" - semver "~5.0.1" - -ajv-keywords@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c" - -ajv@^4.7.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.2.tgz#3f7dcda95b0c34bceb2d69945117d146219f1a2c" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" - -ansi-styles@^2.1.0, ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" - dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" - -aproba@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" - -are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.0, array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" - dependencies: - lodash "^4.8.0" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" - -babel-cli@6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.16.0.tgz#4e0d1cf40442ef78330f7fef88eb3a0a1b16bd37" - dependencies: - babel-core "^6.16.0" - babel-polyfill "^6.16.0" - babel-register "^6.16.0" - babel-runtime "^6.9.0" - bin-version-check "^2.1.0" - chalk "1.1.1" - commander "^2.8.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^0.1.0" - glob "^5.0.5" - lodash "^4.2.0" - log-symbols "^1.0.2" - output-file-sync "^1.1.0" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - request "^2.65.0" - slash "^1.0.0" - source-map "^0.5.0" - v8flags "^2.0.10" - optionalDependencies: - chokidar "^1.0.0" - -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^2.0.0" - -babel-core@6.17.0, babel-core@^6.16.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" - dependencies: - babel-code-frame "^6.16.0" - babel-generator "^6.17.0" - babel-helpers "^6.16.0" - babel-messages "^6.8.0" - babel-register "^6.16.0" - babel-runtime "^6.9.1" - babel-template "^6.16.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.4.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - -babel-eslint@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.0.0.tgz#54e51b4033f54ac81326ecea4c646a779935196d" - dependencies: - babel-traverse "^6.15.0" - babel-types "^6.15.0" - babylon "^6.11.2" - lodash.pickby "^4.6.0" - -babel-generator@^6.17.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" - dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - -babel-helper-bindify-decorators@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" - dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" - dependencies: - babel-helper-explode-assignable-expression "^6.18.0" - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-builder-react-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz#ab02f19a2eb7ace936dd87fa55896d02be59bf71" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - esutils "^2.0.0" - lodash "^4.2.0" - -babel-helper-call-delegate@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" - dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-helper-explode-assignable-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" - dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-explode-class@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" - dependencies: - babel-helper-bindify-decorators "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" - dependencies: - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-get-function-arity@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-hoist-variables@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-helper-regex@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" - dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" - dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" - dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" - -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-check-es2015-constants@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.3.13: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" - -babel-plugin-transform-async-generator-functions@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" - dependencies: - babel-helper-remap-async-to-generator "^6.16.2" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-async-to-generator@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" - dependencies: - babel-helper-remap-async-to-generator "^6.16.0" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-class-properties@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" - dependencies: - babel-helper-function-name "^6.18.0" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.9.1" - babel-template "^6.15.0" - -babel-plugin-transform-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" - dependencies: - babel-helper-define-map "^6.8.0" - babel-helper-explode-class "^6.8.0" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-types "^6.13.0" - -babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-block-scoping@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" - dependencies: - babel-runtime "^6.9.0" - babel-template "^6.15.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - lodash "^4.2.0" - -babel-plugin-transform-es2015-classes@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" - dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-destructuring@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" - dependencies: - babel-runtime "^6.9.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" - -babel-plugin-transform-es2015-for-of@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" - dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" - -babel-plugin-transform-es2015-literals@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-modules-amd@^6.18.0, babel-plugin-transform-es2015-modules-amd@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.16.0, babel-plugin-transform-es2015-modules-commonjs@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" - dependencies: - babel-plugin-transform-strict-mode "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.14.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" - -babel-plugin-transform-es2015-modules-umd@^6.12.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - -babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" - dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-parameters@^6.16.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" - dependencies: - babel-helper-call-delegate "^6.18.0" - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.9.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-shorthand-properties@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-plugin-transform-es2015-spread@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-sticky-regex@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" - -babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-es2015-unicode-regex@^6.3.13: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" - dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-flow-strip-types@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz#4d3e642158661e9b40db457c004a30817fa32592" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-object-rest-spread@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-react-display-name@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" - dependencies: - babel-runtime "^6.0.0" - -babel-plugin-transform-react-jsx-self@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.11.0.tgz#605c9450c1429f97a930f7e1dfe3f0d9d0dbd0f4" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" - -babel-plugin-transform-react-jsx-source@^6.3.13: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" - -babel-plugin-transform-react-jsx@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" - dependencies: - babel-helper-builder-react-jsx "^6.8.0" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.0.0" - -babel-plugin-transform-regenerator@^6.16.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" - dependencies: - babel-runtime "^6.9.0" - babel-types "^6.16.0" - private "~0.1.5" - -babel-plugin-transform-strict-mode@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" - dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" - -babel-polyfill@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" - dependencies: - babel-runtime "^6.9.1" - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-preset-es2015@6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.16.0.tgz#59acecd1efbebaf48f89404840f2fe78c4d2ad5c" - dependencies: - babel-plugin-check-es2015-constants "^6.3.13" - babel-plugin-transform-es2015-arrow-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" - babel-plugin-transform-es2015-block-scoping "^6.14.0" - babel-plugin-transform-es2015-classes "^6.14.0" - babel-plugin-transform-es2015-computed-properties "^6.3.13" - babel-plugin-transform-es2015-destructuring "^6.16.0" - babel-plugin-transform-es2015-duplicate-keys "^6.6.0" - babel-plugin-transform-es2015-for-of "^6.6.0" - babel-plugin-transform-es2015-function-name "^6.9.0" - babel-plugin-transform-es2015-literals "^6.3.13" - babel-plugin-transform-es2015-modules-amd "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs "^6.16.0" - babel-plugin-transform-es2015-modules-systemjs "^6.14.0" - babel-plugin-transform-es2015-modules-umd "^6.12.0" - babel-plugin-transform-es2015-object-super "^6.3.13" - babel-plugin-transform-es2015-parameters "^6.16.0" - babel-plugin-transform-es2015-shorthand-properties "^6.3.13" - babel-plugin-transform-es2015-spread "^6.3.13" - babel-plugin-transform-es2015-sticky-regex "^6.3.13" - babel-plugin-transform-es2015-template-literals "^6.6.0" - babel-plugin-transform-es2015-typeof-symbol "^6.6.0" - babel-plugin-transform-es2015-unicode-regex "^6.3.13" - babel-plugin-transform-regenerator "^6.16.0" - -babel-preset-react@6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.16.0.tgz#aa117d60de0928607e343c4828906e4661824316" - dependencies: - babel-plugin-syntax-flow "^6.3.13" - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-flow-strip-types "^6.3.13" - babel-plugin-transform-react-display-name "^6.3.13" - babel-plugin-transform-react-jsx "^6.3.13" - babel-plugin-transform-react-jsx-self "^6.11.0" - babel-plugin-transform-react-jsx-source "^6.3.13" - -babel-preset-stage-2@6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.17.0.tgz#dc4f84582781353cef36c41247eae5e36c4cae0d" - dependencies: - babel-plugin-transform-class-properties "^6.16.0" - babel-plugin-transform-decorators "^6.13.0" - babel-preset-stage-3 "^6.17.0" - -babel-preset-stage-3@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.3.13" - babel-plugin-transform-async-generator-functions "^6.17.0" - babel-plugin-transform-async-to-generator "^6.16.0" - babel-plugin-transform-exponentiation-operator "^6.3.13" - babel-plugin-transform-object-rest-spread "^6.16.0" - -babel-register@6.16.3, babel-register@^6.16.0: - version "6.16.3" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" - dependencies: - babel-core "^6.16.0" - babel-runtime "^6.11.6" - core-js "^2.4.0" - home-or-tmp "^1.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - path-exists "^1.0.0" - source-map-support "^0.4.2" - -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" - dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" - dependencies: - babel-runtime "^6.9.1" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.11.0, babylon@^6.11.2: - version "6.14.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" - -backo2@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -base64-url@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.3.3.tgz#f8b6c537f09a4fc58c99cb86e0b0e9c61461a20f" - -base64url@2.0.0, base64url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" - -bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" - dependencies: - tweetnacl "^0.14.3" - -bcrypt@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.2.tgz#d05fc5d223173e0e28ec381c0f00cc25ffaf2736" - dependencies: - bindings "1.2.1" - nan "2.5.0" - node-pre-gyp "0.6.32" - -bin-version-check@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" - dependencies: - bin-version "^1.0.0" - minimist "^1.1.0" - semver "^4.0.3" - semver-truncate "^1.0.0" - -bin-version@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" - dependencies: - find-versions "^1.0.0" - -binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" - -bindings@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" - -bl@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - dependencies: - readable-stream "~2.0.5" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -body-parser@1.15.2: - version "1.15.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.15.2.tgz#d7578cf4f1d11d5f6ea804cef35dc7a7ff6dae67" - dependencies: - bytes "2.4.0" - content-type "~1.0.2" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.5.0" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "6.2.0" - raw-body "~2.1.7" - type-is "~1.6.13" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boom@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.0.tgz#1ed1b4b8cd6891b602910debe33e1d511531b847" - dependencies: - hoek "4.x.x" - -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" - dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - -bson@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.1.tgz#3a5addb0f2ff88bc3436e708e4bdb8637602d72d" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -buffer-to-vinyl@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" - dependencies: - file-type "^3.1.0" - readable-stream "^2.0.2" - uuid "^2.0.1" - vinyl "^1.0.0" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0, camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - -chai@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" - dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" - -chalk@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.1.tgz#509afb67066e7499f7eb3535c77445772ae2d019" - dependencies: - ansi-styles "^2.1.0" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chokidar@^1.0.0, chokidar@^1.4.3: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -circular-json@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" - -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@2.9.0, commander@^2.8.1, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - dependencies: - graceful-readlink ">= 1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.6, concat-stream@^1.4.7: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - -configstore@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" - dependencies: - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - object-assign "^4.0.1" - os-tmpdir "^1.0.0" - osenv "^0.1.0" - uuid "^2.0.1" - write-file-atomic "^1.1.2" - xdg-basedir "^2.0.0" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - -content-disposition@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" - -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" - -convert-source-map@^1.1.0, convert-source-map@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cors: - version "2.8.1" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.1.tgz#6181aa56abb45a2825be3304703747ae4e9d2383" - dependencies: - vary "^1" - -crc@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.0.tgz#4258e351613a74ef1153dfcb05e820c3e9715d7f" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" - dependencies: - es5-ext "~0.10.2" - -damerau-levenshtein@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -dataloader@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.2.0.tgz#3f73ea657c492c860c1633348adc55ca9bf2107e" - -debug@2, debug@2.2.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decompress-tar@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" - dependencies: - is-tar "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-tarbz2@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" - dependencies: - is-bzip2 "^1.0.0" - object-assign "^2.0.0" - seek-bzip "^1.0.3" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-targz@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" - dependencies: - is-gzip "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-unzip@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" - dependencies: - is-zip "^1.0.0" - read-all-stream "^3.0.0" - stat-mode "^0.2.0" - strip-dirs "^1.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - yauzl "^2.2.1" - -decompress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" - dependencies: - buffer-to-vinyl "^1.0.0" - concat-stream "^1.4.6" - decompress-tar "^3.0.0" - decompress-tarbz2 "^3.0.0" - decompress-targz "^3.0.0" - decompress-unzip "^3.0.0" - stream-combiner2 "^1.1.1" - vinyl-assign "^1.0.1" - vinyl-fs "^2.2.0" - -deep-eql@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" - dependencies: - type-detect "0.1.1" - -deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -denodeify@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" - -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" - -deprecated-decorator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" - -doctrine@1.3.x: - version "1.3.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^1.2.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -dotenv@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" - -duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -duplexify@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" - dependencies: - end-of-stream "1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ecdsa-sig-formatter@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" - dependencies: - base64url "^2.0.0" - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - -end-of-stream@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" - dependencies: - once "~1.3.0" - -error-ex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" - dependencies: - is-arrayish "^0.2.1" - -es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" - dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" - -es6-map@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-set "~0.1.3" - es6-symbol "~3.1.0" - event-emitter "~0.3.4" - -es6-promise@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" - -es6-promise@^3.0.2, es6-promise@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - -es6-set@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-symbol "3" - event-emitter "~0.3.4" - -es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - -es6-weak-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" - dependencies: - d "^0.1.1" - es5-ext "^0.10.8" - es6-iterator "2" - es6-symbol "3" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-config-react-app@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-0.4.0.tgz#7f87bfd2a35ed7aa17860b6b002b4197fea385d0" - -eslint-import-resolver-node@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" - dependencies: - debug "^2.2.0" - object-assign "^4.0.1" - resolve "^1.1.6" - -eslint-module-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-1.0.0.tgz#c4a57fd3a53efd8426cc2d5550aadab9bbd05fd0" - dependencies: - debug "2.2.0" - pkg-dir "^1.0.0" - -eslint-plugin-babel@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-3.3.0.tgz#2f494aedcf6f4aa4e75b9155980837bc1fbde193" - -eslint-plugin-flowtype@2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.21.0.tgz#a47e85abcdd181d37a336054bd552149ae387d9c" - dependencies: - lodash "^4.15.0" - -eslint-plugin-import@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.0.1.tgz#dcfe96357d476b3f822570d42c29bec66f5d9c5c" - dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.2.0" - doctrine "1.3.x" - eslint-import-resolver-node "^0.2.0" - eslint-module-utils "^1.0.0" - has "^1.0.1" - lodash.cond "^4.3.0" - minimatch "^3.0.3" - pkg-up "^1.0.0" - -eslint-plugin-jsx-a11y@2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" - dependencies: - damerau-levenshtein "^1.0.0" - jsx-ast-utils "^1.0.0" - object-assign "^4.0.1" - -eslint-plugin-react@6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.4.1.tgz#7d1aade747db15892f71eee1fea4addf97bcfa2b" - dependencies: - doctrine "^1.2.2" - jsx-ast-utils "^1.3.1" - -eslint@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.8.1.tgz#7d02db44cd5aaf4fa7aa489e1f083baa454342ba" - dependencies: - chalk "^1.1.3" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^1.2.2" - escope "^3.6.0" - espree "^3.3.1" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.2.0" - ignore "^3.1.5" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.6.0" - strip-bom "^3.0.0" - strip-json-comments "~1.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - -espree@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" - dependencies: - acorn "^4.0.1" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" - dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - -event-emitter@~0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" - dependencies: - d "~0.1.1" - es5-ext "~0.10.7" - -event-stream@~3.3.0: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -express-session@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.14.1.tgz#600364f0f6bf5dce32649e006770bdeee80aec99" - dependencies: - cookie "0.3.1" - cookie-signature "1.0.6" - crc "3.4.0" - debug "~2.2.0" - depd "~1.1.0" - on-headers "~1.0.1" - parseurl "~1.3.1" - uid-safe "~2.1.2" - utils-merge "1.0.0" - -express@4.14.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" - dependencies: - accepts "~1.3.3" - array-flatten "1.1.1" - content-disposition "0.5.1" - content-type "~1.0.2" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "~2.2.0" - depd "~1.1.0" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.7.0" - finalhandler "0.5.0" - fresh "0.3.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.1" - path-to-regexp "0.1.7" - proxy-addr "~1.1.2" - qs "6.2.0" - range-parser "~1.2.0" - send "0.14.1" - serve-static "~1.11.1" - type-is "~1.6.13" - utils-merge "1.0.0" - vary "~1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend@3, extend@^3.0.0, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fast-levenshtein@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - dependencies: - pend "~1.2.0" - -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-type@^3.1.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - -filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -finalhandler@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" - dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - statuses "~1.3.0" - unpipe "~1.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-versions@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" - dependencies: - array-uniq "^1.0.0" - get-stdin "^4.0.1" - meow "^3.5.0" - semver-regex "^1.0.0" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flat-cache@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" - dependencies: - circular-json "^0.3.0" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -for-in@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" - -for-own@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" - dependencies: - for-in "^0.1.5" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" - -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" - -from@~0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" - -fs-readdir-recursive@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.0.15" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.29" - -fstream-ignore@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" - -gauge@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - supports-color "^0.2.0" - wide-align "^1.1.0" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -getos@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/getos/-/getos-2.8.2.tgz#365e7e3b2cf74cb85ebb6d1d8c76633580cee534" - dependencies: - async "2.0.1" - -getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.0.1.tgz#60021327cc963ddc3b5f085764f500479ecd82ff" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - dependencies: - extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" - unique-stream "^2.0.2" - -glob@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^5.0.3, glob@^5.0.5: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^9.0.0, globals@^9.2.0: - version "9.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -got@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" - dependencies: - duplexify "^3.2.0" - infinity-agent "^2.0.0" - is-redirect "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - nested-error-stacks "^1.0.0" - object-assign "^3.0.0" - prepend-http "^1.0.0" - read-all-stream "^3.0.0" - timed-out "^2.0.0" - -graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.4: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -graphql-server-core@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/graphql-server-core/-/graphql-server-core-0.4.3.tgz#3198832ce8703388713f012da023b33a3823be98" - optionalDependencies: - typed-graphql "^1.0.2" - -graphql-server-express@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/graphql-server-express/-/graphql-server-express-0.4.3.tgz#198674e6db4949c060b9959554d3dc4e9cc4ed9b" - dependencies: - graphql-server-core "^0.4.3" - graphql-server-module-graphiql "^0.4.3" - optionalDependencies: - "@types/express" "^4.0.33" - -graphql-server-module-graphiql@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/graphql-server-module-graphiql/-/graphql-server-module-graphiql-0.4.3.tgz#f82b92b99bb1e1b4b285c86bf6fcfa60b3a7a805" - -graphql-server@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/graphql-server/-/graphql-server-0.3.2.tgz#ac3299963221be784fc78a22784d2d9ab7116e5e" - dependencies: - boom "^4.0.0" - http-errors "^1.5.0" - source-map-support "^0.4.2" - -graphql-subscriptions@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.2.0.tgz#9aebf19283f797354615b263090e15246a4c6c8d" - dependencies: - es6-promise "^3.2.1" - graphql "^0.7.0" - -graphql-subscriptions@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.1.5.tgz#603422c0a7ea3818b630751d1c9798bfa1a820ee" - dependencies: - es6-promise "^3.2.1" - graphql "^0.7.0" - -graphql-tools@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-0.8.3.tgz#7766ec1d1cc716dde331bd7813267bda44aefa08" - dependencies: - deprecated-decorator "^0.1.6" - lodash "^4.3.0" - node-uuid "^1.4.7" - optionalDependencies: - typed-graphql "^1.0.2" - -graphql@0.7.2, graphql@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.7.2.tgz#cc894a32823399b8a0cb012b9e9ecad35cd00f72" - dependencies: - iterall "1.0.2" - -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hoek@4.x.x: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.1.0.tgz#4a4557460f69842ed463aa00628cc26d2683afa7" - -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" - dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" - -hosted-git-info@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" - -http-errors@^1.5.0, http-errors@~1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" - dependencies: - inherits "2.0.3" - setprototypeof "1.0.2" - statuses ">= 1.3.1 < 2" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" - dependencies: - agent-base "2" - debug "2" - extend "3" - -iconv-lite@0.4.13, iconv-lite@~0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -ignore-by-default@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - -ignore@^3.1.5: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -infinity-agent@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -invariant@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -ipaddr.js@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" - -is-absolute@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" - dependencies: - is-relative "^0.1.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.0.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-bzip2@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" - -is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-gzip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" - -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-natural-number@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@~1, is-promise@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-relative@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - -is-stream@^1.0.0, is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-tar@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - -is-zip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isemail@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -iterall@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.2.tgz#41a2e96ce9eda5e61c767ee5dc312373bb046e91" - -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - -joi@^6.10.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" - dependencies: - hoek "2.x.x" - isemail "1.x.x" - moment "2.x.x" - topo "1.x.x" - -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" - -js-yaml@^3.5.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" - -jsonwebtoken@^7.0.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.3.0.tgz#85118d6a70e3fccdf14389f4e7a1c3f9c8a9fbba" - dependencies: - joi "^6.10.1" - jws "^3.1.4" - lodash.once "^4.0.0" - ms "^0.7.1" - xtend "^4.0.1" - -jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" - dependencies: - extsprintf "1.0.2" - json-schema "0.2.3" - verror "1.3.6" - -jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.4.tgz#0257ed1cc4b1e65b39d7d9940f9fb4f20f7ba0a9" - dependencies: - acorn-jsx "^3.0.1" - object-assign "^4.1.0" - -jwa@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" - dependencies: - base64url "2.0.0" - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.9" - safe-buffer "^5.0.1" - -jws@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" - dependencies: - base64url "^2.0.0" - jwa "^1.1.4" - safe-buffer "^5.0.1" - -jwt-simple@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/jwt-simple/-/jwt-simple-0.5.1.tgz#79ea01891b61de6b68e13e67c0b4b5bda937b294" - -kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" - dependencies: - is-buffer "^1.0.2" - -latest-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" - dependencies: - package-json "^1.0.0" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" - dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash.assign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" - -lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" - -lodash.create@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - -lodash.defaults@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" - dependencies: - lodash.assign "^3.0.0" - lodash.restparam "^3.0.0" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isequal@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" - -lodash.isobject@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash@4.16.4, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0: - version "4.16.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" - -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - dependencies: - chalk "^1.0.0" - -loose-envify@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" - dependencies: - js-tokens "^2.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -meow@^3.5.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^2.1.5, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.25.0: - version "1.25.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: - version "2.1.13" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" - dependencies: - mime-db "~1.25.0" - -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" - dependencies: - brace-expansion "^1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.2.0" - diff "1.4.0" - escape-string-regexp "1.0.5" - glob "7.0.5" - growl "1.9.2" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - -moment@2.x.x: - version "2.17.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.1.tgz#fed9506063f36b10f066c8b59a144d7faebe1d82" - -mongo-find-by-ids@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mongo-find-by-ids/-/mongo-find-by-ids-1.0.0.tgz#c4e7a108e2b9fb98f59eb8be5d3801b2bfb52222" - -mongodb-core@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.0.tgz#49a5edf476f6cc16c4ff7d423802a88080d992fb" - dependencies: - bson "~1.0.0" - require_optional "~1.0.0" - -mongodb-download@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mongodb-download/-/mongodb-download-1.3.2.tgz#0a2e8868eaea6c18e2a7f7cb7c8048ff10809337" - dependencies: - debug "^2.2.0" - getos "^2.7.0" - yargs "^3.26.0" - -mongodb-prebuilt@^5.0.7: - version "5.0.8" - resolved "https://registry.yarnpkg.com/mongodb-prebuilt/-/mongodb-prebuilt-5.0.8.tgz#82eb96336688888c3a614efbf6c5613fb656fbed" - dependencies: - debug "^2.2.0" - decompress "^3.0.0" - https-proxy-agent "^1.0.0" - mongodb-download "^1.3.2" - spawn-sync "1.0.15" - yargs "^3.26.0" - -mongodb@^2.2.11: - version "2.2.13" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.13.tgz#f74315fbf64450265f920481fc7f17491b056b8a" - dependencies: - es6-promise "3.2.1" - mongodb-core "2.1.0" - readable-stream "2.1.5" - -ms@0.7.1, ms@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -nan@2.5.0, nan@^2.3.0, nan@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -nested-error-stacks@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" - dependencies: - inherits "~2.0.1" - -node-fetch@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-pre-gyp@0.6.32, node-pre-gyp@^0.6.29: - version "0.6.32" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" - dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.1" - rc "~1.1.6" - request "^2.79.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" - -node-static@0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/node-static/-/node-static-0.5.9.tgz#2f5bf30949e1735958266c269413aebce8cbe899" - -node-uuid@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - -nodeify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" - dependencies: - is-promise "~1.0.0" - promise "~1.3.0" - -nodemon@1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" - dependencies: - chokidar "^1.4.3" - debug "^2.2.0" - es6-promise "^3.0.2" - ignore-by-default "^1.0.0" - lodash.defaults "^3.1.2" - minimatch "^3.0.0" - ps-tree "^1.0.1" - touch "1.0.0" - undefsafe "0.0.3" - update-notifier "0.5.0" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - dependencies: - abbrev "1" - -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" - -npmlog@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.1" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0, once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - dependencies: - is-stream "^1.0.1" - readable-stream "^2.0.1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -output-file-sync@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - -package-json@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" - dependencies: - got "^3.2.0" - registry-url "^3.0.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" - -passport-jwt@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-2.2.1.tgz#0e004c94071319d673d9d9bcfd1574a868011527" - dependencies: - jsonwebtoken "^7.0.0" - passport-strategy "^1.0.0" - -passport-strategy@1.x.x, passport-strategy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" - -passport@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/passport/-/passport-0.3.2.tgz#9dd009f915e8fe095b0124a01b8f82da07510102" - dependencies: - passport-strategy "1.x.x" - pause "0.0.1" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - -pause@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - -pkg-up@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" - dependencies: - find-up "^1.0.0" - -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -private@^0.1.6, private@~0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -promise@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" - dependencies: - is-promise "~1" - -proxy-addr@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" - dependencies: - forwarded "~0.1.0" - ipaddr.js "1.1.1" - -ps-tree@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" - dependencies: - event-stream "~3.3.0" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" - -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" - -random-bytes@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" - -randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" - dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" - -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@~2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" - -rc@^1.0.1, rc@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~1.0.4" - -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@2.1.5, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~2.0.0, readable-stream@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" - -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" - -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -registry-url@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -request@^2.65.0, request@^2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - -require-uncached@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -require_optional@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.0.tgz#52a86137a849728eb60a55533617f8f914f59abf" - dependencies: - resolve-from "^2.0.0" - semver "^5.1.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - -resolve@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - -rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" - dependencies: - glob "^7.0.5" - -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - -seek-bzip@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - dependencies: - commander "~2.8.1" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -semver-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" - -semver-truncate@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" - dependencies: - semver "^5.3.0" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -semver@^4.0.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@~5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" - -send@0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.0" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.0" - -serve-static@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.14.1" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -setprototypeof@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shelljs@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-map-support@^0.4.2: - version "0.4.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" - dependencies: - source-map "^0.5.3" - -source-map@^0.5.0, source-map@^0.5.3: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -spawn-sync@1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -"statuses@>= 1.3.1 < 2", statuses@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - dependencies: - duplexer "~0.1.1" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -string-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" - dependencies: - strip-ansi "^3.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-dirs@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" - dependencies: - chalk "^1.0.0" - get-stdin "^4.0.1" - is-absolute "^0.1.5" - is-natural-number "^2.0.0" - minimist "^1.1.0" - sum-up "^1.0.1" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - -subscriptions-transport-ws@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.2.6.tgz#433861167c25ef9a2b8697e9403afa2a77656cb3" - dependencies: - "@types/node" "^6.0.38" - backo2 "^1.0.2" - es6-promise "^3.2.1" - graphql-subscriptions "^0.1.3" - lodash.isobject "^3.0.2" - lodash.isstring "^4.0.1" - node-static "0.5.9" - websocket "^1.0.23" - -sum-up@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - dependencies: - chalk "^1.0.0" - -supports-color@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - dependencies: - has-flag "^1.0.0" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - -tar-stream@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - -tar@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^0.6.0, through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@~2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -timed-out@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" - -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - dependencies: - extend-shallow "^2.0.1" - -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" - -topo@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" - dependencies: - hoek "2.x.x" - -touch@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" - dependencies: - nopt "~1.0.10" - -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - dependencies: - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.4" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" - -type-detect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" - -type-is@~1.6.13: - version "1.6.14" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.13" - -typed-graphql@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-graphql/-/typed-graphql-1.0.2.tgz#4c0f788775d552df4d4ec3d73f25469252f40fb8" - -typedarray-to-buffer@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.2.tgz#1017b32d984ff556eba100f501589aba1ace2e04" - dependencies: - is-typedarray "^1.0.0" - -typedarray@~0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -uid-number@~0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -uid-safe@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.3.tgz#077e264a00b3187936b270bb7376a26473631071" - dependencies: - base64-url "1.3.3" - random-bytes "~1.0.0" - -undefsafe@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -update-notifier@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" - dependencies: - chalk "^1.0.0" - configstore "^1.0.0" - is-npm "^1.0.0" - latest-version "^1.0.0" - repeating "^1.1.2" - semver-diff "^2.0.0" - string-length "^1.0.0" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - -uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" - -v8flags@^2.0.10: - version "2.0.11" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" - dependencies: - user-home "^1.1.1" - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -vary@^1, vary@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" - -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" - dependencies: - extsprintf "1.0.2" - -vinyl-assign@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" - dependencies: - object-assign "^4.0.1" - readable-stream "^2.0.0" - -vinyl-fs@^2.2.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" - graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" - lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" - through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" - -vinyl@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -websocket@^1.0.23: - version "1.0.23" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.23.tgz#20de8ec4a7126b09465578cd5dbb29a9c296aac6" - dependencies: - debug "^2.2.0" - nan "^2.3.3" - typedarray-to-buffer "^3.1.2" - yaeti "^0.0.4" - -wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" - dependencies: - string-width "^1.0.1" - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" - dependencies: - graceful-fs "^4.1.2" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - dependencies: - os-homedir "^1.0.0" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yaeti@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.4.tgz#89fe739c45ac4491028973193262a837693a66b6" - -yargs@^3.26.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yauzl@^2.2.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.7.0.tgz#e21d847868b496fc29eaec23ee87fdd33e9b2bce" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" diff --git a/test/generate/directives.js b/test/generate/directives.js index 0626c29..49e8693 100644 --- a/test/generate/directives.js +++ b/test/generate/directives.js @@ -11,7 +11,7 @@ describe('directives', () => { const input = parse(`type Test { status: TestStatus @enum }`); - + it('leaves the typename unchanged in the schema', () => { const schema = generateSchema(input); @@ -36,20 +36,42 @@ describe('directives', () => { it('does not generate a resolver', () => { const ast = generateResolversAst(input); + let keys = []; + // less offensive, otherwise, we have to change it after each + // change in the templates + ast.program.body.forEach(body => { + if (body.declarations && + body.declarations.length > 0) { - const resolvers = ast.program.body[0].declarations[0]; - const Test = resolvers.init.properties.find(p => p.key.name === 'Test'); - const keys = Test.value.properties.map(p => p.key.name); + body.declarations.forEach(declaration => { + if (declaration.init && + declaration.init.properties && + declaration.init.properties.length > 0){ + const Test = declaration.init.properties.find(p => p.key.name === 'Test'); + if (Test && Test.value && Test.value.properties && Test.value.properties.length > 0) { + keys = keys.concat(Test.value.properties.map(p => p.key.name)); + } + } + }); + } + }); expect(keys).to.not.include('status'); }); it('does not generate a model function', () => { const ast = generateModelAst(input); - - const TestClass = ast.program.body[2].declaration.body; - const keys = TestClass.body.map(p => p.key.name); - + let keys = []; + // less offensive, otherwise, we have to change it after each + // change in the templates + ast.program.body.forEach(body =>{ + if (body.declaration && + body.declaration.body && + body.declaration.body.body && + body.declaration.body.body.length > 0) { + keys = keys.concat(body.declaration.body.body.map(p => p.key.name)); + } + }); expect(keys).to.not.include('status'); }); }); diff --git a/test/generate/model.js b/test/generate/model.js index 430f60b..b367820 100644 --- a/test/generate/model.js +++ b/test/generate/model.js @@ -3,36 +3,45 @@ import chai, { expect } from 'chai'; import chaiDiff from 'chai-diff'; import fs from 'fs'; -import readInput from '../../generate/read'; -import generateSchema from '../../generate/schema'; -import generateModel from '../../generate/model'; +import { readString } from '../../generate/util/read'; +import generate from '../../generate'; describe('generateModel', () => { chai.use(chaiDiff); describe('with user test file', () => { - const input = readInput(`${__dirname}/../input/User.graphql`); + const input = readString(`${__dirname}/../input/User.graphql`); it('generates correct JavaScript', () => { - const schema = generateSchema(input); - const output = generateModel(input, schema); - + const { + typeName, + TypeName, + outputSchemaStr, + resolversStr, + modelStr, + } = generate(input); + const expected = fs.readFileSync(`${__dirname}/../output-app/model/User.js`, 'utf8'); - expect(output).not.to.be.differentFrom(expected, { relaxedSpace: true }); + expect(modelStr).not.to.be.differentFrom(expected, { relaxedSpace: true }); }); }); describe('with tweet test file', () => { - const input = readInput(`${__dirname}/../input/Tweet.graphql`); + const input = readString(`${__dirname}/../input/Tweet.graphql`); it('generates correct JavaScript', () => { - const schema = generateSchema(input); - const output = generateModel(input, schema); + const { + typeName, + TypeName, + outputSchemaStr, + resolversStr, + modelStr, + } = generate(input); const expected = fs.readFileSync(`${__dirname}/../output-app/model/Tweet.js`, 'utf8'); - expect(output).not.to.be.differentFrom(expected, { relaxedSpace: true }); + expect(modelStr).not.to.be.differentFrom(expected, { relaxedSpace: true }); }); }); }); diff --git a/test/generate/resolvers.js b/test/generate/resolvers.js index 58c1af8..acafd4b 100644 --- a/test/generate/resolvers.js +++ b/test/generate/resolvers.js @@ -3,36 +3,45 @@ import chai, { expect } from 'chai'; import chaiDiff from 'chai-diff'; import fs from 'fs'; -import readInput from '../../generate/read'; -import generateSchema from '../../generate/schema'; -import generateResolvers from '../../generate/resolvers'; +import { readString } from '../../generate/util/read'; +import generate from '../../generate'; describe('generateResolvers', () => { chai.use(chaiDiff); describe('with user test file', () => { - const input = readInput(`${__dirname}/../input/User.graphql`); + const input = readString(`${__dirname}/../input/User.graphql`); it('generates correct JavaScript', () => { - const schema = generateSchema(input); - const output = generateResolvers(input, schema); + const { + typeName, + TypeName, + outputSchemaStr, + resolversStr, + modelStr, + } = generate(input); const expected = fs.readFileSync(`${__dirname}/../output-app/resolvers/User.js`, 'utf8'); - expect(output).not.to.be.differentFrom(expected, { relaxedSpace: true }); + expect(resolversStr).not.to.be.differentFrom(expected, { relaxedSpace: true }); }); }); describe('with tweet test file', () => { - const input = readInput(`${__dirname}/../input/Tweet.graphql`); + const input = readString(`${__dirname}/../input/Tweet.graphql`); it('generates correct JavaScript', () => { - const schema = generateSchema(input); - const output = generateResolvers(input, schema); + const { + typeName, + TypeName, + outputSchemaStr, + resolversStr, + modelStr, + } = generate(input); const expected = fs.readFileSync(`${__dirname}/../output-app/resolvers/Tweet.js`, 'utf8'); - expect(output).not.to.be.differentFrom(expected, { relaxedSpace: true }); + expect(resolversStr).not.to.be.differentFrom(expected, { relaxedSpace: true }); }); }); }); diff --git a/test/generate/schema.js b/test/generate/schema.js index da2cb79..fd6a3b7 100644 --- a/test/generate/schema.js +++ b/test/generate/schema.js @@ -4,16 +4,16 @@ import chaiDiff from 'chai-diff'; import fs from 'fs'; import { print } from 'graphql'; -import readInput from '../../generate/read'; +import readInput from '../../generate/util/read'; import generateSchema from '../../generate/schema'; -describe('generateResolvers', () => { +describe('generateSchema', () => { chai.use(chaiDiff); describe('with user test file', () => { const input = readInput(`${__dirname}/../input/User.graphql`); - it('generates correct JavaScript', () => { + it('generates correct Schema', () => { const schema = generateSchema(input); const output = print(schema); @@ -26,7 +26,7 @@ describe('generateResolvers', () => { describe('with tweet test file', () => { const input = readInput(`${__dirname}/../input/Tweet.graphql`); - it('generates correct JavaScript', () => { + it('generates correct Schema', () => { const schema = generateSchema(input); const output = print(schema); diff --git a/test/get-jwt-tokens-for-tests.sh b/test/get-jwt-tokens-for-tests.sh new file mode 100755 index 0000000..7ebc09b --- /dev/null +++ b/test/get-jwt-tokens-for-tests.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd output-app-end-to-end/scripts +babel-node generateJWT.js +cd ../.. diff --git a/test/input/Tweet.graphql b/test/input/Tweet.graphql index 9fc371f..58a0654 100644 --- a/test/input/Tweet.graphql +++ b/test/input/Tweet.graphql @@ -1,6 +1,16 @@ -type Tweet { - author: User! @unmodifiable - body: String! +type Tweet - likers: [User!] @hasAndBelongsToMany(as: "liked") +@authorize( + admin: ["create", "read", "update", "delete"], + author: ["create", "read", "update", "delete"], + coauthors: ["read", "update"], + world: ["read"] +) + +{ + author: User @unmodifiable @belongsTo @authRole(for: ["author"]) + coauthors: [User] @belongsToMany @authRole(for: ["coauthors"]) + body: String + + likers: [User] @hasAndBelongsToMany(as: "liked") } diff --git a/test/input/User.graphql b/test/input/User.graphql index 842c07d..2fbe6bc 100644 --- a/test/input/User.graphql +++ b/test/input/User.graphql @@ -1,11 +1,21 @@ -type User { - username: String! +type User + +@authorize( + admin: ["create", "read", "update", "delete"] + this: ["create", "read", "update", "delete"] +) + +{ + role: String @authRole(for: ["admin"]) + email: String! + username: String + bio: String notify: Boolean - tweets(minLikes: Int): [Tweet!] @hasMany(as: "author") - liked: [Tweet!] @belongsToMany + tweets(minLikes: Int): [Tweet] @hasMany(as: "author") + liked: [Tweet] @belongsToMany - following: [User!] @belongsToMany - followers: [User!] @hasAndBelongsToMany(as: "following") + following: [User] @belongsToMany + followers: [User] @hasAndBelongsToMany(as: "following") } diff --git a/test/output-app-end-to-end/index.js b/test/output-app-end-to-end/index.js index 9d15fe1..8cc625b 100644 --- a/test/output-app-end-to-end/index.js +++ b/test/output-app-end-to-end/index.js @@ -1,7 +1,6 @@ import { describe, it } from 'mocha'; import { assert } from 'chai'; - -import { sendQuery } from './sendQuery'; +import { sendQuery, adminUser } from './sendQuery'; describe('environment', () => { it('graphql server should be available', () => { @@ -11,7 +10,7 @@ describe('environment', () => { } }`; - return sendQuery({ query, operationName: 'foo' }) + return sendQuery({ query, operationName: 'foo', userId: adminUser }) .then((result) => { assert.isDefined(result.data); }); diff --git a/test/output-app-end-to-end/mutations.js b/test/output-app-end-to-end/mutations.js deleted file mode 100644 index 85f9efa..0000000 --- a/test/output-app-end-to-end/mutations.js +++ /dev/null @@ -1,141 +0,0 @@ -import { describe, it } from 'mocha'; -import { assert } from 'chai'; - -import { sendQuery, sendQueryAndExpect } from './sendQuery'; - -describe('mutations', () => { - describe('users', () => { - it('can do CRUD', () => { - function makeInput(user) { - return `{ - username: "${user.username}", - bio: "${user.bio}" - }`; - } - - const expectedUser = { - username: 'zol', - bio: 'Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead', - }; - - const modifiedUser = { - username: 'zoltan', - bio: 'Maker of things, I guess', - }; - - let userId; - return sendQuery({ query: ` - mutation { - createUser(input: ${makeInput(expectedUser)}) { - id - } - } - ` }) - .then((result) => { - assert.isNotNull(result.data); - assert.isNotNull(result.data.createUser); - assert.isNotNull(result.data.createUser.id); - userId = result.data.createUser.id; - }) - .then(() => - sendQueryAndExpect( - `{ user(id: "${userId}") { username, bio } }`, - { user: expectedUser }) - ) - .then(() => - sendQueryAndExpect(` - mutation { - updateUser(id: "${userId}", input: ${makeInput(modifiedUser)}) { - username - bio - } - } - `, { updateUser: modifiedUser }) - ) - .then(() => - sendQueryAndExpect( - `{ user(id: "${userId}") { username, bio } }`, - { user: modifiedUser }) - ) - .then(() => - sendQueryAndExpect( - `mutation { removeUser(id: "${userId}") }`, - { removeUser: true }) - ) - .then(() => - sendQueryAndExpect( - `{ user(id: "${userId}") { username, bio } }`, - { user: null }) - ); - }); - }); - - describe('tweets', () => { - it('can do CRUD', () => { - function makeInput(tweet) { - if (tweet.author) { - return `{ - authorId: "${tweet.author.id}", - body: "${tweet.body}" - }`; - } - return `{ - body: "${tweet.body}" - }`; - } - - const expectedTweet = { - author: { id: '583291a1638566b3c5a92ca1' }, - body: 'This is a test tweet', - }; - - const modifiedTweet = { - body: 'This is a modified test', - }; - - let tweetId; - return sendQuery({ query: ` - mutation { - createTweet(input: ${makeInput(expectedTweet)}) { - id - } - } - ` }) - .then((result) => { - assert.isNotNull(result.data); - assert.isNotNull(result.data.createTweet); - assert.isNotNull(result.data.createTweet.id); - tweetId = result.data.createTweet.id; - }) - .then(() => - sendQueryAndExpect( - `{ tweet(id: "${tweetId}") { author { id } body } }`, - { tweet: expectedTweet }) - ) - .then(() => - sendQueryAndExpect(` - mutation { - updateTweet(id: "${tweetId}", input: ${makeInput(modifiedTweet)}) { - body - } - } - `, { updateTweet: modifiedTweet }) - ) - .then(() => - sendQueryAndExpect( - `{ tweet(id: "${tweetId}") { body } }`, - { tweet: modifiedTweet }) - ) - .then(() => - sendQueryAndExpect( - `mutation { removeTweet(id: "${tweetId}") }`, - { removeTweet: true }) - ) - .then(() => - sendQueryAndExpect( - `{ tweet(id: "${tweetId}") { body } }`, - { tweet: null }) - ); - }); - }); -}); diff --git a/test/output-app-end-to-end/scripts/JWTs.txt b/test/output-app-end-to-end/scripts/JWTs.txt new file mode 100644 index 0000000..e8f7f53 --- /dev/null +++ b/test/output-app-end-to-end/scripts/JWTs.txt @@ -0,0 +1,49 @@ +{ _id: { '$oid': '583291a1638566b3c5a92ca1' }, + bio: 'tech lead @meteorjs @apollographql', + createdAt: 1479776905993, + followingIds: [ { '$oid': '583291a1638566b3c5a92ca0' } ], + likedIds: + [ { '$oid': '583676d3618530145474e350' }, + { '$oid': '583676d3618530145474e351' } ], + updatedAt: 1479776905993, + username: 'stubailo', + role: 'admin', + createdById: { '$oid': '583291a1638566b3c5a92ca1' }, + updatedById: { '$oid': '583291a1638566b3c5a92ca1' } } +Generated JWT Token for tests: +JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiI1ODMyOTFhMTYzODU2NmIzYzVhOTJjYTEifQ.QaJYP81K7kgB8FVw6bOK7XSZYI6_gn9GCOlDToQcu0Q +###################################### +{ _id: { '$oid': '583291a1638566b3c5a92ca0' }, + bio: 'I build things with @percolatestudio. Author of @discovermeteor. Exploring how to improve user experience through technology, design and performance.', + createdAt: 1479776904993, + followingIds: + [ { '$oid': '583291a1638566b3c5a92ca1' }, + { '$oid': '583291a1638566b3c5a92ca2' } ], + likedIds: + [ { '$oid': '583676d3618530145474e352' }, + { '$oid': '583676d3618530145474e353' }, + { '$oid': '583676d3618530145474e354' } ], + updatedAt: 1479776904993, + username: 'tmeasday', + role: 'editor', + hash: '$2a$10$SeepHv0X3GZfSzl0uqlXmucLsP2VjdI.nuA0UJnmOtEecLSx.RiWe', + createdById: { '$oid': '583291a1638566b3c5a92ca1' }, + updatedById: { '$oid': '583291a1638566b3c5a92ca1' } } +Generated JWT Token for tests: +JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiI1ODMyOTFhMTYzODU2NmIzYzVhOTJjYTAifQ.9Vv99jJ1EyJyp7Q8G09vs7qdjtBicq0UlU4GeNKZ5Dc +###################################### +{ _id: { '$oid': '583291a1638566b3c5a92ca2' }, + bio: 'Co-founder of Parse, now at Facebook. Ex Google search quality, game developer & math contester.', + createdAt: 1479776906993, + followingIds: [ { '$oid': '583291a1638566b3c5a92ca1' } ], + likedIds: + [ { '$oid': '583676d3618530145474e350' }, + { '$oid': '583676d3618530145474e353' } ], + updatedAt: 1479776906993, + username: 'lacker', + role: 'user', + createdById: { '$oid': '583291a1638566b3c5a92ca1' }, + updatedById: { '$oid': '583291a1638566b3c5a92ca1' } } +Generated JWT Token for tests: +JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiI1ODMyOTFhMTYzODU2NmIzYzVhOTJjYTIifQ.qfw1KGMp2tZ28csjYwkkv44SMMh4V0-VSLP3c5iC49Y +###################################### diff --git a/test/output-app-end-to-end/scripts/generateJWT.js b/test/output-app-end-to-end/scripts/generateJWT.js new file mode 100755 index 0000000..5282cb0 --- /dev/null +++ b/test/output-app-end-to-end/scripts/generateJWT.js @@ -0,0 +1,22 @@ +import jwt from '../../output-app/node_modules/jwt-simple'; +import fs from 'fs'; + +const KEY = 'test-key'; + +const userFile = fs.readFileSync('../../seeds/User.json', 'utf8'); +const re = new RegExp("{.*}", 'g'); +let arr; + +while ((arr = re.exec(userFile)) !== null) { + let user = JSON.parse(arr[0]); + console.log(user); + console.log('Generated JWT Token for tests:'); + const payload = { + userId: user._id.$oid.toString(), + }; + const token = jwt.encode(payload, KEY); + console.log('JWT', token); + console.log('######################################'); +} + + diff --git a/test/output-app-end-to-end/scripts/run-end-to-end-tests.sh b/test/output-app-end-to-end/scripts/run-end-to-end-tests.sh index 75abf03..6746686 100755 --- a/test/output-app-end-to-end/scripts/run-end-to-end-tests.sh +++ b/test/output-app-end-to-end/scripts/run-end-to-end-tests.sh @@ -7,6 +7,7 @@ echo "checking for server connection" TEST_DIR=$(dirname $(dirname "$0")) SEED_DIR=$(dirname $TEST_DIR)/seeds +LOG_FILE=$(dirname $TEST_DIR)/output-app/server/logs/all-logs-readable.log $MOCHA "$TEST_DIR/index.js" > /dev/null 2> /dev/null if [[ $? -ne 0 ]]; then @@ -26,4 +27,16 @@ mongoimport --drop --host 127.0.0.1:3002 --db database --collection tweet "$SEED echo "running tests" -$MOCHA "$TEST_DIR" +# Test all... + $MOCHA "$TEST_DIR" + +# Test only specific test files... +# $MOCHA "$TEST_DIR/test-1-roles.js" +# $MOCHA "$TEST_DIR/test-2-queries-with-user-role-admin.js" +# $MOCHA "$TEST_DIR/test-3-mutations-with-user-role-admin.js" +# $MOCHA "$TEST_DIR/test-4-mutations-with-unknown-user.js" +# $MOCHA "$TEST_DIR/test-5-mutations-with-user-role-user.js" +# $MOCHA "$TEST_DIR/test-6-mutations-with-user-role-editor.js" + +echo "Please consider the log file for debugging $LOG_FILE" +echo "" diff --git a/test/output-app-end-to-end/sendQuery.js b/test/output-app-end-to-end/sendQuery.js index 511c35f..50f1e8a 100644 --- a/test/output-app-end-to-end/sendQuery.js +++ b/test/output-app-end-to-end/sendQuery.js @@ -1,12 +1,29 @@ import fetch from 'node-fetch'; import { assert } from 'chai'; +import jwt from '../output-app/node_modules/jwt-simple'; const ENDPOINT = 'http://localhost:3000/graphql'; -export function sendQuery({ query }) { +// For testing different user authorizations, set users to: +export const unknownUser = ''; // not signed in +export const defaultUser = '583291a1638566b3c5a92ca2'; // role = 'user' +export const roleUser = '583291a1638566b3c5a92ca0'; // role = 'editor' +export const adminUser = '583291a1638566b3c5a92ca1'; // role = 'admin' + +export function getToken(userId, KEY='test-key'){ + const payload = { userId }; + const token = (userId && userId !== '') ? `JWT ${jwt.encode(payload, KEY)}` : null; + return token; +} + +export function sendQuery({ query, userId }) { + const token = getToken(userId); return fetch(ENDPOINT, { method: 'POST', - headers: { 'content-type': 'application/json' }, + headers: { + 'content-type': 'application/json', + 'authorization': token, + }, body: JSON.stringify({ query }), }).then((response) => { assert.equal(response.status, 200, response.statusText); @@ -14,8 +31,8 @@ export function sendQuery({ query }) { }); } -export function sendQueryAndExpect(query, expectedResult) { - return sendQuery({ query }) +export function sendQueryAndExpect(query, expectedResult, userId) { + return sendQuery({ query, userId }) .then((result) => { assert.isDefined(result.data); assert.deepEqual(result.data, expectedResult); diff --git a/test/output-app-end-to-end/test-1-roles.js b/test/output-app-end-to-end/test-1-roles.js new file mode 100644 index 0000000..103c8c9 --- /dev/null +++ b/test/output-app-end-to-end/test-1-roles.js @@ -0,0 +1,70 @@ +import { describe, it } from 'mocha'; +import { assert } from 'chai'; +import { sendQuery, defaultUser, roleUser, adminUser } from './sendQuery'; + +describe('test-1: roles', () => { + + describe('adminUser: stubailo', () => { + it('has role "admin"', () => { + return sendQuery({query: + `query { + user(id: "${adminUser}") { + role + username + } + }`, + userId: adminUser + }).then(result => { + assert.isDefined(result.data); + assert.isDefined(result.data.user); + assert.isDefined(result.data.user.role); + assert.equal(result.data.user.role, 'admin'); + assert.equal(result.data.user.username, 'stubailo'); + return false; + }) + }) + }); + + describe('roleUser: tmeasday', () => { + it('has role "editor"', () => { + return sendQuery({query: + `query { + user(id: "${roleUser}") { + role + username + } + }`, + userId: adminUser + }).then(result => { + assert.isDefined(result.data); + assert.isDefined(result.data.user); + assert.isDefined(result.data.user.role); + assert.equal(result.data.user.role, 'editor'); + assert.equal(result.data.user.username, 'tmeasday'); + return false; + }) + }) + }); + + describe('defaultUser: lacker', () => { + it('has role "user"', () => { + return sendQuery({query: + `query { + user(id: "${defaultUser}") { + role + username + } + }`, + userId: adminUser + }).then(result => { + assert.isDefined(result.data); + assert.isDefined(result.data.user); + assert.isDefined(result.data.user.role); + assert.equal(result.data.user.role, 'user'); + assert.equal(result.data.user.username, 'lacker'); + return false; + }) + }) + }); + +}); \ No newline at end of file diff --git a/test/output-app-end-to-end/queries.js b/test/output-app-end-to-end/test-2-queries-with-user-role-admin.js similarity index 91% rename from test/output-app-end-to-end/queries.js rename to test/output-app-end-to-end/test-2-queries-with-user-role-admin.js index 5a40453..043f743 100644 --- a/test/output-app-end-to-end/queries.js +++ b/test/output-app-end-to-end/test-2-queries-with-user-role-admin.js @@ -1,12 +1,13 @@ import { describe, it } from 'mocha'; import { assert } from 'chai'; +import { sendQuery, sendQueryAndExpect, unknownUser, defaultUser, roleUser, adminUser } from './sendQuery'; -import { sendQuery, sendQueryAndExpect } from './sendQuery'; -describe('queries', () => { +describe('test-2: queries as user with role "admin"', () => { + function itQueries(name, query, expectedResult) { it(name, () => { - sendQueryAndExpect(query, expectedResult); + sendQueryAndExpect(query, expectedResult, adminUser); }); } @@ -39,19 +40,21 @@ describe('queries', () => { } let lastCreatedAt; - return sendQuery({ query: constructQuery() }) + return sendQuery({ query: constructQuery(), userId: adminUser }) .then((result) => { const items = checkResult(result, 0, expectedItems.length); lastCreatedAt = items[0].createdAt; }) - .then(() => sendQuery({ query: constructQuery('(limit: 1)') })) + .then(() => sendQuery({ query: constructQuery('(limit: 1)'), userId: adminUser })) .then(result => checkResult(result, 0, 1)) .then(() => sendQuery({ query: constructQuery(`(lastCreatedAt: ${lastCreatedAt})`), + userId: adminUser, })) .then(result => checkResult(result, 1, expectedItems.length - 1)) .then(() => sendQuery({ query: constructQuery(`(lastCreatedAt: ${lastCreatedAt}, limit: 1)`), + userId: adminUser, })) .then(result => checkResult(result, 1, Math.min(expectedItems.length - 1, 1)) @@ -138,3 +141,4 @@ describe('queries', () => { }, [{ username: 'tmeasday' }, { username: 'lacker' }]); }); }); + diff --git a/test/output-app-end-to-end/test-3-mutations-with-user-role-admin.js b/test/output-app-end-to-end/test-3-mutations-with-user-role-admin.js new file mode 100644 index 0000000..5538aa4 --- /dev/null +++ b/test/output-app-end-to-end/test-3-mutations-with-user-role-admin.js @@ -0,0 +1,420 @@ +import { describe, it } from 'mocha'; +import { assert } from 'chai'; +import { sendQuery, sendQueryAndExpect, roleUser, adminUser } from './sendQuery'; + +let newUser; +let otherUser; +let tweetId; +let tweetId2; +let tweetIdOthers; + +function makeUserInput(user) { + let query = `{`; + Object.keys(user).forEach(field => { + query = query + ` + ${field}: "${user[field]}"`; + }); + query = query + ` + }`; + return query; +} + +function makeTweetInput(tweet, userId) { + if (tweet.author) { + return `{ + authorId: "${userId ? userId : tweet.author.id}", + coauthorsIds: ${tweet.coauthorsIds ? JSON.stringify(tweet.coauthorsIds) : JSON.stringify([])}, + body: "${tweet.body}" + }`; + } + return `{ + body: "${tweet.body}" + }`; +} + +describe('test-3: user with role "admin"', () => { + + before(function(done) { + const expectedUser = { + email: 'tobias@gmail.com', + password: 'password', + username: 'tobkle', + bio: 'someone', + role: 'admin' + }; + // console.log('before:', makeUserInput(expectedUser)); + // console.log('userId', adminUser); + sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + role + } + } + `, + userId: adminUser + }) + .then(result => { + // console.log('after:', result); + assert.isNotNull(result.data); + assert.isNotNull(result.data.createUser); + assert.isNotNull(result.data.createUser.id); + assert.equal(result.data.createUser.role, 'admin'); + newUser = result.data.createUser.id; + done(); + }) + .catch((error) => { + console.log('ERROR: BEFORE', error); + done(); + }) + }); + + describe('on type "user" (part 1)...', () => { + + it('admin user created new user "tobkle" with role "admin" for the next tests...', () => { + assert.isNotNull(newUser); + }); + + it('admin user created new "other" user with role "editor"', () => { + const expectedUser = { + email: 'zol@gmail.com', + password: 'password', + username: 'zol', + bio: 'Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead', + role: 'editor' + }; + return sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createUser); + assert.isNotNull(result.data.createUser.id); + otherUser = result.data.createUser.id; + }); + }); + + it('can read other users', () => { + return sendQueryAndExpect(` + { user(id: "${otherUser}") { username, bio, role } } + `, { + user: { + username: 'zol', + bio: 'Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead', + role: 'editor' + } + }, + newUser) + }); + + it('can read himself', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username, role } } + `, { + user: { + username: 'tobkle', + role: 'admin' + } + }, + newUser) + }); + + it('can update other users', () => { + const modifiedUser = { + username: 'zoltan', + bio: 'Maker of things, I guess', + role: 'editor' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${otherUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { updateUser: modifiedUser }, + newUser) + }); + + it('can update himself', () => { + const modifiedUser = { + username: 'tobkle', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: modifiedUser + }, + newUser) + }); + + it('can update role of other user to "admin"', () => { + const modifiedUser = { + username: 'zoltan', + bio: 'now an admin', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${otherUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: modifiedUser + }, + newUser) + }); + + it('can update his role from "admin" to "editor"', () => { + const modifiedUser = { + username: 'tobkle', + bio: 'Maker of things, I guess', + role: 'editor' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: modifiedUser + }, + newUser) + }); + + it('can not update own role while being "editor"', () => { + const modifiedUser = { + username: 'tobkle', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: { + bio: 'Maker of things, I guess', + role: 'editor', + username: 'tobkle', + } + }, + newUser) + }); + + it('other user with role "admin" can update role for user "tobkle" back to "admin"', () => { + const modifiedUser = { + username: 'tobkle', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: modifiedUser + }, + otherUser) + }); + + it('can delete other users', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${otherUser}") + } + `, { + removeUser: true + }, + newUser) + }); + + }); + + describe('on type "tweet"...', () => { + + let expectedTweet = { + author: { id: newUser }, + //coauthors: [], + body: 'This is a test tweet of user tobkle', + }; + + const expectedTweetOtherAuthor = { + author: { id: adminUser }, + //coauthors: [], + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const modifiedTweet = { + body: 'This is a modified test tweet', + }; + + before(function (done) { + expectedTweet.author.id = newUser; + sendQuery({ query: ` + mutation { + createTweet(input: ${makeTweetInput(expectedTweet, newUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createTweet); + assert.isNotNull(result.data.createTweet.id); + tweetId = result.data.createTweet.id; + done(); + }) + .catch((error) => { + console.log(error); + done(); + }) + }); + + it('can create tweet for himself', () => { + assert.isNotNull(tweetId); + }); + + it('can create tweet for other author', () => { + sendQuery({ query: ` + mutation { + createTweet(input: ${makeTweetInput(expectedTweetOtherAuthor, adminUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createTweet); + assert.isNotNull(result.data.createTweet.id); + tweetIdOthers = result.data.createTweet.id; + }) + }); + + it('can read own tweet', () => { + expectedTweet.author.id = newUser; + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { author { id } body } }`, + { tweet: expectedTweet }, + newUser) + }); + + it('can read others tweet', () => { + return sendQueryAndExpect( + `{ tweet(id: "583676d3618530145474e352") { author { id } body } }`, + { tweet: expectedTweetOtherAuthor }, + newUser) + }); + + it('can update own tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetId}", input: ${makeTweetInput(modifiedTweet, newUser)}) { + body + } + } + `, + { updateTweet: modifiedTweet }, + newUser) + }); + + it('can update other users tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetIdOthers}", input: ${makeTweetInput(modifiedTweet)}) { + body + } + } + `, + { updateTweet: modifiedTweet }, + newUser) + }); + + it('can read updated tweet correctly', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { body } }`, + { tweet: modifiedTweet }, + newUser) + }); + + it('can remove own tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetId}") }`, + { removeTweet: true }, + newUser) + }); + + it('can remove other users tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetIdOthers}") }`, + { removeTweet: true }, + newUser) + }); + + it('can not read removed tweet anymore', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { body } }`, + { tweet: null }, + newUser) + }); + + }); + + describe('on type "user" (part 2)...', () => { + + it('can delete himself', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${newUser}") + } + `, { + removeUser: true + }, + newUser) + }); + + it('user "tobkle" is deleted', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username, bio, role } } + `, { + user: null + }, + newUser) + }); + + }); + +}); \ No newline at end of file diff --git a/test/output-app-end-to-end/test-4-mutations-with-unknown-user.js b/test/output-app-end-to-end/test-4-mutations-with-unknown-user.js new file mode 100644 index 0000000..b0cd010 --- /dev/null +++ b/test/output-app-end-to-end/test-4-mutations-with-unknown-user.js @@ -0,0 +1,198 @@ +import { describe, it } from 'mocha'; +import { assert } from 'chai'; +import { sendQuery, sendQueryAndExpect, unknownUser, adminUser } from './sendQuery'; + +let newUser; +let tweetId; +const tweetIdOthers = '583676d3618530145474e352'; + +function makeUserInput(user) { + let query = `{`; + Object.keys(user).forEach(field => { + query = query + ` + ${field}: "${user[field]}"`; + }); + query = query + ` + }`; + return query; +} + +function makeTweetInput(tweet, userId) { + if (tweet.author) { + return `{ + authorId: "${userId ? userId : tweet.author.id}", + coauthorsIds: ${tweet.coauthorsIds ? JSON.stringify(tweet.coauthorsIds) : JSON.stringify([])}, + body: "${tweet.body}" + }`; + } + return `{ + body: "${tweet.body}" + }`; +} + +describe('test-4: unkown user (e.g. not signed in, or expired token)', () => { + + describe('on type "user" (part 1)...', () => { + + it('can not create users', () => { + const expectedUser = { + email: 'tobias@gmail.com', + password: 'password', + username: 'tobkle', + bio: 'someone', + role: 'admin' + }; + return sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + } + } + `, + userId: unknownUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNull(result.data.createUser); + }) + }); + + it('can not read other users', () => { + return sendQueryAndExpect(` + { user(id: "${adminUser}") { username, bio, role } } + `, { + user: null + }, + unknownUser) + }); + + it('can not update other users', () => { + const modifiedUser = { + username: 'zoltan', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${adminUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { updateUser: null }, + unknownUser) + }); + + it('can not delete other users', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${adminUser}") + } + `, { + removeUser: null + }, + unknownUser) + }); + + }); + + describe('on type "tweet"...', () => { + + let expectedTweet = { + author: { id: newUser }, + body: 'This is a test tweet of user tobkle', + }; + + const expectedTweetOtherAuthor = { + author: { id: adminUser }, + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const expectedTweetOtherAuthorNoAuthor = { + author: null, + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const modifiedTweet = { + body: 'This is a modified test tweet', + }; + + before(function (done) { + expectedTweet.author.id = unknownUser; + sendQuery({ query: ` + mutation { + createTweet(input: ${makeTweetInput(expectedTweet, unknownUser)}) { + id + } + } + `, + userId: unknownUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNull(result.data.createTweet); + done(); + }) + .catch((error) => { + done(); + }); + }); + + it('can not create tweet for himself', () => { + assert.isUndefined(tweetId); + }); + + it('can not create tweet for other author', () => { + return sendQueryAndExpect(` + mutation { + createTweet(input: ${makeTweetInput(expectedTweetOtherAuthor, adminUser)}) { + id + } + } + `, + { createTweet: null }, + unknownUser); + }); + + it('can read others tweet', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetIdOthers}") { author { id } body } }`, + { tweet: expectedTweetOtherAuthorNoAuthor }, + unknownUser) + }); + + it('can not update own tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetIdOthers}", input: ${makeTweetInput(modifiedTweet, unknownUser)}) { + body + } + } + `, + { updateTweet: null }, + unknownUser) + }); + + it('can not update others tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetIdOthers}", input: ${makeTweetInput(modifiedTweet)}) { + body + } + } + `, + { updateTweet: null }, + unknownUser) + }); + + it('can not remove other users tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetIdOthers}") }`, + { removeTweet: null }, + unknownUser) + }); + + }); + +}); \ No newline at end of file diff --git a/test/output-app-end-to-end/test-5-mutations-with-user-role-user.js b/test/output-app-end-to-end/test-5-mutations-with-user-role-user.js new file mode 100644 index 0000000..9800a7e --- /dev/null +++ b/test/output-app-end-to-end/test-5-mutations-with-user-role-user.js @@ -0,0 +1,358 @@ +import { describe, it } from 'mocha'; +import { assert } from 'chai'; +import { sendQuery, sendQueryAndExpect, roleUser, adminUser } from './sendQuery'; + +let newUser; +let tweetId; +const tweetIdOthers = '583676d3618530145474e352'; + +function makeUserInput(user) { + let query = `{`; + Object.keys(user).forEach(field => { + query = query + ` + ${field}: "${user[field]}"`; + }); + query = query + ` + }`; + return query; +} + +function makeTweetInput(tweet, userId) { + if (tweet.author) { + return `{ + authorId: "${userId ? userId : tweet.author.id}", + coauthorsIds: ${tweet.coauthorsIds ? JSON.stringify(tweet.coauthorsIds) : JSON.stringify([])}, + body: "${tweet.body}" + }`; + } + return `{ + body: "${tweet.body}" + }`; +} + +describe('test-5: user with role "user"', () => { + + before(function(done) { + const expectedUser = { + email: 'tobias@gmail.com', + password: 'password', + username: 'tobkle', + bio: 'someone', + role: 'user' + }; + sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + role + } + } + `, + userId: adminUser + }) + .then(result => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createUser); + assert.isNotNull(result.data.createUser.id); + assert.equal(result.data.createUser.role, 'user'); + newUser = result.data.createUser.id; + done(); + }) + .catch(err => { + console.log(err); + done(); + }); + }); + + describe('on type "user" (part 1)...', () => { + + it('admin user created new user "tobkle" with role "user" for the next tests...', () => { + assert.isNotNull(newUser); + }); + + it('can not create users', () => { + const expectedUser = { + email: 'zol@gmail.com', + password: 'password', + username: 'zol', + bio: 'Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead', + role: 'editor' + }; + return sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNull(result.data.createUser); + }) + }); + + it('can not read other users', () => { + return sendQueryAndExpect(` + { user(id: "${adminUser}") { username, bio, role } } + `, { + user: null + }, + newUser) + }); + + it('can read himself without field "role"', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username } } + `, { + user: { + username: 'tobkle' + } + }, + newUser) + }); + + it('can read himself with field "role"', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username, role } } + `, { + user: { + username: 'tobkle', + role: 'user' + } + }, + newUser) + }); + + it('can not update other users', () => { + const modifiedUser = { + username: 'zoltan', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${adminUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { updateUser: null }, + newUser) + }); + + it('can update himself', () => { + const modifiedUser = { + username: 'tobkle', + bio: 'Maker of things, I guess', + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + } + } + `, { + updateUser: { + username: 'tobkle', + bio: 'Maker of things, I guess', + } + }, + newUser) + }); + + it('can not update his role', () => { + const modifiedUser = { + username: 'tobkle', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: { + bio: 'Maker of things, I guess', + role: 'user', + username: 'tobkle', + } + }, + newUser) + }); + + it('can not delete other users', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${adminUser}") + } + `, { + removeUser: null + }, + newUser) + }); + + }); + + describe('on type "tweet"...', () => { + + let expectedTweet = { + author: { id: newUser }, + body: 'This is a test tweet of user tobkle', + }; + + const expectedTweetOtherAuthor = { + author: { id: adminUser }, + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const expectedTweetOtherAuthorNoAuthor = { + author: null, + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const modifiedTweet = { + body: 'This is a modified test tweet', + }; + + before(function (done) { + expectedTweet.author.id = newUser; + sendQuery({ query: ` + mutation { + createTweet(input: ${makeTweetInput(expectedTweet, newUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createTweet); + assert.isNotNull(result.data.createTweet.id); + tweetId = result.data.createTweet.id; + done(); + }) + .catch(err => { + console.log(err); + done(); + }); + }); + + it('can create tweet for himself', () => { + assert.isNotNull(tweetId); + }); + + it('can not create tweet for other author', () => { + return sendQueryAndExpect(` + mutation { + createTweet(input: ${makeTweetInput(expectedTweetOtherAuthor, adminUser)}) { + id + } + } + `, + { createTweet: null }, + newUser); + }); + + it('can read own tweet', () => { + expectedTweet.author.id = newUser; + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { author { id } body } }`, + { tweet: expectedTweet }, + newUser) + }); + + it('can read others tweet', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetIdOthers}") { author { id } body } }`, + { tweet: expectedTweetOtherAuthorNoAuthor }, + newUser) + }); + + it('can update own tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetId}", input: ${makeTweetInput(modifiedTweet, newUser)}) { + body + } + } + `, + { updateTweet: modifiedTweet }, + newUser) + }); + + it('can not update others tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetIdOthers}", input: ${makeTweetInput(modifiedTweet)}) { + body + } + } + `, + { updateTweet: null }, + newUser) + }); + + it('can read updated tweet correctly', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { body } }`, + { tweet: modifiedTweet }, + newUser) + }); + + it('can remove own tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetId}") }`, + { removeTweet: true }, + newUser) + }); + + it('can not remove other users tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetIdOthers}") }`, + { removeTweet: null }, + newUser) + }); + + it('can not read removed tweet anymore', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { body } }`, + { tweet: null }, + newUser) + }); + + }); + + describe('on type "user" (part 2)...', () => { + + it('can delete himself', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${newUser}") + } + `, { + removeUser: true + }, + newUser) + }); + + it('user "tobkle" is deleted', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username, bio, role } } + `, { + user: null + }, + newUser) + }); + + }); + +}); \ No newline at end of file diff --git a/test/output-app-end-to-end/test-6-mutations-with-user-role-editor.js b/test/output-app-end-to-end/test-6-mutations-with-user-role-editor.js new file mode 100644 index 0000000..674c587 --- /dev/null +++ b/test/output-app-end-to-end/test-6-mutations-with-user-role-editor.js @@ -0,0 +1,347 @@ +import { describe, it } from 'mocha'; +import { assert } from 'chai'; +import { sendQuery, sendQueryAndExpect, roleUser, adminUser } from './sendQuery'; + +let newUser; +let tweetId; +const tweetIdOthers = '583676d3618530145474e352'; + +function makeUserInput(user) { + let query = `{`; + Object.keys(user).forEach(field => { + query = query + ` + ${field}: "${user[field]}"`; + }); + query = query + ` + }`; + return query; +} + +function makeTweetInput(tweet, userId) { + if (tweet.author) { + return `{ + authorId: "${userId ? userId : tweet.author.id}", + coauthorsIds: ${tweet.coauthorsIds ? JSON.stringify(tweet.coauthorsIds) : JSON.stringify([])}, + body: "${tweet.body}" + }`; + } + return `{ + body: "${tweet.body}" + }`; +} + +describe('test-6: user with role "editor"', () => { + + before(function(done) { + const expectedUser = { + email: 'tobias@gmail.com', + password: 'password', + username: 'tobkle', + bio: 'someone', + role: 'editor' + }; + sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + role + } + } + `, + userId: adminUser + }) + .then(result => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createUser); + assert.isNotNull(result.data.createUser.id); + assert.equal(result.data.createUser.role, 'editor'); + newUser = result.data.createUser.id; + done(); + }) + .catch(err => { + console.log(err); + done(); + }); + }); + + describe('on type "user" (part 1)...', () => { + + it('admin user created new user "tobkle" with role "editor" for the next tests...', () => { + assert.isNotNull(newUser); + }); + + it('can not create users', () => { + const expectedUser = { + email: 'zol@gmail.com', + password: 'password', + username: 'zol', + bio: 'Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead', + role: 'editor' + }; + return sendQuery({query: ` + mutation { + createUser(input: ${makeUserInput(expectedUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNull(result.data.createUser); + }) + }); + + it('can not read other users', () => { + return sendQueryAndExpect(` + { user(id: "${adminUser}") { username, bio, role } } + `, { + user: null + }, + newUser) + }); + + it('can read himself', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username, role } } + `, { + user: { + username: 'tobkle', + role: 'editor' + } + }, + newUser) + }); + + it('can not update other users', () => { + const modifiedUser = { + username: 'zoltan', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${adminUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { updateUser: null }, + newUser) + }); + + it('can update himself', () => { + const modifiedUser = { + username: 'tmeasday', + bio: 'Maker of things, I guess', + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + } + } + `, { + updateUser: { + username: 'tmeasday', + bio: 'Maker of things, I guess', + } + }, + newUser) + }); + + it('can not update his role', () => { + const modifiedUser = { + username: 'tmeasday', + bio: 'Maker of things, I guess', + role: 'admin' + }; + return sendQueryAndExpect(` + mutation { + updateUser(id: "${newUser}", input: ${makeUserInput(modifiedUser)}) { + username + bio + role + } + } + `, { + updateUser: { + bio: 'Maker of things, I guess', + role: 'editor', + username: 'tmeasday', + } + }, + newUser) + }); + + it('can not delete other users', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${adminUser}") + } + `, { + removeUser: null + }, + newUser) + }); + + }); + + describe('on type "tweet"...', () => { + + let expectedTweet = { + author: { id: newUser }, + body: 'This is a test tweet of user tobkle', + }; + + const expectedTweetOtherAuthor = { + author: { id: adminUser }, + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const expectedTweetOtherAuthorNoAuthor = { + author: null, + body: 'We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:', + }; + + const modifiedTweet = { + body: 'This is a modified test tweet', + }; + + before(function (done) { + expectedTweet.author.id = newUser; + sendQuery({ query: ` + mutation { + createTweet(input: ${makeTweetInput(expectedTweet, newUser)}) { + id + } + } + `, + userId: newUser + }) + .then((result) => { + assert.isNotNull(result.data); + assert.isNotNull(result.data.createTweet); + assert.isNotNull(result.data.createTweet.id); + tweetId = result.data.createTweet.id; + done(); + }) + .catch(err => { + console.log(err); + done(); + }); + }); + + it('can create tweet for himself', () => { + assert.isNotNull(tweetId); + }); + + it('can not create tweet for other author', () => { + return sendQueryAndExpect(` + mutation { + createTweet(input: ${makeTweetInput(expectedTweetOtherAuthor, adminUser)}) { + id + } + } + `, + { createTweet: null }, + newUser); + }); + + it('can read own tweet', () => { + expectedTweet.author.id = newUser; + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { author { id } body } }`, + { tweet: expectedTweet }, + newUser) + }); + + it('can read others tweet', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetIdOthers}") { author { id } body } }`, + { tweet: expectedTweetOtherAuthorNoAuthor }, + newUser) + }); + + it('can update own tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetId}", input: ${makeTweetInput(modifiedTweet, newUser)}) { + body + } + } + `, + { updateTweet: modifiedTweet }, + newUser) + }); + + it('can not update others tweet', () => { + return sendQueryAndExpect(` + mutation { + updateTweet(id: "${tweetIdOthers}", input: ${makeTweetInput(modifiedTweet)}) { + body + } + } + `, + { updateTweet: null }, + newUser) + }); + + it('can read updated tweet correctly', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { body } }`, + { tweet: modifiedTweet }, + newUser) + }); + + it('can remove own tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetId}") }`, + { removeTweet: true }, + newUser) + }); + + it('can not remove other users tweet', () => { + return sendQueryAndExpect( + `mutation { removeTweet(id: "${tweetIdOthers}") }`, + { removeTweet: null }, + newUser) + }); + + it('can not read removed tweet anymore', () => { + return sendQueryAndExpect( + `{ tweet(id: "${tweetId}") { body } }`, + { tweet: null }, + newUser) + }); + + }); + + describe('on type "user" (part 2)...', () => { + + it('can delete himself', () => { + return sendQueryAndExpect(` + mutation { + removeUser(id: "${newUser}") + } + `, { + removeUser: true + }, + newUser) + }); + + it('user "tobkle" is deleted', () => { + return sendQueryAndExpect(` + { user(id: "${newUser}") { username, bio, role } } + `, { + user: null + }, + newUser) + }); + + }); + +}); \ No newline at end of file diff --git a/test/output-app-generation-test.sh b/test/output-app-generation-test.sh index a1c03e4..ca9d7d8 100755 --- a/test/output-app-generation-test.sh +++ b/test/output-app-generation-test.sh @@ -26,7 +26,7 @@ cd output-app $CGS add-type "$INPUT_DIR/Tweet.graphql" $CGS add-type "$INPUT_DIR/User.graphql" -diff -rb . "$EXPECTED_OUTPUT_DIR" -x "db" -x "node_modules" -x "nohup.out" -x ".create-graphql-server.checksums" +diff -rb . "$EXPECTED_OUTPUT_DIR" -x "db" -x "node_modules" -x "nohup.out" -x ".create-graphql-server.checksums" -x "yarn.lock" -x "log" -x ".DS_Store" set +e trap - EXIT diff --git a/test/output-app/.gitignore b/test/output-app/.gitignore index 50ffcff..04d877b 100644 --- a/test/output-app/.gitignore +++ b/test/output-app/.gitignore @@ -1,3 +1,7 @@ node_modules /db /input +log/all-logs-readable.log +.DS_Store +log/ +yarn-error.log diff --git a/test/output-app/README.md b/test/output-app/README.md new file mode 100644 index 0000000..fc7ed96 --- /dev/null +++ b/test/output-app/README.md @@ -0,0 +1,285 @@ +# create-graphql-server +This is a generated create-graphql-server app. + +* Authentication: Identifies an user +* Authorization: Defines all actions a user is allowed to perform + +## Implementing Authentication +The authentication is performed in those locations: +* ./server/index.js +* ./server/authenticate.js +* ./model/index.js + +### ./server/index.js +In the server, the database is started, and the UserCollection is defined. That's where the server accesses the user documents in the database. + +In ```js authenticate(app, UserCollection)``` the authentication is prepared and processed. Later, if a user sends a 'graphql' request, the user is determined with ```js passport.authenticate(...)```. After that, the user is whether an anonymous user or an authenticated user. You find the identified user in the object "me". Then the type models have to be initialized with the user "me" authorizations: ```js req.context = addModelsToContext({... me ...})```. + +By-the-way: The server/index.js is able to access the User collection directly by the following two lines. This is used in the server/authenticate.js during authenticate. +```js +... +const UserCollection = db.collection('user'); +... +authenticate(app, UserCollection); +... +``` + +### ./model/index.js +If there is a User model generated, then we load it as the first model. It defines the model, which will be used in the other models as well, to perform the authorization checks. + +```javascript +const models = {}; + +export default function addModelsToContext(context) { + const newContext = Object.assign({}, context); + + // User model has to be first, to initialize the other models with correct authorizations + if (models['User']){ + newContext['User'] = new models['User'](newContext); + } + + Object.keys(models).forEach((key) => { + if (key !== 'User') newContext[key] = new models[key](newContext); + }); + return newContext; +} + +import Tweet from './Tweet'; +models.Tweet = Tweet; + +import User from './User'; +models.User = User; +``` + +### ./server/authenticate.js +Here, the real identification of an user is performed. After a user requested a '/login' url with user and password. The user's email is searched in the database. If it is there, it checks if the user's encrypted hash is equal to the encrypted password. If so, a user is identified and a JWT token is generated and transfered back to the requesting user. This JWT token is usually stored in the client's browsers local storage and added to the next call in the Authorization header. With all the next requests of that user, he sends an header like... +```javacript +authorization JWT calculated.JWT.token +``` +This JWT token is decrypted with an internal secret KEY to get the user id. This user is then read from the cache/database within userFromPayload and returned to the request as the user object "me", which is then used in all "/graphql" calls. + +```javascript +import passport from 'passport'; +import { Strategy, ExtractJwt } from 'passport-jwt'; +import jwt from 'jwt-simple'; +import { ObjectId } from 'mongodb'; +import nodeify from 'nodeify'; +import bcrypt from 'bcrypt'; +import DataLoader from 'dataloader'; +import { findByIds } from 'create-graphql-server-find-by-ids'; + +const KEY = 'test-key'; +let Loader; + +async function userFromPayload(request, jwtPayload) { + if (!jwtPayload.userId) { + throw new Error('No userId in JWT'); + } + return await Loader.load(ObjectId(jwtPayload.userId)); +} + +passport.use(new Strategy({ + jwtFromRequest: ExtractJwt.fromAuthHeader(), + secretOrKey: KEY, + passReqToCallback: true, +}, (request, jwtPayload, done) => { + nodeify(userFromPayload(request, jwtPayload), done); +})); + +export default function addPassport(app, User) { + Loader = new DataLoader(ids => findByIds(User, ids)); + + app.use(passport.initialize()); + + app.post('/login', async (req, res, next) => { + try { + const { email, password } = req.body; + + if (!email || !password) { + throw new Error('Username or password not set on request'); + } + + const user = await User.findOne({ email }); + if (!user || !(await bcrypt.compare(password, user.hash))) { + throw new Error('User not found matching email/password combination'); + } + + const payload = { + userId: user._id.toString(), + }; + + const token = jwt.encode(payload, KEY); + res.json({ token }); + } catch (e) { + next(e); + } + }); +} +``` + +## Implementing Authorizations +Use the @authorize directive in a \.graphql input file, to define which authorizations should be generated by create-graphql-server. You can define user-roles and document-roles to control authorizations. + +* user-roles: e.g. User.role = "admin", all admins are allowed to do create, read, update, delete,... +* document-roles: e.g. Tweet.authorId = User._id, only authors are allowed to create, update, delete a document + +Use the following syntax for the Tweet.graphql input file:: +```javascript +type Tweet + +@authorize( + admin: ["create", "read", "update", "delete"], + author: ["create", "read", "update", "delete"], + coauthors: ["read", "update"], + world: ["read"] +) + +{ + author: User! @unmodifiable @belongsTo @authRole(for: ["author"]) + coauthors: [User] @belongsTo @authRole(for: ["coauthors"]) + body: String! + + likers: [User!] @hasAndBelongsToMany(as: "liked") +} +``` + +This has the following meaning: +* user-roles: "admin", "world" are created. (user-roles don't have own fields of type User or [User] in the document). + Thus it will check, if the logged in user has a role "admin". Or if there is a special role "world", which just means every known or unknown user is allowed. For "world" authorization you don't have to be logged in. + So each "admin" user will be able to create, read, update or delete the Tweet document. + Everyone ("world") will be allowed to read all Tweets. +* document-roles: "author", "coauthors" are created. (Document-roles have a corresponding field in the document.) + Look for the fields with the directive @authRole("...") + Only the author of a Tweet is allowed to create, read, update, delete its single Tweet. + Only a coauthor of a Tweet is allowed to read and update a Tweet, but he is not allowed to create a Tweet for a different author, and also not to delete a tweet of a different user. + +and for the User.graphql input file: +```javascript +type User + +@authorize( + admin: ["create", "read", "update", "delete"] + this: ["read", "update", "delete"] +) + +{ + role: String @authRole(for: ["admin"]) + username: String! + + bio: String + notify: Boolean + + tweets(minLikes: Int): [Tweet!] @hasMany(as: "author") + liked: [Tweet!] @belongsToMany + + following: [User!] @belongsToMany + followers: [User!] @hasAndBelongsToMany(as: "following") +} +``` + +This has the following meaning: +* user-role: "admin", is created. (user roles don't have own fields of type User or [User] in the document) + It is a String field with: **role: String! @authRole("admin")** + This will check, if the logged in user has a role "admin". + So each "admin" user will be able to create, read, update or delete any User document. +* document-role: "this", is created (document roles have own fields in the document, but this is a special case for the field _id, which is not shown in the input type, but will be generated in the later schema file.) + Only the user id of "this" meaning _id is allowed to readOne, update, delete its single User document. + +Use create-graphql-server command to generate the according schema, resolver, model files with the create-graphql-server command line interface. After its generation, you will find the generated files in the sub folders: schema, resolvers, model. The generated model files will use the following functions to implement the authorization logic. + +## create-graphql-server-authorization +Install it with: +```bash +npm install create-graphql-server-authorization +``` +[Github: create-graphql-server-authorization](https://github.com/tobkle/create-graphql-server-authorization) + +[Please have a look in the API documentation.](https://tobkle.github.io/create-graphql-server-authorization/) + +This uses the following functions from that module: + +### function authlog +A logging function that understands "resolvers", "modes" and "users". Simple wrapper around whatever logging function we use. + +### function findByIds (create-graphql-server-find-by-ids) +This is an extended version of [mongo-find-by-ids](https://github.com/tmeasday/mongo-find-by-ids). +The enhancement is only to provide an additional authQuery object, to extend the query to meet additional authorizations. + +### function protectFields +Use function protectFields to protect single fields from access. Provide signed in user in "me", the authorized User roles for the protected field(s) - meaning the user who is allowed to access the field -, provide an array with protected fields, and the current document object, which is to be checked for protected fields and the User model context. + +### function checkAuthDoc +Use function checkAuthDoc to check and get back the document. Especially used in insert operations, to figure out, if the toBeInsertedDoc is valid to be added by this userRole, docRole and action. + +### function loggedIn +Use function loggedIn, to check if a user is logged in. + +### function queryForRoles +Use function queryForRoles to generate an authQuery object. + +It expects the following arguments with the meanings: +* **me:** this is the logged in user object out of the resolver's context +* **userRoles:** an array with userRoles, which was generated by the @authorize directives in the .graphql file +* **docRoles:** an array with docRoles, which was generated by the @authorize directives in the .graphql file +* **User:** User context to access the User model +* **logger:** logging function e.g. ```js authlog(resolver, mode, me) ``` + * **resolver:** this is a string with the resolver's name, optional, only for easier debugging + * **mode:** this is the current mode of operation: + * **create:** insert a record to the database + * **read:** read a record or many records from the database + * **readOne:** read only a single record from the database + * **readMany:** read many records from the the database + * **update:** update a record in the database + * **delete:** remove a record from the database + * **me:** the user object, who is executing the request, and who is checked for authorization + +### function userRoleAuthorized +This helper function is used by queryForRoles, and decides, if a user gains the authorization by its role. +For example: If a user has a field "role" in his user document and it contains the value "admin". So it checks if a user's role is admin, and allows all operations for admins. + +### function fieldContainsUserId +This helper function is used in the models and checks, if the provided field of types: array, object or string contains the userId. + +### ./resolver/User.js +In the resolver interfaces, there are different objects: +* the root object "tweet", contains the document fields +* the args object "args", contains arguments from the graphql query/mutation +* the context object "Tweet", contains the access to the database model of the Tweet collection +* the context object "me", contains the current logged in user -if logged in-, which is provided from the server's passport implementation +* the last argument in the resolver function is the resolver's name, which is optional and only to enhance the logging in debugging mode by additional information. If you have to analyze authorization outcomes, this helps a lot to figure out, which resolvers authorization rule fired. + +### ./resolver/Tweet.js +In the resolver interfaces, there are different objects: +* the root object "tweet", contains the document fields +* the args object "args", contains arguments from the graphql query/mutation +* the context object "Tweet", contains the access to the database model of the Tweet collection +* the context object "me", contains the current logged in user -if logged in-, which is provided from the server's passport implementation +* the last argument in the resolver function is the resolver's name, which is optional and only to enhance the logging in debugging mode by additional information. If you have to analyze authorization outcomes, this helps a lot to figure out, which resolvers authorization rule fired. + +### Testing +If you run within the project root at least one time, it generates the database and adds the seed tweet and user documents once during each run. +```bash +yarn end-to-end-test +``` +It executes many pre-defined tests with different user-roles and document-roles. May be you want to add additional tests to enhance the security of the logic. + +If you want to test with the http://localhost:3000/graphiql frontend, best download the following app: +```bash +brew cask install graphiql +``` +...and have a look into the file **./test/output-app-end-to-end/scripts/JWTs.txt**, or generate this file by running: +```bash +cd ./test/output-app-end-to-end/scripts +babel-node ./generateJWT.js > JWTs.txt +``` +This generates JWT tokens for the different test users from the ./test/seeds/User.json. Copy the wanted JWT token of the different users, and start the GraphiQL app with the following entries: + +* GraphQL endpoint: ```http://localhost:3000/graphql``` +* Method: ```POST``` +* Edit HTTP headers: + * Header name: ```authorization``` + * Header value: ```JWT the-copied-token``` + +...and write and execute your queries/mutations in the GraphiQL window. + +If you use different user's JWT tokens, you can simulate the different user roles such as "admin", "editor" and "user" manually. diff --git a/test/output-app/log/all-logs-readable.log b/test/output-app/log/all-logs-readable.log new file mode 100644 index 0000000..bd9dceb --- /dev/null +++ b/test/output-app/log/all-logs-readable.log @@ -0,0 +1,2283 @@ +2017-09-06 14:28:31 -------------------------------------------------------------------------------- +2017-09-06 14:28:31 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + __schema { + queryType { + name + } + } +} + +2017-09-06 14:28:31 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:31 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:31 registered authorizedLoader successfully +2017-09-06 14:28:31 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + __schema { + queryType { + name + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca1") { + role + username + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + role + username + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca2") { + role + username + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + id + username + bio + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + users { + username + createdAt + } +} + +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'users' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + users(limit: 1) { + username + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'users' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + users(lastCreatedAt: 1479776904993) { + username + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'users' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + users(lastCreatedAt: 1479776904993, limit: 1) { + username + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'users' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + followers { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user followers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + followers(limit: 1) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user followers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + followers(lastCreatedAt: 1479776905993) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user followers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + followers(lastCreatedAt: 1479776905993, limit: 1) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user followers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + following { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user following' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + following(limit: 1) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user following' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + following(lastCreatedAt: 1479776905993) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user following' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + following(lastCreatedAt: 1479776905993, limit: 1) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user following' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + tweets { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + tweets(limit: 1) { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + tweets(lastCreatedAt: 1479964340853) { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + tweets(lastCreatedAt: 1479964340853, limit: 1) { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + liked { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user liked' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + liked(limit: 1) { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user liked' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + liked(lastCreatedAt: 1479964371334) { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user liked' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca0") { + liked(lastCreatedAt: 1479964371334, limit: 1) { + id + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'user liked' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e351") { + id + body + } +} + +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e351") { + author { + username + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweets { + id + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweets(limit: 1) { + id + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweets(lastCreatedAt: 1479964340853) { + id + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweets(lastCreatedAt: 1479964340853, limit: 1) { + id + createdAt + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readMany 'tweets' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e353") { + likers { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'tweet likers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e353") { + likers(limit: 1) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'tweet likers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e353") { + likers(lastCreatedAt: 1479776904993) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'tweet likers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e353") { + likers(lastCreatedAt: 1479776904993, limit: 1) { + username + createdAt + } + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readMany 'tweet likers' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "tobias@gmail.com", password: "password", username: "tobkle", bio: "someone", role: "admin"}) { + id + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize create 'createUser' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize create 'createUser' with user 'stubailo' and role: 'admin' is authorized by userRole. +2017-09-06 14:28:58 inserted user 59afea0a66d3d67b39954b17. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "zol@gmail.com", password: "password", username: "zol", bio: "Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead", role: "editor"}) { + id + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize create 'createUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize create 'createUser' with user 'tobkle' and role: 'admin' is authorized by userRole. +2017-09-06 14:28:58 inserted user 59afea0a66d3d67b39954b18. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0a66d3d67b39954b18") { + username + bio + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0a66d3d67b39954b17") { + username + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0a66d3d67b39954b18", input: {username: "zoltan", bio: "Maker of things, I guess", role: "editor"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 updated user 59afea0a66d3d67b39954b18. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0a66d3d67b39954b17", input: {username: "tobkle", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 updated user 59afea0a66d3d67b39954b17. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0a66d3d67b39954b18", input: {username: "zoltan", bio: "now an admin", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 updated user 59afea0a66d3d67b39954b18. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0a66d3d67b39954b17", input: {username: "tobkle", bio: "Maker of things, I guess", role: "editor"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 updated user 59afea0a66d3d67b39954b17. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "editor", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0a66d3d67b39954b17", input: {username: "tobkle", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'editor' is authorized +2017-09-06 14:28:58 Authorize update 'updateUser' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0a66d3d67b39954b17" + } + ] +} +2017-09-06 14:28:58 updated user 59afea0a66d3d67b39954b17. +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0a66d3d67b39954b17" + } + ] +} +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "zoltan", role: "admin", id: "59afea0a66d3d67b39954b18", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0a66d3d67b39954b17", input: {username: "tobkle", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'zoltan' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'zoltan' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateUser' with user 'zoltan' and role 'admin' is authorized +2017-09-06 14:28:58 updated user 59afea0a66d3d67b39954b17. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "59afea0a66d3d67b39954b18") +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize delete 'removeUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 removed user 59afea0a66d3d67b39954b18. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "59afea0a66d3d67b39954b17", coauthorsIds: [], body: "This is a test tweet of user tobkle"}) { + id + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize create 'createTweet' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 inserted tweet 59afea0a66d3d67b39954b19. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 Authorize create 'createTweet' with user 'tobkle' and role: 'admin' is authorized by userRole. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "583291a1638566b3c5a92ca1", coauthorsIds: [], body: "We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:"}) { + id + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0a66d3d67b39954b19") { + author { + id + } + body + } +} + +2017-09-06 14:28:58 Authorize create 'createTweet' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 inserted tweet 59afea0a66d3d67b39954b1a. +2017-09-06 14:28:58 Authorize create 'createTweet' with user 'tobkle' and role: 'admin' is authorized by userRole. +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e352") { + author { + id + } + body + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "59afea0a66d3d67b39954b19", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateTweet' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 updated tweet 59afea0a66d3d67b39954b19. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "59afea0a66d3d67b39954b1a", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize update 'updateTweet' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 updated tweet 59afea0a66d3d67b39954b1a. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0a66d3d67b39954b19") { + body + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "59afea0a66d3d67b39954b19") +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize delete 'removeTweet' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 removed tweet 59afea0a66d3d67b39954b19. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "59afea0a66d3d67b39954b1a") +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize delete 'removeTweet' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 removed tweet 59afea0a66d3d67b39954b1a. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0a66d3d67b39954b19") { + body + } +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "tobkle", role: "admin", id: "59afea0a66d3d67b39954b17", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "59afea0a66d3d67b39954b17") +} + +2017-09-06 14:28:58 Authorize readOne 'user findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 Authorize delete 'removeUser' with user 'tobkle' and role 'admin' is authorized +2017-09-06 14:28:58 removed user 59afea0a66d3d67b39954b17. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0a66d3d67b39954b17") { + username + bio + role + } +} + +2017-09-06 14:28:58 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:58 ERROR Authorize readOne 'user' with user '' not authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "tobias@gmail.com", password: "password", username: "tobkle", bio: "someone", role: "admin"}) { + id + } +} + +2017-09-06 14:28:58 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 ERROR Authorize create 'createUser' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca1") { + username + bio + role + } +} + +2017-09-06 14:28:58 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:58 ERROR Authorize readOne 'user' with user '' not authorized +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "583291a1638566b3c5a92ca1", input: {username: "zoltan", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:58 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:58 ERROR Authorize update 'updateUser' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:58 -------------------------------------------------------------------------------- +2017-09-06 14:28:58 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "583291a1638566b3c5a92ca1") +} + +2017-09-06 14:28:58 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:58 ERROR Authorize delete 'removeUser' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:58 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "", coauthorsIds: [], body: "This is a test tweet of user tobkle"}) { + id + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "583291a1638566b3c5a92ca1", coauthorsIds: [], body: "We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:"}) { + id + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 ERROR Authorize create 'createTweet' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e352") { + author { + id + } + body + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 ERROR Authorize readOne 'tweet author' with user '' not authorized +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "583676d3618530145474e352", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 ERROR Authorize update 'updateTweet' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "583676d3618530145474e352", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 ERROR Authorize update 'updateTweet' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "583676d3618530145474e352") +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 ERROR Authorize delete 'removeTweet' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "tobias@gmail.com", password: "password", username: "tobkle", bio: "someone", role: "user"}) { + id + role + } +} + +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize create 'createUser' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:59 Authorize create 'createUser' with user 'stubailo' and role: 'admin' is authorized by userRole. +2017-09-06 14:28:59 inserted user 59afea0b66d3d67b39954b1b. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "zol@gmail.com", password: "password", username: "zol", bio: "Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead", role: "editor"}) { + id + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 ERROR Authorize create 'createUser' with user 'tobkle' and role: 'user' is not authorized. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca1") { + username + bio + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0b66d3d67b39954b1b") { + username + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0b66d3d67b39954b1b") { + username + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "583291a1638566b3c5a92ca1", input: {username: "zoltan", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize update 'updateUser' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0b66d3d67b39954b1b", input: {username: "tobkle", bio: "Maker of things, I guess"}) { + username + bio + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize update 'updateUser' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 updated user 59afea0b66d3d67b39954b1b. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0b66d3d67b39954b1b", input: {username: "tobkle", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize update 'updateUser' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 updated user 59afea0b66d3d67b39954b1b. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "583291a1638566b3c5a92ca1") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize delete 'removeUser' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "59afea0b66d3d67b39954b1b", coauthorsIds: [], body: "This is a test tweet of user tobkle"}) { + id + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize create 'createTweet' with user 'tobkle' and role: 'user' is authorized by docRole. +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 inserted tweet 59afea0b66d3d67b39954b1c. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "583291a1638566b3c5a92ca1", coauthorsIds: [], body: "We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:"}) { + id + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 ERROR Authorize create 'createTweet' with user 'tobkle' and role: 'user' is not authorized. +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0b66d3d67b39954b1c") { + author { + id + } + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e352") { + author { + id + } + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "59afea0b66d3d67b39954b1c", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize update 'updateTweet' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1b" + }, + { + "coauthorsIds": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 updated tweet 59afea0b66d3d67b39954b1c. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "583676d3618530145474e352", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize update 'updateTweet' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1b" + }, + { + "coauthorsIds": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0b66d3d67b39954b1c") { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "59afea0b66d3d67b39954b1c") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize delete 'removeTweet' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 removed tweet 59afea0b66d3d67b39954b1c. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "583676d3618530145474e352") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize delete 'removeTweet' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0b66d3d67b39954b1c") { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "user", id: "59afea0b66d3d67b39954b1b", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "59afea0b66d3d67b39954b1b") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'user' is authorized +2017-09-06 14:28:59 Authorize delete 'removeUser' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'user' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1b" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 removed user 59afea0b66d3d67b39954b1b. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0b66d3d67b39954b1b") { + username + bio + role + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 ERROR Authorize readOne 'user' with user '' not authorized +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "stubailo", role: "admin", id: "583291a1638566b3c5a92ca1", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "tobias@gmail.com", password: "password", username: "tobkle", bio: "someone", role: "editor"}) { + id + role + } +} + +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize create 'createUser' with user 'stubailo' and role 'admin' is authorized +2017-09-06 14:28:59 Authorize create 'createUser' with user 'stubailo' and role: 'admin' is authorized by userRole. +2017-09-06 14:28:59 inserted user 59afea0b66d3d67b39954b1d. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + createUser(input: {email: "zol@gmail.com", password: "password", username: "zol", bio: "Maker of apps, product and engineering. Climber. Cyclist. Enthusiast. Product lead", role: "editor"}) { + id + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 ERROR Authorize create 'createUser' with user 'tobkle' and role: 'editor' is not authorized. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +{ + user(id: "583291a1638566b3c5a92ca1") { + username + bio + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0b66d3d67b39954b1d") { + username + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "583291a1638566b3c5a92ca1", input: {username: "zoltan", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize update 'updateUser' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tobkle", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0b66d3d67b39954b1d", input: {username: "tmeasday", bio: "Maker of things, I guess"}) { + username + bio + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tobkle' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize update 'updateUser' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tobkle' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 updated user 59afea0b66d3d67b39954b1d. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + updateUser(id: "59afea0b66d3d67b39954b1d", input: {username: "tmeasday", bio: "Maker of things, I guess", role: "admin"}) { + username + bio + role + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize update 'updateUser' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 updated user 59afea0b66d3d67b39954b1d. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "583291a1638566b3c5a92ca1") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize delete 'removeUser' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "59afea0b66d3d67b39954b1d", coauthorsIds: [], body: "This is a test tweet of user tobkle"}) { + id + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize create 'createTweet' with user 'tmeasday' and role: 'editor' is authorized by docRole. +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 inserted tweet 59afea0b66d3d67b39954b1e. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + createTweet(input: {authorId: "583291a1638566b3c5a92ca1", coauthorsIds: [], body: "We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:"}) { + id + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 ERROR Authorize create 'createTweet' with user 'tmeasday' and role: 'editor' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0b66d3d67b39954b1e") { + author { + id + } + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +{ + tweet(id: "583676d3618530145474e352") { + author { + id + } + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "59afea0b66d3d67b39954b1e", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 updated tweet 59afea0b66d3d67b39954b1e. +2017-09-06 14:28:59 Authorize update 'updateTweet' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1d" + }, + { + "coauthorsIds": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + updateTweet(id: "583676d3618530145474e352", input: {body: "This is a modified test tweet"}) { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize update 'updateTweet' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1d" + }, + { + "coauthorsIds": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0b66d3d67b39954b1e") { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "59afea0b66d3d67b39954b1e") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize delete 'removeTweet' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 removed tweet 59afea0b66d3d67b39954b1e. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + removeTweet(id: "583676d3618530145474e352") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize delete 'removeTweet' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "authorId": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +{ + tweet(id: "59afea0b66d3d67b39954b1e") { + body + } +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "tmeasday", role: "editor", id: "59afea0b66d3d67b39954b1d", +Operation: "", variables: "", +Query: +mutation { + removeUser(id: "59afea0b66d3d67b39954b1d") +} + +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user 'tmeasday' and role 'editor' is authorized +2017-09-06 14:28:59 Authorize delete 'removeUser' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 Authorize readOne 'user findOneById' with user 'tmeasday' and role: 'editor' with + authQuery: { + "$or": [ + { + "_id": "59afea0b66d3d67b39954b1d" + } + ] +} +2017-09-06 14:28:59 registered authorizedLoader successfully +2017-09-06 14:28:59 removed user 59afea0b66d3d67b39954b1d. +2017-09-06 14:28:59 -------------------------------------------------------------------------------- +2017-09-06 14:28:59 Request: +User: "", role: "", id: "", +Operation: "", variables: "", +Query: +{ + user(id: "59afea0b66d3d67b39954b1d") { + username + bio + role + } +} + +2017-09-06 14:28:59 ERROR Authorize readOne 'user findOneById' with user '' and role: 'null' is not authorized. +2017-09-06 14:28:59 Authorize readOne 'tweet findOneById' with user '' and role '' is authorized +2017-09-06 14:28:59 ERROR Authorize readOne 'user' with user '' not authorized +2017-09-06 14:28:59 registered authorizedLoader successfully diff --git a/test/output-app/model/Tweet.js b/test/output-app/model/Tweet.js index ebe5063..1817205 100644 --- a/test/output-app/model/Tweet.js +++ b/test/output-app/model/Tweet.js @@ -1,60 +1,158 @@ -import DataLoader from 'dataloader'; -import findByIds from 'mongo-find-by-ids'; +/* eslint-disable prettier */ +import { + queryForRoles, + onAuthRegisterLoader, + authlog, + checkAuthDoc +} from 'create-graphql-server-authorization'; export default class Tweet { constructor(context) { this.context = context; this.collection = context.db.collection('tweet'); this.pubsub = context.pubsub; - this.loader = new DataLoader(ids => findByIds(this.collection, ids)); + const { me, User } = context; + queryForRoles( + me, + ['admin', 'world'], + ['authorId', 'coauthorsIds'], + { User }, + onAuthRegisterLoader('tweet findOneById', 'readOne', me, this) + ); } - findOneById(id) { - return this.loader.load(id); + async findOneById(id, me, resolver) { + const log = authlog(resolver, 'readOne', me); + if (!this.authorizedLoader) { + log.error('not authorized'); + return null; + } + return await this.authorizedLoader.load(id); } - all({ lastCreatedAt = 0, limit = 10 }) { - return this.collection.find({ - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + find({ lastCreatedAt = 0, limit = 10, baseQuery = {} }, me, resolver) { + const authQuery = queryForRoles( + me, + ['admin', 'world'], + ['authorId', 'coauthorsIds'], + { User: this.context.User }, + authlog(resolver, 'readMany', me) + ); + const finalQuery = { + ...baseQuery, + ...authQuery, + createdAt: { $gt: lastCreatedAt } + }; + return this.collection + .find(finalQuery) + .sort({ createdAt: 1 }) + .limit(limit) + .toArray(); } - author(tweet) { - return this.context.User.findOneById(tweet.authorId); + author(tweet, me, resolver) { + return this.context.User.findOneById( + tweet.authorId, + me, + resolver + ); } - likers(tweet, { lastCreatedAt = 0, limit = 10 }) { - return this.context.User.collection.find({ - likedIds: tweet._id, - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + coauthors(tweet, { lastCreatedAt = 0, limit = 10 }, me, resolver) { + const baseQuery = { _id: { $in: tweet.coauthorsIds || [] } }; + return this.context.User.find( + { baseQuery, lastCreatedAt, limit }, + me, + resolver + ); } - async insert(doc) { + likers(tweet, { lastCreatedAt = 0, limit = 10 }, me, resolver) { + const baseQuery = { likedIds: tweet._id }; + return this.context.User.find( + { baseQuery, lastCreatedAt, limit }, + me, + resolver + ); + } + + createdBy(tweet, me, resolver) { + return this.context.User.findOneById(tweet.createdById, me, resolver); + } + + updatedBy(tweet, me, resolver) { + return this.context.User.findOneById(tweet.updatedById, me, resolver); + } + + async insert(doc, me, resolver) { const docToInsert = Object.assign({}, doc, { createdAt: Date.now(), updatedAt: Date.now(), + createdById: (me && me._id) ? me._id : 'unknown', + updatedById: (me && me._id) ? me._id : 'unknown', }); + checkAuthDoc( + docToInsert, + me, + ['admin'], + ['authorId'], + { User: this.context.User }, + authlog(resolver, 'create', me) + ); const id = (await this.collection.insertOne(docToInsert)).insertedId; - this.pubsub.publish('tweetInserted', await this.findOneById(id)); - return id; + if (!id) { + throw new Error(`insert tweet not possible.`); + } + this.context.log.debug(`inserted tweet ${id}.`); + const insertedDoc = this.findOneById(id, me, 'pubsub tweetInserted'); + this.pubsub.publish('tweetInserted', insertedDoc); + return insertedDoc; } - async updateById(id, doc) { - const ret = await this.collection.update({ _id: id }, { + async updateById(id, doc, me, resolver) { + const docToUpdate = { $set: Object.assign({}, doc, { updatedAt: Date.now(), - }), - }); - this.loader.clear(id); - this.pubsub.publish('tweetUpdated', await this.findOneById(id)); - return ret; + updatedById: me && me._id ? me._id : 'unknown' + }) + }; + const baseQuery = { _id: id }; + const authQuery = queryForRoles( + me, + ['admin'], + ['authorId', 'coauthorsIds'], + { User: this.context.User }, + authlog(resolver, 'update', me) + ); + const finalQuery = { ...baseQuery, ...authQuery }; + const result = await this.collection.updateOne(finalQuery, docToUpdate); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`update tweet not possible for ${id}.`); + } + this.context.log.debug(`updated tweet ${id}.`); + this.authorizedLoader.clear(id); + const updatedDoc = this.findOneById(id, me, 'pubsub tweetUpdated'); + this.pubsub.publish('tweetUpdated', updatedDoc); + return updatedDoc; } - async removeById(id) { - const ret = this.collection.remove({ _id: id }); - this.loader.clear(id); + async removeById(id, me, resolver) { + const baseQuery = { _id: id }; + const authQuery = queryForRoles( + me, + ['admin'], + ['authorId'], + { User: this.context.User }, + authlog(resolver, 'delete', me) + ); + const finalQuery = { ...baseQuery, ...authQuery }; + const result = await this.collection.remove(finalQuery); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`remove tweet not possible for ${id}.`); + } + this.context.log.debug(`removed tweet ${id}.`); + this.authorizedLoader.clear(id); this.pubsub.publish('tweetRemoved', id); - return ret; + return result; } } diff --git a/test/output-app/model/User.js b/test/output-app/model/User.js index fd61249..670c416 100644 --- a/test/output-app/model/User.js +++ b/test/output-app/model/User.js @@ -1,77 +1,190 @@ -import DataLoader from 'dataloader'; -import findByIds from 'mongo-find-by-ids'; +/* eslint-disable prettier */ +import { + queryForRoles, + onAuthRegisterLoader, + authlog, + checkAuthDoc, + protectFields +} from 'create-graphql-server-authorization'; +import bcrypt from 'bcrypt'; +const SALT_ROUNDS = 10; export default class User { constructor(context) { this.context = context; this.collection = context.db.collection('user'); this.pubsub = context.pubsub; - this.loader = new DataLoader(ids => findByIds(this.collection, ids)); + this.authRole = User.authRole; + const { me } = context; + queryForRoles( + me, + ['admin'], + ['_id'], + { User }, + onAuthRegisterLoader('user findOneById', 'readOne', me, this) + ); } - findOneById(id) { - return this.loader.load(id); + static authRole(user) { + return user && user.role ? user.role : null; } - all({ lastCreatedAt = 0, limit = 10 }) { - return this.collection.find({ - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + async findOneById(id, me, resolver) { + const log = authlog(resolver, 'readOne', me); + if (!this.authorizedLoader) { + log.error('not authorized'); + return null; + } + return await this.authorizedLoader.load(id); } - tweets(user, { minLikes, lastCreatedAt = 0, limit = 10 }) { - return this.context.Tweet.collection.find({ - authorId: user._id, - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + find({ lastCreatedAt = 0, limit = 10, baseQuery = {} }, me, resolver) { + const authQuery = queryForRoles( + me, + ['admin'], + ['_id'], + { User: this.context.User }, + authlog(resolver, 'readMany', me) + ); + const finalQuery = { + ...baseQuery, + ...authQuery, + createdAt: { $gt: lastCreatedAt } + }; + return this.collection + .find(finalQuery) + .sort({ createdAt: 1 }) + .limit(limit) + .toArray(); } - liked(user, { lastCreatedAt = 0, limit = 10 }) { - return this.context.Tweet.collection.find({ - _id: { $in: user.likedIds || [] }, - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + tweets(user, { minLikes, lastCreatedAt = 0, limit = 10 }, me, resolver) { + const baseQuery = { authorId: user._id }; + return this.context.Tweet.find( + { baseQuery, minLikes, lastCreatedAt, limit }, + me, + resolver + ); } - following(user, { lastCreatedAt = 0, limit = 10 }) { - return this.context.User.collection.find({ - _id: { $in: user.followingIds || [] }, - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + liked(user, { lastCreatedAt = 0, limit = 10 }, me, resolver) { + const baseQuery = { _id: { $in: user.likedIds || [] } }; + return this.context.Tweet.find( + { baseQuery, lastCreatedAt, limit }, + me, + resolver + ); } - followers(user, { lastCreatedAt = 0, limit = 10 }) { - return this.context.User.collection.find({ - followingIds: user._id, - createdAt: { $gt: lastCreatedAt }, - }).sort({ createdAt: 1 }).limit(limit).toArray(); + following(user, { lastCreatedAt = 0, limit = 10 }, me, resolver) { + const baseQuery = { _id: { $in: user.followingIds || [] } }; + return this.context.User.find( + { baseQuery, lastCreatedAt, limit }, + me, + resolver + ); } - async insert(doc) { - const docToInsert = Object.assign({}, doc, { + followers(user, { lastCreatedAt = 0, limit = 10 }, me, resolver) { + const baseQuery = { followingIds: user._id }; + return this.context.User.find( + { baseQuery, lastCreatedAt, limit }, + me, + resolver + ); + } + + createdBy(user, me, resolver) { + return this.context.User.findOneById(user.createdById, me, resolver); + } + + updatedBy(user, me, resolver) { + return this.context.User.findOneById(user.updatedById, me, resolver); + } + + async insert(doc, me, resolver) { + // We don't want to store passwords in plaintext + const { password, ...rest } = doc; + const hash = await bcrypt.hash(password, SALT_ROUNDS); + let docToInsert = Object.assign({}, rest, { + hash, createdAt: Date.now(), updatedAt: Date.now(), + createdById: me && me._id ? me._id : 'unknown', + updatedById: me && me._id ? me._id : 'unknown' + }); + checkAuthDoc( + docToInsert, + me, + ['admin'], + ['_id'], + { User: this.context.User }, + authlog(resolver, 'create', me) + ); + docToInsert = protectFields(me, ['admin'], ['role'], docToInsert, { + User: this.context.User }); const id = (await this.collection.insertOne(docToInsert)).insertedId; - this.pubsub.publish('userInserted', await this.findOneById(id)); - return id; + if (!id) { + throw new Error(`insert user not possible.`); + } + this.context.log.debug(`inserted user ${id}.`); + const insertedDoc = this.findOneById(id, me, 'pubsub userInserted'); + this.pubsub.publish('userInserted', insertedDoc); + return insertedDoc; } - async updateById(id, doc) { - const ret = await this.collection.update({ _id: id }, { + async updateById(id, doc, me, resolver) { + const docToUpdate = { $set: Object.assign({}, doc, { updatedAt: Date.now(), - }), - }); - this.loader.clear(id); - this.pubsub.publish('userUpdated', await this.findOneById(id)); - return ret; + updatedById: me && me._id ? me._id : 'unknown' + }) + }; + const baseQuery = { _id: id }; + const authQuery = queryForRoles( + me, + ['admin'], + ['_id'], + { User: this.context.User }, + authlog(resolver, 'update', me) + ); + docToUpdate.$set = protectFields( + me, + ['admin'], + ['role'], + docToUpdate.$set, + { User: this.context.User } + ); + const finalQuery = { ...baseQuery, ...authQuery }; + const result = await this.collection.updateOne(finalQuery, docToUpdate); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`update user not possible for ${id}.`); + } + this.context.log.debug(`updated user ${id}.`); + this.authorizedLoader.clear(id); + const updatedDoc = this.findOneById(id, me, 'pubsub userUpdated'); + this.pubsub.publish('userUpdated', updatedDoc); + return updatedDoc; } - async removeById(id) { - const ret = this.collection.remove({ _id: id }); - this.loader.clear(id); + async removeById(id, me, resolver) { + const baseQuery = { _id: id }; + const authQuery = queryForRoles( + me, + ['admin'], + ['_id'], + { User: this.context.User }, + authlog(resolver, 'delete', me) + ); + const finalQuery = { ...baseQuery, ...authQuery }; + const result = await this.collection.remove(finalQuery); + if (result.result.ok !== 1 || result.result.n !== 1) { + throw new Error(`remove user not possible for ${id}.`); + } + this.context.log.debug(`removed user ${id}.`); + this.authorizedLoader.clear(id); this.pubsub.publish('userRemoved', id); - return ret; + return result; } } diff --git a/test/output-app/model/index.js b/test/output-app/model/index.js index 99f9412..ab03af2 100644 --- a/test/output-app/model/index.js +++ b/test/output-app/model/index.js @@ -2,8 +2,14 @@ const models = {}; export default function addModelsToContext(context) { const newContext = Object.assign({}, context); + + // User model has to be first, to initialize the other models with correct authorizations + if (models['User']){ + newContext['User'] = new models['User'](newContext); + } + Object.keys(models).forEach((key) => { - newContext[key] = new models[key](newContext); + if (key !== 'User') newContext[key] = new models[key](newContext); }); return newContext; } diff --git a/test/output-app/package.json b/test/output-app/package.json index b5438f1..68b7053 100644 --- a/test/output-app/package.json +++ b/test/output-app/package.json @@ -5,6 +5,12 @@ "scripts": { "start": "babel-node index.js" }, + "config": { + "logfile": "log/all-logs-readable.log", + "loglevel": "debug", + "maxsize": 5, + "maxfiles": 5 + }, "private": true, "author": "", "license": "MIT", @@ -33,6 +39,9 @@ "bcrypt": "^1.0.2", "body-parser": "1.15.2", "cors": "^2.8.1", + "create-graphql-server-authorization": "^0.0.45", + "create-graphql-server-find-by-ids": "^0.0.4", + "create-graphql-server-logging": "^0.0.3", "dataloader": "^1.2.0", "denodeify": "^1.2.1", "dotenv": "2.0.0", @@ -45,11 +54,12 @@ "graphql-tools": "^0.8.2", "jwt-simple": "^0.5.1", "lodash": "4.16.4", - "mongo-find-by-ids": "^1.0.0", "mongodb": "^2.2.11", + "morgan": "^1.8.2", "nodeify": "^1.0.1", "passport": "^0.3.2", "passport-jwt": "^2.2.1", - "subscriptions-transport-ws": "0.2.6" + "subscriptions-transport-ws": "0.2.6", + "winston": "^2.3.1" } } diff --git a/test/output-app/resolvers/Tweet.js b/test/output-app/resolvers/Tweet.js index 64cfed4..02c47dc 100644 --- a/test/output-app/resolvers/Tweet.js +++ b/test/output-app/resolvers/Tweet.js @@ -1,46 +1,58 @@ +/* eslint-disable prettier */ +/* eslint comma-dangle: [2, "only-multiline"] */ const resolvers = { Tweet: { id(tweet) { return tweet._id; }, - author(tweet, args, { Tweet }) { - return Tweet.author(tweet); + author(tweet, args, { Tweet, me }) { + return Tweet.author(tweet, me, 'tweet author'); }, - likers(tweet, { lastCreatedAt, limit }, { Tweet }) { - return Tweet.likers(tweet, { lastCreatedAt, limit }); + coauthors(tweet, args, { Tweet, me }) { + return Tweet.coauthors(tweet, args, me, 'tweet coauthors'); }, + + likers(tweet, args, { Tweet, me }) { + return Tweet.likers(tweet, args, me, 'tweet likers'); + }, + + createdBy(tweet, args, { Tweet, me }) { + return Tweet.createdBy(tweet, me, 'tweet createdBy'); + }, + + updatedBy(tweet, args, { Tweet, me }) { + return Tweet.updatedBy(tweet, me, 'tweet updatedBy'); + } }, Query: { - tweets(root, { lastCreatedAt, limit }, { Tweet }) { - return Tweet.all({ lastCreatedAt, limit }); + tweets(root, { lastCreatedAt, limit }, { Tweet, me }) { + return Tweet.find({ lastCreatedAt, limit }, me, 'tweets'); }, - tweet(root, { id }, { Tweet }) { - return Tweet.findOneById(id); - }, + tweet(root, { id }, { Tweet, me }) { + return Tweet.findOneById(id, me, 'tweet'); + } }, Mutation: { - async createTweet(root, { input }, { Tweet }) { - const id = await Tweet.insert(input); - return Tweet.findOneById(id); + async createTweet(root, { input }, { Tweet, me }) { + return await Tweet.insert(input, me, 'createTweet'); }, - async updateTweet(root, { id, input }, { Tweet }) { - await Tweet.updateById(id, input); - return Tweet.findOneById(id); + async updateTweet(root, { id, input }, { Tweet, me }) { + return await Tweet.updateById(id, input, me, 'updateTweet'); }, - removeTweet(root, { id }, { Tweet }) { - return Tweet.removeById(id); - }, + async removeTweet(root, { id }, { Tweet, me }) { + return await Tweet.removeById(id, me, 'removeTweet'); + } }, Subscription: { tweetCreated: tweet => tweet, tweetUpdated: tweet => tweet, - tweetRemoved: id => id, - }, + tweetRemoved: id => id + } }; export default resolvers; diff --git a/test/output-app/resolvers/User.js b/test/output-app/resolvers/User.js index 0e4abac..f5eea86 100644 --- a/test/output-app/resolvers/User.js +++ b/test/output-app/resolvers/User.js @@ -1,54 +1,62 @@ +/* eslint-disable prettier */ +/* eslint comma-dangle: [2, "only-multiline"] */ const resolvers = { User: { id(user) { return user._id; }, - tweets(user, { minLikes, lastCreatedAt, limit }, { User }) { - return User.tweets(user, { minLikes, lastCreatedAt, limit }); + tweets(user, args, { User, me }) { + return User.tweets(user, args, me, 'user tweets'); }, - liked(user, { lastCreatedAt, limit }, { User }) { - return User.liked(user, { lastCreatedAt, limit }); + liked(user, args, { User, me }) { + return User.liked(user, args, me, 'user liked'); }, - following(user, { lastCreatedAt, limit }, { User }) { - return User.following(user, { lastCreatedAt, limit }); + following(user, args, { User, me }) { + return User.following(user, args, me, 'user following'); }, - followers(user, { lastCreatedAt, limit }, { User }) { - return User.followers(user, { lastCreatedAt, limit }); + followers(user, args, { User, me }) { + return User.followers(user, args, me, 'user followers'); }, + + createdBy(user, args, { User, me }) { + return User.createdBy(user, me, 'user createdBy'); + }, + + updatedBy(user, args, { User, me }) { + return User.updatedBy(user, me, 'user updatedBy'); + } }, Query: { - users(root, { lastCreatedAt, limit }, { User }) { - return User.all({ lastCreatedAt, limit }); + users(root, { lastCreatedAt, limit }, { User, me }) { + return User.find({ lastCreatedAt, limit }, me, 'users'); }, - user(root, { id }, { User }) { - return User.findOneById(id); - }, + user(root, { id }, { User, me }) { + return User.findOneById(id, me, 'user'); + } }, Mutation: { - async createUser(root, { input }, { User }) { - const id = await User.insert(input); - return User.findOneById(id); + async createUser(root, { input }, { User, me }) { + return await User.insert(input, me, 'createUser'); }, - async updateUser(root, { id, input }, { User }) { - await User.updateById(id, input); - return User.findOneById(id); + async updateUser(root, { id, input }, { User, me }) { + return await User.updateById(id, input, me, 'updateUser'); }, - removeUser(root, { id }, { User }) { - return User.removeById(id); - }, + async removeUser(root, { id }, { User, me }) { + return await User.removeById(id, me, 'removeUser'); + } }, Subscription: { userCreated: user => user, userUpdated: user => user, - userRemoved: id => id, - }, + userRemoved: id => id + } }; export default resolvers; diff --git a/test/output-app/schema/Tweet.graphql b/test/output-app/schema/Tweet.graphql index f5a6b3b..6ff5416 100644 --- a/test/output-app/schema/Tweet.graphql +++ b/test/output-app/schema/Tweet.graphql @@ -1,10 +1,13 @@ type Tweet { id: ObjID! - author: User! - body: String! - likers(lastCreatedAt: Float, limit: Int): [User!] + author: User + coauthors(lastCreatedAt: Float, limit: Int): [User] + body: String + likers(lastCreatedAt: Float, limit: Int): [User] createdAt: Float! updatedAt: Float! + createdBy: User + updatedBy: User } extend type Query { @@ -13,12 +16,16 @@ extend type Query { } input CreateTweetInput { - authorId: ObjID! - body: String! + authorId: ObjID + coauthorsIds: [ObjID] + body: String + likersIds: [ObjID] } input UpdateTweetInput { - body: String! + coauthorsIds: [ObjID] + body: String + likersIds: [ObjID] } extend type Mutation { diff --git a/test/output-app/schema/User.graphql b/test/output-app/schema/User.graphql index f504c7f..fcd6f86 100644 --- a/test/output-app/schema/User.graphql +++ b/test/output-app/schema/User.graphql @@ -1,14 +1,18 @@ type User { id: ObjID! - username: String! + role: String + email: String! + username: String bio: String notify: Boolean - tweets(minLikes: Int, lastCreatedAt: Float, limit: Int): [Tweet!] - liked(lastCreatedAt: Float, limit: Int): [Tweet!] - following(lastCreatedAt: Float, limit: Int): [User!] - followers(lastCreatedAt: Float, limit: Int): [User!] + tweets(minLikes: Int, lastCreatedAt: Float, limit: Int): [Tweet] + liked(lastCreatedAt: Float, limit: Int): [Tweet] + following(lastCreatedAt: Float, limit: Int): [User] + followers(lastCreatedAt: Float, limit: Int): [User] createdAt: Float! updatedAt: Float! + createdBy: User + updatedBy: User } extend type Query { @@ -17,15 +21,28 @@ extend type Query { } input CreateUserInput { - username: String! + role: String + email: String! + username: String bio: String notify: Boolean + tweetsIds: [ObjID] + likedIds: [ObjID] + followingIds: [ObjID] + followersIds: [ObjID] + password: String! } input UpdateUserInput { - username: String! + role: String + email: String + username: String bio: String notify: Boolean + tweetsIds: [ObjID] + likedIds: [ObjID] + followingIds: [ObjID] + followersIds: [ObjID] } extend type Mutation { diff --git a/test/output-app/server/authenticate.js b/test/output-app/server/authenticate.js index a08b286..2559482 100644 --- a/test/output-app/server/authenticate.js +++ b/test/output-app/server/authenticate.js @@ -4,15 +4,17 @@ import jwt from 'jwt-simple'; import { ObjectId } from 'mongodb'; import nodeify from 'nodeify'; import bcrypt from 'bcrypt'; +import DataLoader from 'dataloader'; +import { findByIds } from 'create-graphql-server-find-by-ids'; const KEY = 'test-key'; +let Loader; async function userFromPayload(request, jwtPayload) { if (!jwtPayload.userId) { throw new Error('No userId in JWT'); } - - return await request.context.User.findOneById(ObjectId(jwtPayload.userId)); + return await Loader.load(ObjectId(jwtPayload.userId)); } passport.use(new Strategy({ @@ -23,7 +25,9 @@ passport.use(new Strategy({ nodeify(userFromPayload(request, jwtPayload), done); })); -export default function addPassport(app) { +export default function addPassport(app, User) { + Loader = new DataLoader(ids => findByIds(User, ids)); + app.use(passport.initialize()); app.post('/login', async (req, res, next) => { @@ -34,7 +38,7 @@ export default function addPassport(app) { throw new Error('Username or password not set on request'); } - const user = await req.context.User.collection.findOne({ email }); + const user = await User.findOne({ email }); if (!user || !(await bcrypt.compare(password, user.hash))) { throw new Error('User not found matching email/password combination'); } diff --git a/test/output-app/server/index.js b/test/output-app/server/index.js index 073ae22..ca7be63 100644 --- a/test/output-app/server/index.js +++ b/test/output-app/server/index.js @@ -7,14 +7,22 @@ import { makeExecutableSchema } from 'graphql-tools'; import { MongoClient } from 'mongodb'; import cors from 'cors'; import passport from 'passport'; - +import morgan from 'morgan'; +import { findByIds } from 'create-graphql-server-find-by-ids'; +import { getLogFilename, logger } from 'create-graphql-server-logging'; import typeDefs from '../schema'; import resolvers from '../resolvers'; import addModelsToContext from '../model'; import authenticate from './authenticate'; - +import { parse, print } from 'graphql'; import { pubsub, subscriptionManager } from './subscriptions'; +const log = logger(getLogFilename()); +const stream = { + write: function(message, encoding) { + // log.debug(message); + } +}; const schema = makeExecutableSchema({ typeDefs, resolvers }); const { @@ -26,36 +34,45 @@ const { async function startServer() { + log.info('Logger started'); + const db = await MongoClient.connect(MONGO_URL); + const UserCollection = db.collection('user'); const app = express().use('*', cors()); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); + app.use(morgan("dev", { "stream": stream })); - app.use((req, res, next) => { - req.context = addModelsToContext({ db, pubsub }); - next(); - }); - - authenticate(app); + authenticate(app, UserCollection); app.use('/graphql', (req, res, next) => { - passport.authenticate('jwt', { session: false }, (err, user) => { + passport.authenticate('jwt', { session: false }, (err, me) => { + req.context = addModelsToContext({ + db, pubsub, me, UserCollection, findByIds, log + }); graphqlExpress(() => { // Get the query, the same way express-graphql does it // https://github.com/graphql/express-graphql/blob/3fa6e68582d6d933d37fa9e841da5d2aa39261cd/src/index.js#L257 + const {variables, operationName} = req.body; + const {_id, username, role} = me; const query = req.query.query || req.body.query; - if (query && query.length > 2000) { + log.debug('-'.repeat(80)); + log.debug(`Request:\nUser: "${(username) ? username: ''}", role: "${(role) ? role : ''}", id: "${(_id) ? _id : ''}",\nOperation: "${operationName ? operationName : ''}", variables: "${variables ? JSON.stringify(variables) : ''}",\nQuery:\n${print(parse(query))}`); + if (query && query.length > 4000) { // None of our app's queries are this long // Probably indicates someone trying to send an overly expensive query + log.error('Query too large.'); throw new Error('Query too large.'); } - return { schema, - context: Object.assign({ user }, req.context), + context: Object.assign({ me }, req.context), debug: true, - formatError(e) { console.log(e) }, + formatError(e) { + console.log(e); + return e; + }, }; })(req, res, next); })(req, res, next); diff --git a/test/output-app/yarn.lock b/test/output-app/yarn.lock index ce8e5db..6dbdcd4 100644 --- a/test/output-app/yarn.lock +++ b/test/output-app/yarn.lock @@ -3,45 +3,49 @@ "@types/express-serve-static-core@*": - version "4.0.39" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.39.tgz#45157f96480d46f254648f45b2c6d70bd9fc9f54" + version "4.0.50" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.50.tgz#c5a139b5d29d2305aae6d982f69cef36120beacf" dependencies: "@types/node" "*" "@types/express@^4.0.33": - version "4.0.34" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.34.tgz#cdc0afd69d70d2295b81b3aa47f26f672afcde1c" + version "4.0.37" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.37.tgz#625ac3765169676e01897ca47011c26375784971" dependencies: "@types/express-serve-static-core" "*" "@types/serve-static" "*" "@types/mime@*": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" + version "1.3.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.1.tgz#2cf42972d0931c1060c7d5fa6627fce6bd876f2f" + +"@types/node@*": + version "8.0.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.25.tgz#66ecaf4df93f5281b48427ee96fbcdfc4f0cdce1" -"@types/node@*", "@types/node@^6.0.38": - version "6.0.51" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.51.tgz#84cbf25111516ec9304d0b61469dc0fa9d12ba32" +"@types/node@^6.0.38": + version "6.0.88" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.88.tgz#f618f11a944f6a18d92b5c472028728a3e3d4b66" "@types/serve-static@*": - version "1.7.31" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a" + version "1.7.32" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.32.tgz#0f6732e4dab0813771dd8fc8fe14940f34728b4c" dependencies: "@types/express-serve-static-core" "*" "@types/mime" "*" abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" accepts@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" dependencies: - mime-types "~2.1.11" + mime-types "~2.1.16" negotiator "0.6.1" -acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: +acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" dependencies: @@ -51,57 +55,73 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" +acorn@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" agent-base@2: - version "2.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" + version "2.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" dependencies: extend "~3.0.0" semver "~5.0.1" ajv-keywords@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c" + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" -ajv@^4.7.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.2.tgz#3f7dcda95b0c34bceb2d69945117d146219f1a2c" +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" ansi-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" ansi-styles@^2.1.0, ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: - arrify "^1.0.0" micromatch "^2.1.5" + normalize-path "^2.0.0" aproba@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" dependencies: delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" + readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.9" @@ -116,8 +136,8 @@ arr-diff@^2.0.0: arr-flatten "^1.0.1" arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" array-find-index@^1.0.1: version "1.0.2" @@ -149,27 +169,45 @@ asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +assert@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +ast-types@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.11.tgz#371177bb59232ff5ceaa1d09ee5cad705b1a5aa9" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" +async@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" dependencies: - lodash "^4.8.0" + lodash "^4.14.0" + +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" asynckit@^0.4.0: version "0.4.0" @@ -180,8 +218,8 @@ aws-sign2@~0.6.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" aws4@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" babel-cli@6.16.0: version "6.16.0" @@ -209,15 +247,15 @@ babel-cli@6.16.0: optionalDependencies: chokidar "^1.0.0" -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" +babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - chalk "^1.1.0" + chalk "^1.1.3" esutils "^2.0.2" - js-tokens "^2.0.0" + js-tokens "^3.0.2" -babel-core@6.17.0, babel-core@^6.16.0: +babel-core@6.17.0: version "6.17.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" dependencies: @@ -243,6 +281,30 @@ babel-core@6.17.0, babel-core@^6.16.0: slash "^1.0.0" source-map "^0.5.0" +babel-core@^6.16.0, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + babel-eslint@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.0.0.tgz#54e51b4033f54ac81326ecea4c646a779935196d" @@ -252,156 +314,156 @@ babel-eslint@7.0.0: babylon "^6.11.2" lodash.pickby "^4.6.0" -babel-generator@^6.17.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" +babel-generator@^6.17.0, babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" detect-indent "^4.0.0" jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" -babel-helper-bindify-decorators@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" dependencies: - babel-helper-explode-assignable-expression "^6.18.0" - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-builder-react-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz#ab02f19a2eb7ace936dd87fa55896d02be59bf71" +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - esutils "^2.0.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" -babel-helper-call-delegate@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" -babel-helper-explode-assignable-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-explode-class@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" dependencies: - babel-helper-bindify-decorators "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" dependencies: - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-get-function-arity@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-hoist-variables@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-regex@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" -babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" +babel-helpers@^6.16.0, babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" +babel-messages@^6.23.0, babel-messages@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -435,287 +497,283 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" -babel-plugin-syntax-trailing-function-commas@^6.3.13: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" -babel-plugin-transform-async-generator-functions@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" dependencies: - babel-helper-remap-async-to-generator "^6.16.2" + babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" -babel-plugin-transform-async-to-generator@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" dependencies: - babel-helper-remap-async-to-generator "^6.16.0" + babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-class-properties@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" dependencies: - babel-helper-function-name "^6.18.0" + babel-helper-function-name "^6.24.1" babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.9.1" - babel-template "^6.15.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" dependencies: - babel-helper-define-map "^6.8.0" - babel-helper-explode-class "^6.8.0" + babel-helper-explode-class "^6.24.1" babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-types "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: - babel-runtime "^6.9.0" - babel-template "^6.15.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-plugin-transform-es2015-classes@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-destructuring@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: - babel-runtime "^6.9.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-for-of@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-literals@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" -babel-plugin-transform-es2015-modules-amd@^6.18.0, babel-plugin-transform-es2015-modules-amd@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" +babel-plugin-transform-es2015-modules-amd@^6.24.1, babel-plugin-transform-es2015-modules-amd@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.16.0, babel-plugin-transform-es2015-modules-commonjs@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" +babel-plugin-transform-es2015-modules-commonjs@^6.16.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: - babel-plugin-transform-strict-mode "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.18.0" + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" babel-plugin-transform-es2015-modules-systemjs@^6.14.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-modules-umd@^6.12.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" dependencies: - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-parameters@^6.16.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: - babel-helper-call-delegate "^6.18.0" - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.9.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" babel-plugin-transform-es2015-shorthand-properties@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-spread@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.3.13: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-exponentiation-operator@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-flow-strip-types@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz#4d3e642158661e9b40db457c004a30817fa32592" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" dependencies: babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.26.0" babel-plugin-transform-react-display-name@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-react-jsx-self@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.11.0.tgz#605c9450c1429f97a930f7e1dfe3f0d9d0dbd0f4" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" dependencies: babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" + babel-runtime "^6.22.0" babel-plugin-transform-react-jsx-source@^6.3.13: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" dependencies: babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" + babel-runtime "^6.22.0" babel-plugin-transform-react-jsx@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" dependencies: - babel-helper-builder-react-jsx "^6.8.0" + babel-helper-builder-react-jsx "^6.24.1" babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-regenerator@^6.16.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.16.0" - private "~0.1.5" + regenerator-transform "^0.10.0" -babel-plugin-transform-strict-mode@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-polyfill@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: - babel-runtime "^6.9.1" - core-js "^2.4.0" - regenerator-runtime "^0.9.5" + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" babel-preset-es2015@6.16.0: version "6.16.0" @@ -767,16 +825,16 @@ babel-preset-stage-2@6.17.0: babel-preset-stage-3 "^6.17.0" babel-preset-stage-3@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" dependencies: - babel-plugin-syntax-trailing-function-commas "^6.3.13" - babel-plugin-transform-async-generator-functions "^6.17.0" - babel-plugin-transform-async-to-generator "^6.16.0" - babel-plugin-transform-exponentiation-operator "^6.3.13" - babel-plugin-transform-object-rest-spread "^6.16.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@6.16.3, babel-register@^6.16.0: +babel-register@6.16.3: version "6.16.3" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" dependencies: @@ -789,79 +847,90 @@ babel-register@6.16.3, babel-register@^6.16.0: path-exists "^1.0.0" source-map-support "^0.4.2" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" +babel-register@^6.16.0, babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" -babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" +babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: - babel-runtime "^6.9.1" + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" + lodash "^4.17.4" + to-fast-properties "^1.0.3" -babylon@^6.11.0, babylon@^6.11.2: - version "6.14.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" +babylon@^6.11.0, babylon@^6.11.2, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" backo2@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -base64-url@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/base64-url/-/base64-url-1.3.3.tgz#f8b6c537f09a4fc58c99cb86e0b0e9c61461a20f" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base64url@2.0.0, base64url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" +basic-auth@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" + bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" dependencies: tweetnacl "^0.14.3" bcrypt@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.2.tgz#d05fc5d223173e0e28ec381c0f00cc25ffaf2736" + version "1.0.3" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.3.tgz#b02ddc6c0b52ea16b8d3cf375d5a32e780dab548" dependencies: - bindings "1.2.1" - nan "2.5.0" - node-pre-gyp "0.6.32" + nan "2.6.2" + node-pre-gyp "0.6.36" bin-version-check@^2.1.0: version "2.1.0" @@ -879,18 +948,14 @@ bin-version@^1.0.0: find-versions "^1.0.0" binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" - -bindings@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" bl@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" dependencies: - readable-stream "~2.0.5" + readable-stream "^2.0.5" block-stream@*: version "0.0.9" @@ -920,16 +985,16 @@ boom@2.x.x: hoek "2.x.x" boom@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.0.tgz#1ed1b4b8cd6891b602910debe33e1d511531b847" + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" dependencies: hoek "4.x.x" -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: - balanced-match "^0.4.1" + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -944,9 +1009,9 @@ browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -bson@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.1.tgz#3a5addb0f2ff88bc3436e708e4bdb8637602d72d" +bson@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" buffer-crc32@~0.2.3: version "0.2.13" @@ -956,7 +1021,7 @@ buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" -buffer-shims@^1.0.0: +buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -994,13 +1059,40 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai-json-equal@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/chai-json-equal/-/chai-json-equal-0.0.1.tgz#338fcbbdaec63349379c7c4278c8a28da3b141a1" + +chai-spies-next@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/chai-spies-next/-/chai-spies-next-0.9.3.tgz#672a84f68824af152ea1cbdda5a96f1a066302b9" + +chai-string@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.4.0.tgz#359140c051d36a4e4b1a5fc6b910152f438a8d49" + +chai-subset@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/chai-subset/-/chai-subset-1.6.0.tgz#a5d0ca14e329a79596ed70058b6646bd6988cfe9" chai@^3.5.0: version "3.5.0" @@ -1020,7 +1112,7 @@ chalk@1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1031,8 +1123,8 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: supports-color "^2.0.0" chokidar@^1.0.0, chokidar@^1.4.3: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -1045,9 +1137,9 @@ chokidar@^1.0.0, chokidar@^1.4.3: optionalDependencies: fsevents "^1.0.0" -circular-json@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" cli-cursor@^1.0.1: version "1.0.2" @@ -1056,8 +1148,16 @@ cli-cursor@^1.0.1: restore-cursor "^1.0.1" cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" cliui@^3.0.3: version "3.2.0" @@ -1087,18 +1187,26 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@^2.8.1, commander@^2.9.0: +commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" +commander@^2.8.1: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + commander@~2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -1110,12 +1218,12 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" concat-stream@^1.4.6, concat-stream@^1.4.7: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" configstore@^1.0.0: version "1.4.0" @@ -1146,9 +1254,9 @@ content-type@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" -convert-source-map@^1.1.0, convert-source-map@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" +convert-source-map@^1.1.0, convert-source-map@^1.1.1, convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" cookie-signature@1.0.6: version "1.0.6" @@ -1158,24 +1266,62 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -cors: - version "2.8.1" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.1.tgz#6181aa56abb45a2825be3304703747ae4e9d2383" +cors@^2.8.1: + version "2.8.4" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" dependencies: + object-assign "^4" vary "^1" crc@3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.0.tgz#4258e351613a74ef1153dfcb05e820c3e9715d7f" +create-graphql-server-authorization@^0.0.45: + version "0.0.45" + resolved "https://registry.yarnpkg.com/create-graphql-server-authorization/-/create-graphql-server-authorization-0.0.45.tgz#b871b25281f85044aea8d213ca0091ca1e638655" + dependencies: + assert "^1.4.1" + babylon "^6.18.0" + chai-string "^1.4.0" + create-graphql-server-find-by-ids "^0.0.4" + create-graphql-server-logging "^0.0.3" + global "^4.3.2" + graphql "^0.11.1" + handlebars "^4.0.10" + iterall "^1.1.0" + lodash "4.16.4" + lodash.clonedeep "^4.5.0" + lodash.includes "^4.3.0" + lodash.merge "^4.6.0" + mongodb "^2.2.31" + recast "^0.12.6" + winston "^2.3.1" + +create-graphql-server-find-by-ids@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/create-graphql-server-find-by-ids/-/create-graphql-server-find-by-ids-0.0.4.tgz#02d35103a55648d5589f0023f242047462396ef6" + dependencies: + babylon "^6.18.0" + +create-graphql-server-logging@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/create-graphql-server-logging/-/create-graphql-server-logging-0.0.3.tgz#8b8b9c44ee5d6a9964696059a26858d57ea3bb79" + dependencies: + babylon "^6.18.0" + chai-json-equal "^0.0.1" + chai-spies-next "^0.9.3" + chai-subset "^1.6.0" + winston "^2.3.1" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -1188,15 +1334,19 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" dependencies: - es5-ext "~0.10.2" + es5-ext "^0.10.9" damerau-levenshtein@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" dashdash@^1.12.0: version "1.14.1" @@ -1205,16 +1355,22 @@ dashdash@^1.12.0: assert-plus "^1.0.0" dataloader@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.2.0.tgz#3f73ea657c492c860c1633348adc55ca9bf2107e" + version "1.3.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.3.0.tgz#6fec5be4b30a712e4afd30b86b4334566b97673b" -debug@2, debug@2.2.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: +debug@2, debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" -decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1285,8 +1441,8 @@ deep-eql@^0.1.3: type-detect "0.1.1" deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" deep-is@~0.1.3: version "0.1.3" @@ -1316,9 +1472,9 @@ denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +depd@1.1.1, depd@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" deprecated-decorator@^0.1.6: version "0.1.6" @@ -1334,9 +1490,9 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" doctrine@1.3.x: version "1.3.0" @@ -1352,6 +1508,10 @@ doctrine@^1.2.2: esutils "^2.0.2" isarray "^1.0.0" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + dotenv@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-2.0.0.tgz#bd759c357aaa70365e01c96b7b0bec08a6e0d949" @@ -1367,10 +1527,10 @@ duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + version "3.5.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" dependencies: - end-of-stream "1.0.0" + end-of-stream "^1.0.0" inherits "^2.0.1" readable-stream "^2.0.0" stream-shift "^1.0.0" @@ -1402,49 +1562,43 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - end-of-stream@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" dependencies: - once "~1.3.0" + once "^1.4.0" error-ex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" -es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.30" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" dependencies: es6-iterator "2" es6-symbol "~3.1" -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" es6-map@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-set "~0.1.3" - es6-symbol "~3.1.0" - event-emitter "~0.3.4" + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" es6-promise@3.2.1: version "3.2.1" @@ -1454,31 +1608,31 @@ es6-promise@^3.0.2, es6-promise@^3.2.1: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" -es6-set@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-symbol "3" - event-emitter "~0.3.4" + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" -es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: - d "~0.1.1" - es5-ext "~0.10.11" + d "1" + es5-ext "~0.10.14" es6-weak-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" dependencies: - d "^0.1.1" - es5-ext "^0.10.8" - es6-iterator "2" - es6-symbol "3" + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" escape-html@~1.0.3: version "1.0.3" @@ -1595,32 +1749,28 @@ eslint@3.8.1: user-home "^2.0.0" espree@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" dependencies: - acorn "^4.0.1" + acorn "^5.1.1" acorn-jsx "^3.0.0" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" dependencies: - estraverse "~4.1.0" + estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1628,12 +1778,12 @@ etag@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" -event-emitter@~0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" dependencies: - d "~0.1.1" - es5-ext "~0.10.7" + d "1" + es5-ext "~0.10.14" event-stream@~3.3.0: version "3.3.4" @@ -1715,8 +1865,8 @@ extend-shallow@^2.0.1: is-extendable "^0.1.0" extend@3, extend@^3.0.0, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" extglob@^0.3.1: version "0.3.2" @@ -1724,13 +1874,17 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" fast-levenshtein@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" fd-slicer@~1.0.1: version "1.0.1" @@ -1757,8 +1911,8 @@ file-type@^3.1.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" fill-range@^2.1.0: version "2.2.3" @@ -1801,31 +1955,31 @@ first-chunk-stream@^1.0.0: resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" flat-cache@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" dependencies: - circular-json "^0.3.0" + circular-json "^0.3.1" del "^2.0.2" graceful-fs "^4.1.2" write "^0.2.1" -for-in@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" for-own@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: - for-in "^0.1.5" + for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" form-data@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -1840,8 +1994,8 @@ fresh@0.3.0: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" from@~0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.3.tgz#ef63ac2062ac32acf7862e0d40b44b896f22f3bc" + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" fs-readdir-recursive@^0.1.0: version "0.1.2" @@ -1852,13 +2006,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.0.15" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.36" -fstream-ignore@~1.0.5: +fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: @@ -1866,9 +2020,9 @@ fstream-ignore@~1.0.5: inherits "2" minimatch "^3.0.0" -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -1879,9 +2033,9 @@ function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" -gauge@~2.7.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -1890,7 +2044,6 @@ gauge@~2.7.1: signal-exit "^3.0.0" string-width "^1.0.1" strip-ansi "^3.0.1" - supports-color "^0.2.0" wide-align "^1.1.0" generate-function@^2.0.0: @@ -1908,14 +2061,14 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" getos@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/getos/-/getos-2.8.2.tgz#365e7e3b2cf74cb85ebb6d1d8c76633580cee534" + version "2.8.4" + resolved "https://registry.yarnpkg.com/getos/-/getos-2.8.4.tgz#7b8603d3619c28e38cb0fe7a4f63c3acb80d5163" dependencies: - async "2.0.1" + async "2.1.4" getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" @@ -1933,8 +2086,8 @@ glob-parent@^2.0.0: is-glob "^2.0.0" glob-parent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.0.1.tgz#60021327cc963ddc3b5f085764f500479ecd82ff" + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -1952,9 +2105,9 @@ glob-stream@^5.3.2: to-absolute-glob "^0.1.1" unique-stream "^2.0.2" -glob@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1974,19 +2127,26 @@ glob@^5.0.3, glob@^5.0.5: path-is-absolute "^1.0.0" glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.0.0, globals@^9.2.0: - version "9.14.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^9.18.0, globals@^9.2.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^5.0.0: version "5.0.0" @@ -2014,7 +2174,7 @@ got@^3.2.0: read-all-stream "^3.0.0" timed-out "^2.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.4: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2022,24 +2182,24 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -graphql-server-core@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/graphql-server-core/-/graphql-server-core-0.4.3.tgz#3198832ce8703388713f012da023b33a3823be98" +graphql-server-core@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/graphql-server-core/-/graphql-server-core-0.4.4.tgz#d5b502f1300b4f775ee3dfa6f8a1bf9fb3cf48a9" optionalDependencies: typed-graphql "^1.0.2" graphql-server-express@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/graphql-server-express/-/graphql-server-express-0.4.3.tgz#198674e6db4949c060b9959554d3dc4e9cc4ed9b" + version "0.4.4" + resolved "https://registry.yarnpkg.com/graphql-server-express/-/graphql-server-express-0.4.4.tgz#ed4c7b1cc158d03cc95e4eea712def4d1f46d9a0" dependencies: - graphql-server-core "^0.4.3" - graphql-server-module-graphiql "^0.4.3" + graphql-server-core "^0.4.4" + graphql-server-module-graphiql "^0.4.4" optionalDependencies: "@types/express" "^4.0.33" -graphql-server-module-graphiql@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/graphql-server-module-graphiql/-/graphql-server-module-graphiql-0.4.3.tgz#f82b92b99bb1e1b4b285c86bf6fcfa60b3a7a805" +graphql-server-module-graphiql@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/graphql-server-module-graphiql/-/graphql-server-module-graphiql-0.4.4.tgz#9b8ca9444de7eb40458bf9264579ae200d7029a0" graphql-server@^0.3.2: version "0.3.2" @@ -2064,12 +2224,12 @@ graphql-subscriptions@^0.1.3: graphql "^0.7.0" graphql-tools@^0.8.2: - version "0.8.3" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-0.8.3.tgz#7766ec1d1cc716dde331bd7813267bda44aefa08" + version "0.8.4" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-0.8.4.tgz#3cf4b2a650e0322b655ca274ec24914b608fb562" dependencies: deprecated-decorator "^0.1.6" lodash "^4.3.0" - node-uuid "^1.4.7" + uuid "^3.0.1" optionalDependencies: typed-graphql "^1.0.2" @@ -2079,6 +2239,12 @@ graphql@0.7.2, graphql@^0.7.0: dependencies: iterall "1.0.2" +graphql@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.1.tgz#c9f004255db946a7f5f48ada0041290b9bd02c3d" + dependencies: + iterall "^1.1.0" + growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" @@ -2093,14 +2259,26 @@ gulp-sourcemaps@1.6.0: through2 "^2.0.0" vinyl "^1.0.0" -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" +handlebars@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" has-ansi@^2.0.0: version "2.0.0" @@ -2136,8 +2314,8 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hoek@4.x.x: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.1.0.tgz#4a4557460f69842ed463aa00628cc26d2683afa7" + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" home-or-tmp@^1.0.0: version "1.0.0" @@ -2146,11 +2324,27 @@ home-or-tmp@^1.0.0: os-tmpdir "^1.0.1" user-home "^1.1.1" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hosted-git-info@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +http-errors@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" -http-errors@^1.5.0, http-errors@~1.5.0: +http-errors@~1.5.0, http-errors@~1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" dependencies: @@ -2174,17 +2368,21 @@ https-proxy-agent@^1.0.0: debug "2" extend "3" -iconv-lite@0.4.13, iconv-lite@~0.4.13: +iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" +iconv-lite@~0.4.13: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + ignore-by-default@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" ignore@^3.1.5: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" imurmurhash@^0.1.4: version "0.1.4" @@ -2207,10 +2405,14 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" @@ -2233,7 +2435,7 @@ inquirer@^0.12.0: strip-ansi "^3.0.0" through "^2.3.6" -invariant@^2.2.0: +invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -2243,9 +2445,9 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -ipaddr.js@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" +ipaddr.js@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" is-absolute@^0.1.5: version "0.1.7" @@ -2263,9 +2465,9 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.0.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" is-builtin-module@^1.0.0: version "1.0.0" @@ -2278,8 +2480,8 @@ is-bzip2@^1.0.0: resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" @@ -2296,8 +2498,8 @@ is-extglob@^1.0.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" is-extglob@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" is-finite@^1.0.0: version "1.0.2" @@ -2331,9 +2533,9 @@ is-gzip@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" +is-my-json-valid@^2.10.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" @@ -2348,12 +2550,18 @@ is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" -is-number@^2.0.2, is-number@^2.1.0: +is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -2442,7 +2650,7 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" -isstream@~0.1.2: +isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2450,11 +2658,9 @@ iterall@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.2.tgz#41a2e96ce9eda5e61c767ee5dc312373bb046e91" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" +iterall@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.1.tgz#f7f0af11e9a04ec6426260f5019d9fcca4d50214" joi@^6.10.1: version "6.10.1" @@ -2465,20 +2671,20 @@ joi@^6.10.1: moment "2.x.x" topo "1.x.x" -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" js-yaml@^3.5.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" dependencies: argparse "^1.0.7" - esprima "^2.6.0" + esprima "^4.0.0" jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jsesc@^1.3.0: version "1.3.0" @@ -2510,38 +2716,40 @@ json5@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" jsonpointer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" jsonwebtoken@^7.0.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.3.0.tgz#85118d6a70e3fccdf14389f4e7a1c3f9c8a9fbba" + version "7.4.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz#77f5021de058b605a1783fa1283e99812e645638" dependencies: joi "^6.10.1" jws "^3.1.4" lodash.once "^4.0.0" - ms "^0.7.1" + ms "^2.0.0" xtend "^4.0.1" jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: - extsprintf "1.0.2" + assert-plus "1.0.0" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.4.tgz#0257ed1cc4b1e65b39d7d9940f9fb4f20f7ba0a9" - dependencies: - acorn-jsx "^3.0.1" - object-assign "^4.1.0" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" jwa@^1.1.4: version "1.1.5" @@ -2565,10 +2773,16 @@ jwt-simple@^0.5.1: resolved "https://registry.yarnpkg.com/jwt-simple/-/jwt-simple-0.5.1.tgz#79ea01891b61de6b68e13e67c0b4b5bda937b294" kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" dependencies: - is-buffer "^1.0.2" + is-buffer "^1.1.5" latest-version@^1.0.0: version "1.0.1" @@ -2576,6 +2790,10 @@ latest-version@^1.0.0: dependencies: package-json "^1.0.0" +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -2648,6 +2866,10 @@ lodash.assign@^3.0.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" @@ -2667,6 +2889,10 @@ lodash.defaults@^3.1.2: lodash.assign "^3.0.0" lodash.restparam "^3.0.0" +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -2676,8 +2902,8 @@ lodash.isarray@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" lodash.isequal@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" lodash.isobject@^3.0.2: version "3.0.2" @@ -2695,6 +2921,10 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.merge@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + lodash.once@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" @@ -2707,21 +2937,29 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash@4.16.4, lodash@^4.0.0, lodash@^4.15.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0: +lodash@4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" dependencies: chalk "^1.0.0" +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + loose-envify@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: - js-tokens "^2.0.0" + js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" @@ -2793,25 +3031,31 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.25.0: - version "1.25.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: - version "2.1.13" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" dependencies: - mime-db "~1.25.0" + mime-db "~1.29.0" mime@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: - brace-expansion "^1.0.0" + brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" @@ -2821,22 +3065,26 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" mocha@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" + version "3.5.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.0.tgz#1328567d2717f997030f8006234bce9b8cd72465" dependencies: browser-stdout "1.3.0" commander "2.9.0" - debug "2.2.0" - diff "1.4.0" + debug "2.6.8" + diff "3.2.0" escape-string-regexp "1.0.5" - glob "7.0.5" + glob "7.1.1" growl "1.9.2" json3 "3.3.2" lodash.create "3.1.1" @@ -2844,18 +3092,14 @@ mocha@^3.1.2: supports-color "3.1.2" moment@2.x.x: - version "2.17.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.1.tgz#fed9506063f36b10f066c8b59a144d7faebe1d82" - -mongo-find-by-ids@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mongo-find-by-ids/-/mongo-find-by-ids-1.0.0.tgz#c4e7a108e2b9fb98f59eb8be5d3801b2bfb52222" + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" -mongodb-core@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.0.tgz#49a5edf476f6cc16c4ff7d423802a88080d992fb" +mongodb-core@2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.15.tgz#841f53b87ffff4c7458189c35c8ae827e1169764" dependencies: - bson "~1.0.0" + bson "~1.0.4" require_optional "~1.0.0" mongodb-download@^1.3.2: @@ -2877,25 +3121,43 @@ mongodb-prebuilt@^5.0.7: spawn-sync "1.0.15" yargs "^3.26.0" -mongodb@^2.2.11: - version "2.2.13" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.13.tgz#f74315fbf64450265f920481fc7f17491b056b8a" +mongodb@^2.2.11, mongodb@^2.2.31: + version "2.2.31" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.31.tgz#1940445c661e19217bb3bf8245d9854aaef548db" dependencies: es6-promise "3.2.1" - mongodb-core "2.1.0" - readable-stream "2.1.5" + mongodb-core "2.1.15" + readable-stream "2.2.7" + +morgan@^1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687" + dependencies: + basic-auth "~1.1.0" + debug "2.6.8" + depd "~1.1.0" + on-finished "~2.3.0" + on-headers "~1.0.1" -ms@0.7.1, ms@^0.7.1: +ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@2.0.0, ms@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" -nan@2.5.0, nan@^2.3.0, nan@^2.3.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" +nan@2.6.2, nan@^2.3.0, nan@^2.3.3: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" natural-compare@^1.4.0: version "1.4.0" @@ -2912,34 +3174,30 @@ nested-error-stacks@^1.0.0: inherits "~2.0.1" node-fetch@^1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.2.tgz#c54e9aac57e432875233525f3c891c4159ffefd7" dependencies: encoding "^0.1.11" is-stream "^1.0.1" -node-pre-gyp@0.6.32, node-pre-gyp@^0.6.29: - version "0.6.32" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" +node-pre-gyp@0.6.36, node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.1" - rc "~1.1.6" - request "^2.79.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" node-static@0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/node-static/-/node-static-0.5.9.tgz#2f5bf30949e1735958266c269413aebce8cbe899" -node-uuid@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - nodeify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" @@ -2962,38 +3220,41 @@ nodemon@1.11.0: undefsafe "0.0.3" update-notifier "0.5.0" -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: abbrev "1" + osenv "^0.1.4" -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" dependencies: abbrev "1" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" -npmlog@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" - gauge "~2.7.1" + gauge "~2.7.3" set-blocking "~2.0.0" number-is-nan@^1.0.0: @@ -3012,9 +3273,9 @@ object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +object-assign@^4, object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" object.omit@^2.0.0: version "2.0.1" @@ -3033,22 +3294,23 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0: +once@^1.3.0, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" -once@~1.3.0, once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -3085,9 +3347,9 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.3.tgz#83cf05c6d6458fc4d5ac6362ea325d92f2754217" +osenv@^0.1.0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -3158,7 +3420,7 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3166,6 +3428,10 @@ path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -3192,6 +3458,10 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3234,14 +3504,18 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6, private@~0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" +private@^0.1.6, private@^0.1.7, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" @@ -3253,11 +3527,11 @@ promise@~1.3.0: is-promise "~1" proxy-addr@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" + version "1.1.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" dependencies: forwarded "~0.1.0" - ipaddr.js "1.1.1" + ipaddr.js "1.4.0" ps-tree@^1.0.1: version "1.1.0" @@ -3273,20 +3547,20 @@ qs@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" random-bytes@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" + is-number "^3.0.0" + kind-of "^4.0.0" range-parser@~1.2.0: version "1.2.0" @@ -3300,14 +3574,14 @@ raw-body@~2.1.7: iconv-lite "0.4.13" unpipe "1.0.0" -rc@^1.0.1, rc@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" +rc@^1.0.1, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" dependencies: deep-extend "~0.4.0" ini "~1.3.0" minimist "^1.2.0" - strip-json-comments "~1.0.4" + strip-json-comments "~2.0.1" read-all-stream@^3.0.0: version "3.1.0" @@ -3331,16 +3605,16 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@2.1.5, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" +readable-stream@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" dependencies: - buffer-shims "^1.0.0" + buffer-shims "~1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + string_decoder "~1.0.0" util-deprecate "~1.0.1" "readable-stream@>=1.0.33-1 <1.1.0-0": @@ -3352,15 +3626,16 @@ readable-stream@2.1.5, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.1 isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@~2.0.0, readable-stream@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: core-util-is "~1.0.0" - inherits "~2.0.1" + inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" util-deprecate "~1.0.1" readdirp@^2.0.0: @@ -3380,6 +3655,16 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" +recast@^0.12.6: + version "0.12.6" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.6.tgz#4b0fb82feb1d10b3bd62d34943426d9b3ed30d4c" + dependencies: + ast-types "0.9.11" + core-js "^2.4.1" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.5.0" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -3391,9 +3676,21 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" regex-cache@^0.4.2: version "0.4.3" @@ -3426,6 +3723,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" @@ -3450,18 +3751,18 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@^2.65.0, request@^2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" +request@^2.65.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" - caseless "~0.11.0" + caseless "~0.12.0" combined-stream "~1.0.5" extend "~3.0.0" forever-agent "~0.6.1" form-data "~2.1.1" - har-validator "~2.0.6" + har-validator "~4.2.1" hawk "~3.1.3" http-signature "~1.1.0" is-typedarray "~1.0.0" @@ -3469,10 +3770,12 @@ request@^2.65.0, request@^2.79.0: json-stringify-safe "~5.0.1" mime-types "~2.1.7" oauth-sign "~0.8.1" - qs "~6.3.0" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" stringstream "~0.0.4" tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" + tunnel-agent "^0.6.0" uuid "^3.0.0" require-uncached@^1.0.2: @@ -3483,8 +3786,8 @@ require-uncached@^1.0.2: resolve-from "^1.0.0" require_optional@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.0.tgz#52a86137a849728eb60a55533617f8f914f59abf" + version "1.0.1" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" dependencies: resolve-from "^2.0.0" semver "^5.1.0" @@ -3498,8 +3801,10 @@ resolve-from@^2.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" resolve@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + dependencies: + path-parse "^1.0.5" restore-cursor@^1.0.1: version "1.0.1" @@ -3508,9 +3813,15 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" -rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" @@ -3524,9 +3835,9 @@ rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" seek-bzip@^1.0.3: version "1.0.5" @@ -3550,9 +3861,9 @@ semver-truncate@^1.0.0: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" semver@^4.0.3: version "4.3.6" @@ -3580,14 +3891,32 @@ send@0.14.1: range-parser "~1.2.0" statuses "~1.3.0" +send@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.1" + mime "1.3.4" + ms "0.7.2" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + serve-static@~1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" + version "1.11.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.2.tgz#2cf9889bd4435a320cc36895c9aa57bd662e6ac7" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" parseurl "~1.3.1" - send "0.14.1" + send "0.14.2" set-blocking@~2.0.0: version "2.0.0" @@ -3601,6 +3930,10 @@ setprototypeof@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" @@ -3631,15 +3964,21 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -source-map-support@^0.4.2: - version "0.4.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" +source-map-support@^0.4.15, source-map-support@^0.4.2: + version "0.4.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.16.tgz#16fecf98212467d017d586a2af68d628b9421cd8" dependencies: - source-map "^0.5.3" + source-map "^0.5.6" -source-map@^0.5.0, source-map@^0.5.3: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" spawn-sync@1.0.15: version "1.0.15" @@ -3673,8 +4012,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -3683,15 +4022,18 @@ sshpk@^1.7.0: optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" jsbn "~0.1.0" tweetnacl "~0.14.0" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + stat-mode@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" -"statuses@>= 1.3.1 < 2", statuses@~1.3.0: +"statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -3718,7 +4060,7 @@ string-length@^1.0.0: dependencies: strip-ansi "^3.0.0" -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -3727,16 +4069,22 @@ string-width@^1.0.1: strip-ansi "^3.0.0" string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" + strip-ansi "^4.0.0" string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@~1.0.0, string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3747,6 +4095,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" @@ -3781,10 +4135,14 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: +strip-json-comments@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + subscriptions-transport-ws@0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.2.6.tgz#433861167c25ef9a2b8697e9403afa2a77656cb3" @@ -3810,10 +4168,6 @@ supports-color@3.1.2: dependencies: has-flag "^1.0.0" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -3829,29 +4183,29 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" tar-stream@^1.1.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" + version "1.5.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" dependencies: bl "^1.0.0" end-of-stream "^1.0.0" readable-stream "^2.0.0" xtend "^4.0.0" -tar@~2.2.1: +tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -3898,9 +4252,9 @@ to-absolute-glob@^0.1.1: dependencies: extend-shallow "^2.0.1" -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" topo@1.x.x: version "1.1.0" @@ -3924,17 +4278,23 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.4" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.4.tgz#8c9dbfb52795686f166cd2023794bcf103d13c2b" + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" type-check@~0.3.2: version "0.3.2" @@ -3951,11 +4311,11 @@ type-detect@^1.0.0: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" type-is@~1.6.13: - version "1.6.14" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" dependencies: media-typer "0.3.0" - mime-types "~2.1.13" + mime-types "~2.1.15" typed-graphql@^1.0.2: version "1.0.2" @@ -3967,19 +4327,31 @@ typedarray-to-buffer@^3.1.2: dependencies: is-typedarray "^1.0.0" -typedarray@~0.0.5: +typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uid-number@~0.0.6: +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" uid-safe@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.3.tgz#077e264a00b3187936b270bb7376a26473631071" + version "2.1.5" + resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" dependencies: - base64-url "1.3.3" random-bytes "~1.0.0" undefsafe@0.0.3: @@ -4023,6 +4395,12 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + utils-merge@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" @@ -4031,13 +4409,13 @@ uuid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" +uuid@^3.0.0, uuid@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" v8flags@^2.0.10: - version "2.0.11" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" dependencies: user-home "^1.1.1" @@ -4053,14 +4431,16 @@ validate-npm-package-license@^3.0.1: spdx-expression-parse "~1.0.0" vary@^1, vary@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + version "1.1.1" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: - extsprintf "1.0.2" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" vinyl-assign@^1.0.1: version "1.2.1" @@ -4107,24 +4487,47 @@ vinyl@^1.0.0: replace-ext "0.0.1" websocket@^1.0.23: - version "1.0.23" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.23.tgz#20de8ec4a7126b09465578cd5dbb29a9c296aac6" + version "1.0.24" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.24.tgz#74903e75f2545b6b2e1de1425bc1c905917a1890" dependencies: debug "^2.2.0" nan "^2.3.3" typedarray-to-buffer "^3.1.2" - yaeti "^0.0.4" + yaeti "^0.0.6" wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: - string-width "^1.0.1" + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" +winston@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -4141,10 +4544,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" write-file-atomic@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" dependencies: - graceful-fs "^4.1.2" + graceful-fs "^4.1.11" imurmurhash "^0.1.4" slide "^1.1.5" @@ -4168,9 +4571,9 @@ y18n@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yaeti@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.4.tgz#89fe739c45ac4491028973193262a837693a66b6" +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" yargs@^3.26.0: version "3.32.0" @@ -4184,9 +4587,18 @@ yargs@^3.26.0: window-size "^0.1.4" y18n "^3.2.0" +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + yauzl@^2.2.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.7.0.tgz#e21d847868b496fc29eaec23ee87fdd33e9b2bce" + version "2.8.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.0.1" diff --git a/test/seeds/Tweet.json b/test/seeds/Tweet.json index 1edc5e9..50bc59c 100644 --- a/test/seeds/Tweet.json +++ b/test/seeds/Tweet.json @@ -1,6 +1,6 @@ -{"_id":{"$oid":"583676d3618530145474e352"},"authorId":{"$oid":"583291a1638566b3c5a92ca1"},"body":"We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:","createdAt":1.479964371334e+12,"updatedAt":1.479964371334e+12} -{"_id":{"$oid":"583676d3618530145474e355"},"authorId":{"$oid":"583291a1638566b3c5a92ca2"},"body":"Where have I heard this before","createdAt":1.479964438372e+12,"updatedAt":1.479964438372e+12} -{"_id":{"$oid":"583676d3618530145474e351"},"authorId":{"$oid":"583291a1638566b3c5a92ca0"},"body":"Good times bringing Apollo Optics to Rails over the last few months with @tmeasday @chollier @cjoudrey @rmosolgo and others!","createdAt":1.479964352544e+12,"updatedAt":1.479964352544e+12} -{"_id":{"$oid":"583676d3618530145474e354"},"authorId":{"$oid":"583291a1638566b3c5a92ca2"},"body":"It will stop being insane. It will just be normal. TV changed presidential politics, now it's social media's turn.","createdAt":1.479964423351e+12,"updatedAt":1.479964423351e+12} -{"_id":{"$oid":"583676d3618530145474e353"},"authorId":{"$oid":"583291a1638566b3c5a92ca1"},"body":"Help improve @apollographql integration with #redux dev tools:","createdAt":1.479964386822e+12,"updatedAt":1.479964386822e+12} -{"_id":{"$oid":"583676d3618530145474e350"},"authorId":{"$oid":"583291a1638566b3c5a92ca0"},"body":"A #graphql-first development workflow based on real world lessons, from @danimman \u0026 @stubailo:","createdAt":1.479964340853e+12,"updatedAt":1.479964340853e+12} +{"_id":{"$oid":"583676d3618530145474e352"},"authorId":{"$oid":"583291a1638566b3c5a92ca1"},"coauthorsIds":[],"body":"We put our hearts into this talk about a #GraphQL-first workflow and how it helped us build apps fast:","createdAt":1.479964371334e+12,"updatedAt":1.479964371334e+12, "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583676d3618530145474e355"},"authorId":{"$oid":"583291a1638566b3c5a92ca2"},"coauthorsIds":[{"$oid":"583291a1638566b3c5a92ca1"}],"body":"Where have I heard this before","createdAt":1.479964438372e+12,"updatedAt":1.479964438372e+12, "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583676d3618530145474e351"},"authorId":{"$oid":"583291a1638566b3c5a92ca0"},"coauthorsIds":[{"$oid":"583291a1638566b3c5a92ca2"},{"$oid":"583291a1638566b3c5a92ca1"}],"body":"Good times bringing Apollo Optics to Rails over the last few months with @tmeasday @chollier @cjoudrey @rmosolgo and others!","createdAt":1.479964352544e+12,"updatedAt":1.479964352544e+12, "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583676d3618530145474e354"},"authorId":{"$oid":"583291a1638566b3c5a92ca2"},"coauthorsIds":[{"$oid":"583291a1638566b3c5a92ca0"},{"$oid":"583291a1638566b3c5a92ca1"}],"body":"It will stop being insane. It will just be normal. TV changed presidential politics, now it's social media's turn.","createdAt":1.479964423351e+12,"updatedAt":1.479964423351e+12, "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583676d3618530145474e353"},"authorId":{"$oid":"583291a1638566b3c5a92ca1"},"coauthorsIds":[{"$oid":"583291a1638566b3c5a92ca2"},{"$oid":"583291a1638566b3c5a92ca0"}],"body":"Help improve @apollographql integration with #redux dev tools:","createdAt":1.479964386822e+12,"updatedAt":1.479964386822e+12, "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583676d3618530145474e350"},"authorId":{"$oid":"583291a1638566b3c5a92ca0"},"coauthorsIds":[{"$oid":"583291a1638566b3c5a92ca1"},{"$oid":"583291a1638566b3c5a92ca2"}],"body":"A #graphql-first development workflow based on real world lessons, from @danimman \u0026 @stubailo:","createdAt":1.479964340853e+12,"updatedAt":1.479964340853e+12, "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} diff --git a/test/seeds/User.json b/test/seeds/User.json index 1618acf..8c15dad 100644 --- a/test/seeds/User.json +++ b/test/seeds/User.json @@ -1,3 +1,3 @@ -{"_id":{"$oid":"583291a1638566b3c5a92ca1"},"bio":"tech lead @meteorjs @apollographql","createdAt":1.479776905993e+12,"followingIds":[{"$oid":"583291a1638566b3c5a92ca0"}],"likedIds":[{"$oid":"583676d3618530145474e350"},{"$oid":"583676d3618530145474e351"}],"updatedAt":1.479776905993e+12,"username":"stubailo"} -{"_id":{"$oid":"583291a1638566b3c5a92ca0"},"bio":"I build things with @percolatestudio. Author of @discovermeteor. Exploring how to improve user experience through technology, design and performance.","createdAt":1.479776904993e+12,"followingIds":[{"$oid":"583291a1638566b3c5a92ca1"},{"$oid":"583291a1638566b3c5a92ca2"}],"likedIds":[{"$oid":"583676d3618530145474e352"},{"$oid":"583676d3618530145474e353"},{"$oid":"583676d3618530145474e354"}],"updatedAt":1.479776904993e+12,"username":"tmeasday"} -{"_id":{"$oid":"583291a1638566b3c5a92ca2"},"bio":"Co-founder of Parse, now at Facebook. Ex Google search quality, game developer \u0026 math contester.","createdAt":1.479776906993e+12,"followingIds":[{"$oid":"583291a1638566b3c5a92ca1"}],"likedIds":[{"$oid":"583676d3618530145474e350"},{"$oid":"583676d3618530145474e353"}],"updatedAt":1.479776906993e+12,"username":"lacker"} +{"_id":{"$oid":"583291a1638566b3c5a92ca1"},"bio":"tech lead @meteorjs @apollographql","createdAt":1.479776905993e+12,"followingIds":[{"$oid":"583291a1638566b3c5a92ca0"}],"likedIds":[{"$oid":"583676d3618530145474e350"},{"$oid":"583676d3618530145474e351"}],"updatedAt":1.479776905993e+12,"username":"stubailo", "role":"admin", "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583291a1638566b3c5a92ca0"},"bio":"I build things with @percolatestudio. Author of @discovermeteor. Exploring how to improve user experience through technology, design and performance.","createdAt":1.479776904993e+12,"followingIds":[{"$oid":"583291a1638566b3c5a92ca1"},{"$oid":"583291a1638566b3c5a92ca2"}],"likedIds":[{"$oid":"583676d3618530145474e352"},{"$oid":"583676d3618530145474e353"},{"$oid":"583676d3618530145474e354"}],"updatedAt":1.479776904993e+12,"username":"tmeasday", "role": "editor", "hash":"$2a$10$SeepHv0X3GZfSzl0uqlXmucLsP2VjdI.nuA0UJnmOtEecLSx.RiWe", "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} +{"_id":{"$oid":"583291a1638566b3c5a92ca2"},"bio":"Co-founder of Parse, now at Facebook. Ex Google search quality, game developer \u0026 math contester.","createdAt":1.479776906993e+12,"followingIds":[{"$oid":"583291a1638566b3c5a92ca1"}],"likedIds":[{"$oid":"583676d3618530145474e350"},{"$oid":"583676d3618530145474e353"}],"updatedAt":1.479776906993e+12,"username":"lacker", "role": "user", "createdById":{"$oid":"583291a1638566b3c5a92ca1"}, "updatedById":{"$oid":"583291a1638566b3c5a92ca1"}} diff --git a/test/test-add-update-remove.sh b/test/test-add-update-remove.sh index 40fb69e..9b7e96b 100755 --- a/test/test-add-update-remove.sh +++ b/test/test-add-update-remove.sh @@ -105,7 +105,7 @@ if exists "./model/User.js" && exists "./schema/User.graphql" && exists "./schema/Tweet.graphql" && exists "./schema/Order.graphql" && - hasRef "./model/index.js" "User" 4 && + hasRef "./model/index.js" "User" 9 && hasRef "./model/index.js" "Tweet" 4 && hasRef "./model/index.js" "Order" 4 && hasRef "./resolvers/index.js" "userResolvers" 2 && @@ -133,7 +133,7 @@ if exists "./model/User.js" && exists "./schema/User.graphql" && exists "./schema/Tweet.graphql" && exists "./schema/Order.graphql" && - hasRef "./model/index.js" "User" 4 && + hasRef "./model/index.js" "User" 9 && hasRef "./model/index.js" "Tweet" 4 && hasRef "./model/index.js" "Order" 4 && hasRef "./resolvers/index.js" "userResolvers" 2 && @@ -215,7 +215,7 @@ if exists "./model/User.js" && exists "./schema/User.graphql" && exists "./schema/Tweet.graphql" && exists "./schema/Order.graphql" && - hasRef "./model/index.js" "User" 4 && + hasRef "./model/index.js" "User" 9 && hasRef "./model/index.js" "Tweet" 4 && hasRef "./model/index.js" "Order" 4 && hasRef "./resolvers/index.js" "userResolvers" 2 && diff --git a/yarn.lock b/yarn.lock index 45f42dc..dfc199e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,10 +3,10 @@ abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" -acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: +acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" dependencies: @@ -16,50 +16,81 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" +acorn@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" ajv-keywords@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" -ajv@^4.7.0: - version "4.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.8.2.tgz#65486936ca36fea39a1504332a78bebd5d447bdc" +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ajv@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" -ansi-regex@^2.0.0: +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" ansi-styles@^2.1.0, ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: - arrify "^1.0.0" micromatch "^2.1.5" + normalize-path "^2.0.0" aproba@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" dependencies: delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" + readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.9" @@ -74,8 +105,8 @@ arr-diff@^2.0.0: arr-flatten "^1.0.1" arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" array-find-index@^1.0.1: version "1.0.2" @@ -103,26 +134,44 @@ asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +assert@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" -ast-types@0.9.2: - version "0.9.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.2.tgz#2cc19979d15c655108bf565323b8e7ee38751f6b" +ast-types@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.11.tgz#371177bb59232ff5ceaa1d09ee5cad705b1a5aa9" + +ast-types@0.9.6: + version "0.9.6" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -132,8 +181,8 @@ aws-sign2@~0.6.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" aws4@^1.2.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" babel-cli@6.16.0: version "6.16.0" @@ -161,15 +210,15 @@ babel-cli@6.16.0: optionalDependencies: chokidar "^1.0.0" -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - chalk "^1.1.0" + chalk "^1.1.3" esutils "^2.0.2" - js-tokens "^2.0.0" + js-tokens "^3.0.2" -babel-core@6.17.0, babel-core@^6.16.0: +babel-core@6.17.0: version "6.17.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.17.0.tgz#6c4576447df479e241e58c807e4bc7da4db7f425" dependencies: @@ -195,165 +244,189 @@ babel-core@6.17.0, babel-core@^6.16.0: slash "^1.0.0" source-map "^0.5.0" -babel-eslint@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.0.0.tgz#54e51b4033f54ac81326ecea4c646a779935196d" +babel-core@^6.16.0, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-eslint@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" dependencies: - babel-traverse "^6.15.0" - babel-types "^6.15.0" - babylon "^6.11.2" - lodash.pickby "^4.6.0" + babel-code-frame "^6.22.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.17.0" -babel-generator@^6.17.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" +babel-generator@^6.17.0, babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" detect-indent "^4.0.0" jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" -babel-helper-bindify-decorators@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" dependencies: - babel-helper-explode-assignable-expression "^6.18.0" - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-builder-react-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.18.0.tgz#ab02f19a2eb7ace936dd87fa55896d02be59bf71" +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - esutils "^2.0.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" -babel-helper-call-delegate@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" - dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" -babel-helper-explode-assignable-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" dependencies: - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-explode-class@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" dependencies: - babel-helper-bindify-decorators "^6.18.0" - babel-runtime "^6.0.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" dependencies: - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-get-function-arity@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-hoist-variables@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-optimise-call-expression@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" -babel-helper-regex@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.18.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" -babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" dependencies: - babel-helper-function-name "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" dependencies: - babel-helper-optimise-call-expression "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" +babel-helpers@^6.16.0, babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" +babel-messages@^6.23.0, babel-messages@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -387,286 +460,283 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" -babel-plugin-syntax-trailing-function-commas@^6.3.13: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" -babel-plugin-transform-async-generator-functions@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" dependencies: - babel-helper-remap-async-to-generator "^6.16.2" + babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" -babel-plugin-transform-async-to-generator@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" dependencies: - babel-helper-remap-async-to-generator "^6.16.0" + babel-helper-remap-async-to-generator "^6.24.1" babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-class-properties@^6.16.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.18.0.tgz#bc1266a39d4c8726e0bd7b15c56235177e6ede57" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" dependencies: - babel-helper-function-name "^6.18.0" + babel-helper-function-name "^6.24.1" babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.9.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" dependencies: - babel-helper-define-map "^6.8.0" - babel-helper-explode-class "^6.8.0" + babel-helper-explode-class "^6.24.1" babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" - babel-types "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" babel-plugin-transform-es2015-arrow-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: - babel-runtime "^6.9.0" - babel-template "^6.15.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-plugin-transform-es2015-classes@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" - dependencies: - babel-helper-define-map "^6.18.0" - babel-helper-function-name "^6.18.0" - babel-helper-optimise-call-expression "^6.18.0" - babel-helper-replace-supers "^6.18.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-template "^6.14.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" babel-plugin-transform-es2015-computed-properties@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: - babel-helper-define-map "^6.8.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-destructuring@^6.16.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.18.0.tgz#a08fb89415ab82058649558bedb7bf8dafa76ba5" + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: - babel-runtime "^6.9.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-duplicate-keys@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-for-of@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-function-name@^6.9.0: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" dependencies: - babel-helper-function-name "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.9.0" + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-literals@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" -babel-plugin-transform-es2015-modules-amd@^6.18.0, babel-plugin-transform-es2015-modules-amd@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" +babel-plugin-transform-es2015-modules-amd@^6.24.1, babel-plugin-transform-es2015-modules-amd@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.16.0, babel-plugin-transform-es2015-modules-commonjs@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" +babel-plugin-transform-es2015-modules-commonjs@^6.16.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: - babel-plugin-transform-strict-mode "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.16.0" - babel-types "^6.18.0" + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" babel-plugin-transform-es2015-modules-systemjs@^6.14.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.18.0.tgz#f09294707163edae4d3b3e8bfacecd01d920b7ad" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" dependencies: - babel-helper-hoist-variables "^6.18.0" - babel-runtime "^6.11.6" - babel-template "^6.14.0" + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-modules-umd@^6.12.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" dependencies: - babel-plugin-transform-es2015-modules-amd "^6.18.0" - babel-runtime "^6.0.0" - babel-template "^6.8.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" babel-plugin-transform-es2015-object-super@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" dependencies: - babel-helper-replace-supers "^6.8.0" - babel-runtime "^6.0.0" + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-parameters@^6.16.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: - babel-helper-call-delegate "^6.18.0" - babel-helper-get-function-arity "^6.18.0" - babel-runtime "^6.9.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" babel-plugin-transform-es2015-shorthand-properties@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-spread@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-sticky-regex@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" - babel-types "^6.8.0" + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-plugin-transform-es2015-template-literals@^6.6.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-typeof-symbol@^6.6.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-es2015-unicode-regex@^6.3.13: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" dependencies: - babel-helper-regex "^6.8.0" - babel-runtime "^6.0.0" + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-exponentiation-operator@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-flow-strip-types@^6.3.13: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz#4d3e642158661e9b40db457c004a30817fa32592" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" dependencies: babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" -babel-plugin-transform-object-rest-spread@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.16.0.tgz#db441d56fffc1999052fdebe2e2f25ebd28e36a9" +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.26.0" babel-plugin-transform-react-display-name@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.8.0.tgz#f7a084977383d728bdbdc2835bba0159577f660e" + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-react-jsx-self@^6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.11.0.tgz#605c9450c1429f97a930f7e1dfe3f0d9d0dbd0f4" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" dependencies: babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" + babel-runtime "^6.22.0" babel-plugin-transform-react-jsx-source@^6.3.13: - version "6.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.9.0.tgz#af684a05c2067a86e0957d4f343295ccf5dccf00" + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" dependencies: babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.9.0" + babel-runtime "^6.22.0" babel-plugin-transform-react-jsx@^6.3.13: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.8.0.tgz#94759942f70af18c617189aa7f3593f1644a71ab" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" dependencies: - babel-helper-builder-react-jsx "^6.8.0" + babel-helper-builder-react-jsx "^6.24.1" babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-regenerator@^6.16.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.16.0" - private "~0.1.5" + regenerator-transform "^0.10.0" -babel-plugin-transform-strict-mode@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" dependencies: - babel-runtime "^6.0.0" - babel-types "^6.18.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" babel-polyfill@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" dependencies: - babel-runtime "^6.9.1" - core-js "^2.4.0" - regenerator-runtime "^0.9.5" + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" babel-preset-es2015@6.16.0: version "6.16.0" @@ -718,16 +788,16 @@ babel-preset-stage-2@6.17.0: babel-preset-stage-3 "^6.17.0" babel-preset-stage-3@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" dependencies: - babel-plugin-syntax-trailing-function-commas "^6.3.13" - babel-plugin-transform-async-generator-functions "^6.17.0" - babel-plugin-transform-async-to-generator "^6.16.0" - babel-plugin-transform-exponentiation-operator "^6.3.13" - babel-plugin-transform-object-rest-spread "^6.16.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@6.16.3, babel-register@^6.16.0: +babel-register@6.16.3: version "6.16.3" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624" dependencies: @@ -740,57 +810,69 @@ babel-register@6.16.3, babel-register@^6.16.0: path-exists "^1.0.0" source-map-support "^0.4.2" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" +babel-register@^6.16.0, babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: - babel-code-frame "^6.16.0" - babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.18.0" - babylon "^6.11.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" -babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" +babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: - babel-runtime "^6.9.1" + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.16.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.16.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" + lodash "^4.17.4" + to-fast-properties "^1.0.3" -babylon, babylon@^6.11.0, babylon@^6.11.2: - version "6.14.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" +babylon@^6.11.0, babylon@^6.14.1, babylon@^6.17.0, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" bcrypt-pbkdf@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" dependencies: tweetnacl "^0.14.3" @@ -810,8 +892,8 @@ bin-version@^1.0.0: find-versions "^1.0.0" binary-extensions@^1.0.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" block-stream@*: version "0.0.9" @@ -825,11 +907,11 @@ boom@2.x.x: dependencies: hoek "2.x.x" -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" +brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: - balanced-match "^0.4.1" + balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: @@ -844,7 +926,11 @@ browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -buffer-shims@^1.0.0: +bson@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" + +buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -869,28 +955,55 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -chai: - version "3.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" + align-text "^0.1.3" + lazy-cache "^1.0.3" -chai-diff: +chai-diff@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chai-diff/-/chai-diff-1.0.1.tgz#6c66894700d80cd90350ab4e4403625d4f53a1c1" dependencies: diff "^2.2.1" +chai-json-equal@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/chai-json-equal/-/chai-json-equal-0.0.1.tgz#338fcbbdaec63349379c7c4278c8a28da3b141a1" + +chai-spies-next@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/chai-spies-next/-/chai-spies-next-0.9.3.tgz#672a84f68824af152ea1cbdda5a96f1a066302b9" + +chai-string@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.4.0.tgz#359140c051d36a4e4b1a5fc6b910152f438a8d49" + +chai-subset@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/chai-subset/-/chai-subset-1.6.0.tgz#a5d0ca14e329a79596ed70058b6646bd6988cfe9" + +chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + chalk@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.1.tgz#509afb67066e7499f7eb3535c77445772ae2d019" @@ -901,7 +1014,7 @@ chalk@1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -911,13 +1024,21 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" chokidar@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: anymatch "^1.3.0" async-each "^1.0.0" @@ -930,19 +1051,27 @@ chokidar@^1.0.0: optionalDependencies: fsevents "^1.0.0" -circular-json@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: - restore-cursor "^1.0.1" + restore-cursor "^2.0.0" cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" co@^4.6.0: version "4.6.0" @@ -952,29 +1081,47 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +color-convert@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@^2.8.1, commander@^2.9.0: +commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" +commander@^2.8.1: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" +concat-stream@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" @@ -984,27 +1131,72 @@ contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" -convert-source-map@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" +convert-source-map@^1.1.0, convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -cpr: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.0.0.tgz#c2a447c9516c37ebb647caa2616beefa2ee67011" +cpr@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cpr/-/cpr-2.2.0.tgz#2dc6c87dfb78012489cdd994227628c320e9a17b" dependencies: graceful-fs "^4.1.5" minimist "^1.2.0" mkdirp "~0.5.1" rimraf "^2.5.4" +create-graphql-server-authorization@^0.0.45: + version "0.0.45" + resolved "https://registry.yarnpkg.com/create-graphql-server-authorization/-/create-graphql-server-authorization-0.0.45.tgz#b871b25281f85044aea8d213ca0091ca1e638655" + dependencies: + assert "^1.4.1" + babylon "^6.18.0" + chai-string "^1.4.0" + create-graphql-server-find-by-ids "^0.0.4" + create-graphql-server-logging "^0.0.3" + global "^4.3.2" + graphql "^0.11.1" + handlebars "^4.0.10" + iterall "^1.1.0" + lodash "4.16.4" + lodash.clonedeep "^4.5.0" + lodash.includes "^4.3.0" + lodash.merge "^4.6.0" + mongodb "^2.2.31" + recast "^0.12.6" + winston "^2.3.1" + +create-graphql-server-find-by-ids@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/create-graphql-server-find-by-ids/-/create-graphql-server-find-by-ids-0.0.4.tgz#02d35103a55648d5589f0023f242047462396ef6" + dependencies: + babylon "^6.18.0" + +create-graphql-server-logging@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/create-graphql-server-logging/-/create-graphql-server-logging-0.0.3.tgz#8b8b9c44ee5d6a9964696059a26858d57ea3bb79" + dependencies: + babylon "^6.18.0" + chai-json-equal "^0.0.1" + chai-spies-next "^0.9.3" + chai-subset "^1.6.0" + winston "^2.3.1" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -1021,35 +1213,37 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" dependencies: - es5-ext "~0.10.2" + es5-ext "^0.10.9" damerau-levenshtein@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" dashdash@^1.12.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" dependencies: assert-plus "^1.0.0" -debug@2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" +dataloader@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.3.0.tgz#6fec5be4b30a712e4afd30b86b4334566b97673b" -debug@^2.1.1, debug@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.2.tgz#94cb466ef7d6d2c7e5245cdd6e4104f2d0d70d30" +debug@2.6.8, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: - ms "0.7.2" + ms "2.0.0" -decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1060,8 +1254,8 @@ deep-eql@^0.1.3: type-detect "0.1.1" deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" deep-is@~0.1.3: version "0.1.3" @@ -1087,7 +1281,7 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -denodeify: +denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" @@ -1097,9 +1291,9 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" diff@^2.2.1: version "2.2.3" @@ -1119,6 +1313,17 @@ doctrine@^1.2.2: esutils "^2.0.2" isarray "^1.0.0" +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1132,76 +1337,62 @@ encoding@^0.1.11: iconv-lite "~0.4.13" error-ex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" -es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.30" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" dependencies: es6-iterator "2" es6-symbol "~3.1" -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" +es6-iterator@2, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" es6-map@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-set "~0.1.3" - es6-symbol "~3.1.0" - event-emitter "~0.3.4" + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" -es6-set@^0.1.4, es6-set@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-symbol "3" - event-emitter "~0.3.4" +es6-promise@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" -es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" +es6-set@^0.1.4, es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" dependencies: - d "~0.1.1" - es5-ext "~0.10.11" + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" -es6-weak-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: - d "^0.1.1" - es5-ext "^0.10.8" - es6-iterator "2" - es6-symbol "3" + d "1" + es5-ext "~0.10.14" escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-config-airbnb-base@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-8.0.0.tgz#c5e958a469ab8af76aff068b43d784e5afe74ca7" @@ -1260,88 +1451,97 @@ eslint-plugin-react@6.4.1: doctrine "^1.2.2" jsx-ast-utils "^1.3.1" -eslint@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.8.1.tgz#7d02db44cd5aaf4fa7aa489e1f083baa454342ba" +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: - chalk "^1.1.3" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^1.2.2" - escope "^3.6.0" - espree "^3.3.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.5.0.tgz#bb75d3b8bde97fb5e13efcd539744677feb019c3" + dependencies: + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" + doctrine "^2.0.0" + eslint-scope "^3.7.1" + espree "^3.5.0" + esquery "^1.0.0" estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.2.0" - ignore "^3.1.5" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.6.0" - strip-bom "^3.0.0" - strip-json-comments "~1.0.1" - table "^3.7.8" + path-is-inside "^1.0.2" + pluralize "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" text-table "~0.2.0" - user-home "^2.0.0" -espree@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" +espree@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" dependencies: - acorn "^4.0.1" + acorn "^5.1.1" acorn-jsx "^3.0.0" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" esprima@~3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.2.tgz#954b5d19321ca436092fa90f06d6798531fe8184" + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" dependencies: - estraverse "~4.1.0" + estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -event-emitter@~0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" dependencies: - d "~0.1.1" - es5-ext "~0.10.7" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + d "1" + es5-ext "~0.10.14" expand-brackets@^0.1.4: version "0.1.5" @@ -1356,8 +1556,16 @@ expand-range@^1.8.1: fill-range "^2.1.0" extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" extglob@^0.3.1: version "0.3.2" @@ -1365,20 +1573,27 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" fast-levenshtein@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" dependencies: escape-string-regexp "^1.0.5" - object-assign "^4.1.0" file-entry-cache@^2.0.0: version "2.0.0" @@ -1388,8 +1603,8 @@ file-entry-cache@^2.0.0: object-assign "^4.0.1" filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" fill-range@^2.1.0: version "2.2.3" @@ -1418,31 +1633,31 @@ find-versions@^1.0.0: semver-regex "^1.0.0" flat-cache@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" dependencies: - circular-json "^0.3.0" + circular-json "^0.3.1" del "^2.0.2" graceful-fs "^4.1.2" write "^0.2.1" -for-in@^0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" for-own@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: - for-in "^0.1.5" + for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" form-data@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" @@ -1457,13 +1672,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0: - version "1.0.15" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" dependencies: nan "^2.3.0" - node-pre-gyp "^0.6.29" + node-pre-gyp "^0.6.36" -fstream-ignore@~1.0.5: +fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: @@ -1471,9 +1686,9 @@ fstream-ignore@~1.0.5: inherits "2" minimatch "^3.0.0" -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -1484,13 +1699,16 @@ function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" -gauge@~2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" - has-color "^0.1.7" has-unicode "^2.0.0" object-assign "^4.1.0" signal-exit "^3.0.0" @@ -1498,23 +1716,13 @@ gauge@~2.6.0: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" @@ -1531,9 +1739,9 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1552,20 +1760,27 @@ glob@^5.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" -globals@^9.0.0, globals@^9.2.0: - version "9.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.13.0.tgz#d97706b61600d8dbe94708c367d3fdcf48470b8f" +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^9.17.0, globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^5.0.0: version "5.0.0" @@ -1592,18 +1807,36 @@ graphql@0.7.2: dependencies: iterall "1.0.2" +graphql@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.1.tgz#c9f004255db946a7f5f48ada0041290b9bd02c3d" + dependencies: + iterall "^1.1.0" + growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" +handlebars@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" has-ansi@^2.0.0: version "2.0.0" @@ -1611,14 +1844,14 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-color@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" - has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -1649,9 +1882,16 @@ home-or-tmp@^1.0.0: os-tmpdir "^1.0.1" user-home "^1.1.1" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + hosted-git-info@^2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" http-signature@~1.1.0: version "1.1.1" @@ -1661,13 +1901,13 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@~0.4.13: - version "0.4.15" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" +iconv-lite@^0.4.17, iconv-lite@~0.4.13: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" -ignore@^3.1.5: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" +ignore@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" imurmurhash@^0.1.4: version "0.1.4" @@ -1686,35 +1926,40 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" +inquirer@^3.0.6: + version "3.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.2.tgz#c2aaede1507cc54d826818737742d621bef2e823" dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" cli-width "^2.0.0" - figures "^1.3.5" + external-editor "^2.0.4" + figures "^2.0.0" lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" through "^2.3.6" -invariant@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" +invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: loose-envify "^1.0.0" @@ -1728,9 +1973,9 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.0.2, is-buffer@~1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" +is-buffer@^1.1.5, is-buffer@~1.1.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" is-builtin-module@^1.0.0: version "1.0.0" @@ -1739,8 +1984,8 @@ is-builtin-module@^1.0.0: builtin-modules "^1.0.0" is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" @@ -1778,21 +2023,18 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: - version "2.15.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-number@^2.0.2, is-number@^2.1.0: +is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -1817,9 +2059,9 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" is-resolvable@^1.0.0: version "1.0.0" @@ -1843,13 +2085,17 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" -isstream@~0.1.2: +isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1857,26 +2103,28 @@ iterall@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.2.tgz#41a2e96ce9eda5e61c767ee5dc312373bb046e91" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" +iterall@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.1.tgz#f7f0af11e9a04ec6426260f5019d9fcca4d50214" -js-tokens@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.5.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" +js-yaml@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" dependencies: argparse "^1.0.7" - esprima "^2.6.0" + esprima "^4.0.0" jsbn@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" jsesc@^1.3.0: version "1.3.0" @@ -1886,11 +2134,15 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -1908,34 +2160,42 @@ json5@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" -jsonpointer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" - jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: - extsprintf "1.0.2" + assert-plus "1.0.0" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.3.tgz#ccfdbe0320ba03f7a1fc4e67ceaf7e2cc0169721" - dependencies: - acorn-jsx "^3.0.1" - object-assign "^4.1.0" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" kind-of@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: - is-buffer "^1.0.2" + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -1977,7 +2237,7 @@ lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" -lodash.clonedeep: +lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -2029,13 +2289,13 @@ lodash.merge@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" +lodash@4.16.4: + version "4.16.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" -lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0: - version "4.16.6" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" +lodash@^4.0.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" log-symbols@^1.0.2: version "1.0.2" @@ -2043,11 +2303,15 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + loose-envify@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: - js-tokens "^2.0.0" + js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" @@ -2056,6 +2320,13 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -2101,123 +2372,147 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.24.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.12" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" dependencies: - mime-db "~1.24.0" + mime-db "~1.29.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" dependencies: - brace-expansion "^1.0.0" + dom-walk "^0.1.0" -minimist, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -mkdirp, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -mocha: - version "3.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.1.2.tgz#51f93b432bf7e1b175ffc22883ccd0be32dba6b5" +mocha@^3.1.2: + version "3.5.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.5.0.tgz#1328567d2717f997030f8006234bce9b8cd72465" dependencies: browser-stdout "1.3.0" commander "2.9.0" - debug "2.2.0" - diff "1.4.0" + debug "2.6.8" + diff "3.2.0" escape-string-regexp "1.0.5" - glob "7.0.5" + glob "7.1.1" growl "1.9.2" json3 "3.3.2" lodash.create "3.1.1" mkdirp "0.5.1" supports-color "3.1.2" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" +mongodb-core@2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.15.tgz#841f53b87ffff4c7458189c35c8ae827e1169764" + dependencies: + bson "~1.0.4" + require_optional "~1.0.0" -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" +mongodb@^2.2.31: + version "2.2.31" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.31.tgz#1940445c661e19217bb3bf8245d9854aaef548db" + dependencies: + es6-promise "3.2.1" + mongodb-core "2.1.15" + readable-stream "2.2.7" -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -node-fetch: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" +node-fetch@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.2.tgz#c54e9aac57e432875233525f3c891c4159ffefd7" dependencies: encoding "^0.1.11" is-stream "^1.0.1" -node-pre-gyp@^0.6.29: - version "0.6.31" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.0" - rc "~1.1.6" - request "^2.75.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" - -node-uuid@~1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" - -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: abbrev "1" + osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" -npmlog@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" - gauge "~2.6.0" + gauge "~2.7.3" set-blocking "~2.0.0" number-is-nan@^1.0.0: @@ -2229,8 +2524,8 @@ oauth-sign@~0.8.1: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" object.omit@^2.0.0: version "2.0.1" @@ -2239,21 +2534,24 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -once@^1.3.0: +once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" -once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" dependencies: - wrappy "1" + mimic-fn "^1.0.0" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" optionator@^0.8.2: version "0.8.2" @@ -2270,10 +2568,17 @@ os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + output-file-sync@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" @@ -2307,14 +2612,18 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -2323,6 +2632,10 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -2349,9 +2662,9 @@ pkg-up@^1.0.0: dependencies: find-up "^1.0.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pluralize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" prelude-ls@~1.1.2: version "1.1.2" @@ -2361,41 +2674,49 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6, private@~0.1.5: - version "0.1.6" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" +private@^0.1.6, private@^0.1.7, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" randomatic@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" + is-number "^3.0.0" + kind-of "^4.0.0" -rc@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" dependencies: deep-extend "~0.4.0" ini "~1.3.0" minimist "^1.2.0" - strip-json-comments "~1.0.4" + strip-json-comments "~2.0.1" read-pkg-up@^1.0.1: version "1.0.1" @@ -2412,27 +2733,28 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" +readable-stream@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1" dependencies: - buffer-shims "^1.0.0" + buffer-shims "~1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@^2.0.2, readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: core-util-is "~1.0.0" - inherits "~2.0.1" + inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~1.0.6" - string_decoder "~0.10.x" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" util-deprecate "~1.0.1" readdirp@^2.0.0: @@ -2444,20 +2766,22 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" +recast@^0.11.18: + version "0.11.23" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" + ast-types "0.9.6" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" -recast: - version "0.11.18" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.18.tgz#07af6257ca769868815209401d4d60eef1b5b947" +recast@^0.12.6: + version "0.12.6" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.6.tgz#4b0fb82feb1d10b3bd62d34943426d9b3ed30d4c" dependencies: - ast-types "0.9.2" - esprima "~3.1.0" + ast-types "0.9.11" + core-js "^2.4.1" + esprima "~4.0.0" private "~0.1.5" source-map "~0.5.0" @@ -2472,9 +2796,21 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" regex-cache@^0.4.2: version "0.4.3" @@ -2501,6 +2837,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" @@ -2515,68 +2855,99 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@^2.65.0, request@^2.75.0: - version "2.78.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.78.0.tgz#e1c8dec346e1c81923b24acdb337f11decabe9cc" +request@^2.65.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" - caseless "~0.11.0" + caseless "~0.12.0" combined-stream "~1.0.5" extend "~3.0.0" forever-agent "~0.6.1" form-data "~2.1.1" - har-validator "~2.0.6" + har-validator "~4.2.1" hawk "~3.1.3" http-signature "~1.1.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.7" - node-uuid "~1.4.7" oauth-sign "~0.8.1" - qs "~6.3.0" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" stringstream "~0.0.4" tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" + tunnel-agent "^0.6.0" + uuid "^3.0.0" -require-uncached@^1.0.2: +require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" +require_optional@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e" + dependencies: + resolve-from "^2.0.0" + semver "^5.1.0" + resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + resolve@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + dependencies: + path-parse "^1.0.5" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + onetime "^2.0.0" + signal-exit "^3.0.2" -rimraf, rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" dependencies: - once "^1.3.0" + is-promise "^2.1.0" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" semver-regex@^1.0.0: version "1.0.0" @@ -2588,9 +2959,9 @@ semver-truncate@^1.0.0: dependencies: semver "^5.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" semver@^4.0.3: version "4.3.6" @@ -2604,17 +2975,19 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelljs@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8" - -signal-exit@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" slash@^1.0.0: version "1.0.0" @@ -2630,15 +3003,21 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -source-map-support@^0.4.2: - version "0.4.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" +source-map-support@^0.4.15, source-map-support@^0.4.2: + version "0.4.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.16.tgz#16fecf98212467d017d586a2af68d628b9421cd8" + dependencies: + source-map "^0.5.6" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: - source-map "^0.5.3" + amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" spdx-correct@~1.0.0: version "1.0.2" @@ -2659,8 +3038,8 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2669,11 +3048,14 @@ sshpk@^1.7.0: optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" jsbn "~0.1.0" tweetnacl "~0.14.0" -string-width@^1.0.1: +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -2681,16 +3063,18 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" + strip-ansi "^4.0.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +string_decoder@~1.0.0, string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" stringstream@~0.0.4: version "0.0.5" @@ -2702,25 +3086,27 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" dependencies: get-stdin "^4.0.1" -strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" supports-color@3.1.2: version "3.1.2" @@ -2732,9 +3118,15 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" +supports-color@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" + dependencies: + has-flag "^2.0.0" + +table@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" dependencies: ajv "^4.7.0" ajv-keywords "^1.0.0" @@ -2743,20 +3135,20 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - -tar@~2.2.1: +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -2772,9 +3164,15 @@ through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" tough-cookie@~2.3.0: version "2.3.2" @@ -2786,17 +3184,23 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" type-check@~0.3.2: version "0.3.2" @@ -2812,11 +3216,24 @@ type-detect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" -typedarray@~0.0.5: +typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uid-number@~0.0.6: +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -2824,19 +3241,23 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + v8flags@^2.0.10: - version "2.0.11" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" dependencies: user-home "^1.1.1" @@ -2847,17 +3268,48 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: - extsprintf "1.0.2" + isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: - string-width "^1.0.1" + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" wordwrap@~1.0.0: version "1.0.0" @@ -2873,6 +3325,15 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0"