From ed4ce4223799ac7f8c7424f7b81cc423a12223e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=CC=81rgio=20Ramos?= Date: Tue, 3 Oct 2017 11:57:18 +0100 Subject: [PATCH] feat(gql-cloudapi): template tag schema re-write - uniform api usage for some models (account/user, networks/vlans/fabrics, etc) - graphidoc, playground, faker, and voyager support - schema in a template tag and documented - apollo-errors - apollo-server-hapi and schema using graphql-tools/makeExecutableSchema - replace express with Hapi - eslint support for graphql - updated dependencies --- package.json | 1 + packages/cloudapi-gql/.eslintignore | 3 +- packages/cloudapi-gql/.eslintrc | 13 +- packages/cloudapi-gql/.gitignore | 1 + packages/cloudapi-gql/.graphqlconfig | 8 + packages/cloudapi-gql/README.md | 27 + packages/cloudapi-gql/package.json | 54 +- packages/cloudapi-gql/src/api/account.js | 9 +- packages/cloudapi-gql/src/api/config.js | 6 +- packages/cloudapi-gql/src/api/datacenters.js | 6 +- packages/cloudapi-gql/src/api/errors.json | 16 + packages/cloudapi-gql/src/api/fabrics.js | 9 - .../cloudapi-gql/src/api/firewall-rules.js | 44 +- packages/cloudapi-gql/src/api/images.js | 29 +- packages/cloudapi-gql/src/api/index.js | 11 +- packages/cloudapi-gql/src/api/key-value.js | 18 + packages/cloudapi-gql/src/api/keys.js | 52 +- packages/cloudapi-gql/src/api/machines.js | 129 +- packages/cloudapi-gql/src/api/networks.js | 14 +- packages/cloudapi-gql/src/api/nics.js | 11 +- packages/cloudapi-gql/src/api/packages.js | 9 +- packages/cloudapi-gql/src/api/policies.js | 40 +- packages/cloudapi-gql/src/api/request.js | 70 +- packages/cloudapi-gql/src/api/roles.js | 22 +- packages/cloudapi-gql/src/api/services.js | 4 +- packages/cloudapi-gql/src/api/users.js | 24 +- packages/cloudapi-gql/src/api/vlans.js | 21 + packages/cloudapi-gql/src/endpoint.js | 11 - packages/cloudapi-gql/src/index.js | 37 - packages/cloudapi-gql/src/schema/index.js | 20 +- .../src/schema/mutations/account.js | 56 - .../src/schema/mutations/firewall-rules.js | 103 - .../src/schema/mutations/images.js | 62 - .../src/schema/mutations/index.js | 16 - .../cloudapi-gql/src/schema/mutations/keys.js | 52 - .../src/schema/mutations/machines.js | 328 --- .../src/schema/mutations/policies.js | 74 - .../src/schema/mutations/roles.js | 108 - .../src/schema/mutations/snapshots.js | 60 - .../src/schema/mutations/users.js | 144 -- .../src/schema/queries/account.js | 13 - .../src/schema/queries/datacenters.js | 19 - .../src/schema/queries/fabrics.js | 12 - .../src/schema/queries/firewall-rules.js | 19 - .../cloudapi-gql/src/schema/queries/images.js | 53 - .../cloudapi-gql/src/schema/queries/index.js | 20 - .../src/schema/queries/machines.js | 78 - .../src/schema/queries/networks.js | 19 - .../cloudapi-gql/src/schema/queries/nics.js | 19 - .../src/schema/queries/packages.js | 57 - .../src/schema/queries/policies.js | 20 - .../cloudapi-gql/src/schema/queries/roles.js | 20 - .../src/schema/queries/services.js | 19 - .../cloudapi-gql/src/schema/queries/users.js | 28 - packages/cloudapi-gql/src/schema/resolvers.js | 133 ++ .../cloudapi-gql/src/schema/schema.graphql | 1144 +++++++++++ .../cloudapi-gql/src/schema/types/audit.js | 59 - .../src/schema/types/datacenter.js | 14 - .../src/schema/types/dynamic-object.js | 41 - .../cloudapi-gql/src/schema/types/fabric.js | 19 - .../src/schema/types/firewall-rule.js | 92 - .../cloudapi-gql/src/schema/types/image.js | 127 -- packages/cloudapi-gql/src/schema/types/key.js | 16 - .../cloudapi-gql/src/schema/types/login.js | 108 - .../cloudapi-gql/src/schema/types/machine.js | 181 -- .../cloudapi-gql/src/schema/types/network.js | 74 - packages/cloudapi-gql/src/schema/types/nic.js | 41 - .../cloudapi-gql/src/schema/types/package.js | 52 - .../cloudapi-gql/src/schema/types/policy.js | 29 - .../cloudapi-gql/src/schema/types/role.js | 52 - .../cloudapi-gql/src/schema/types/service.js | 13 - .../cloudapi-gql/src/schema/types/snapshot.js | 16 - packages/cloudapi-gql/src/server.js | 122 ++ .../src/containers/instances/firewall.js | 4 +- .../src/containers/instances/list.js | 4 +- .../src/containers/instances/metadata.js | 9 +- .../src/containers/instances/networks.js | 4 +- .../src/containers/instances/tags.js | 9 +- yarn.lock | 1798 +++++++++++++---- 79 files changed, 3178 insertions(+), 3101 deletions(-) create mode 100644 packages/cloudapi-gql/.gitignore create mode 100644 packages/cloudapi-gql/.graphqlconfig create mode 100644 packages/cloudapi-gql/src/api/errors.json delete mode 100644 packages/cloudapi-gql/src/api/fabrics.js create mode 100644 packages/cloudapi-gql/src/api/key-value.js create mode 100644 packages/cloudapi-gql/src/api/vlans.js delete mode 100644 packages/cloudapi-gql/src/endpoint.js delete mode 100644 packages/cloudapi-gql/src/index.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/account.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/firewall-rules.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/images.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/index.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/keys.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/machines.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/policies.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/roles.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/snapshots.js delete mode 100644 packages/cloudapi-gql/src/schema/mutations/users.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/account.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/datacenters.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/fabrics.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/firewall-rules.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/images.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/index.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/machines.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/networks.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/nics.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/packages.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/policies.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/roles.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/services.js delete mode 100644 packages/cloudapi-gql/src/schema/queries/users.js create mode 100644 packages/cloudapi-gql/src/schema/resolvers.js create mode 100644 packages/cloudapi-gql/src/schema/schema.graphql delete mode 100644 packages/cloudapi-gql/src/schema/types/audit.js delete mode 100644 packages/cloudapi-gql/src/schema/types/datacenter.js delete mode 100644 packages/cloudapi-gql/src/schema/types/dynamic-object.js delete mode 100644 packages/cloudapi-gql/src/schema/types/fabric.js delete mode 100644 packages/cloudapi-gql/src/schema/types/firewall-rule.js delete mode 100644 packages/cloudapi-gql/src/schema/types/image.js delete mode 100644 packages/cloudapi-gql/src/schema/types/key.js delete mode 100644 packages/cloudapi-gql/src/schema/types/login.js delete mode 100644 packages/cloudapi-gql/src/schema/types/machine.js delete mode 100644 packages/cloudapi-gql/src/schema/types/network.js delete mode 100644 packages/cloudapi-gql/src/schema/types/nic.js delete mode 100644 packages/cloudapi-gql/src/schema/types/package.js delete mode 100644 packages/cloudapi-gql/src/schema/types/policy.js delete mode 100644 packages/cloudapi-gql/src/schema/types/role.js delete mode 100644 packages/cloudapi-gql/src/schema/types/service.js delete mode 100644 packages/cloudapi-gql/src/schema/types/snapshot.js create mode 100644 packages/cloudapi-gql/src/server.js diff --git a/package.json b/package.json index aebee4a3..c72d3935 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "eslint-config-xo-space": "^0.16.0", "eslint-gh-status-reporter": "^1.0.7", "eslint-plugin-flowtype": "^2.35.1", + "eslint-plugin-graphql": "^1.3.0", "eslint-plugin-import": "^2.7.0", "eslint-plugin-jsx-a11y": "^6.0.2", "eslint-plugin-prettier": "^2.2.0", diff --git a/packages/cloudapi-gql/.eslintignore b/packages/cloudapi-gql/.eslintignore index 2b7cecf7..1e2f7f6c 100644 --- a/packages/cloudapi-gql/.eslintignore +++ b/packages/cloudapi-gql/.eslintignore @@ -1,2 +1,3 @@ .nyc_output -coverage \ No newline at end of file +coverage +doc \ No newline at end of file diff --git a/packages/cloudapi-gql/.eslintrc b/packages/cloudapi-gql/.eslintrc index 14dc524b..24c8df08 100644 --- a/packages/cloudapi-gql/.eslintrc +++ b/packages/cloudapi-gql/.eslintrc @@ -1,3 +1,14 @@ { - "extends": "joyent-portal" + "extends": "joyent-portal", + "plugins": ["graphql"], + "rules": { + "graphql/template-strings": ["error", { + "env": "apollo" + }], + "graphql/named-operations": ["error"], + "graphql/required-fields": ["error", { + "requiredFields": ["id"] + }], + "graphql/capitalized-type-name": ["error"] + } } diff --git a/packages/cloudapi-gql/.gitignore b/packages/cloudapi-gql/.gitignore new file mode 100644 index 00000000..8e695ec8 --- /dev/null +++ b/packages/cloudapi-gql/.gitignore @@ -0,0 +1 @@ +doc diff --git a/packages/cloudapi-gql/.graphqlconfig b/packages/cloudapi-gql/.graphqlconfig new file mode 100644 index 00000000..5f2f42a1 --- /dev/null +++ b/packages/cloudapi-gql/.graphqlconfig @@ -0,0 +1,8 @@ +{ + "schemaPath": "src/schema/schema.graphql", + "extensions": { + "endpoints": { + "dev": "http://localhost:4000/graphql" + } + } +} diff --git a/packages/cloudapi-gql/README.md b/packages/cloudapi-gql/README.md index 93c1f37b..32eed36f 100644 --- a/packages/cloudapi-gql/README.md +++ b/packages/cloudapi-gql/README.md @@ -9,6 +9,7 @@ Server that exposes [CloudApi](https://apidocs.joyent.com/cloudapi/) through [Gr - [Install](#install) - [Usage](#usage) +- [Todo](#todo) - [License](#license) ## Install @@ -23,6 +24,32 @@ yarn add joyent-portal-cloudapi-gql yarn run start ``` + - [GraphiQL](http://0.0.0.0:4000/graphiql) + - [Graphidoc](http://0.0.0.0:4000/doc) + - [Voyager](http://0.0.0.0:4000/voyager) + - [Playground](http://0.0.0.0:4000/playground) + + +![](https://cldup.com/StGgfIbD3N.png) +![](https://cldup.com/fhpul_AJ13.png) +![](https://cldup.com/A-VwSbvWBe.png) +![](https://cldup.com/08P360Skhx.png) + +``` +yarn run faker +``` + + - [GraphQL Faker Interactive Editor](http://0.0.0.0:9002/editor) + - [GraphQL Faker API](http://0.0.0.0:9002/graphql) + +![](https://cldup.com/VWadVMorQ0.png) + +## Todo + + - [ ] Finish missing connections, transforms, and mutations + - [ ] remove node-triton dependency + - [ ] support multiple users on the same server + ## License MPL-2.0 diff --git a/packages/cloudapi-gql/package.json b/packages/cloudapi-gql/package.json index d73f672c..13d43603 100644 --- a/packages/cloudapi-gql/package.json +++ b/packages/cloudapi-gql/package.json @@ -1,34 +1,56 @@ { "name": "cloudapi-gql", - "version": "1.0.4", + "version": "2.0.0", "private": true, "license": "MPL-2.0", "repository": "github:yldio/joyent-portal", - "main": "src/index.js", + "main": "src/schema/index.js", "scripts": { - "lint": "eslint . --fix", + "lint": "eslint . --fix --ext .js --ext .graphql", + "fmt": "prettier --write --single-quote src/**/*.js src/*.js src/**/*.graphql", "test": "echo 0", "test-ci": "echo 0", - "start": "node src/index.js", - "prepublish": "echo 0" + "start": "PORT=4000 node src/server.js", + "dev": "CORS=1 PORT=4000 nodemon src/server.js", + "fake": "graphql-faker ./src/schema/schema.graphql -p 4000", + "prepublish": "echo 0", + "graphdoc": "graphdoc -s ./src/schema/schema.graphql -o ./doc --force", + "faker": "graphql-faker ./src/schema/schema.graphql" }, "dependencies": { + "@2fd/graphdoc": "^2.4.0", + "apollo-errors": "^1.5.1", + "apollo-server-hapi": "^1.1.2", "apr-awaitify": "^1.0.4", + "boom": "^6.0.0", "bunyan": "^1.8.12", - "cors": "^2.8.4", "dotenv": "^4.0.0", - "express": "^4.15.4", - "express-graphql": "^0.6.11", - "got": "^7.1.0", - "graphql": "^0.11.2", - "graphql-tools": "^1.2.2", - "minimist": "^1.2.0", + "execa": "^0.8.0", + "force-array": "^3.1.0", + "good": "^7.3.0", + "good-console": "^6.4.0", + "good-squeeze": "^5.0.2", + "graphql-playground": "^1.0.4", + "graphql-tools": "^2.0.0", + "graphql-voyager": "^1.0.0-rc.9", + "hapi": "^16.6.2", + "hasha": "^3.0.0", + "inert": "^4.2.1", "node-fetch": "^1.7.3", - "smartdc-auth": "^2.5.5", - "triton": "^5.3.1" + "smartdc-auth": "^2.5.6", + "triton": "^5.4.0" }, "devDependencies": { - "eslint": "^4.5.0", - "eslint-config-joyent-portal": "3.0.0" + "graphql-faker": "^1.4.0", + "eslint": "^4.8.0", + "eslint-config-joyent-portal": "3.0.0", + "eslint-plugin-graphql": "^1.3.0", + "nodemon": "^1.12.1", + "prettier": "^1.7.4" + }, + "nodemonConfig": { + "ignore": [ + "doc/*" + ] } } diff --git a/packages/cloudapi-gql/src/api/account.js b/packages/cloudapi-gql/src/api/account.js index 08adaa85..5898f953 100644 --- a/packages/cloudapi-gql/src/api/account.js +++ b/packages/cloudapi-gql/src/api/account.js @@ -1,9 +1,4 @@ const request = require('./request'); -module.exports.get = () => { - return request('getAccount'); -}; - -module.exports.update = ctx => { - return request('updateAccount', ctx); -}; +module.exports.get = () => request('getAccount'); +module.exports.update = ctx => request('updateAccount', ctx); diff --git a/packages/cloudapi-gql/src/api/config.js b/packages/cloudapi-gql/src/api/config.js index 77428d35..3d25800b 100644 --- a/packages/cloudapi-gql/src/api/config.js +++ b/packages/cloudapi-gql/src/api/config.js @@ -1,5 +1,3 @@ -// Const request = require('./request'); +const { fetch } = require('./request'); -module.exports.get = () => { - // Return request('', ctx); -}; +module.exports = () => fetch('/:login/config'); diff --git a/packages/cloudapi-gql/src/api/datacenters.js b/packages/cloudapi-gql/src/api/datacenters.js index 7aafe965..1439f7ac 100644 --- a/packages/cloudapi-gql/src/api/datacenters.js +++ b/packages/cloudapi-gql/src/api/datacenters.js @@ -1,5 +1,5 @@ const request = require('./request'); -module.exports = () => { - return request('listDatacenters'); -}; +module.exports = () => request('listDatacenters'); +// this method is useless since it only "returns an HTTP redirect to your client, where the datacenter url is in the Location header" +// module.exports.get = ({ name }) => request.fetch(`/:login/datacenters/${name}`); diff --git a/packages/cloudapi-gql/src/api/errors.json b/packages/cloudapi-gql/src/api/errors.json new file mode 100644 index 00000000..6e58de57 --- /dev/null +++ b/packages/cloudapi-gql/src/api/errors.json @@ -0,0 +1,16 @@ +{ + "BadRequest": "You sent bad HTTP", + "InternalError": "Something went wrong in Triton", + "InUseError": "The object is in use and cannot be operated on", + "InvalidArgument": "You sent bad arguments or a bad value for an argument", + "InvalidCredentials": "Authentication failed", + "InvalidHeader": "You sent a bad HTTP header", + "InvalidVersion": "You sent a bad Api-Version string", + "MissingParameter": "You didn't send a required parameter", + "NotAuthorized": "You don't have access to the requested resource", + "RequestThrottled": "You were throttled", + "RequestTooLarge": "You sent too much request data", + "RequestMoved": "HTTP Redirect", + "ResourceNotFound": "What you asked for wasn't found", + "UnknownError": "Something completely unexpected happened!" +} diff --git a/packages/cloudapi-gql/src/api/fabrics.js b/packages/cloudapi-gql/src/api/fabrics.js deleted file mode 100644 index bb934414..00000000 --- a/packages/cloudapi-gql/src/api/fabrics.js +++ /dev/null @@ -1,9 +0,0 @@ -const request = require('./request'); - -module.exports.list = () => { - return request('listFirewallRules', {}); -}; - -module.exports.get = ctx => { - return request('getFirewallRule', ctx); -}; diff --git a/packages/cloudapi-gql/src/api/firewall-rules.js b/packages/cloudapi-gql/src/api/firewall-rules.js index 60bba238..dc8f86a2 100644 --- a/packages/cloudapi-gql/src/api/firewall-rules.js +++ b/packages/cloudapi-gql/src/api/firewall-rules.js @@ -1,37 +1,11 @@ const request = require('./request'); -module.exports.list = () => { - return request('listFirewallRules', {}); -}; - -module.exports.listByMachine = ctx => { - return request('listMachineFirewallRules', ctx); -}; - -module.exports.listMachines = ctx => { - return request('listFirewallRuleMachines', ctx); -}; - -module.exports.get = ctx => { - return request('getFirewallRule', ctx); -}; - -module.exports.create = ctx => { - return request('createFirewallRule', ctx); -}; - -module.exports.update = ctx => { - return request('updateFirewallRule', ctx); -}; - -module.exports.enable = ctx => { - return request('enableFirewallRule', ctx); -}; - -module.exports.disable = ctx => { - return request('disableFirewallRule', ctx); -}; - -module.exports.destroy = ctx => { - return request('deleteFirewallRule', ctx); -}; +module.exports.list = () => request('listFirewallRules', {}); +module.exports.listByMachine = ctx => request('listMachineFirewallRules', ctx); +module.exports.listMachines = ctx => request('listFirewallRuleMachines', ctx); +module.exports.get = ({ id }) => request('getFirewallRule', id); +module.exports.create = ctx => request('createFirewallRule', ctx); +module.exports.update = ctx => request('updateFirewallRule', ctx); +module.exports.enable = ctx => request('enableFirewallRule', ctx); +module.exports.disable = ctx => request('disableFirewallRule', ctx); +module.exports.destroy = ctx => request('deleteFirewallRule', ctx); diff --git a/packages/cloudapi-gql/src/api/images.js b/packages/cloudapi-gql/src/api/images.js index 1458472d..41d9113e 100644 --- a/packages/cloudapi-gql/src/api/images.js +++ b/packages/cloudapi-gql/src/api/images.js @@ -1,25 +1,8 @@ const request = require('./request'); -module.exports.list = ctx => { - return request('listImages', ctx); -}; - -module.exports.get = ctx => { - return request('getImage', ctx); -}; - -module.exports.create = ctx => { - return request('createImageFromMachine', ctx); -}; - -// Module.exports.update = (ctx) => { -// return request('UpdateImage', ctx); -// }; - -module.exports.destroy = uuid => { - return request('deleteImage', uuid); -}; - -// Module.exports.xport = (uuid) => { -// return request('deleteImage', uuid); -// }; +module.exports.list = ctx => request('listImages', ctx); +module.exports.get = ctx => request('getImage', ctx); +module.exports.destroy = uuid => request('deleteImage', uuid); +module.exports.export = uuid => request('deleteImage', uuid); +module.exports.create = ctx => request('createImageFromMachine', ctx); +module.exports.update = ctx => request('UpdateImage', ctx); diff --git a/packages/cloudapi-gql/src/api/index.js b/packages/cloudapi-gql/src/api/index.js index 983029fb..ee15e0c4 100644 --- a/packages/cloudapi-gql/src/api/index.js +++ b/packages/cloudapi-gql/src/api/index.js @@ -1,16 +1,17 @@ module.exports = { account: require('./account'), - users: require('./users'), - policies: require('./policies'), - roles: require('./roles'), keys: require('./keys'), + users: require('./users'), + roles: require('./roles'), + policies: require('./policies'), + config: require('./config'), datacenters: require('./datacenters'), services: require('./services'), images: require('./images'), packages: require('./packages'), machines: require('./machines'), - firewallRules: require('./firewall-rules'), - // Fabrics: require('./fabrics'), + firewall: require('./firewall-rules'), + vlans: require('./vlans'), networks: require('./networks'), nics: require('./nics') }; diff --git a/packages/cloudapi-gql/src/api/key-value.js b/packages/cloudapi-gql/src/api/key-value.js new file mode 100644 index 00000000..b8591790 --- /dev/null +++ b/packages/cloudapi-gql/src/api/key-value.js @@ -0,0 +1,18 @@ +const forceArray = require('force-array'); +const hasha = require('hasha'); + +module.exports.toKeyValue = r => + Object.keys(r).map(name => ({ + id: hasha(JSON.stringify({ name, value: r[name] })), + name, + value: r[name] + })); + +module.exports.fromKeyValue = kvs => + forceArray(kvs).reduce( + (rest, { name, value }) => + Object.assign(rest, { + [name]: value + }), + {} + ); diff --git a/packages/cloudapi-gql/src/api/keys.js b/packages/cloudapi-gql/src/api/keys.js index fee3f4f2..344f8e16 100644 --- a/packages/cloudapi-gql/src/api/keys.js +++ b/packages/cloudapi-gql/src/api/keys.js @@ -1,35 +1,25 @@ -const request = require('./request'); +const { fetch, client } = require('./request'); -module.exports = { - user: { - list: ctx => { - return request('listUserKeys', ctx); - }, - get: ctx => { - return request('getUserKey', ctx); - }, - create: ctx => { - return request('createUserKey', ctx); - }, - destroy: ctx => { - return request('deleteUserKey', ctx); - } - }, - account: { - list: () => { - return request('listKeys', {}); - }, +const { principal } = client; - get: ctx => { - return request('getKey', ctx); - }, +const getLoginPrefix = user => + user && principal.account !== user + ? `:login/users/${user}` + : principal.user && principal.user.length + ? `:login/users/${principal.user}` + : ':login'; - create: ctx => { - return request('createKey', ctx); - }, +module.exports.list = (opts = {}) => + fetch(`/${getLoginPrefix(opts.login)}/keys`); - destroy: ctx => { - return request('deleteKey', ctx); - } - } -}; +module.exports.get = ({ login, name }) => + fetch(`/${getLoginPrefix(login)}/keys/${name}`); + +module.exports.create = ({ login, name, key }) => + fetch(`/${getLoginPrefix(login)}/keys`, { + method: 'POST', + body: { name, key } + }); + +module.exports.destroy = ({ login, name }) => + fetch(`/${getLoginPrefix(login)}/keys/${name}`, { method: 'DELETE' }); diff --git a/packages/cloudapi-gql/src/api/machines.js b/packages/cloudapi-gql/src/api/machines.js index 856c08fc..c72ef739 100644 --- a/packages/cloudapi-gql/src/api/machines.js +++ b/packages/cloudapi-gql/src/api/machines.js @@ -1,119 +1,44 @@ -const awaitify = require('apr-awaitify'); -const fetch = require('node-fetch'); -const url = require('url'); - const request = require('./request'); -const { _path, _getAuthHeaders, account, url: host } = request.client; -const client = request.client; -const getAuthHeaders = awaitify(_getAuthHeaders.bind(client)); - const snapshots = { - list: ctx => { - return request('listMachineSnapshots', ctx); - }, - get: ctx => { - return request('getMachineSnapshot', ctx); - }, - create: ctx => { - return request('createMachineSnapshot', ctx); - }, - destroy: ctx => { - return request('deleteMachineSnapshot', ctx); - } + list: ctx => request('listMachineSnapshots', ctx), + get: ctx => request('getMachineSnapshot', ctx), + create: ctx => request('createMachineSnapshot', ctx), + destroy: ctx => request('deleteMachineSnapshot', ctx) }; const metadata = { - list: async ({ id }) => { - const pathname = _path.call(client, `/${account}/machines/${id}/metadata`); - const headers = await getAuthHeaders('GET', pathname); - - const href = url.format({ - protocol: 'https', - host: host.replace(/^https:\/\//, ''), - pathname - }); - - return fetch(href, { method: 'GET', headers }).then(response => - response.json() - ); - }, - get: ctx => { - return request('getMachineMetadata', ctx); - } + list: ({ id }) => request.fetch(`/:login/machines/${id}/metadata`), + get: ({ id, key }) => request.fetch(`/:login/machines/${id}/metadata/${key}`), + destroy: ctx => request('', ctx) }; const firewall = { - enable: ctx => { - return request('enableMachineFirewall', ctx); - }, - disable: ctx => { - return request('disableMachineFirewall', ctx); - } + enable: ctx => request('enableMachineFirewall', ctx), + disable: ctx => request('disableMachineFirewall', ctx) }; const tags = { - list: ctx => { - return request('listMachineTags', ctx); - }, - get: ctx => { - return request('getMachineTag', ctx); - }, - add: ctx => { - return request('addMachineTags', ctx); - }, - replace: ctx => { - return request('replaceMachineTags', ctx); - }, - destroy: ctx => { - const method = ctx.tag ? 'deleteMachineTag' : 'deleteMachineTags'; - return request(method, ctx); - } + list: ctx => request('listMachineTags', ctx), + get: ctx => request('getMachineTag', ctx), + add: ctx => request('addMachineTags', ctx), + replace: ctx => request('replaceMachineTags', ctx), + destroy: ctx => + request(ctx.tag ? 'deleteMachineTag' : 'deleteMachineTags', ctx) }; -module.exports.list = ctx => { - return request('listMachines', ctx); -}; - -module.exports.get = ctx => { - return request('getMachine', ctx); -}; - -module.exports.create = ctx => { - return request('createMachine', ctx); -}; - -module.exports.stop = ctx => { - return request('stopMachine', ctx); -}; - -module.exports.start = uuid => { - return request('startMachine', uuid); -}; - -module.exports.startFromSnapshot = ctx => { - return request('startMachineFromSnapshot', ctx); -}; - -module.exports.reboot = ctx => { - return request('rebootMachine', ctx); -}; - -module.exports.resize = ctx => { - return request('', ctx); -}; - -module.exports.rename = ctx => { - return request('', ctx); -}; - -module.exports.destroy = ctx => { - return request('deleteMachine', ctx); -}; - -module.exports.audit = ctx => { - return request('machineAudit', ctx); -}; +module.exports.list = ctx => request('listMachines', ctx); +module.exports.get = ctx => request('getMachine', ctx); +module.exports.create = ctx => request('createMachine', ctx); +module.exports.stop = ctx => request('stopMachine', ctx); +module.exports.start = uuid => request('startMachine', uuid); +module.exports.startFromSnapshot = ctx => + request('startMachineFromSnapshot', ctx); +module.exports.reboot = ctx => request('rebootMachine', ctx); +module.exports.resize = ctx => request('', ctx); +module.exports.rename = ctx => request('', ctx); +module.exports.destroy = ctx => request('deleteMachine', ctx); +module.exports.audit = ctx => request('machineAudit', ctx); module.exports.snapshots = snapshots; module.exports.metadata = metadata; diff --git a/packages/cloudapi-gql/src/api/networks.js b/packages/cloudapi-gql/src/api/networks.js index 047127c8..6a5340fb 100644 --- a/packages/cloudapi-gql/src/api/networks.js +++ b/packages/cloudapi-gql/src/api/networks.js @@ -1,9 +1,9 @@ const request = require('./request'); -module.exports.list = () => { - return request('listNetworks'); -}; - -module.exports.get = ctx => { - return request('getNetwork', ctx); -}; +// lists all networks, including fabric networks +module.exports.list = () => request('listNetworks'); +module.exports.get = ctx => request('getNetwork', ctx); +// create fabric network +module.exports.create = () => request(''); +// destroy fabric network +module.exports.destroy = () => request(''); diff --git a/packages/cloudapi-gql/src/api/nics.js b/packages/cloudapi-gql/src/api/nics.js index 34ddca88..bdc114ec 100644 --- a/packages/cloudapi-gql/src/api/nics.js +++ b/packages/cloudapi-gql/src/api/nics.js @@ -1,9 +1,6 @@ const request = require('./request'); -module.exports.list = () => { - return request('listNics'); -}; - -module.exports.get = ctx => { - return request('getNic', ctx); -}; +module.exports.list = () => request('listNics'); +module.exports.get = ctx => request('getNic', ctx); +module.exports.add = ctx => request(''); +module.exports.destroy = ctx => request(''); diff --git a/packages/cloudapi-gql/src/api/packages.js b/packages/cloudapi-gql/src/api/packages.js index fd38f7cf..7732abeb 100644 --- a/packages/cloudapi-gql/src/api/packages.js +++ b/packages/cloudapi-gql/src/api/packages.js @@ -1,9 +1,4 @@ const request = require('./request'); -module.exports.list = ctx => { - return request('listPackages', ctx); -}; - -module.exports.get = ctx => { - return request('getPackage', ctx); -}; +module.exports.list = ctx => request('listPackages', ctx); +module.exports.get = ctx => request('getPackage', ctx); diff --git a/packages/cloudapi-gql/src/api/policies.js b/packages/cloudapi-gql/src/api/policies.js index 4ea9b3cc..ce0917e0 100644 --- a/packages/cloudapi-gql/src/api/policies.js +++ b/packages/cloudapi-gql/src/api/policies.js @@ -1,21 +1,23 @@ const request = require('./request'); +// const aperture = require('aperture'); +// const { config } = require('aperture-config'); +// +// const parser = aperture.createParser({ +// types: aperture.types, +// typeTable: config.typeTable +// }); +// .then(policies => +// policies.map(({ rules, ...policy }) => +// Object.assign(policy, { +// rules: Object.assign(rules.map(parser.parse.bind(parser)), { +// str: rule +// }) +// }) +// ) +// ); -module.exports.list = () => { - return request('listPolicies'); -}; - -module.exports.get = ctx => { - return request('getPolicy', ctx); -}; - -module.exports.create = ctx => { - return request('createPolicy', ctx); -}; - -module.exports.update = ctx => { - return request('updatePolicy', ctx); -}; - -module.exports.destroy = ctx => { - return request('deletePolicy', ctx); -}; +module.exports.list = () => request('listPolicies'); +module.exports.get = ctx => request('getPolicy', ctx); +module.exports.create = ctx => request('createPolicy', ctx); +module.exports.update = ctx => request('updatePolicy', ctx); +module.exports.destroy = ctx => request('deletePolicy', ctx); diff --git a/packages/cloudapi-gql/src/api/request.js b/packages/cloudapi-gql/src/api/request.js index bbb83e7b..01422381 100644 --- a/packages/cloudapi-gql/src/api/request.js +++ b/packages/cloudapi-gql/src/api/request.js @@ -1,8 +1,38 @@ -const credentials = require('../credentials'); +const { createError } = require('apollo-errors'); +const awaitify = require('apr-awaitify'); const auth = require('smartdc-auth'); const cloudapi = require('triton/lib/cloudapi2'); const bunyan = require('bunyan'); +const fetch = require('node-fetch'); +const url = require('url'); + const pkg = require('../../package.json'); +const credentials = require('../credentials'); +const errors = require('./errors.json'); + +const STATUSES = [ + 400, + 401, + 403, + 404, + 405, + 406, + 409, + 413, + 415, + 420, + 449, + 500, + 503 +]; + +const ERRORS = Object.keys(errors).reduce( + (errs, code) => + Object.assign(errs, { + [code]: createError(code, { message: errors[code] }) + }), + {} +); const log = bunyan.createLogger({ name: pkg.name @@ -21,6 +51,9 @@ const client = cloudapi.createClient({ }) }); +const { _path, _getAuthHeaders, account, url: host } = client; +const getAuthHeaders = awaitify(_getAuthHeaders.bind(client)); + module.exports = (method, args) => { return new Promise((resolve, reject) => { const fn = client[method].bind(client); @@ -38,3 +71,38 @@ module.exports = (method, args) => { }; module.exports.client = client; + +module.exports.fetch = async (_pathanme, reqOpts = {}) => { + const method = (reqOpts.method || 'get').toUpperCase(); + const pathname = _path.call(client, _pathanme.replace(/:login/, account)); + const headers = await getAuthHeaders(method, pathname); + + const href = url.format({ + protocol: 'https', + host: host.replace(/^https:\/\//, ''), + pathname + }); + + return fetch( + href, + Object.assign(reqOpts, { + method, + headers: Object.assign({}, reqOpts.headers, headers) + }) + ) + .then(async response => [response.status, await response.json()]) + .then(([status, body]) => { + // eslint-disable-next-line no-implicit-coercion + if (~STATUSES.indexOf(status)) { + const { code, message } = body; + const CustomError = ERRORS[code] || ERRORS.UnknownError; + + throw new CustomError({ + message, + data: { pathname, body: reqOpts.body } + }); + } + + return body; + }); +}; diff --git a/packages/cloudapi-gql/src/api/roles.js b/packages/cloudapi-gql/src/api/roles.js index c6762f53..e247822f 100644 --- a/packages/cloudapi-gql/src/api/roles.js +++ b/packages/cloudapi-gql/src/api/roles.js @@ -1,16 +1,11 @@ const request = require('./request'); -module.exports.list = () => { - return request('listRoles'); -}; +module.exports.list = () => request('listRoles'); -module.exports.get = ctx => { - return request('getRole', ctx); -}; +module.exports.get = ({ id, name }) => + request.fetch(`/:login/roles/${id || name}`); -module.exports.create = ctx => { - return request('createRole', ctx); -}; +module.exports.create = ctx => request('createRole', ctx); module.exports.set = ctx => { const id = ctx.id ? `/${ctx.id}` : ''; @@ -22,10 +17,5 @@ module.exports.set = ctx => { }); }; -module.exports.update = ctx => { - return request('updateRole', ctx); -}; - -module.exports.destroy = ctx => { - return request('deleteRole', ctx); -}; +module.exports.update = ctx => request('updateRole', ctx); +module.exports.destroy = ctx => request('deleteRole', ctx); diff --git a/packages/cloudapi-gql/src/api/services.js b/packages/cloudapi-gql/src/api/services.js index 5cad9529..8178c466 100644 --- a/packages/cloudapi-gql/src/api/services.js +++ b/packages/cloudapi-gql/src/api/services.js @@ -1,5 +1,3 @@ const request = require('./request'); -module.exports = () => { - return request('listServices'); -}; +module.exports = () => request('listServices'); diff --git a/packages/cloudapi-gql/src/api/users.js b/packages/cloudapi-gql/src/api/users.js index e237c076..9fc0d1b8 100644 --- a/packages/cloudapi-gql/src/api/users.js +++ b/packages/cloudapi-gql/src/api/users.js @@ -1,21 +1,7 @@ const request = require('./request'); -module.exports.list = () => { - return request('listUsers'); -}; - -module.exports.get = ctx => { - return request('getUser', ctx); -}; - -module.exports.create = ctx => { - return request('createUser', ctx); -}; - -module.exports.destroy = ctx => { - return request('deleteUser', ctx); -}; - -module.exports.update = ctx => { - return request('updateUser', ctx); -}; +module.exports.list = () => request('listUsers'); +module.exports.get = ctx => request('getUser', ctx); +module.exports.create = ctx => request('createUser', ctx); +module.exports.destroy = ctx => request('deleteUser', ctx); +module.exports.update = ctx => request('updateUser', ctx); diff --git a/packages/cloudapi-gql/src/api/vlans.js b/packages/cloudapi-gql/src/api/vlans.js new file mode 100644 index 00000000..ad259782 --- /dev/null +++ b/packages/cloudapi-gql/src/api/vlans.js @@ -0,0 +1,21 @@ +const { fetch } = require('./request'); + +module.exports.list = () => fetch('/:login/fabrics/default/vlans'); +module.exports.get = ({ id }) => fetch(`/:login/fabrics/default/vlans/${id}`); + +module.exports.create = ctx => + fetch(`/:login/fabrics/default/vlans`, { + method: 'POST', + body: ctx + }); + +module.exports.update = ({ id, ...rest }) => + fetch(`/:login/fabrics/default/vlans/${id}`, { + method: 'PUT', + body: Object.assign({ id }, rest) + }); + +module.exports.destroy = ({ id }) => + fetch(`/:login/fabrics/default/vlans/${id}`, { + method: 'DELETE' + }); diff --git a/packages/cloudapi-gql/src/endpoint.js b/packages/cloudapi-gql/src/endpoint.js deleted file mode 100644 index fc71f92f..00000000 --- a/packages/cloudapi-gql/src/endpoint.js +++ /dev/null @@ -1,11 +0,0 @@ -// const argv = require('minimist')(process.argv.slice(2)); -// const { makeExecutableSchema, addMockFunctionsToSchema } = require('graphql-tools'); - -// const { query, mutation } = require('./schema'); - -// console.log(new GraphQLSchema({ -// query, -// mutation -// })); -// -// diff --git a/packages/cloudapi-gql/src/index.js b/packages/cloudapi-gql/src/index.js deleted file mode 100644 index 1ef92db5..00000000 --- a/packages/cloudapi-gql/src/index.js +++ /dev/null @@ -1,37 +0,0 @@ -const express = require('express'); -const graphqlHTTP = require('express-graphql'); -const cors = require('cors'); - -const schema = require('./schema'); - -const app = express(); - -app.use(cors()); -app.options('*', cors()); - -app.post( - '/graphql', - graphqlHTTP({ - schema, - graphiql: false - }) -); - -app.get( - '/graphql', - graphqlHTTP({ - schema, - graphiql: true - }) -); - -const server = app.listen(4000, err => { - if (err) { - // eslint-disable-next-line no-console - console.error(err); - throw err; - } - - // eslint-disable-next-line no-console - console.log(`Listening at http://0.0.0.0:${server.address().port}/graphql`); -}); diff --git a/packages/cloudapi-gql/src/schema/index.js b/packages/cloudapi-gql/src/schema/index.js index 4aaa5624..9ea195d0 100644 --- a/packages/cloudapi-gql/src/schema/index.js +++ b/packages/cloudapi-gql/src/schema/index.js @@ -1,9 +1,17 @@ -const { GraphQLSchema } = require('graphql'); +const path = require('path'); +const { makeExecutableSchema } = require('graphql-tools'); +const { readFileSync } = require('fs'); -const query = require('./queries'); -const mutation = require('./mutations'); +const resolvers = require('./resolvers'); +const typeDefs = readFileSync( + path.join(__dirname, './schema.graphql'), + 'utf-8' +); -module.exports = new GraphQLSchema({ - query, - mutation +module.exports = makeExecutableSchema({ + typeDefs, + resolvers }); + +module.exports.typeDefs = typeDefs; +module.exports.resolvers = resolvers; diff --git a/packages/cloudapi-gql/src/schema/mutations/account.js b/packages/cloudapi-gql/src/schema/mutations/account.js deleted file mode 100644 index a40ba47d..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/account.js +++ /dev/null @@ -1,56 +0,0 @@ -const AccountType = require('../types/login'); -const api = require('../../api'); - -const { GraphQLBoolean, GraphQLString } = require('graphql'); - -module.exports.updateAccount = { - type: AccountType, - description: 'Update your account details', - args: { - email: { - type: GraphQLString - }, - companyName: { - type: GraphQLString - }, - firstName: { - type: GraphQLString - }, - lastName: { - type: GraphQLString - }, - address: { - type: GraphQLString - }, - postalCode: { - type: GraphQLString - }, - city: { - type: GraphQLString - }, - state: { - type: GraphQLString - }, - country: { - type: GraphQLString - }, - phone: { - type: GraphQLString - }, - cnsEnabled: { - type: GraphQLBoolean - } - }, - resolve: (root, args) => { - return api.account.get().then(account => { - return api.account.update( - Object.assign(account, args, { - firstName: args.firstName || account.firstName, - lastName: args.firstName || account.lastName, - companyName: args.companyName || account.companyName, - postalCode: args.postalCode || account.postalCode - }) - ); - }); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/firewall-rules.js b/packages/cloudapi-gql/src/schema/mutations/firewall-rules.js deleted file mode 100644 index edd60e24..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/firewall-rules.js +++ /dev/null @@ -1,103 +0,0 @@ -const FirewallRuleType = require('../types/firewall-rule'); -const api = require('../../api'); - -const { GraphQLID, GraphQLBoolean, GraphQLString } = require('graphql'); - -module.exports.createFirewallRule = { - type: FirewallRuleType, - description: - "Adds a new firewall rule for the specified account. This rule will be added to all the account's instances where it may be necessary", - args: { - enabled: { - type: GraphQLBoolean, - description: - 'Indicates if the rule is enabled (optional, false by default)' - }, - rule: { - type: GraphQLString, - description: 'Firewall rule text' - }, - description: { - type: GraphQLString, - description: 'Human-readable description for the rule (optional)' - } - }, - resolve: (root, args) => { - return api.firewallRules.create({ - rule: args.rule, - description: args.description, - enabled: Boolean(args.enabled) - }); - } -}; - -module.exports.updateFirewallRule = { - type: FirewallRuleType, - description: - 'Updates the given rule record and -- depending on rule contents -- adds/removes/updates the rule on all the required instances', - args: { - id: { - type: GraphQLID, - description: 'Firewall rule id' - }, - enabled: { - type: GraphQLBoolean, - description: - 'Indicates if the rule is enabled (optional, false by default)' - }, - rule: { - type: GraphQLString, - description: 'Firewall rule text' - }, - description: { - type: GraphQLString, - description: 'Human-readable description for the rule (optional)' - } - }, - resolve: (root, args) => { - return api.firewallRules.update(args); - } -}; - -module.exports.enableFirewallRule = { - type: FirewallRuleType, - description: 'Enables the given firewall rule if it is disabled', - args: { - id: { - type: GraphQLID, - description: 'Firewall rule id' - } - }, - resolve: (root, args) => { - return api.firewallRules.enable(args); - } -}; - -module.exports.disableFirewallRule = { - type: FirewallRuleType, - description: 'Disables the given firewall rule if it is enabled', - args: { - id: { - type: GraphQLID, - description: 'Firewall rule id' - } - }, - resolve: (root, args) => { - return api.firewallRules.disable(args); - } -}; - -module.exports.deleteFirewallRule = { - type: FirewallRuleType, - description: - 'Removes the given firewall rule from all the required instances', - args: { - id: { - type: GraphQLID, - description: 'Firewall rule id' - } - }, - resolve: (root, args) => { - return api.firewallRules.destroy(args); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/images.js b/packages/cloudapi-gql/src/schema/mutations/images.js deleted file mode 100644 index 31a8ca50..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/images.js +++ /dev/null @@ -1,62 +0,0 @@ -const AccountType = require('../types/login'); -const DynamicObjectType = require('../types/dynamic-object'); -const api = require('../../api'); - -const { - GraphQLString, - GraphQLList, - GraphQLNonNull, - GraphQLID -} = require('graphql'); - -module.exports.createImage = { - type: AccountType, - description: 'Create a new custom image from an instance', - args: { - machine: { - type: new GraphQLNonNull(GraphQLID), - description: - 'The prepared and stopped instance UUID from which the image is to be created' - }, - name: { - type: new GraphQLNonNull(GraphQLString), - description: - 'The name of the custom image, e.g. "my-image". Maximum 512 characters. However, typical names should be much shorter, e.g. 5-20 characters' - }, - version: { - type: new GraphQLNonNull(GraphQLString), - description: - 'The version of the custom image, e.g. "1.0.0". Maximum 128 characters' - }, - description: { - type: GraphQLString, - description: - 'A short prose description of this image. Maximum 512 characters' - }, - homepage: { - type: GraphQLString, - description: - 'Homepage URL where users can find more information about the image. Maximum 128 characters' - }, - eula: { - type: GraphQLString, - description: - 'URL of the End User License Agreement (EULA) for the image. Maximum 128 characters' - }, - acl: { - type: new GraphQLList(GraphQLID), - description: - 'An array of user/account UUIDs to which to give read access to a private image. I.e. this is only relevant for images with public === false' - }, - tags: { - type: DynamicObjectType, - description: - 'An object of key/value pairs that allows clients to categorize images by any given criteria' - } - }, - resolve: (root, args) => { - const { create } = api.images; - - return create(args); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/index.js b/packages/cloudapi-gql/src/schema/mutations/index.js deleted file mode 100644 index 39f35342..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/index.js +++ /dev/null @@ -1,16 +0,0 @@ -const { GraphQLObjectType } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'RootMutationType', - fields: Object.assign( - require('./account'), - require('./keys'), - require('./users'), - require('./roles'), - require('./policies'), - require('./machines'), - require('./images'), - require('./firewall-rules'), - require('./snapshots') - ) -}); diff --git a/packages/cloudapi-gql/src/schema/mutations/keys.js b/packages/cloudapi-gql/src/schema/mutations/keys.js deleted file mode 100644 index 2320015c..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/keys.js +++ /dev/null @@ -1,52 +0,0 @@ -const KeyType = require('../types/key'); -const api = require('../../api'); - -const { GraphQLNonNull, GraphQLString, GraphQLID } = require('graphql'); - -module.exports.createKey = { - type: KeyType, - description: - 'Uploads a new OpenSSH key to Triton for use in HTTP signing and SSH', - args: { - name: { - type: new GraphQLNonNull(GraphQLString) - }, - key: { - type: new GraphQLNonNull(GraphQLString) - }, - userId: { - type: GraphQLID, - description: - 'UserId to add this key to. Leaving this in blank will add the key to the account' - } - }, - resolve: (root, args) => { - const _api = args.userId ? api.keys.user : api.keys.account; - return _api.create(args); - } -}; - -module.exports.deleteKey = { - type: GraphQLID, - description: 'Deletes a single SSH key, by name or fingerprint', - args: { - name: { - type: GraphQLString - }, - fingerprint: { - type: GraphQLString - }, - userId: { - type: GraphQLID, - description: - 'UserId who this key belongs to. Leaving this in blank will delete an account key' - } - }, - resolve: (root, args) => { - const _api = args.userId ? api.keys.user : api.keys.account; - - return _api.destroy(args).then(() => { - return args.name || args.fingerprint; - }); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/machines.js b/packages/cloudapi-gql/src/schema/mutations/machines.js deleted file mode 100644 index f9fbdefb..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/machines.js +++ /dev/null @@ -1,328 +0,0 @@ -const MachineType = require('../types/machine'); -const DynamicObjectType = require('../types/dynamic-object'); -const api = require('../../api'); - -const { - GraphQLNonNull, - GraphQLString, - GraphQLBoolean, - GraphQLID, - GraphQLList -} = require('graphql'); - -module.exports.createMachine = { - type: MachineType, - description: 'Allows you to provision an instance', - args: { - name: { - type: GraphQLString, - description: - 'Friendly name for this instance; default is the first 8 characters of the machine id' - }, - package: { - type: new GraphQLNonNull(GraphQLString), - description: - 'Id of the package to use on provisioning, obtained from ListPackages' - }, - image: { - type: new GraphQLNonNull(GraphQLString), - description: 'The image UUID (from images { id })' - }, - networks: { - type: new GraphQLList(GraphQLString), - description: 'Desired networks ids (from networks { id })' - }, - locality: { - type: MachineType.locality, - description: - 'Optionally specify which instances the new instance should be near or far from' - }, - metadata: { - type: DynamicObjectType, - description: - 'An arbitrary set of metadata key/value pairs can be set at provision time' - }, - tags: { - type: DynamicObjectType, - description: 'An arbitrary set of tags can be set at provision time' - }, - firewallEnabled: { - type: GraphQLBoolean, - description: - 'Completely enable or disable firewall for this instance. Default is false' - } - }, - resolve: (root, args) => { - const resolveNames = (obj = {}, namespace) => { - return Object.keys(obj).reduce((all, name) => { - return Object.assign(all, { - [`${namespace}.${name}`]: obj[name] - }); - }, {}); - }; - - const tags = resolveNames(args.tags, 'tag'); - const metadata = resolveNames(args.tags, 'metadata'); - - const machine = Object.assign( - { - name: args.name, - package: args.package, - image: args.image, - networks: args.networks, - locality: args.locality, - firewallEnabled: args.firewallEnabled - }, - tags, - metadata - ); - - return api.machines.create(machine); - } -}; - -module.exports.startMachine = { - type: MachineType, - description: 'Allows you to boot up an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - }, - resolve: (root, args) => { - return api.machines.start(args.id).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.startMachineFromSnapshot = { - type: MachineType, - description: - 'If an instance is in the "stopped" state, you can choose to start the instance from the referenced snapshot', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - name: { - type: new GraphQLNonNull(GraphQLID), - description: 'The snapshot id' - } - }, - resolve: (root, args) => { - return api.machines.startFromSnapshot(args).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.stopMachine = { - type: MachineType, - description: 'Allows you to shut down an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - }, - resolve: (root, args) => { - return api.machines.stop(args.id).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.rebootMachine = { - type: MachineType, - description: 'Allows you to reboot an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - }, - resolve: (root, args) => { - return api.machines.reboot(args.id).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.deleteMachine = { - type: DynamicObjectType, - description: 'Allows you to completely destroy an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - }, - resolve: (root, args) => { - return api.machines.destroy(args.id); - } -}; - -module.exports.auditMachine = { - type: new GraphQLList(DynamicObjectType), - description: - "Provides a list of an instance's accomplished actions. Results are sorted from newest to oldest action", - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - } - // resolve: (root, args) => { - // return api.machines.destroy(args.id); - // } -}; - -module.exports.setMachineFirewall = { - type: MachineType, - description: 'Allows you to set the firewall state for an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - enabled: { - type: new GraphQLNonNull(GraphQLBoolean) - } - }, - resolve: (root, args) => { - const { firewall } = api.machines; - - const fn = args.enabled ? firewall.enable : firewall.disable; - - return fn(args.id).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.enableMachineFirewall = { - type: MachineType, - description: 'Allows you to enable the firewall for an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - }, - resolve: (root, args) => { - const { firewall } = api.machines; - - return firewall.enable(args.id).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.disableMachineFirewall = { - type: MachineType, - description: 'Allows you to completely disable the firewall of an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - } - }, - resolve: (root, args) => { - const { firewall } = api.machines; - - return firewall.disable(args.id).then(machine => { - if (machine) { - return machine; - } - - return api.machines.get(args); - }); - } -}; - -module.exports.addMachineTags = { - type: DynamicObjectType, - description: 'Set tags on the given instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - tags: { - type: new GraphQLNonNull(DynamicObjectType), - description: 'Tag name/value pairs' - } - }, - resolve: (root, args) => { - const { tags } = api.machines; - - return tags.add(args); - } -}; - -module.exports.replaceMachineTags = { - type: DynamicObjectType, - description: 'Fully replace all tags on an instance with the given tags', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - tags: { - type: new GraphQLNonNull(DynamicObjectType), - description: 'Tag name/value pairs' - } - }, - resolve: (root, args) => { - const { tags } = api.machines; - - return tags.replace(args); - } -}; - -module.exports.deleteMachineTags = { - type: DynamicObjectType, - description: 'Deletes tags from an instance', - args: { - id: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - tag: { - type: GraphQLString, - description: - 'Tag name to remove. If value is not supplied, all machine tags are removed' - } - }, - resolve: (root, args) => { - const { tags } = api.machines; - - return tags.destroy(args); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/policies.js b/packages/cloudapi-gql/src/schema/mutations/policies.js deleted file mode 100644 index 30a2012d..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/policies.js +++ /dev/null @@ -1,74 +0,0 @@ -const PolicyType = require('../types/policy'); -const api = require('../../api'); - -const { - GraphQLNonNull, - GraphQLString, - GraphQLID, - GraphQLList -} = require('graphql'); - -module.exports.createPolicy = { - type: PolicyType, - description: 'Creates a new account policy', - args: { - name: { - type: new GraphQLNonNull(GraphQLString), - description: 'The policy name' - }, - rules: { - type: new GraphQLNonNull(new GraphQLList(GraphQLString)), - description: - 'One or more Aperture sentences to be added to the current policy' - }, - description: { - type: GraphQLString, - description: 'A description for this policy (Optional)' - } - }, - resolve: (root, args) => { - return api.policies.create(args); - } -}; - -module.exports.updatePolicy = { - type: PolicyType, - description: - 'Upgrades an existing account policy. Everything but id can be modified', - args: { - id: { - type: new GraphQLNonNull(GraphQLID) - }, - name: { - type: new GraphQLNonNull(GraphQLString), - description: 'The policy name' - }, - rules: { - type: new GraphQLNonNull(new GraphQLList(GraphQLString)), - description: - 'One or more Aperture sentences to be added to the current policy' - }, - description: { - type: GraphQLString, - description: 'A description for this policy (Optional)' - } - }, - resolve: (root, args) => { - return api.policies.update(args); - } -}; - -module.exports.deletePolicy = { - type: GraphQLID, - description: 'Delete an RBAC policy', - args: { - id: { - type: new GraphQLNonNull(GraphQLID) - } - }, - resolve: (root, args) => { - return api.policies.destroy(args).then(() => { - return args.id; - }); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/roles.js b/packages/cloudapi-gql/src/schema/mutations/roles.js deleted file mode 100644 index 45a26890..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/roles.js +++ /dev/null @@ -1,108 +0,0 @@ -const RoleType = require('../types/role'); -const api = require('../../api'); - -const { - GraphQLNonNull, - GraphQLString, - GraphQLID, - GraphQLList -} = require('graphql'); - -module.exports.createRole = { - type: RoleType, - description: 'Create a new role for your account', - args: { - name: { - type: new GraphQLNonNull(GraphQLString), - description: "The role's name" - }, - policies: { - type: new GraphQLList(GraphQLString), - description: "This account's policies to be given to this role (Optional)" - }, - members: { - type: new GraphQLList(GraphQLString), - description: - "This account's user logins to be added to this role (Optional)" - }, - defaultMembers: { - type: new GraphQLList(GraphQLString), - description: - "This account's user logins to be added to this role and have it enabled by default (Optional)" - } - }, - resolve: (root, args) => { - return api.roles.create(args); - } -}; - -module.exports.updateRole = { - type: RoleType, - description: 'Modifies an account role. Anything but id can be modified', - args: { - id: { - type: new GraphQLNonNull(GraphQLID) - }, - name: { - type: GraphQLString, - description: "The role's name" - }, - policies: { - type: new GraphQLList(GraphQLString), - description: "This account's policies to be given to this role (Optional)" - }, - members: { - type: new GraphQLList(GraphQLString), - description: - "This account's user logins to be added to this role (Optional)" - }, - defaultMembers: { - type: new GraphQLList(GraphQLString), - description: - "This account's user logins to be added to this role and have it enabled by default (Optional)" - } - }, - resolve: (root, args) => { - return api.roles.update(args); - } -}; - -module.exports.deleteRole = { - type: GraphQLID, - description: 'Remove a role', - args: { - id: { - type: new GraphQLNonNull(GraphQLID) - } - }, - resolve: (root, args) => { - return api.roles.destroy(args).then(() => { - return args.id; - }); - } -}; - -module.exports.setRoleTags = { - type: RoleType.tag, - description: - "Sets the given role tags to the provided resource path. resource_path can be the path to any of the CloudAPI resources described in this document: account, keys, users, roles, policies, user's ssh keys, datacenters, images, packages, instances, analytics, instrumentations, firewall rules and networks.", - args: { - resource: { - type: new GraphQLNonNull(GraphQLString), - description: 'The resource type e.g. `machines`, `policies`...' - }, - id: { - type: GraphQLID, - description: 'The resource id' - }, - role: { - type: new GraphQLNonNull(new GraphQLList(GraphQLString)), - description: 'The list role-tags to be added to this resource' - } - }, - resolve: (root, args) => { - const { set } = api.roles; - - return set(args); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/snapshots.js b/packages/cloudapi-gql/src/schema/mutations/snapshots.js deleted file mode 100644 index e9cadbf3..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/snapshots.js +++ /dev/null @@ -1,60 +0,0 @@ -const SnapshotType = require('../types/snapshot'); -const api = require('../../api'); - -const { GraphQLNonNull, GraphQLString, GraphQLID } = require('graphql'); - -module.exports.createSnapshot = { - type: SnapshotType, - description: 'Allows you to take a snapshot of a machine instance', - args: { - machine: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - name: { - type: GraphQLString, - description: 'The name to assign to the new snapshot' - } - }, - resolve: (root, args) => { - const { snapshot: { create, get } } = api.machines; - - const newArgs = { - id: args.machine, - name: args.name - }; - - return create(newArgs).then(snapshot => { - if (snapshot) { - return snapshot; - } - - return get(newArgs); - }); - } -}; - -module.exports.deleteSnapshot = { - type: GraphQLID, - description: 'Deletes the specified snapshot of an instance', - args: { - machine: { - type: new GraphQLNonNull(GraphQLID), - description: 'The machine id' - }, - name: { - type: GraphQLString, - description: 'The name to assign to the new snapshot' - } - }, - resolve: (root, args) => { - const { snapshot: { destroy } } = api.machines; - - const newArgs = { - id: args.machine, - name: args.name - }; - - return destroy(newArgs).then(() => args.name); - } -}; diff --git a/packages/cloudapi-gql/src/schema/mutations/users.js b/packages/cloudapi-gql/src/schema/mutations/users.js deleted file mode 100644 index 310f053e..00000000 --- a/packages/cloudapi-gql/src/schema/mutations/users.js +++ /dev/null @@ -1,144 +0,0 @@ -const UserType = require('../types/login'); -const api = require('../../api'); - -const { GraphQLNonNull, GraphQLString, GraphQLID } = require('graphql'); - -module.exports.createUser = { - type: UserType, - description: 'Creates a new user under an account', - args: { - login: { - type: new GraphQLNonNull(GraphQLString) - }, - email: { - type: new GraphQLNonNull(GraphQLString) - }, - password: { - type: new GraphQLNonNull(GraphQLString) - }, - companyName: { - type: GraphQLString - }, - firstName: { - type: GraphQLString - }, - lastName: { - type: GraphQLString - }, - address: { - type: GraphQLString - }, - postalCode: { - type: GraphQLString - }, - city: { - type: GraphQLString - }, - state: { - type: GraphQLString - }, - country: { - type: GraphQLString - }, - phone: { - type: GraphQLString - } - }, - resolve: (root, args) => { - return api.users.create( - Object.assign(args, { - firstName: args.firstName, - lastName: args.firstName, - companyName: args.companyName, - postalCode: args.postalCode - }) - ); - } -}; - -module.exports.deleteUser = { - type: GraphQLID, - description: 'Remove a user', - args: { - id: { - type: new GraphQLNonNull(GraphQLID) - } - }, - resolve: (root, args) => { - return api.users.destroy(args).then(() => { - return args.id; - }); - } -}; - -module.exports.updateUser = { - type: UserType, - description: "Update a user's modifiable properties", - args: { - id: { - type: new GraphQLNonNull(GraphQLID) - }, - login: { - type: GraphQLString - }, - email: { - type: GraphQLString - }, - companyName: { - type: GraphQLString - }, - firstName: { - type: GraphQLString - }, - lastName: { - type: GraphQLString - }, - address: { - type: GraphQLString - }, - postalCode: { - type: GraphQLString - }, - city: { - type: GraphQLString - }, - state: { - type: GraphQLString - }, - country: { - type: GraphQLString - }, - phone: { - type: GraphQLString - } - }, - resolve: (root, args) => { - return api.users.update( - Object.assign(args, { - firstName: args.firstName, - lastName: args.firstName, - companyName: args.companyName, - postalCode: args.postalCode - }) - ); - } -}; - -// Module.exports.changeUserPassword = { -// type: UserType, -// description: 'This is a separate rule for password changes, so different policies can be used for an user trying to modify other data, or only their own password', -// args: { -// id: { -// type: new GraphQLNonNull(GraphQLID) -// }, -// password: { -// type: GraphQLString -// }, -// password_confirmation: { -// type: GraphQLString -// } -// }, -// resolve: (root, args) => { -// return api.users.updatePassword(args); -// } -// }; diff --git a/packages/cloudapi-gql/src/schema/queries/account.js b/packages/cloudapi-gql/src/schema/queries/account.js deleted file mode 100644 index 30347e72..00000000 --- a/packages/cloudapi-gql/src/schema/queries/account.js +++ /dev/null @@ -1,13 +0,0 @@ -const AccountType = require('../types/login'); -const api = require('../../api'); - -module.exports = { - type: AccountType, - resolve() { - return api.account.get().then(account => { - return Object.assign(account, { - isUser: false - }); - }); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/datacenters.js b/packages/cloudapi-gql/src/schema/queries/datacenters.js deleted file mode 100644 index 81776caf..00000000 --- a/packages/cloudapi-gql/src/schema/queries/datacenters.js +++ /dev/null @@ -1,19 +0,0 @@ -const DatacenterType = require('../types/datacenter'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList } = graphql; - -module.exports = { - type: new GraphQLList(DatacenterType), - resolve() { - return api.datacenters().then(datacenters => { - return Object.keys(datacenters).map(name => { - return { - url: datacenters[name], - name - }; - }); - }); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/fabrics.js b/packages/cloudapi-gql/src/schema/queries/fabrics.js deleted file mode 100644 index fa09c227..00000000 --- a/packages/cloudapi-gql/src/schema/queries/fabrics.js +++ /dev/null @@ -1,12 +0,0 @@ -const FabricType = require('../types/fabrics'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList } = graphql; - -module.exports = { - type: new GraphQLList(FabricType), - resolve() { - return api.fabrics.list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/firewall-rules.js b/packages/cloudapi-gql/src/schema/queries/firewall-rules.js deleted file mode 100644 index b82753c3..00000000 --- a/packages/cloudapi-gql/src/schema/queries/firewall-rules.js +++ /dev/null @@ -1,19 +0,0 @@ -const FirewallRuleType = require('../types/firewall-rule'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(FirewallRuleType), - args: { - id: { - type: GraphQLID, - description: 'Filter on id' - } - }, - resolve(root, args) { - const { list, get } = api.firewallRules; - return args.id ? get(args.id).then(rule => [rule]) : list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/images.js b/packages/cloudapi-gql/src/schema/queries/images.js deleted file mode 100644 index 4ee79ae3..00000000 --- a/packages/cloudapi-gql/src/schema/queries/images.js +++ /dev/null @@ -1,53 +0,0 @@ -const ImageType = require('../types/image'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLBoolean, GraphQLString, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(ImageType), - args: { - id: { - type: GraphQLID, - description: 'Filter on id' - }, - name: { - type: GraphQLString, - description: 'Filter on "friendly" name' - }, - os: { - type: GraphQLString, - description: 'Filter on the underlying operating system' - }, - version: { - type: GraphQLString, - description: 'Filter on the version' - }, - public: { - type: GraphQLBoolean, - description: 'Filter public/private images' - }, - state: { - type: GraphQLString, - description: - 'Filter on image state. By default only active images are shown. Use "all" to list all images' - }, - owner: { - type: GraphQLString, - description: 'Filter on owner UUID' - }, - type: { - type: GraphQLString, - description: 'Filter on image type' - } - }, - resolve(root, args) { - const { list, get } = api.images; - - return args.id - ? get({ - id: args.id - }).then(img => [img]) - : list(args); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/index.js b/packages/cloudapi-gql/src/schema/queries/index.js deleted file mode 100644 index 599a6f90..00000000 --- a/packages/cloudapi-gql/src/schema/queries/index.js +++ /dev/null @@ -1,20 +0,0 @@ -const { GraphQLObjectType } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'RootQueryType', - fields: { - account: require('./account'), - users: require('./users'), - policies: require('./policies'), - roles: require('./roles'), - datacenters: require('./datacenters'), - services: require('./services'), - images: require('./images'), - packages: require('./packages'), - machines: require('./machines'), - firewallRules: require('./firewall-rules'), - // Fabrics: require('./fabrics') - networks: require('./networks') - // Nics: require('./nics') - } -}); diff --git a/packages/cloudapi-gql/src/schema/queries/machines.js b/packages/cloudapi-gql/src/schema/queries/machines.js deleted file mode 100644 index 32100ec0..00000000 --- a/packages/cloudapi-gql/src/schema/queries/machines.js +++ /dev/null @@ -1,78 +0,0 @@ -const MachineType = require('../types/machine'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLInt, GraphQLList, GraphQLString, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(MachineType), - args: { - id: { - type: GraphQLID - }, - brand: { - type: GraphQLString, - description: 'Filter on the type of instance (e.g. lx)' - }, - name: { - type: GraphQLString, - description: - 'Machine name to find (will make your list size 1, or 0 if nothing found)' - }, - image: { - type: GraphQLString, - description: 'Image id; returns instances provisioned with that image' - }, - state: { - type: GraphQLString, - description: 'Filter on the current state (e.g. running)' - }, - memory: { - type: GraphQLInt, - description: 'Filter on the current size of the RAM deployed (in MiB)' - }, - tombstone: { - type: GraphQLInt, - description: 'Filter on instances destroyed in the last N minutes' - }, - first: { - type: GraphQLInt, - description: - 'Return a max of N instances; default is 1000 (which is also the maximum allowable result set size)' - }, - after: { - type: GraphQLInt, - description: 'Get a `first` number of instances starting at this offset' - }, - tags: { - type: new GraphQLList(GraphQLString), - description: 'Filter on existing tags' - }, - docker: { - type: GraphQLString, - description: - 'Whether to only list Docker instances, or only non-Docker instances, if present. Defaults to showing all instances.' - }, - credentials: { - type: GraphQLString, - description: - 'Whether to include the generated credentials for instances, if present. Defaults to false' - } - }, - resolve(root, args) { - const { list, get } = api.machines; - - const { after, first } = args; - - const newArgs = Object.assign(args, { - limit: first, - offset: after - }); - - return args.id - ? get({ - id: args.id - }).then(machine => [machine]) - : list(newArgs); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/networks.js b/packages/cloudapi-gql/src/schema/queries/networks.js deleted file mode 100644 index 707e2de4..00000000 --- a/packages/cloudapi-gql/src/schema/queries/networks.js +++ /dev/null @@ -1,19 +0,0 @@ -const NetworkType = require('../types/network'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(NetworkType), - args: { - id: { - type: GraphQLID - } - }, - resolve(root, args) { - const { list, get } = api.networks; - - return args.id ? get(args).then(network => [network]) : list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/nics.js b/packages/cloudapi-gql/src/schema/queries/nics.js deleted file mode 100644 index 432c8e1f..00000000 --- a/packages/cloudapi-gql/src/schema/queries/nics.js +++ /dev/null @@ -1,19 +0,0 @@ -const NicType = require('../types/nic'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLString } = graphql; - -module.exports = { - type: new GraphQLList(NicType), - args: { - mac: { - type: GraphQLString - } - }, - resolve(root, args) { - const { list, get } = api.nics; - - return args.id ? get(args).then(nic => [nic]) : list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/packages.js b/packages/cloudapi-gql/src/schema/queries/packages.js deleted file mode 100644 index b5cfd5a3..00000000 --- a/packages/cloudapi-gql/src/schema/queries/packages.js +++ /dev/null @@ -1,57 +0,0 @@ -const PackageType = require('../types/package'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLInt, GraphQLList, GraphQLString, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(PackageType), - args: { - id: { - type: GraphQLID, - description: 'Filter on package id' - }, - name: { - type: GraphQLString, - description: 'Filter on the "friendly" name' - }, - memory: { - type: GraphQLInt, - description: 'Filter on how much memory will by available (in MiB)' - }, - disk: { - type: GraphQLInt, - description: 'Filter on how much disk space will be available (in MiB)' - }, - swap: { - type: GraphQLInt, - description: 'Filter on how much swap space will be available (in MiB)' - }, - lwps: { - type: GraphQLInt, - description: - 'Filter on maximum number of light-weight processes (threads) allowed' - }, - vcpus: { - type: GraphQLInt, - description: 'Filter on number of vCPUs' - }, - version: { - type: GraphQLString, - description: 'Filter on the version' - }, - group: { - type: GraphQLString, - description: 'Filter on the group belonging to' - } - }, - resolve(root, args) { - const { list, get } = api.packages; - - return args.id - ? get({ - id: args.id - }).then(pkg => [pkg]) - : list(args); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/policies.js b/packages/cloudapi-gql/src/schema/queries/policies.js deleted file mode 100644 index c45fb8ae..00000000 --- a/packages/cloudapi-gql/src/schema/queries/policies.js +++ /dev/null @@ -1,20 +0,0 @@ -const PolicyType = require('../types/policy'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(PolicyType), - args: { - id: { - type: GraphQLID, - description: '`id` of the `PolicyType` to filter' - } - }, - resolve(root, args) { - const { list, get } = api.policies; - - return args.id ? get(args).then(policy => [policy]) : list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/roles.js b/packages/cloudapi-gql/src/schema/queries/roles.js deleted file mode 100644 index f59bfad6..00000000 --- a/packages/cloudapi-gql/src/schema/queries/roles.js +++ /dev/null @@ -1,20 +0,0 @@ -const RoleType = require('../types/role'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(RoleType), - args: { - id: { - type: GraphQLID, - description: '`id` or `name` of the `RoleType` to filter' - } - }, - resolve(root, args) { - const { list, get } = api.roles; - - return args.id ? get(args).then(role => [role]) : list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/services.js b/packages/cloudapi-gql/src/schema/queries/services.js deleted file mode 100644 index 70658fff..00000000 --- a/packages/cloudapi-gql/src/schema/queries/services.js +++ /dev/null @@ -1,19 +0,0 @@ -const ServiceType = require('../types/service'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList } = graphql; - -module.exports = { - type: new GraphQLList(ServiceType), - resolve() { - return api.services().then(services => { - return Object.keys(services).map(name => { - return { - url: services[name], - name - }; - }); - }); - } -}; diff --git a/packages/cloudapi-gql/src/schema/queries/users.js b/packages/cloudapi-gql/src/schema/queries/users.js deleted file mode 100644 index 14b48ff5..00000000 --- a/packages/cloudapi-gql/src/schema/queries/users.js +++ /dev/null @@ -1,28 +0,0 @@ -const UserType = require('../types/login'); -const graphql = require('graphql'); -const api = require('../../api'); - -const { GraphQLList, GraphQLID } = graphql; - -module.exports = { - type: new GraphQLList(UserType), - args: { - id: { - type: GraphQLID, - description: '`id` or `login` of the `UserType` to filter' - } - }, - resolve(root, args) { - const { list, get } = api.users; - - return args.id - ? get(args) - .then(user => [user]) - .then(user => - Object.assign(user, { - isUser: true - }) - ) - : list(); - } -}; diff --git a/packages/cloudapi-gql/src/schema/resolvers.js b/packages/cloudapi-gql/src/schema/resolvers.js new file mode 100644 index 00000000..7a6873e5 --- /dev/null +++ b/packages/cloudapi-gql/src/schema/resolvers.js @@ -0,0 +1,133 @@ +const { toKeyValue, fromKeyValue } = require('../api/key-value'); +const api = require('../api'); + +const transform = { + toImage: ({ os, ...rest }) => { + console.log(rest); + return Object.assign(rest, { + os: os ? os.toUpperCase() : os + }); + }, + fromImage: ({ os, state, type, ...rest }) => Object.assign(rest, { + os: os ? os.toLowerCase() : os, + state: state ? state.toLowerCase() : state, + type: type ? type.toLowerCase() : type + }) +}; + +const resolvers = { + Query: { + account: () => api.account.get(), + keys: (root, { login, name }) => + name + ? api.keys.get({ login, name }).then(key => [key]) + : api.keys.list({ login, name }), + key: (root, { login, name }) => api.keys.get({ login, name }), + users: (root, { id }) => + id ? api.users.get({ id }).then(user => [user]) : api.users.list(), + user: (root, { id }) => api.users.get({ id }), + roles: (root, { id, name }) => + id || name + ? api.roles.get({ id, name }).then(role => [role]) + : api.roles.list(), + role: (root, { id, name }) => api.roles.get({ id, name }), + policies: (root, { id }) => + id + ? api.policies.get({ id }).then(policy => [policy]) + : api.policies.list(), + policy: (root, { id }) => api.policies.get({ id }), + config: () => api.config().then(toKeyValue), + datacenters: () => + api.datacenters().then(dcs => + Object.keys(dcs).map(name => ({ + name, + url: dcs[name] + })) + ), + services: () => api.services().then(toKeyValue), + images: (root, { id, ...rest }) => id + ? api.images.get({ id }) + .then(image => [image]) + .then((imgs) => imgs.map(transform.toImage)) + : api.images.list(transform.fromImage(rest)) + .then((imgs) => imgs.map(transform.toImage)), + image: (root, { id }) => api.images.get({ id }), + packages: (root, { id, ...rest }) => + id + ? api.packages.get({ id }).then(pkg => [pkg]) + : api.packages.list(rest), + package: (root, { id }) => api.packages.get({ id }), + machines: (root, { id, brand, state, tags, ...rest }) => + id + ? api.machines.get({ id }) + : api.machines.list( + Object.assign(rest, { + brand: brand ? brand.toLowerCase() : brand, + state: state ? state.toLowerCase() : state, + tags: fromKeyValue(tags) + }) + ), + machine: (root, { id }) => api.machines.get({ id }), + snapshots: (root, { name, machine }) => + name + ? api.machines.snapshots + .get({ id: machine, name }) + .then(snapshot => [snapshot]) + : api.machines.snapshots.list({ id: machine }), + snapshot: (root, { name, machine }) => + api.machines.snapshots.get({ name, id: machine }), + metadata: (root, { machine, name, ...rest }) => + name + ? api.machines.metadata + .get(Object.assign(rest, { id: machine, key: name })) + .then(value => toKeyValue({ [name]: value })) + : api.machines.metadata.list({ id: machine }).then(toKeyValue), + metadataValue: (root, { name, machine }) => + api.machines.metadata + .get({ key: name, id: machine }) + .then(value => toKeyValue({ [name]: value }).shift()), + tags: (root, { machine, name }) => + name + ? api.machines.tags + .get({ id: machine, tag: name }) + .then(value => toKeyValue({ [name]: value })) + : api.machines.tags.list({ id: machine }).then(toKeyValue), + tag: (root, { machine, name }) => + api.machines.tags + .get({ id: machine, tag: name }) + .then(value => toKeyValue({ [name]: value }).shift()), + // eslint-disable-next-line camelcase + firewall_rules: (root, { machine, id }) => + id + ? api.firewall.get({ id }) + : machine + ? api.firewall.listByMachine({ id: machine }) + : api.firewall.list(), + // eslint-disable-next-line camelcase + firewall_rule: (root, { id }) => api.firewall.get({ id }), + vlans: (root, { id }) => (id ? api.vlans.get({ id }) : api.vlans.list()), + vlan: (root, { id }) => api.vlans.get({ id }), + networks: (root, { id, vlan }) => + id ? api.networks.get({ id, vlan }) : api.networks.list({ vlan }), + network: (root, { id, vlan }) => api.networks.get({ id, vlan }), + nics: (root, { machine, mac }) => + mac ? api.nics.get({ machine, mac }) : api.nics.list({ machine }), + nic: (root, { machine, mac }) => api.nics.get({ machine, mac }) + }, + User: { + keys: ({ login }, { name }) => resolvers.Query.keys(null, { login, name }) + }, + Machine: { + tags: ({ id }, { name }) => + resolvers.Query.tags(null, { machine: id, name }), + metadata: ({ id }, { name }) => + resolvers.Query.metadata(null, { machine: id, name }), + snapshots: ({ id }, { name }) => + resolvers.Query.snapshots(null, { machine: id, name }), + // eslint-disable-next-line camelcase + firewall_rules: ({ id: machine }, { id }) => + resolvers.Query.firewall_rules(null, { machine, id }) + } +}; + +module.exports = resolvers; diff --git a/packages/cloudapi-gql/src/schema/schema.graphql b/packages/cloudapi-gql/src/schema/schema.graphql new file mode 100644 index 00000000..d752bdca --- /dev/null +++ b/packages/cloudapi-gql/src/schema/schema.graphql @@ -0,0 +1,1144 @@ +enum AffinityRuleType { + MUST_SAME_NODE + SHOULD_SAME_NODE + MUST_DIFF_NODE + SHOW_DIFF_NODE +} + +input AffinityRule { + key: String + type: AffinityRuleType + value: String +} + +type MantaLocation { + manta_url: String + image_path: String + manifest_path: String +} + +# todo: get source for this +enum NicState { + PROVISIONING + RUNNING + STOPPED +} + +# Logical networks are used both on head nodes and compute nodes, and are associated with physical interfaces by using a system called NIC Tags +type NIC { + # NIC's IPv4 address + ip: String + # NIC's MAC address + mac: String + # Whether this is the instance's primary NIC + primary: Boolean + # IPv4 netmask + netmask: String + # IPv4 gateway + gateway: String + # Describes the state of the NIC (e.g. provisioning, running, or stopped) + state: NicState + # The NIC's network id + network: Network +} + +# Logical networks in Triton model core network configurations to enable Triton to define Virtual Network Interfaces and IP addresses for instances +type Network { + # Unique id for this network + id: ID + # The network name + name: String + # Whether this a public or private (rfc1918) network' + public: Boolean + # Whether this network is created on a fabric' + fabric: Boolean + # Description of this network + description: String + # A CIDR formatted string that describes the network' + subnet: String + # The first IP on the network that may be assigned' + provision_start_ip: String + # The last IP on the network that may be assigned' + provision_end_ip: String + # Optional Gateway IP address' + gateway: String + # Optional Resolver IP addresses' + resolvers: [String] + # Optional Static routes for hosts on this network' + routes: [KeyValue] + # Provision internet NAT zone on gateway address', + internet_nat: Boolean +} + +type VLAN { + # A number from 0-4095 that indicates the VLAN's id + id: ID + # A unique name to identify the VLAN + name: String + # An optional description of the VLAN + description: String +} + +type FirewallRule { + # Unique identifier for this rule + id: ID + # Indicates if the rule is enabled + enabled: Boolean + # Firewall rule + rule: String + # Indicates if the rule is global + global: Boolean + # Human-readable description for the rule + description: String + # Lists all instances a firewall rule is applied to + machines: [Machine] +} + +enum CallerType { + BASIC + OPERATOR + SIGNATURE + TOKEN +} + +type Caller { + # Authentication type for the action request + type: CallerType + # When the authentication type is BASIC, this member will be present and include user login + user: String + # When the authentication type is BASIC, this member will be present and include user login + ip: String + # When authentication type is either SIGNATURE or TOKEN, SSH key identifier + keyId: String +} + +type Action { + # The name of the action + name: String + # The original set of parameters sent when the action was requested + parameters: [KeyValue] + # `true` or `false`, depending on the action's success + success: Boolean + # Account requesting the action + caller: Caller + # When the action finished + time: String +} + +enum SnapshotState { + QUEUED + CANCELED + FAILED + CREATED +} + +type Snapshot { + # The name of this snapshot + name: ID + # The current state of the snapshot + state: SnapshotState +} + +enum MachineState { + PROVISIONING + RUNNING + STOPPING + STOPPED + DELETED + FAILED +} + +# An image contains the software packages that will be available on newly-provisioned instance. In the case of hardware virtual machines, the image also includes the operating system +type Machine { + # Unique id for this instance' + id: ID + # The "friendly" name for this instance' + name: String + # The type of instance (e.g. lx)' + brand: Brand + # The current state of this instance (e.g. running)' + state: MachineState + # The image id this instance was provisioned with' + image: Image + # The amount of RAM this instance has (in MiB)' + memory: Int + # The amount of disk this instance has (in MiB)' + disk: Int + # Any additional metadata this instance has', + metadata( + # Name of metadata value to retrieve + name: String + ): [KeyValue] + # The complete set of tags associated with this machine + tags( + # Name of tag value to retrieve + name: String + ): [KeyValue] + # When this instance was created + created: String + # When this instance's details was last updated + updated: String + # Whether this instance is a Docker container, if present + docker: Boolean + # The IP addresses this instance has + ips: [String] + # The networks of the nics this instance has + networks: [Network] + # IP address of the primary nic of this instance + primary_ip: String + # Whether firewall rules are enforced on this instance + firewall_enabled: Boolean + # List of FirewallRules affecting this machine + firewall_rules( + # Unique identifier for this rule + id: ID + ): [FirewallRule] + # UUID of the server on which the instance is located + compute_node: ID + # The id or name of the package used to create this instance + package: Package + # The snapshots based on this instance + snapshots( + # Snapshot name + name: String + ): [Snapshot] + # Provides a list of an instance's accomplished actions. Results are sorted from newest to oldest action + actions: [Action] +} + +type Package { + # Unique id for this package + id: ID + # The "friendly" name for this package + name: String + # How much memory will by available (in MiB) + memory: Int + # How much disk space will be available (in MiB) + disk: Int + # How much swap space will be available (in MiB) + swap: Int + # Maximum number of light-weight processes (threads) allowed + lwps: Int + # Number of vCPUs for this package + vcpus: Int + # The version of this package + version: String + # The group this package belongs to + group: String + # A human-friendly description about this package + description: String +} + +enum ImageErrorCode { + # This typically means that the target KVM VM (e.g. Linux) has old guest + # tools that pre-date the image creation feature. Guest tools can be upgraded + # with installers at https://download.joyent.com/pub/guest-tools/. Other + # possibilities are: a boot time greater than the 5 minute timeout or a bug + # or crash in the image preparation script. + PREPARE_IMAGE_DID_NOT_RUN + # Origin image data could not be found for the VM. Either the link to the image from which the VM was created has been broken (e.g. via 'zfs promote' or migration, see SYSOPS-6491) or there is some problem in either the 'image_uuid' value from vmadm get or in imgadm's DB of manifest info for that image. + VS_HAS_NO_ORIGIN + # Indicates an error due to functionality that isn't currently supported. One example is that custom image creation of a VM based on a custom image isn't currently supported. + NOT_SUPPORTED +} + +# An object providing details on failure of some asynchronous image action. Currently this is used during CreateImageFromVm. It is only present with state == 'failed' +type ImageError { + code: ImageErrorCode + # A short description of the image creation failure + message: String +} + +# The current state of the image +enum ImageState { + # The image is ready for use, i.e. VMs can be provisioned using this image. + ACTIVE + # The image has not yet been activated. See ActivateImage. + UNACTIVATED + # The image is disabled. This will be the state if the image is activated, but also disabled == true. See EnableImage and DisableImage. + DISABLED + # A state for a placeholder image while an image is being asynchronously created. This is used during CreateImageFromVm. + CREATING + # A state for a placeholder image indicating that asynchronous image creation failed. See the error field for details. + FAILED +} + +# The type of file compression used by an image file +enum ImageFileCompression { + BZIP2 + GZIP + NONE +} + +type ImageFile { + # SHA-1 hex digest of the file content. Used for upload/download corruption checking. + sha1: ID + # Number of bytes. Maximum 20GiB. This maximum is meant to be a "you'll never hit it" cap, the purpose is to inform cache handling in IMGAPI servers. + size: Int + # The type of file compression used by the file. One of 'bzip2', 'gzip', 'none'. + compression: ImageFileCompression + # Optional. The ZFS internal unique identifier for this dataset's snapshot (available via zfs get guid SNAPSHOT, e.g. zfs get guid zones/f669428c-a939-11e2-a485-b790efc0f0c1@final). If available, this is used to ensure a common base snapshot for incremental images (via imgadm create -i) and VM migrations (via vmadm send/receive). + dataset_guid: ID + # Only included if ?inclAdminFields=true is passed to GetImage/ListImages. The IMGAPI storage type used to store this file. + stor: String +} + +# Brands are related to the type of virtualization used among other factors +enum Brand { + JOYENT + JOYENT_MINIMAL + LX + KVM +} + +# A grouping of various requirements for provisioning a VM with this image +type ImageRequirements { + # An array describing the minimum number of network interfaces + networks: [Network] + # Defines the SmartOS "brand" that is required to provision with this image + brand: Brand + # A boolean indicating that provisioning with this image requires that an SSH public key be provided + ssh_key: Boolean + # `min_ram` is an integer number of MiB specifying the minimum RAM required to provision this image + min_ram: Int + # `max_ram` is an integer number of MiB specifying the maximum RAM this image may provisioned with + max_ram: Int + # `min_platform` defines the minimum required SmartOS platform on which this image can be used (and hence in SDC on which it will be provisioned) + min_platform: [KeyValue] + # `max_platform` defines the maximum allowed SmartOS platform on which this image can be used (and hence in SDC on which it will be provisioned) + max_platform: [KeyValue] +} + +# The type of the image file +enum ImageType { + # a ZFS dataset used to create a new SmartOS zone + ZONE_DATASET + # a dataset used to create a Lx-brand zone + LX_DATASET + # a KVM virtual machine image + ZVOL + # a Docker image + DOCKER + # an image that serves any other specific purpose + OTHER +} + +# The operating system of the image file +enum ImageOS { + # SmartOS + SMARTOS + # Linux, e.g. CentOS, Ubuntu, etc. + LINUX + # A Microsoft Windows OS image + WINDOWS + # FreeBSD/netBSD + BSD + # Illumos + ILLUMOS + # A catch-all for other operating systems + OTHER +} + +# An image contains the software packages that will be available on newly-provisioned instance. In the case of hardware virtual machines, the image also includes the operating system +type Image { + # Unique id for this image + id: ID + # The "friendly" name for this image' + name: String + # The underlying operating system for this image' + os: ImageOS + # The version for this image' + version: String + # What kind of image this is. The values differ after v8.0.0+ + type: ImageType + # Contains a grouping of various minimum requirements for provisioning an instance with this image. For example "password" indicates that a password must be provided + requirements: ImageRequirements + # The URL for a web page with more detailed information for this image + homepage: String + # An array of image files that make up each image. Currently only a single file per image is supported + files: [ImageFile] + # The time this image has been made publicly available + published_at: String + # The UUID of the user who owns this image + owner: ID + # Indicates if this image is publicly available + public: Boolean + # The current state of the image. One of "active", "unactivated", "disabled", "creating", "failed" + state: ImageState + # An object of key/value pairs that allows clients to categorize images by any given criteria + tags: [KeyValue] + # URL of the End User License Agreement (EULA) for the image + eula: String + # Access Control List. An array of account UUIDs given access to a private image. The field is only relevant to private images + acl: [User] + # If state==FAILED, resulting from CreateImageFromMachine failure, then there may be an error object of the form {"code": "", "message": ""} + error: ImageError +} + +type Datacenter { + # Location of the datacenter + name: String + url: String +} + +input KeyValueInput { + name: String! + value: String! +} + +type KeyValue { + id: ID! + name: String! + value: String! +} + +# Policies are lists of rules that describe access to resources +type Policy { + # Unique id for this policy + id: ID + # The policy name + name: String + # One or more Aperture sentences applying to the policy + rules: [String] + # A description for this policy + description: String +} + +# Roles are lists of users and policies. Roles describe which users are allowed access according to the policies +type Role { + # Unique id for this role + id: ID + # The role name + name: String + # This account's policies which this role obeys + policies: [Policy] + # This account's user logins this role applies to + members: [User] + # This account's user logins this role applies to by default + default_members: [User] +} + +type Key { + # Name for this key + name: String + # Key fingerprint + fingerprint: String + # Public key in OpenSSH format + value: String +} + +type User { + # Unique id for this user/account + id: ID + # Account/Sub-user login name + login: String + # Email address + email: String + company_name: String + first_name: String @fake(type: firstName) + last_name: String + address: String + postal_code: String + city: String + state: String + country: String + phone: String + # When this user/account was created + created: String + # When this user/account's details was last updated + updated: String + # true if Triton CNS is enabled for account + triton_cns_enabled: Boolean + # lists all public keys we have on record for the specified account user + keys( + # name of the key to filter + name: String + ): [Key] +} + +type Query { + # Retrieves your account details + account: User + # Lists all public keys we have on record for the specified account + keys( + # only retrieve keys from specified username + login: String + # name of the key to filter + name: String + ): [Key] + # Retrieves the record for an individual key + key( + # name of the key to retrieve + name: String! + # only retrieve keys from specified username. required for sub-users + login: String + ): Key + # Returns a list of an account's user objects + users( + # user id to filter + id: ID + ): [User] + # Get one user for an account + user( + # username of user to filter + id: ID! + ): User + # Returns an array of account roles + roles( + # filter by role `id` + id: ID + # filter by role `name` + name: String + ): [Role] + # Get an account role (`:role`) by `id` or `name` + role( + # retrieve role with `id` + id: ID + # retrieve role with `name` + name: String + ): Role + # Retrieves a list of account policies + policies( + # filter by policy `id` + id: ID + ): [Policy] + # Get an account policy (`:policy`) by `id` + policy( + # retrieve policy with `id` + id: ID! + ): Policy + # Outputs configuration for your account + config: [KeyValue] + # Provides a list of all datacenters this cloud is aware of + datacenters: [Datacenter] + # Provides the URL endpoints for services for this datacenter. It is a mapping of service name to URL endpoint. + services: [KeyValue] + # Provides a list of images available in this datacenter + images( + # The id of this image + id: ID + # The "friendly" name for this image + name: String + # The underlying operating system for this image + os: ImageOS + # The version for this image + version: String + # Filter public/private images + public: Boolean + # Filter on image state. By default only active images are shown. Use ALL to list all images + state: ImageState + # Filter on owner UUID + owner: ID + # Filter on image type + type: ImageType + ): [Image] + # Gets an individual image by id + image( + # Unique id of this image + id: ID + ): Image + # Provides a list of packages available in this datacenter + packages( + # The id of for this package + id: ID + # The "friendly" name for this package + name: String + # How much memory will by available (in MiB) + memory: Int + # How much disk space will be available (in MiB) + disk: Int + # How much swap space will be available (in MiB) + swap: Int + # Maximum number of light-weight processes (threads) allowed + lwps: Int + # Number of vCPUs for this package + vcpus: Int + # The version of this package + version: String + # The group this package belongs to + group: String + ): [Package] + # Gets a package by `name` or `id` + package( + # The id of for this package + id: ID + ): Package + # Lists all instances we have on record for your account + machines( + # The id of for this machine + id: ID + # The type of instance (e.g. lx) + brand: Brand + # Machine name to find (will make your list size 1, or 0 if nothing found) + name: String + # Image id; returns instances provisioned with that image + image: ID + # The current state of the instance (e.g. running) + state: MachineState + # The current size of the RAM deployed for the instance (in MiB) + memory: Int + # Include destroyed and failed instances available in instance history + tombstone: Boolean + # Return a max of N instances; default is 1000 (which is also the maximum allowable result set size) + limit: Int + # Get a limit number of instances starting at this offset + offset: Int + # Whether to only list Docker instances, or only non-Docker instances, if present. Defaults to showing all instances + docker: Boolean + # Whether to include the generated credentials for instances, if present. Defaults to false + credentials: Boolean + # An arbitrary set of tags can be used for querying + tags: [KeyValueInput] + ): [Machine] + # Gets the details for an individual instance. Deleted instances are returned only if the instance history has not been purged from Triton + machine( + # The id of for this machine + id: ID + ): Machine + # Lists all snapshots taken for a given machine + snapshots( + # Snapshot id + name: ID + # Machine id + machine: ID! + ): [Snapshot] + # Gets the state of the named snapshot + snapshot( + # Machine id + machine: ID! + # Snapshot name + name: String! + ): Snapshot + # Returns the complete set of metadata associated with a given machine + metadata( + # Machine id + machine: ID! + # Whether or not to return instance credentials. Defaults to false + credentials: Boolean + # Name of metadata value to retrieve + name: String + ): [KeyValue] + # Gets the state of the named snapshot + metadataValue( + # Machine id + machine: ID! + # Name of metadata value to retrieve + name: String + ): KeyValue + # Returns the complete set of tags associated with this machine + tags( + # Machine id + machine: ID! + # Name of tag value to retrieve + name: String + ): [KeyValue] + # Returns the value for a single tag on this machine + tag( + # Machine id + machine: ID! + # Name of tag value to retrieve + name: String + ): KeyValue + # Provides a list of an instance's accomplished actions. Results are sorted from newest to oldest action. Note that the complete audit trail is returned only if the instance history and job records have not been purged from Triton. + actions( + # Machine id + machine: ID! + ): [Action] + # List all firewall rules for the current account + # + # Arguments + # id: + # machine: + firewall_rules( + # Unique identifier for this rule + id: ID + # Machine id + machine: ID + ): [FirewallRule] + # Retrieves an individual firewall rule + firewall_rule( + # Unique identifier for this rule + id: ID! + ): FirewallRule + # List all vlans for the current account + vlans( + # Unique identifier for this vlan + id: ID + ): [VLAN] + # Retrieves an individual vlan + vlan( + # Unique identifier for this vlan + id: ID! + ): VLAN + # Lists all of the networks. If the vlan parameter is specified, then only fabric networks are returned + networks( + id: ID + # VLAN id + vlan: ID + ): [Network] + # Retrieves an individual network rule + network( + id: ID! + # VLAN id + vlan: ID + ): Network + # List all the NICs on an instance + nics( + # Machine id + machine: ID! + # NIC's MAC address + mac: String + ): [NIC] + # Gets a specific NIC on an instance + nic( + # Machine id + machine: ID! + # NIC's MAC address + mac: String! + ): [NIC] +} + +type Mutation { + # Update your account details + updateAccount( + # Email address + email: String + companyName: String + firstName: String + lastName: String + address: String + postalCode: String + city: String + state: String + country: String + phone: String + # Enable or disable the Triton CNS + triton_cns_enabled: Boolean + ): User + # Uploads a new OpenSSH key to Triton for use in HTTP signing and SSH. + createKey( + # User id. Use this for sub-user keys + user: ID + # Name for this key + name: String + # OpenSSH formatted public key + fingerprint: String! + ): Key + # Deletes a single SSH key, by name or fingerprint + deleteKey( + # User id. Use this for sub-user keys + user: ID + # Name for this key + name: String + # OpenSSH formatted public key + fingerprint: String + ): Key + # Creates a new user under an account + createUser( + # Email address + email: String + # Username + login: String + # Password + password: String + companyName: String + firstName: String + lastName: String + address: String + postalCode: String + city: String + state: String + country: String + phone: String + ): User + # Update a user's modifiable properties + updateUser( + id: ID! + login: String + email: String + companyName: String + firstName: String + lastName: String + address: String + postalCode: String + city: String + state: String + country: String + phone: String + ): User + # This is a separate rule for password changes, so different policies can be used for an user trying to modify other data, or only their own password + changeUserPassword( + id: ID! + password: String + password_confirmation: String + ): User + # Remove a user + deleteUser(id: ID!): User + # Create a new role for your account + createRole( + # The role's name + name: String + # This account's policies to be given to this role + policies: [ID] + # This account's user logins to be added to this role + members: [ID] + # This account's user logins to be added to this role and have it enabled by default + default_members: [ID] + ): Role + # Modifies an account role. Anything but id can be modified + updateRole( + # Role id + id: ID! + # The role's name + name: String + # This account's policies to be given to this role + policies: [ID] + # This account's user logins to be added to this role + members: [ID] + # This account's user logins to be added to this role and have it enabled by default + default_members: [ID] + ): Role + # Remove a role + deleteRole( + # Role id + id: ID! + ): Role + # Creates a new account policy + createPolicy( + # The policy name + name: String + # One or more Aperture sentences to be added to the current policy + rules: [String]! + # A description for this policy + description: String + ): Policy + # Upgrades an existing account policy. Everything but id can be modified. + updatePolicy( + # Policy id + id: ID! + # The policy name + name: String + # One or more Aperture sentences to be added to the current policy + rules: [String] + # A description for this policy + description: String + ): Policy + # Delete an RBAC policy + deletePolicy( + # Policy id + id: ID! + ): Policy + # Updates configuration values for your account + updateConfig( + # ID of the network used for provisioning docker containers + default_network: String + ): [KeyValue] + # Delete an image. Caller must be the owner of the image to delete it + deleteImage( + # Image id + id: ID + ): Image + # Exports an image to the specified Manta path. Caller must be the owner of the image, and the correspondent Manta path prefix, in order to export it + # + # Arguments + # id: + exportImage( + # Manta path prefix used when exporting the image + manta_path: String! + ): MantaLocation + # Create a new custom image from an instance + createImageFromMachine( + # The prepared and stopped instance UUID from which the image is to be created + machine: ID! + # The name of the custom image, e.g. "my-image" + name: String! + # The version of the custom image, e.g. "1.0.0" + version: String! + # The image description + description: String + # The image homepage + homepage: String + # The image eula + eula: String + # The image acl + acl: String + # The image tags + tags: [KeyValueInput] + ): Image + # Create a new custom image from an instance + updateImage( + # Image id + id: ID! + # The name of the custom image, e.g. "my-image" + name: String! + # The version of the custom image, e.g. "1.0.0" + version: String! + # The image description + description: String + # The image homepage + homepage: String + # The image eula + eula: String + # The image acl + acl: String + # The image tags + tags: [KeyValueInput] + ): Image + # Allows you to provision an instance. + # + # If you do not specify a name, CloudAPI will generate a random one for you. If you have enabled Triton CNS on your account, this name will also be used in DNS to refer to the new instance (and must therefore consist of DNS-safe characters only). + # + # Your instance will initially be not available for login (Triton must provision and boot it); you can poll [GetMachine](https://apidocs.joyent.com/cloudapi/#GetMachine) for its status. When the `state` field is equal to `running`, you can log in. If the instance is a `brand` other than `kvm`, you can usually use any of the SSH keys managed under the [keys section](https://apidocs.joyent.com/cloudapi/#keys) of CloudAPI to login as any POSIX user on the OS. You can add/remove keys over time, and the instance will automatically work with that set. + # + # If the the instance has a brand `kvm`, and of a UNIX-derived OS (e.g. Linux), you must have keys uploaded before provisioning; that entire set of keys will be written out to `/root/.ssh/authorized_keys` in the new instance, and you can SSH in using one of those keys. Changing the keys over time under your account will not affect a running hardware virtual machine in any way; those keys are statically written at provisioning-time only, and you will need to manually manage them on the instance itself. + # + # If the image you create an instance from is set to generate passwords for you, the username/password pairs will be returned in the metadata response as a nested object, like so: + # + # ```json + # "metadata": { + # "credentials": { + # "root": "s8v9kuht5e", + # "admin": "mf4bteqhpy" + # } + # } + # ``` + # + # You cannot overwrite the `credentials` key in CloudAPI. + # + # More generally, the metadata keys can be set either at the time of instance creation, or after the fact. You must either pass in plain-string values, or a JSON-encoded string. On metadata retrieval, you will get a JSON object back. + # + # Networks can be specified using the networks attribute. If it is absent from the input, the instance will default to attaching to one externally-accessible network (it will have one public IP), and one internally-accessible network from the datacenter network pools. It is possible to have an instance attached to only an internal network, or both public and internal, or just external. + # + # Be aware that CreateMachine does not return IP addresses or networks. To obtain the IP addresses and networks of a newly-provisioned instance, poll [GetMachine](https://apidocs.joyent.com/cloudapi/#GetMachine) until the instance state is `running`. + # + # Typically, Triton will allocate the new instance somewhere reasonable within the cloud. See [affinity rules](https://apidocs.joyent.com/cloudapi/#affinity-rules) below for options on controlling server placement of new instances. + # + # When Triton CNS is enabled, the DNS search domain of the new VM will be automatically set to the suffix of the "instance" record that is created for that VM. For example, if the full CNS name of the new VM would be "foo.inst.35ad1ec4-2eab-11e6-ac02-8f56c66976a1.us-west-1.triton.zone", its automatic DNS search path would include "inst.35ad1ec4-2eab-11e6-ac02-8f56c66976a1.us-west-1.triton.zone". This can be changed later within the instance, if desired. + createMachine( + # Friendly name for this instance; default is the first 8 characters of the machine id. If the name includes the string {{shortId}}, any instances of that tag within the name will be replaced by the first 8 characters of the machine id. + name: String + # Id of the package to use on provisioning, obtained from ListPackages + package: ID + # The image UUID + image: ID + # Desired networks ids + networks: [ID] + # Optional array of affinity rules + affinity: [AffinityRule] + # An arbitrary set of metadata key/value pairs can be set at provision time, but they must be prefixed with "metadata" + metadata: [KeyValueInput] + # An arbitrary set of tags can be set at provision time, but they must be prefixed with "tag" + tag: [KeyValueInput] + # Completely enable or disable firewall for this instance. Default is false + firewall_enabled: Boolean + ): Machine + # Allows you to shut down an instance + stopMachine( + # Machine id + id: ID! + ): Machine + # Allows you to boot up an instance + startMachine( + # Machine id + id: ID! + ): Machine + # Allows you to reboot an instance + rebootMachine( + # Machine id + id: ID! + ): Machine + # Resize an instance to a new package + # + # Resizing is only supported for containers (instances which are not hardware virtual machines -- they have brand=kvm). Hardware virtual machines cannot be resized. Resizing is not guaranteed to work, especially when resizing upwards in resources. It is best-effort, and may fail. Resizing downwards will usually succeed. + resizeMachine( + # Machine id + id: ID! + # Package id + package: ID! + ): Machine + # Allows you to rename an instance + renameMachine( + # Machine id + id: ID! + # Package id + name: String! + ): Machine + # Allows you to enable the firewall for an instance + enableMachineFirewall( + # Machine id + id: ID! + ): Machine + # Allows you to take a snapshot of an instance. Once you have one or more snapshots, you can boot the instance from a previous snapshot. Snapshots are not usable with other instances; they are a point-in-time snapshot of the current instance. Snapshots can also only be taken of instances that are not of brand 'kvm'. + createMachineSnapshot( + # Machine id + id: ID! + name: String + ): Snapshot + # If an instance is in the 'stopped' state, you can choose to start the instance from the referenced snapshot. This is effectively a means to roll back instance state. + startMachineFromSnapshot( + # Machine id + id: ID! + snapshot: ID! + ): Machine + # Deletes the specified snapshot of an instance + deleteMachineSnapshot( + # Machine id + id: ID! + snapshot: ID! + ): Snapshot + # Allows you to update the metadata for a given instance. Note that updating the metadata via CloudAPI will result in the metadata being updated in the running instance. The semantics of this call are subtly different that the AddMachineTags call -- any metadata keys passed in here are created if they do not exist, and overwritten if they do. + updateMachineMetadata( + # Machine id + id: ID! + # Metadata key value pairs + metadata: [KeyValueInput] + ): Machine + # Deletes a single metadata key from this instance + deleteMachineMetadata( + # Machine id + id: ID! + # Metadata key + key: String! + ): String + # Deletes all metadata keys from this instance + deleteAllMachineMetadata( + # Machine id + id: ID! + ): String + # Set tags on the given instance. A pre-existing tag with the same name as one given will be overwritten + addMachineTags( + # Machine id + id: ID! + # key value pairs + tags: [KeyValueInput]! + ): Machine + # Fully replace all tags on an instance with the given tags + replaceMachineTags( + # Machine id + id: ID! + # key value pairs + tags: [KeyValueInput]! + ): Machine + # Deletes a single tag from this instance + deleteMachineTag( + # Machine id + id: ID! + # tag key + tags: [KeyValueInput]! + ): Machine + # Deletes all tags from an instance + deleteMachineTags( + # Machine id + id: ID! + ): Machine + # Allows you to completely destroy an instance + deleteMachine( + # Machine id + id: ID! + ): Machine + # Adds a new firewall rule for the specified account. This rule will be added to all the account's instances where it may be necessary + createFirewallRule( + # Indicates if the rule is enabled (optional, false by default) + enabled: Boolean + # Firewall rule text + rule: String! + # Human-readable description for the rule + description: String + ): FirewallRule + # Adds a new firewall rule for the specified account. This rule will be added to all the account's instances where it may be necessary + updateFirewallRule( + # Firewall rule id + id: ID! + # Indicates if the rule is enabled (false by default) + enabled: Boolean + # Firewall rule text + rule: String + # Human-readable description for the rule + description: String + ): FirewallRule + # Enables the given firewall rule if it is disabled + enableFirewallRule( + # Firewall rule id + id: ID! + ): FirewallRule + # Disables the given firewall rule if it is enabled + disableFirewallRule( + # Firewall rule id + id: ID! + ): FirewallRule + # Removes the given firewall rule from all the required instances + deleteFirewallRule( + # Firewall rule id + id: ID! + ): FirewallRule + # Creates a new VLAN on the fabric + createVLAN( + # A number from 0-4095 that indicates the VLAN's id + id: Int! + # A unique name to identify the VLAN + name: String! + # An optional description of the VLAN + descritpion: String + ): VLAN + # Updates a fabric VLAN + updateVLAN( + # The VLAN id + id: Int! + # A unique name to identify the VLAN + name: String + # An optional description of the VLAN + descritpion: String + ): VLAN + # Deletes the specified VLAN. Note there must be no networks on that VLAN in order for the VLAN to be deleted. + deleteVLAN( + # The VLAN id + id: Int! + ): VLAN + # Create Fabric network + createNetwork( + # The network name; must be unique + name: String! + # Description of this network + description: String + # A CIDR formatted string that describes the network + subnet: String! + # The first IP on the network that may be assigned + provision_start_ip: String + # The last IP on the network that may be assigned + provision_end_ip: String + # Gateway IP address + gateway: String + # Optional resolver IP addresses + resolvers: [String] + # Optional Static routes for hosts on this network + routes: [KeyValueInput] + # Provision internet NAT zone on gateway address, default is true + internet_nat: Boolean + ): Network + # Deletes the specified Network. Note that no instances may be provisioned on the Network + deleteNetwork( + # The network id + id: ID + ): Network + # Creates a new NIC on an instance belonging to a given account + # *WARNING*: this causes the instance to reboot while adding the NIC + addNic( + # Machine id + machine: ID! + # ID of network this NIC should attach to + network: ID! + ): NIC + # Removes a NIC on an instance belonging to a given account + # *WARNING*: this causes the instance to reboot while removing the NIC + removeNic( + # Machine id + machine: ID + # NIC mac address + mac: String + ): NIC +} + +schema { + query: Query + mutation: Mutation +} diff --git a/packages/cloudapi-gql/src/schema/types/audit.js b/packages/cloudapi-gql/src/schema/types/audit.js deleted file mode 100644 index bc28a493..00000000 --- a/packages/cloudapi-gql/src/schema/types/audit.js +++ /dev/null @@ -1,59 +0,0 @@ -const DynamicObjectType = require('./dynamic-object'); - -const { GraphQLString, GraphQLObjectType, GraphQLBoolean } = require('graphql'); - -const CallerType = new GraphQLObjectType({ - name: 'CallerType', - fields: { - type: { - type: GraphQLString, - description: - 'Authentication type for the action request. One of "basic", "operator", "signature" or "token"' - }, - user: { - type: GraphQLString, - description: - 'When the authentication type is "basic", this member will be present and include user login' - }, - ip: { - type: GraphQLString, - description: - 'The IP addresses this from which the action was requested. Not present if type is "operator"' - }, - keyId: { - type: GraphQLString, - description: - 'When authentication type is either "signature" or "token", SSH key identifier' - } - } -}); - -module.exports = new GraphQLObjectType({ - name: 'AuditType', - fields: { - action: { - type: GraphQLString, - description: 'The name of the action' - }, - parameters: { - type: DynamicObjectType, - description: - 'The original set of parameters sent when the action was requested' - }, - success: { - type: GraphQLBoolean, - description: "`true` or `false`, depending on the action's success", - resolve: root => { - return root.success === 'yes'; - } - }, - caller: { - type: CallerType, - description: 'Account requesting the action' - }, - time: { - type: GraphQLString, - description: 'When the action finished' - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/datacenter.js b/packages/cloudapi-gql/src/schema/types/datacenter.js deleted file mode 100644 index 63518ee9..00000000 --- a/packages/cloudapi-gql/src/schema/types/datacenter.js +++ /dev/null @@ -1,14 +0,0 @@ -const { GraphQLString, GraphQLObjectType } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'DatacenterType', - fields: { - name: { - type: GraphQLString, - description: 'location of the datacenter' - }, - url: { - type: GraphQLString - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/dynamic-object.js b/packages/cloudapi-gql/src/schema/types/dynamic-object.js deleted file mode 100644 index 9a17892e..00000000 --- a/packages/cloudapi-gql/src/schema/types/dynamic-object.js +++ /dev/null @@ -1,41 +0,0 @@ -const { GraphQLScalarType, Kind } = require('graphql'); - -const kinds = { - [Kind.STRING]: ast => { - return ast.value; - }, - [Kind.BOOLEAN]: ast => { - return kinds[Kind.STRING](ast); - }, - [Kind.INT]: ast => { - return Number(ast.value); - }, - [Kind.FLOAT]: ast => { - return kinds[Kind.INT](ast); - }, - [Kind.OBJECT]: ast => { - const value = Object.create(null); - ast.fields.forEach(field => { - value[field.name.value] = parseLiteral(field.value); - }); - - return value; - }, - [Kind.LIST]: ast => { - return ast.values.map(parseLiteral); - } -}; - -// https://github.com/taion/graphql-type-json/blob/master/src/index.js -const parseLiteral = ast => { - const kind = kinds[ast.kind]; - return kind ? kinds[ast.kind](ast) : null; -}; - -// From http://stackoverflow.com/a/34229603 -module.exports = new GraphQLScalarType({ - name: 'DynamicObjectType', - serialize: v => v, - parseValue: v => v, - parseLiteral -}); diff --git a/packages/cloudapi-gql/src/schema/types/fabric.js b/packages/cloudapi-gql/src/schema/types/fabric.js deleted file mode 100644 index 4e14ce23..00000000 --- a/packages/cloudapi-gql/src/schema/types/fabric.js +++ /dev/null @@ -1,19 +0,0 @@ -const { GraphQLString, GraphQLObjectType, GraphQLInt } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'FabricsType', - fields: { - name: { - type: GraphQLString, - description: 'A unique name to identify the VLAN' - }, - vlanId: { - type: GraphQLInt, - description: "A number from 0-4095 that indicates the VLAN's id" - }, - description: { - type: GraphQLString, - description: 'An optional description of the VLAN' - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/firewall-rule.js b/packages/cloudapi-gql/src/schema/types/firewall-rule.js deleted file mode 100644 index 95aa7890..00000000 --- a/packages/cloudapi-gql/src/schema/types/firewall-rule.js +++ /dev/null @@ -1,92 +0,0 @@ -const api = require('../../api'); - -const { - GraphQLString, - GraphQLBoolean, - GraphQLObjectType, - GraphQLList, - GraphQLID, - GraphQLInt -} = require('graphql'); - -const FirewallRuleSyntaxType = new GraphQLObjectType({ - name: 'FirewallRuleSyntaxType', - fields: { - text: { - type: GraphQLString - }, - from: { - type: GraphQLString - }, - to: { - type: GraphQLString - }, - action: { - type: GraphQLString - }, - protocol: { - type: GraphQLString - }, - port: { - type: GraphQLInt - } - } -}); - -module.exports = new GraphQLObjectType({ - name: 'FirewallRuleType', - // Function to allow circular dependencies - fields: () => ({ - id: { - type: GraphQLID, - description: 'Unique identifier for this rule' - }, - enabled: { - type: GraphQLBoolean, - description: 'Indicates if the rule is enabled', - resolve: root => { - return Boolean(root.enabled); - } - }, - rule: { - type: GraphQLString, // FirewallRuleSyntaxType, - description: 'Firewall rule', - resolve: ({ rule }) => { - return rule; - // console.log(rule); - // const regex = /from (.*?) to (.*?) (allow|deny) (.*?) port (\d*)/i; - // const tokens = rule.match(regex); - // - // return { - // from: tokens[1], - // to: tokens[2], - // action: tokens[3], - // protocol: tokens[4], - // port: tokens[5], - // text: rule - // }; - } - }, - global: { - type: GraphQLBoolean, - description: 'Indicates if the rule is global', - resolve: root => { - return Boolean(root.global); - } - }, - description: { - type: GraphQLString, - description: 'Human-readable description for the rule' - }, - machines: { - // Circular dependency - type: new GraphQLList(require('./machine')), - description: 'Lists all instances a firewall rule is applied to', - resolve: root => { - return api.firewallRules.listMachines({ - id: root.id - }); - } - } - }) -}); diff --git a/packages/cloudapi-gql/src/schema/types/image.js b/packages/cloudapi-gql/src/schema/types/image.js deleted file mode 100644 index 4a5683d2..00000000 --- a/packages/cloudapi-gql/src/schema/types/image.js +++ /dev/null @@ -1,127 +0,0 @@ -const DynamicObjectType = require('./dynamic-object'); - -const { - GraphQLBoolean, - GraphQLString, - GraphQLObjectType, - GraphQLInt, - GraphQLList, - GraphQLID -} = require('graphql'); - -const ErrorType = new GraphQLObjectType({ - name: 'ErrorType', - fields: { - code: { - type: GraphQLString, - description: - 'A CamelCase string code for this error, e.g. "PrepareImageDidNotRun". See GetImage docs for a table of error.code values' - }, - message: { - type: GraphQLString, - description: 'A short description of the image creation failure' - } - } -}); - -const ImageFileType = new GraphQLObjectType({ - name: 'ImageFileType', - fields: { - compression: { - type: GraphQLString, - description: - 'The type of file compression used for the image file. One of "bzip2", "gzip", "none"' - }, - sha1: { - type: GraphQLString, - description: - 'SHA-1 hex digest of the file content. Used for corruption checking' - }, - size: { - type: GraphQLInt, - description: 'File size in bytes' - } - } -}); - -module.exports = new GraphQLObjectType({ - name: 'ImageType', - description: - 'An image contains the software packages that will be available on newly-provisioned instance. In the case of hardware virtual machines, the image also includes the operating system', - fields: { - id: { - type: GraphQLID, - description: 'Unique id for this image' - }, - name: { - type: GraphQLString, - description: 'The "friendly" name for this image' - }, - os: { - type: GraphQLString, - description: 'The underlying operating system for this image' - }, - version: { - type: GraphQLString, - description: 'The version for this image' - }, - type: { - type: GraphQLString, - description: 'What kind of image this is. The values differ after v8.0.0+' - }, - requirements: { - type: DynamicObjectType, - description: - 'Contains a grouping of various minimum requirements for provisioning an instance with this image. For example "password" indicates that a password must be provided' - }, - homepage: { - type: GraphQLString, - description: - 'The URL for a web page with more detailed information for this image' - }, - files: { - type: new GraphQLList(ImageFileType), - description: - 'An array of image files that make up each image. Currently only a single file per image is supported' - }, - publishedAt: { - type: GraphQLString, - description: 'The time this image has been made publicly available' - }, - owner: { - type: GraphQLString, - description: 'The UUID of the user who owns this image' - }, - public: { - type: GraphQLBoolean, - description: 'Indicates if this image is publicly available', - resolve: root => { - return Boolean(root.public); - } - }, - state: { - type: GraphQLString, - description: - 'The current state of the image. One of "active", "unactivated", "disabled", "creating", "failed"' - }, - tags: { - type: DynamicObjectType, - description: - 'An object of key/value pairs that allows clients to categorize images by any given criteria' - }, - eula: { - type: GraphQLString, - description: 'URL of the End User License Agreement (EULA) for the image' - }, - acl: { - type: new GraphQLList(GraphQLString), - description: - 'Access Control List. An array of account UUIDs given access to a private image. The field is only relevant to private images' - }, - error: { - type: ErrorType, - description: - 'If state=="failed", resulting from CreateImageFromMachine failure, then there may be an error object of the form {"code": "", "message": ""}' - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/key.js b/packages/cloudapi-gql/src/schema/types/key.js deleted file mode 100644 index 6937832c..00000000 --- a/packages/cloudapi-gql/src/schema/types/key.js +++ /dev/null @@ -1,16 +0,0 @@ -const { GraphQLString, GraphQLObjectType } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'KeyType', - fields: { - name: { - type: GraphQLString - }, - fingerprint: { - type: GraphQLString - }, - key: { - type: GraphQLString - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/login.js b/packages/cloudapi-gql/src/schema/types/login.js deleted file mode 100644 index edf6290b..00000000 --- a/packages/cloudapi-gql/src/schema/types/login.js +++ /dev/null @@ -1,108 +0,0 @@ -const KeyType = require('./key'); -const api = require('../../api'); - -const { - GraphQLBoolean, - GraphQLString, - GraphQLList, - GraphQLObjectType, - GraphQLID -} = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'LoginType', - fields: { - id: { - type: GraphQLID, - description: 'Unique id for this user/account' - }, - login: { - type: GraphQLString, - description: 'Account/Sub-user login name' - }, - email: { - type: GraphQLString, - description: 'Email address' - }, - companyName: { - type: GraphQLString, - resolve: root => { - return Boolean(root.companyName) || root.companyName; - } - }, - firstName: { - type: GraphQLString, - resolve: root => { - return Boolean(root.firstName) || root.firstName; - } - }, - lastName: { - type: GraphQLString, - resolve: root => { - return Boolean(root.lastName) || root.lastName; - } - }, - address: { - type: GraphQLString - }, - postalCode: { - type: GraphQLString, - resolve: root => { - return Boolean(root.postalCode) || root.postalCode; - } - }, - city: { - type: GraphQLString - }, - state: { - type: GraphQLString - }, - country: { - type: GraphQLString - }, - phone: { - type: GraphQLString - }, - cnsEnabled: { - type: GraphQLBoolean, - description: 'true if Triton CNS is enabled for account', - resolve: root => { - return root.isUser ? null : Boolean(root.tritonCnsEnabled); - } - }, - keys: { - type: new GraphQLList(KeyType), - description: 'Get keys for user/account', - args: { - name: { - type: GraphQLString, - description: 'Filter on key name' - }, - fingerprint: { - type: GraphQLString, - description: 'Filter on key fingerprint' - } - }, - resolve(root, args) { - const _api = root.isUser ? api.keys.user : api.keys.account; - - const { list, get } = _api; - - const newArgs = Object.assign(args, { - userId: root.id - }); - - const filtered = args.name || args.fingerprint; - return filtered ? get(newArgs).then(key => [key]) : list(newArgs); - } - }, - updated: { - type: GraphQLString, - description: "When this user/account's details was last updated" - }, - created: { - type: GraphQLString, - description: 'When this user/account was created' - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/machine.js b/packages/cloudapi-gql/src/schema/types/machine.js deleted file mode 100644 index 9a2e872a..00000000 --- a/packages/cloudapi-gql/src/schema/types/machine.js +++ /dev/null @@ -1,181 +0,0 @@ -const api = require('../../api'); -const DynamicObjectType = require('./dynamic-object'); -const SnapshotType = require('./snapshot'); - -const { - GraphQLBoolean, - GraphQLString, - GraphQLInputObjectType, - GraphQLObjectType, - GraphQLInt, - GraphQLList, - GraphQLID -} = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'MachineType', - description: - 'An image contains the software packages that will be available on newly-provisioned instance. In the case of hardware virtual machines, the image also includes the operating system', - // Function to allow circular dependencies - fields: () => ({ - id: { - type: GraphQLID, - description: 'Unique id for this instance' - }, - name: { - type: GraphQLString, - description: 'The "friendly" name for this instance' - }, - brand: { - type: GraphQLString, - description: 'The type of instance (e.g. lx)' - }, - state: { - type: GraphQLString, - description: 'The current state of this instance (e.g. running)' - }, - image: { - type: GraphQLString, - description: 'The image id this instance was provisioned with' - }, - memory: { - type: GraphQLInt, - description: 'The amount of RAM this instance has (in MiB)' - }, - disk: { - type: GraphQLInt, - description: 'The amount of disk this instance has (in MiB)' - }, - metadata: { - type: DynamicObjectType, - description: 'Any additional metadata this instance has', - args: { - name: { - type: GraphQLString, - description: 'Filter on the name of the metadata field' - } - }, - resolve: (root, args) => { - const { metadata } = api.machines; - const { list, get } = metadata; - - return args.name - ? get({ - id: root.id, - key: args.name - }).then(value => ({ - [args.name]: value - })) - : list({ id: root.id }); - } - }, - tags: { - type: DynamicObjectType, - description: 'Any tags this instance has', - args: { - name: { - type: GraphQLString, - description: 'Filter on the name of the tag' - } - }, - resolve: (root, args) => { - const { tags: { get } } = api.machines; - - return args.name - ? get({ - id: root.id, - tag: args.name - }).then(value => ({ - [args.name]: value - })) - : root.tags; - } - }, - created: { - type: GraphQLString, - description: 'When this instance was created' - }, - updated: { - type: GraphQLString, - description: "When this instance's details was last updated" - }, - docker: { - type: GraphQLBoolean, - description: 'Whether this instance is a Docker container, if present', - resolve: root => { - return Boolean(root.docker); - } - }, - ips: { - type: new GraphQLList(GraphQLString), - description: 'The IP addresses this instance has' - }, - networks: { - type: new GraphQLList(require('./network')), - description: 'The networks of the nics this instance has', - resolve: (root, args) => { - const { networks } = root; - const { get } = api.networks; - - return Promise.all(networks.map(id => get(id))); - } - }, - primaryIp: { - type: GraphQLString, - description: 'IP address of the primary nic of this instance' - }, - firewallEnabled: { - type: GraphQLBoolean, - description: 'Whether firewall rules are enforced on this instance', - resolve: root => { - return Boolean(root.firewallEnabled); - } - }, - firewallRules: { - // Circular dependency - type: new GraphQLList(require('./firewall-rule')), - description: 'List of FirewallRules affecting this machine', - resolve: ({ id }) => { - return api.firewallRules.listByMachine({ id }); - } - }, - computeNode: { - type: GraphQLString, - description: 'UUID of the server on which the instance is located' - }, - package: { - type: GraphQLString, - description: 'The id or name of the package used to create this instance' - }, - snapshots: { - type: new GraphQLList(SnapshotType), - description: 'The snapshots based on this instance', - args: { - name: { - type: GraphQLString, - description: 'Filter on the name of the snapshot' - } - }, - resolve: ({ id }, args) => { - const { list, get } = api.machines.snapshots; - - return args.name ? get({ name: args.name, id: root.id }) : list({ id }); - } - } - }) -}); - -module.exports.locality = new GraphQLInputObjectType({ - name: 'LocalityType', - fields: { - strict: { - type: GraphQLBoolean - }, - near: { - type: new GraphQLList(GraphQLID) - }, - far: { - type: new GraphQLList(GraphQLID) - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/network.js b/packages/cloudapi-gql/src/schema/types/network.js deleted file mode 100644 index d844ffed..00000000 --- a/packages/cloudapi-gql/src/schema/types/network.js +++ /dev/null @@ -1,74 +0,0 @@ -const DynamicObjectType = require('./dynamic-object'); - -const { - GraphQLBoolean, - GraphQLString, - GraphQLObjectType, - GraphQLList, - GraphQLID -} = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'NetworkType', - description: - 'Logical networks in Triton model core network configurations to enable Triton to define Virtual Network Interfaces and IP addresses for instances', - fields: { - id: { - type: GraphQLID, - description: 'Unique id for this network' - }, - name: { - type: GraphQLString, - description: 'The network name' - }, - public: { - type: GraphQLBoolean, - description: 'Whether this a public or private (rfc1918) network', - resolve: root => { - return Boolean(root.public); - } - }, - fabric: { - type: GraphQLBoolean, - description: 'Whether this network is created on a fabric', - resolve: root => { - return Boolean(root.fabric); - } - }, - description: { - type: GraphQLString, - description: 'Description of this network' - }, - subnet: { - type: GraphQLString, - description: 'A CIDR formatted string that describes the network' - }, - provisionStartIp: { - type: GraphQLString, - description: 'The first IP on the network that may be assigned' - }, - provisionEndIp: { - type: GraphQLString, - description: 'The last IP on the network that may be assigned' - }, - gateway: { - type: GraphQLString, - description: 'Optional Gateway IP address' - }, - resolvers: { - type: new GraphQLList(GraphQLString), - description: 'Optional Resolver IP addresses' - }, - routes: { - type: DynamicObjectType, - description: 'Optional Static routes for hosts on this network' - }, - internetNat: { - type: GraphQLBoolean, - description: 'Provision internet NAT zone on gateway address', - resolve: root => { - return Boolean(root.internetNat); - } - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/nic.js b/packages/cloudapi-gql/src/schema/types/nic.js deleted file mode 100644 index 12e0f2aa..00000000 --- a/packages/cloudapi-gql/src/schema/types/nic.js +++ /dev/null @@ -1,41 +0,0 @@ -const { GraphQLBoolean, GraphQLObjectType, GraphQLString } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'NicType', - description: - 'Logical networks are used both on head nodes and compute nodes, and are associated with physical interfaces by using a system called NIC Tags', - fields: { - ip: { - type: GraphQLString, - description: "NIC's IPv4 address" - }, - mac: { - type: GraphQLString, - description: "NIC's MAC address" - }, - primary: { - type: GraphQLBoolean, - description: "Whether this is the instance's primary NIC", - resolve: root => { - return root.primary; - } - }, - netmask: { - type: GraphQLString, - description: 'IPv4 netmask' - }, - gateway: { - type: GraphQLString, - description: 'IPv4 gateway' - }, - state: { - type: GraphQLString, - description: - 'Describes the state of the NIC (e.g. provisioning, running, or stopped)' - }, - network: { - type: GraphQLString, - description: "The NIC's network id (see ListNetworks)" - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/package.js b/packages/cloudapi-gql/src/schema/types/package.js deleted file mode 100644 index 15ea5302..00000000 --- a/packages/cloudapi-gql/src/schema/types/package.js +++ /dev/null @@ -1,52 +0,0 @@ -const { - GraphQLString, - GraphQLObjectType, - GraphQLInt, - GraphQLID -} = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'PackageType', - fields: { - id: { - type: GraphQLID, - description: 'Unique id for this package' - }, - name: { - type: GraphQLString, - description: 'The "friendly" name for this package' - }, - memory: { - type: GraphQLInt, - description: 'How much memory will by available (in MiB)' - }, - disk: { - type: GraphQLInt, - description: 'How much disk space will be available (in MiB)' - }, - swap: { - type: GraphQLInt, - description: 'How much swap space will be available (in MiB)' - }, - lwps: { - type: GraphQLInt, - description: 'Maximum number of light-weight processes (threads) allowed' - }, - vcpus: { - type: GraphQLInt, - description: 'Number of vCPUs for this package' - }, - version: { - type: GraphQLString, - description: 'The version of this package' - }, - group: { - type: GraphQLString, - description: 'The group this package belongs to' - }, - description: { - type: GraphQLString, - description: 'A human-friendly description about this package' - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/policy.js b/packages/cloudapi-gql/src/schema/types/policy.js deleted file mode 100644 index 4bad990a..00000000 --- a/packages/cloudapi-gql/src/schema/types/policy.js +++ /dev/null @@ -1,29 +0,0 @@ -const { - GraphQLString, - GraphQLObjectType, - GraphQLList, - GraphQLID -} = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'PolicyType', - description: 'Policies are lists of rules that describe access to resources', - fields: { - id: { - type: GraphQLID, - description: 'Unique id for this policy' - }, - name: { - type: GraphQLString, - description: 'The policy name' - }, - rules: { - type: new GraphQLList(GraphQLString), - description: 'One or more Aperture sentences applying to the policy' - }, - description: { - type: GraphQLString, - description: 'A description for this policy' - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/role.js b/packages/cloudapi-gql/src/schema/types/role.js deleted file mode 100644 index 2a7442ff..00000000 --- a/packages/cloudapi-gql/src/schema/types/role.js +++ /dev/null @@ -1,52 +0,0 @@ -const { - GraphQLString, - GraphQLObjectType, - GraphQLList, - GraphQLID -} = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'RoleType', - description: - 'Roles are lists of users and policies. Roles describe which users are allowed access according to the policies', - fields: { - id: { - type: GraphQLID, - description: 'Unique id for this role' - }, - name: { - type: GraphQLString, - description: 'The role name' - }, - policies: { - type: new GraphQLList(GraphQLString), - description: "This account's policies which this role obeys (Optional)" - }, - members: { - type: new GraphQLList(GraphQLString), - description: "This account's user logins this role applies to (Optional)" - }, - defaultMembers: { - type: new GraphQLList(GraphQLString), - description: - "This account's user logins this role applies to by default (Optional)" - } - } -}); - -module.exports.tag = new GraphQLObjectType({ - name: 'RoleTagType', - fields: { - name: { - type: GraphQLString, - description: 'Path to the resource' - }, - roleTag: { - type: new GraphQLList(GraphQLString), - description: 'The role name', - resolve: root => { - return root['role-tag'] || root.roleTag; - } - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/service.js b/packages/cloudapi-gql/src/schema/types/service.js deleted file mode 100644 index 09f9ebe6..00000000 --- a/packages/cloudapi-gql/src/schema/types/service.js +++ /dev/null @@ -1,13 +0,0 @@ -const { GraphQLString, GraphQLObjectType } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'ServiceType', - fields: { - name: { - type: GraphQLString - }, - url: { - type: GraphQLString - } - } -}); diff --git a/packages/cloudapi-gql/src/schema/types/snapshot.js b/packages/cloudapi-gql/src/schema/types/snapshot.js deleted file mode 100644 index f69222c3..00000000 --- a/packages/cloudapi-gql/src/schema/types/snapshot.js +++ /dev/null @@ -1,16 +0,0 @@ -const { GraphQLString, GraphQLObjectType, GraphQLID } = require('graphql'); - -module.exports = new GraphQLObjectType({ - name: 'SnapshotType', - description: 'Policies are lists of rules that describe access to resources', - fields: { - name: { - type: GraphQLID, - description: 'The name of this snapshot' - }, - state: { - type: GraphQLString, - description: 'The current state of the snapshot' - } - } -}); diff --git a/packages/cloudapi-gql/src/server.js b/packages/cloudapi-gql/src/server.js new file mode 100644 index 00000000..aadbf57c --- /dev/null +++ b/packages/cloudapi-gql/src/server.js @@ -0,0 +1,122 @@ +const { hapi: Voyager } = require('graphql-voyager/middleware'); +const { hapi: Playground } = require('graphql-playground/middleware'); +const { graphqlHapi, graphiqlHapi } = require('apollo-server-hapi'); +const { formatError } = require('apollo-errors'); +const Hapi = require('hapi'); +const Good = require('good'); +const Path = require('path'); +const Inert = require('inert'); +const Execa = require('execa'); + +const schema = require('./schema'); + +const { CORS, PORT } = process.env; + +const server = new Hapi.Server({ + debug: { + log: ['error'], + request: ['error'] + } +}); + +const handlerError = err => { + if (err) { + // eslint-disable-next-line no-console + console.error(err); + process.exit(1); + } +}; + +// compile docs +// eslint-disable-next-line new-cap +Execa('npm', ['run', 'graphdoc']).catch(handlerError); + +server.connection({ + port: PORT, + routes: { + files: { + relativeTo: Path.join(__dirname, './../doc') + } + } +}); + +server.register( + [ + { + register: Good, + options: { + reporters: { + console: [ + { + module: 'good-squeeze', + name: 'Squeeze', + args: [{ log: '*', response: '*' }] + }, + { + module: 'good-console' + }, + 'stdout' + ] + } + } + }, + Inert, + { + register: graphqlHapi, + options: { + path: '/graphql', + graphqlOptions: { + formatError, + schema + }, + route: { + cors: Boolean(CORS) + } + } + }, + { + register: graphiqlHapi, + options: { + path: '/graphiql', + graphiqlOptions: { + endpointURL: '/graphql' + } + } + }, + { + register: Playground, + options: { + path: '/playground', + endpointUrl: '/graphql' + } + }, + { + register: Voyager, + options: { + path: '/voyager', + endpointUrl: '/graphql' + } + } + ], + err => { + handlerError(err); + + server.route({ + method: 'GET', + path: '/doc/{param*}', + handler: { + directory: { + path: '.', + redirectToSlash: true, + index: true + } + } + }); + + server.start(err => { + handlerError(err); + // eslint-disable-next-line no-console + console.log(`server started at http://0.0.0.0:${server.info.port}`); + }); + } +); diff --git a/packages/my-joy-beta/src/containers/instances/firewall.js b/packages/my-joy-beta/src/containers/instances/firewall.js index 8feabd95..cd25f0d8 100644 --- a/packages/my-joy-beta/src/containers/instances/firewall.js +++ b/packages/my-joy-beta/src/containers/instances/firewall.js @@ -31,13 +31,13 @@ const Firewall = ({ /> )); - const _error = !(error && !_loading) ? null : ( + const _error = (error && !values.length && !_loading) ? ( - ); + ) : null; return ( diff --git a/packages/my-joy-beta/src/containers/instances/list.js b/packages/my-joy-beta/src/containers/instances/list.js index 3d85b33e..bad2dfa6 100644 --- a/packages/my-joy-beta/src/containers/instances/list.js +++ b/packages/my-joy-beta/src/containers/instances/list.js @@ -22,13 +22,13 @@ const List = ({ instances = [], loading = false, error }) => { const _instances = forceArray(instances); const _loading = !instances.length && loading; - const _error = !error ? null : ( + const _error = (error && !_instances.length && !_loading) ? ( - ); + ) : null; return ( diff --git a/packages/my-joy-beta/src/containers/instances/metadata.js b/packages/my-joy-beta/src/containers/instances/metadata.js index e4d9156e..607911a6 100644 --- a/packages/my-joy-beta/src/containers/instances/metadata.js +++ b/packages/my-joy-beta/src/containers/instances/metadata.js @@ -36,20 +36,21 @@ const MetadataForms = (metadata = []) => }); const Metadata = ({ metadata = [], loading, error }) => { + const values = forceArray(metadata); const _title = Metadata; - const _loading = !(loading && !forceArray(metadata).length) ? null : ( + const _loading = !(loading && !values.length) ? null : ( ); - const _metadata = !_loading && MetadataForms(metadata); + const _metadata = !_loading && MetadataForms(values); - const _error = !(error && !_loading) ? null : ( + const _error = (error && !values.length && !_loading) ? ( - ); + ) : null; return ( diff --git a/packages/my-joy-beta/src/containers/instances/networks.js b/packages/my-joy-beta/src/containers/instances/networks.js index 0ae47c1a..126d571c 100644 --- a/packages/my-joy-beta/src/containers/instances/networks.js +++ b/packages/my-joy-beta/src/containers/instances/networks.js @@ -26,13 +26,13 @@ const Networks = ({ networks = [], loading, error }) => { /> )); - const _error = !(error && !_loading) ? null : ( + const _error = (error && !values.length && !_loading) ? ( - ); + ) : null; return ( diff --git a/packages/my-joy-beta/src/containers/instances/tags.js b/packages/my-joy-beta/src/containers/instances/tags.js index ebd7985f..d1c3bb0d 100644 --- a/packages/my-joy-beta/src/containers/instances/tags.js +++ b/packages/my-joy-beta/src/containers/instances/tags.js @@ -36,20 +36,21 @@ const TagForms = (tags = []) => }); const Tags = ({ tags = [], loading, error }) => { + const values = forceArray(tags); const _title = Tags; - const _loading = !(loading && !forceArray(tags).length) ? null : ( + const _loading = (loading && !values.length) ? ( - ); + ) : null; const _tags = !_loading && TagForms(tags); - const _error = !(error && !_loading) ? null : ( + const _error = (error && !values.length && !_loading) ? ( - ); + ) : null; return ( diff --git a/yarn.lock b/yarn.lock index 5775f870..9cdc14a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,26 @@ # yarn lockfile v1 +"@2fd/command@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@2fd/command/-/command-1.1.2.tgz#b831d511bdd3b4e2d88139aaddb06d3d6aa0b08a" + +"@2fd/graphdoc@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@2fd/graphdoc/-/graphdoc-2.4.0.tgz#ebfabd0b09487ce9db8db901a66f1917a025a808" + dependencies: + "@2fd/command" "^1.1.2" + bluebird "^3.5.0" + fs-extra "^0.30.0" + glob "^7.1.0" + graphql "^0.7.0" + marked "^0.3.6" + mustache "^2.2.1" + request "^2.79.0" + slug "^0.9.1" + striptags "^3.0.1" + word-wrap "^1.2.1" + "@commitlint/cli@^3.2.0": version "3.2.0" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-3.2.0.tgz#be8902f2fa859f93697a4e204305d6b476480931" @@ -62,6 +82,38 @@ throat "^4.1.0" vorpal "^1.10.0" +"@f/animate@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@f/animate/-/animate-1.0.1.tgz#a031398adadf9a0bd3a56398cec931f877d88485" + dependencies: + "@f/elapsed-time" "^1.0.0" + "@f/raf" "^1.0.0" + "@f/tween" "^1.0.0" + +"@f/elapsed-time@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@f/elapsed-time/-/elapsed-time-1.0.0.tgz#6a079a6104a87278bf5b4080444ef02d1b595449" + dependencies: + "@f/timestamp" "^1.0.0" + +"@f/map-obj@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@f/map-obj/-/map-obj-1.2.2.tgz#d9a9f8bd76caa2ae11b633dda24d9c6cccc1e60d" + +"@f/raf@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@f/raf/-/raf-1.0.3.tgz#32ddca37de345b20c8c3843018cc51b8f897914d" + +"@f/timestamp@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@f/timestamp/-/timestamp-1.0.0.tgz#32a9166e2516e5ccb9b0fcfdc89223819710e88c" + +"@f/tween@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@f/tween/-/tween-1.0.1.tgz#18aef79c4975e54415adf326e4b5e0d053d207f0" + dependencies: + "@f/map-obj" "^1.2.2" + "@types/core-js@^0.9.41": version "0.9.43" resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-0.9.43.tgz#65d646c5e8c0cd1bdee37065799f9d3d48748253" @@ -70,7 +122,11 @@ version "0.10.2" resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.10.2.tgz#d7c79acbaa17453b6681c80c34b38fcb10c4c08c" -"@types/graphql@^0.9.0": +"@types/graphql@^0.11.4": + version "0.11.4" + resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.11.4.tgz#6e067838246ec741be3950211323726a77147472" + +"@types/graphql@^0.9.0", "@types/graphql@^0.9.1": version "0.9.4" resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.9.4.tgz#cdeb6bcbef9b6c584374b81aa7f48ecf3da404fa" @@ -98,10 +154,17 @@ abab@^1.0.3: resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@^1.3.0, accepts@~1.3.3, accepts@~1.3.4: +accept@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/accept/-/accept-2.1.4.tgz#887af54ceee5c7f4430461971ec400c61d09acbb" + dependencies: + boom "5.x.x" + hoek "4.x.x" + +accepts@^1.3.0, accepts@~1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" dependencies: @@ -217,6 +280,13 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ammo@2.x.x, ammo@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ammo/-/ammo-2.0.4.tgz#bf80aab211698ea78f63ef5e7f113dd5d9e8917f" + dependencies: + boom "5.x.x" + hoek "4.x.x" + anser@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.1.tgz#c3641863a962cebef941ea2c8706f2cb4f0716bd" @@ -300,6 +370,12 @@ apollo-client@^1.4.0: optionalDependencies: "@types/graphql" "0.10.2" +apollo-errors@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/apollo-errors/-/apollo-errors-1.5.1.tgz#956d705fb5bad41de256cdcb41bc009c66e0bb3e" + dependencies: + es6-error "^4.0.0" + apollo-link-core@^0.5.0: version "0.5.4" resolved "https://registry.yarnpkg.com/apollo-link-core/-/apollo-link-core-0.5.4.tgz#8efd4cd747959872a32f313f0ccfc2a76b396668" @@ -308,6 +384,30 @@ apollo-link-core@^0.5.0: graphql-tag "^2.4.2" zen-observable-ts "^0.4.4" +apollo-server-core@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.1.0.tgz#74c3bf4394e14eae7ab60b1d999a3c5b8aa94e9a" + dependencies: + apollo-tracing "^0.0.7" + +apollo-server-hapi@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/apollo-server-hapi/-/apollo-server-hapi-1.1.2.tgz#6b6e53e14a565eb21fb37416e9d3fdd14ceaea93" + dependencies: + apollo-server-core "^1.1.0" + apollo-server-module-graphiql "^1.1.2" + boom "^5.2.0" + +apollo-server-module-graphiql@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.1.2.tgz#49a154cf80e984acb082bd0096175b561e1bfbcc" + +apollo-tracing@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/apollo-tracing/-/apollo-tracing-0.0.7.tgz#78466cfefdb52a0802a57b488d26a1a67a25909f" + dependencies: + graphql-tools "^1.1.0" + apollo@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/apollo/-/apollo-0.2.2.tgz#e409f53765bbf98efa3d127a2789c63bccd025d6" @@ -597,6 +697,10 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async@^1.4.0, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -678,6 +782,10 @@ axobject-query@^0.1.0: dependencies: ast-types-flow "0.0.7" +b64@3.x.x: + version "3.0.3" + resolved "https://registry.yarnpkg.com/b64/-/b64-3.0.3.tgz#36afeee0d9345f046387ce6de8a6702afe5bb56e" + babar@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/babar/-/babar-0.0.3.tgz#2f394d4a5918f7e1ae9e5408e9a96f3f935ee1e2" @@ -1560,7 +1668,7 @@ babel-register@^6.24.1, babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: +babel-runtime@6.26.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -1612,6 +1720,10 @@ babylon@~5.8.3: version "5.8.38" resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" +backo2@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + backoff@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.4.1.tgz#2f68c50e0dd789dbefe24200a62efb04d2456d68" @@ -1705,6 +1817,21 @@ body-parser@1.15.2: raw-body "~2.1.7" type-is "~1.6.13" +body-parser@1.18.2, body-parser@^1.18.1: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -1732,12 +1859,18 @@ boom@4.x.x: dependencies: hoek "4.x.x" -boom@5.x.x: +boom@5.x.x, boom@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" dependencies: hoek "4.x.x" +boom@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-6.0.0.tgz#9b36c52a12afab3f0e55536131b7fd5021aad0cc" + dependencies: + hoek "5.x.x" + boxen@1.2.1, boxen@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" @@ -1801,6 +1934,10 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-fingerprint@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/browser-fingerprint/-/browser-fingerprint-0.0.1.tgz#8df3cdca25bf7d5b3542d61545d730053fce604a" + browser-resolve@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" @@ -1914,8 +2051,8 @@ buffer@^4.3.0: isarray "^1.0.0" buffer@^5.0.3: - version "5.0.7" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.7.tgz#570a290b625cf2603290c1149223d27ccf04db97" + version "5.0.8" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.8.tgz#84daa52e7cf2fa8ce4195bc5cf0f7809e0930b24" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1979,6 +2116,17 @@ cachedir@^1.1.0: dependencies: os-homedir "^1.0.1" +calculate-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/calculate-size/-/calculate-size-1.1.1.tgz#ae7caa1c7795f82c4f035dc7be270e3581dae3ee" + +call@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/call/-/call-4.0.2.tgz#df76f5f51ee8dd48b856ac8400f7e69e6d7399c4" + dependencies: + boom "5.x.x" + hoek "4.x.x" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -2033,12 +2181,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000738" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000738.tgz#84809abc49a390e5a8c224ab9369d3f8d01aa202" + version "1.0.30000741" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000741.tgz#0be59111d4221f21f612b50ee5d67871a2c4a7a5" caniuse-lite@^1.0.30000697, caniuse-lite@^1.0.30000718, caniuse-lite@^1.0.30000726: - version "1.0.30000738" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000738.tgz#1820c3c9adb9a117e311a5bdca1d25bc34288eba" + version "1.0.30000741" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000741.tgz#bc526bc2046e6bc38737cfd77d3026ef04b8f464" capture-stack-trace@^1.0.0: version "1.0.0" @@ -2052,6 +2200,20 @@ caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" +catbox-memory@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-2.0.4.tgz#433e255902caf54233d1286429c8f4df14e822d5" + dependencies: + hoek "4.x.x" + +catbox@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/catbox/-/catbox-7.1.5.tgz#c56f7e8e9555d27c0dc038a96ef73e57d186bb1f" + dependencies: + boom "5.x.x" + hoek "4.x.x" + joi "10.x.x" + ccount@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.2.tgz#53b6a2f815bb77b9c2871f7b9a72c3a25f1d8e89" @@ -2063,6 +2225,10 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chain-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" + chalk@1.1.3, 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" @@ -2326,11 +2492,18 @@ 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" +codemirror-graphql@^0.6.11: + version "0.6.11" + resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-0.6.11.tgz#795efa3933523815a5245eefe8d6831d3c4ad026" + dependencies: + graphql-language-service-interface "0.0.19" + graphql-language-service-parser "0.0.15" + codemirror@5.20.2: version "5.20.2" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.20.2.tgz#918e0ece96d57a99030b2f8b33011284bed5217a" -codemirror@^5.13.4, codemirror@^5.30.0: +codemirror@^5.18.2, codemirror@^5.26.0, codemirror@^5.27.4, codemirror@^5.30.0: version "5.30.0" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.30.0.tgz#86e57dd5ea5535acbcf9c720797b4cefe05b5a70" @@ -2537,13 +2710,19 @@ content-type-parser@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" -content-type@^1.0.2, content-type@~1.0.2: +content-type@^1.0.2, content-type@~1.0.2, content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" -conventional-changelog-angular@^1.3.3, conventional-changelog-angular@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.5.0.tgz#50b2d45008448455fdf67e06ea01972fbd08182a" +content@3.x.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/content/-/content-3.0.6.tgz#9c2e301e9ae515ed65a4b877d78aa5659bb1b809" + dependencies: + boom "5.x.x" + +conventional-changelog-angular@^1.3.3, conventional-changelog-angular@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.5.1.tgz#974e73aa1c39c392e4364f2952bd9a62904e9ea3" dependencies: compare-func "^1.3.1" q "^1.4.1" @@ -2555,11 +2734,11 @@ conventional-changelog-atom@^0.1.1: q "^1.4.1" conventional-changelog-cli@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.3.tgz#ca38f229a27ec14036021b1786a48f5b8d48d7ff" + version "1.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.4.tgz#38f7ff7ac7bca92ea110897ea08b473f2055a27c" dependencies: add-stream "^1.0.0" - conventional-changelog "^1.1.5" + conventional-changelog "^1.1.6" lodash "^4.1.0" meow "^3.7.0" tempfile "^1.1.1" @@ -2570,9 +2749,9 @@ conventional-changelog-codemirror@^0.2.0: dependencies: q "^1.4.1" -conventional-changelog-core@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.9.1.tgz#ddf767c405850dfc8df31726c80fa1a6a10bdc7b" +conventional-changelog-core@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.9.2.tgz#a09b6b959161671ff45b93cc9efb0444e7c845c0" dependencies: conventional-changelog-writer "^2.0.1" conventional-commits-parser "^2.0.0" @@ -2580,7 +2759,7 @@ conventional-changelog-core@^1.9.1: get-pkg-repo "^1.0.0" git-raw-commits "^1.2.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^1.2.1" + git-semver-tags "^1.2.2" lodash "^4.0.0" normalize-package-data "^2.3.5" q "^1.4.1" @@ -2588,9 +2767,9 @@ conventional-changelog-core@^1.9.1: read-pkg-up "^1.0.1" through2 "^2.0.0" -conventional-changelog-ember@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.7.tgz#c6aff35976284e7222649f81c62bd96ff3217bd2" +conventional-changelog-ember@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.8.tgz#65e686da83d23b67133d1f853908c87f948035c0" dependencies: q "^1.4.1" @@ -2640,15 +2819,15 @@ conventional-changelog-writer@^2.0.1: split "^1.0.0" through2 "^2.0.0" -conventional-changelog@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.5.tgz#4c46fb64b2986cab19888d8c4b87ca7c0e431bfd" +conventional-changelog@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.6.tgz#ebd9b1ab63766c715f903f654626b6b1c0da7762" dependencies: - conventional-changelog-angular "^1.5.0" + conventional-changelog-angular "^1.5.1" conventional-changelog-atom "^0.1.1" conventional-changelog-codemirror "^0.2.0" - conventional-changelog-core "^1.9.1" - conventional-changelog-ember "^0.2.7" + conventional-changelog-core "^1.9.2" + conventional-changelog-ember "^0.2.8" conventional-changelog-eslint "^0.2.0" conventional-changelog-express "^0.2.0" conventional-changelog-jquery "^0.1.0" @@ -2691,14 +2870,14 @@ conventional-commits-parser@^2.0.0: trim-off-newlines "^1.0.0" conventional-recommended-bump@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.0.1.tgz#56b8ae553a8a1152fa069e767599e1f6948bd36c" + version "1.0.2" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.0.2.tgz#31856443ab6f9453a1827650e7cc15ec28769645" dependencies: concat-stream "^1.4.10" conventional-commits-filter "^1.0.0" conventional-commits-parser "^2.0.0" git-raw-commits "^1.2.0" - git-semver-tags "^1.2.1" + git-semver-tags "^1.2.2" meow "^3.3.0" object-assign "^4.0.1" @@ -2725,9 +2904,15 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" +copy-to-clipboard@^3: + version "3.0.8" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.0.8.tgz#f4e82f4a8830dce4666b7eb8ded0c9bcc313aba9" + dependencies: + toggle-selection "^1.0.3" + copy-webpack-plugin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" + version "4.1.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.1.0.tgz#292a040318fe8ae3b1d7996ef05dfb483eb0b647" dependencies: bluebird "^2.10.2" fs-extra "^0.26.4" @@ -2738,11 +2923,11 @@ copy-webpack-plugin@^4.0.1: minimatch "^3.0.0" node-dir "^0.1.10" -core-js@^1.0.0: +core-js@^1.0.0, core-js@^1.1.1: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" @@ -2756,7 +2941,7 @@ cors@2.8.1: dependencies: vary "^1" -cors@^2.8.4: +cors@^2.8.3: version "2.8.4" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" dependencies: @@ -2776,8 +2961,8 @@ cosmiconfig@^2.1.0, cosmiconfig@^2.1.1, cosmiconfig@^2.1.3: require-from-string "^1.1.0" cosmiconfig@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.0.1.tgz#d290e2b657a7f3a335257a0d306587836650fdc0" + version "3.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397" dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" @@ -2817,7 +3002,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-class@^15.6.0: +create-react-class@^15.5.1, create-react-class@^15.5.2, create-react-class@^15.6.0: version "15.6.2" resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a" dependencies: @@ -2846,7 +3031,7 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -cryptiles@3.x.x: +cryptiles@3.x.x, cryptiles@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" dependencies: @@ -2921,6 +3106,17 @@ css-mediaquery@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" +css-modules-loader-core@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" + dependencies: + icss-replace-symbols "1.1.0" + postcss "6.0.1" + postcss-modules-extract-imports "1.1.0" + postcss-modules-local-by-default "1.2.0" + postcss-modules-scope "1.1.0" + postcss-modules-values "1.3.0" + css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -3034,6 +3230,14 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +cuid@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/cuid/-/cuid-1.3.8.tgz#4b875e0969bad764f7ec0706cf44f5fb0831f6b7" + dependencies: + browser-fingerprint "0.0.1" + core-js "^1.1.1" + node-fingerprint "0.0.2" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -3330,12 +3534,6 @@ debug@2, debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, de dependencies: ms "2.0.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@^3.0.0, debug@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -3356,12 +3554,6 @@ 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" -decompress-response@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - dependencies: - mimic-response "^1.0.0" - dedent@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb" @@ -3383,10 +3575,10 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" default-gateway@^2.2.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.5.0.tgz#78e24dbd2e1df7490c2b8050515b8e816bfa7da5" + version "2.6.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.6.0.tgz#acf02d181caef4c464b6c37fe25daacd6189b903" dependencies: - execa "^0.7.0" + execa "^0.8.0" ip-regex "^2.1.0" default-require-extensions@^1.0.0: @@ -3575,6 +3767,10 @@ dom-converter@~0.1: dependencies: utila "~0.3" +"dom-helpers@^2.4.0 || ^3.0.0", dom-helpers@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a" + dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -3657,7 +3853,7 @@ duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" -duplexer@^0.1.1: +duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -3681,8 +3877,12 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.18: - version "1.3.22" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.22.tgz#4322d52c151406e3eaef74ad02676883e8416418" + version "1.3.24" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.24.tgz#9b7b88bb05ceb9fa016a177833cc2dde388f21b6" + +element-class@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/element-class/-/element-class-0.2.2.tgz#9d3bbd0767f9013ef8e1c8ebe722c1402a60050e" elliptic@^6.0.0: version "6.4.0" @@ -3745,8 +3945,8 @@ envir@^1.0.0: jessy "^2.0.0" enzyme-adapter-react-16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.0.tgz#e7edd5536743818dcbef336d40d7da59b3a7db8e" + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.1.tgz#066cb1735e65d8d95841a023f94dab3ce6109e17" dependencies: enzyme-adapter-utils "^1.0.0" lodash "^4.17.4" @@ -3755,8 +3955,8 @@ enzyme-adapter-react-16@^1.0.0: prop-types "^15.5.10" enzyme-adapter-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.0.tgz#e94eee63da9a798d498adb1162a2102ed04fc638" + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.1.tgz#fcd81223339a55a312f7552641e045c404084009" dependencies: lodash "^4.17.4" object.assign "^4.0.4" @@ -3775,8 +3975,8 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.6.1, es-abstract@^1.7.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" + version "1.9.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -3826,6 +4026,10 @@ es6-object-assign@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" +es6-promise@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + es6-promise@^4.0.5, es6-promise@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" @@ -3967,11 +4171,19 @@ eslint-plugin-flowtype@2.35.0: lodash "^4.15.0" eslint-plugin-flowtype@^2.35.1: - version "2.36.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.36.0.tgz#ec21cf685dc270c2b24a99bdba1a57999c1040ec" + version "2.37.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.37.0.tgz#2b09694deea6efdd8354eccd328db134b2d8b6d5" dependencies: lodash "^4.15.0" +eslint-plugin-graphql@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-graphql/-/eslint-plugin-graphql-1.3.0.tgz#99e44a93bfda4b1c9efbfb2bd93e7d0a710430c0" + dependencies: + graphql "^0.10.1" + graphql-config "^1.0.0" + lodash "^4.11.1" + eslint-plugin-import@2.7.0, eslint-plugin-import@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" @@ -4083,9 +4295,9 @@ eslint@4.4.1: table "^4.0.1" text-table "~0.2.0" -eslint@^4.5.0, eslint@^4.7.1: - version "4.7.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.7.2.tgz#ff6f5f5193848a27ee9b627be3e73fb9cb5e662e" +eslint@^4.5.0, eslint@^4.7.1, eslint@^4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.8.0.tgz#229ef0e354e0e61d837c7a80fdfba825e199815e" dependencies: ajv "^5.2.0" babel-code-frame "^6.22.0" @@ -4165,7 +4377,7 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.8.0, etag@~1.8.1: +etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -4176,10 +4388,26 @@ event-emitter@~0.3.5: d "1" es5-ext "~0.10.14" +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" + eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +eventemitter3@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" + events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -4245,6 +4473,14 @@ execall@^1.0.0: dependencies: clone-regexp "^1.0.0" +exenv@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.0.tgz#3835f127abf075bfe082d0aed4484057c78e3c89" + +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -4273,20 +4509,20 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.0.tgz#28ea776f377cda4df54b18eb05644b253aba0caa" +expect@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" dependencies: ansi-styles "^3.2.0" - jest-diff "^21.2.0" + jest-diff "^21.2.1" jest-get-type "^21.2.0" - jest-matcher-utils "^21.2.0" - jest-message-util "^21.2.0" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" jest-regex-util "^21.2.0" -express-graphql@^0.6.11: - version "0.6.11" - resolved "https://registry.yarnpkg.com/express-graphql/-/express-graphql-0.6.11.tgz#3dce78d0643e78e7e3606646ce162025ba0585ab" +"express-graphql@github:apis-guru/express-graphql#rootValue_dist": + version "0.6.2" + resolved "https://codeload.github.com/apis-guru/express-graphql/tar.gz/90ff36c20d49e7cec0b64846d0481f75b93d4ae6" dependencies: accepts "^1.3.0" content-type "^1.0.2" @@ -4294,37 +4530,39 @@ express-graphql@^0.6.11: raw-body "^2.1.0" express@^4.13.3, express@^4.15.4: - version "4.15.5" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.5.tgz#670235ca9598890a5ae8170b83db722b842ed927" + version "4.16.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.1.tgz#6b33b560183c9b253b7b62144df33a4654ac9ed0" dependencies: - accepts "~1.3.3" + accepts "~1.3.4" array-flatten "1.1.1" + body-parser "1.18.2" content-disposition "0.5.2" - content-type "~1.0.2" + content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" debug "2.6.9" depd "~1.1.1" encodeurl "~1.0.1" escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.6" + etag "~1.8.1" + finalhandler "1.1.0" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~1.1.5" - qs "6.5.0" + proxy-addr "~2.0.2" + qs "6.5.1" range-parser "~1.2.0" - send "0.15.6" - serve-static "1.12.6" - setprototypeof "1.0.3" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" statuses "~1.3.1" type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" + utils-merge "1.0.1" + vary "~1.1.2" extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" @@ -4381,6 +4619,10 @@ facet@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/facet/-/facet-0.3.0.tgz#1bf949d8a112e2045dda84259407def3deb62c1b" +faker@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" + falafel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/falafel/-/falafel-1.2.0.tgz#c18d24ef5091174a497f318cd24b026a25cddab4" @@ -4402,6 +4644,10 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" +fast-safe-stringify@1.1.x: + version "1.1.13" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.1.13.tgz#a01e9cd9c9e491715c98a75a42d5f0bbd107ff76" + fast-safe-stringify@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.0.tgz#ebd42666fd18fe4f2ba4f0d295065f3f85cade96" @@ -4511,9 +4757,9 @@ fillers@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/fillers/-/fillers-1.1.1.tgz#9d1a8f0150d47f78a898de4cd43cf079d417148e" -finalhandler@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -4661,7 +4907,7 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" -forwarded@~0.1.0: +forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -4671,10 +4917,6 @@ franc@^2.0.0: dependencies: trigram-utils "^0.1.0" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -4686,6 +4928,10 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" @@ -4822,6 +5068,12 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generic-names@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-1.0.2.tgz#e25b7feceb5b5a8f28f5f972a7ccfe57e562adcd" + dependencies: + loader-utils "^0.2.16" + get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -4889,9 +5141,9 @@ git-remote-origin-url@^2.0.0: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.1.tgz#6ccd2a52e735b736748dc762444fcd9588e27490" +git-semver-tags@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.2.tgz#a2139be1bf6e337e125f3eb8bb8fc6f5d4d6445f" dependencies: meow "^3.3.0" semver "^5.0.1" @@ -4968,7 +5220,7 @@ glob@^6.0.1, glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -5048,12 +5300,37 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" +good-console@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/good-console/-/good-console-6.4.0.tgz#7294c9d90c4c9f059a082e180625495966d2ba59" + dependencies: + hoek "4.x.x" + joi "8.1.x" + json-stringify-safe "5.0.x" + moment "2.15.x" + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" dependencies: delegate "^3.1.2" +good-squeeze@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/good-squeeze/-/good-squeeze-5.0.2.tgz#a8e58242b4a0b32cdbdf317b60e73a19a7f0879b" + dependencies: + fast-safe-stringify "1.1.x" + hoek "4.x.x" + +good@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/good/-/good-7.3.0.tgz#25da74d51f336692ec86fe8d6533453585fa85fe" + dependencies: + hoek "4.x.x" + joi "10.x.x" + oppsy "1.x.x" + pumpify "1.3.x" + got@^5.0.0: version "5.7.1" resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" @@ -5090,38 +5367,168 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graphcool-styles@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/graphcool-styles/-/graphcool-styles-0.2.4.tgz#c04aa8a440280e910e4c9cfa1ef97052d1060198" + dependencies: + html-webpack-plugin "^2.24.1" + interactive "^0.1.9" + isomorphic-fetch "^2.2.1" + object-assign "^4.1.0" + react-dom "^15.3.2" + webpack-dev-server "^1.16.2" + +graphcool-styles@^0.1.31: + version "0.1.43" + resolved "https://registry.yarnpkg.com/graphcool-styles/-/graphcool-styles-0.1.43.tgz#da6b72118c890923ef5c4a964405aa3e4541dc82" + dependencies: + html-webpack-plugin "^2.24.1" + interactive "^0.1.9" + object-assign "^4.1.0" + react-dom "^15.3.2" + webpack-dev-server "^1.16.2" + +graphcool-tmp-ui@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/graphcool-tmp-ui/-/graphcool-tmp-ui-0.0.11.tgz#86cfaf0754394419642cc2542a2b5f8a48245659" + dependencies: + classnames "^2.2.5" + graphcool-styles "^0.1.31" + react-modal "^1.6.5" + +graphiql@^0.11.2: + version "0.11.5" + resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-0.11.5.tgz#0924c934d035c69eddfbbae30d3e59e46e29afc9" + dependencies: + codemirror "^5.26.0" + codemirror-graphql "^0.6.11" + marked "0.3.6" + graphql-anywhere@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/graphql-anywhere/-/graphql-anywhere-3.1.0.tgz#3ea0d8e8646b5cee68035016a9a7557c15c21e96" +graphql-config@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-1.0.7.tgz#424bda7da2e70ad6bbec4bd26c83f1d9cb49b271" + dependencies: + graphql "^0.11.6" + graphql-request "^1.2.0" + js-yaml "^3.9.0" + minimatch "^3.0.4" + rimraf "^2.6.1" + +graphql-faker@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphql-faker/-/graphql-faker-1.4.0.tgz#e71c4792757a3c3d39c53711d2096186d6281a37" + dependencies: + body-parser "^1.18.1" + chalk "^2.1.0" + core-js "^2.5.1" + cors "^2.8.3" + express "^4.15.4" + express-graphql "github:apis-guru/express-graphql#rootValue_dist" + faker "^4.1.0" + graphql "github:apis-guru/graphql-js#directives-fork-dist" + lodash "^4.17.4" + node-fetch "^1.7.3" + opn "^5.1.0" + yargs "^9.0.1" + +graphql-language-service-config@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/graphql-language-service-config/-/graphql-language-service-config-0.0.17.tgz#36b5a9906c0bf0d356d31b7583058f9b85d1793e" + dependencies: + graphql-language-service-types "0.0.21" + +graphql-language-service-interface@0.0.19: + version "0.0.19" + resolved "https://registry.yarnpkg.com/graphql-language-service-interface/-/graphql-language-service-interface-0.0.19.tgz#c58fa7bd95d2f30e33e04937a1a2c00a9740926e" + dependencies: + graphql "^0.10.1" + graphql-language-service-config "0.0.17" + graphql-language-service-parser "0.0.15" + graphql-language-service-types "0.0.21" + graphql-language-service-utils "0.0.17" + +graphql-language-service-parser@0.0.15: + version "0.0.15" + resolved "https://registry.yarnpkg.com/graphql-language-service-parser/-/graphql-language-service-parser-0.0.15.tgz#fd64afd8873624fa3c4a5831a08de9ccd6cc5182" + dependencies: + graphql-language-service-types "0.0.21" + +graphql-language-service-types@0.0.21: + version "0.0.21" + resolved "https://registry.yarnpkg.com/graphql-language-service-types/-/graphql-language-service-types-0.0.21.tgz#b9453366fc8985765034bf34056fe93603a24b82" + dependencies: + graphql "^0.10.1" + +graphql-language-service-utils@0.0.17: + version "0.0.17" + resolved "https://registry.yarnpkg.com/graphql-language-service-utils/-/graphql-language-service-utils-0.0.17.tgz#a8b91eca80c6aa5a0d461a0bbb63317986f9b989" + dependencies: + graphql "^0.10.1" + graphql-language-service-types "0.0.21" + +graphql-playground@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/graphql-playground/-/graphql-playground-1.0.4.tgz#b39efc3900f2fabd80233230905e74676cd3e181" + dependencies: + calculate-size "^1.1.1" + classnames "^2.2.5" + codemirror "^5.27.4" + cuid "^1.3.8" + graphcool-styles "0.2.4" + graphcool-tmp-ui "^0.0.11" + graphiql "^0.11.2" + graphql "^0.10.5" + isomorphic-fetch "^2.2.1" + keycode "^2.1.9" + lodash "^4.17.4" + lodash.debounce "^4.0.8" + postcss-modules "^0.6.4" + raw-loader "^0.5.1" + react "^15.4.2" + react-addons-shallow-compare "^15.6.0" + react-codemirror "^1.0.0" + react-copy-to-clipboard "^5.0.0" + react-dom "^15.4.2" + react-modal "^1.6.5" + react-redux "^5.0.5" + react-router-dom "^4.2.2" + react-transition-group "^1.1.3" + react-virtualized "^8.11.3" + redux "^3.7.2" + redux-localstorage rc + redux-localstorage-filter "^0.1.1" + rxjs "^5.0.3" + seamless-immutable "^7.0.1" + subscriptions-transport-ws "^0.8.1" + svgo-loader "^1.1.2" + +graphql-request@^1.2.0, graphql-request@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.3.6.tgz#7257d9c539e747b7ef8dbafc04e4a4231ca94464" + dependencies: + isomorphic-fetch "^2.2.1" + +graphql-subscriptions@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.4.4.tgz#39cff32d08dd3c990113864bab77154403727e9b" + dependencies: + "@types/graphql" "^0.9.1" + es6-promise "^4.0.5" + iterall "^1.1.1" + graphql-tag@^2.0.0, graphql-tag@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.4.2.tgz#6a63297d8522d03a2b72d26f1b239aab343840cd" -graphql-tools@^1.2.2: +graphql-tools@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-1.2.3.tgz#079bf4d157e46c0a0bae9fec117e0eea6e03ba2c" dependencies: @@ -5130,17 +5537,57 @@ graphql-tools@^1.2.2: optionalDependencies: "@types/graphql" "^0.9.0" -graphql@^0.10.0, graphql@^0.10.3: +graphql-tools@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-2.0.0.tgz#d4a848639af17417bf412472b34c0cdd648983f4" + dependencies: + deprecated-decorator "^0.1.6" + uuid "^3.1.0" + optionalDependencies: + "@types/graphql" "^0.11.4" + +graphql-voyager@^1.0.0-rc.9: + version "1.0.0-rc.9" + resolved "https://registry.yarnpkg.com/graphql-voyager/-/graphql-voyager-1.0.0-rc.9.tgz#82ad433274ba1325b6c8a567fb5c59ba83d48a60" + dependencies: + "@f/animate" "^1.0.1" + classnames "^2.2.5" + clipboard "^1.7.1" + graphql-request "^1.3.6" + lodash "^4.17.2" + marked "^0.3.6" + react-modal "^2.3.2" + react-redux "^5.0.6" + react-style-proptype "^3.0.0" + react-toolbox "^2.0.0-beta.7" + redux "^3.7.1" + redux-thunk "^2.1.0" + reselect "^3.0.1" + svg-pan-zoom "^3.5.2" + +graphql@^0.10.0, graphql@^0.10.1, graphql@^0.10.3, graphql@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.10.5.tgz#c9be17ca2bdfdbd134077ffd9bbaa48b8becd298" dependencies: iterall "^1.1.0" -graphql@^0.11.2: - version "0.11.4" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.4.tgz#03e0f86f35a252a5cab79d921a1aaabc7eec621c" +graphql@^0.11.6: + version "0.11.6" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.11.6.tgz#f0146b5dc1480fda579c21bb6238970fd5cf5aa3" dependencies: - iterall "1.1.2" + iterall "1.1.3" + +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" + +"graphql@github:apis-guru/graphql-js#directives-fork-dist": + version "0.9.1" + resolved "https://codeload.github.com/apis-guru/graphql-js/tar.gz/96b1ce3a0e578545dc3958f8b3457e9a535d73a9" + dependencies: + iterall "1.0.3" growly@^1.3.0: version "1.3.0" @@ -5170,6 +5617,29 @@ handlebars@4.0.10, handlebars@^4.0.2, handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" +hapi@^16.6.2: + version "16.6.2" + resolved "https://registry.yarnpkg.com/hapi/-/hapi-16.6.2.tgz#690554fc9c5ca7ad2f8030bbfe21d5e5886cdc14" + dependencies: + accept "^2.1.4" + ammo "^2.0.4" + boom "^5.2.0" + call "^4.0.2" + catbox "^7.1.5" + catbox-memory "^2.0.4" + cryptiles "^3.1.2" + heavy "^4.0.4" + hoek "^4.2.0" + iron "^4.0.5" + items "^2.1.1" + joi "^11.1.0" + mimos "^3.0.3" + podium "^1.3.0" + shot "^3.4.2" + statehood "^5.0.3" + subtext "^5.0.0" + topo "^2.0.2" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -5212,16 +5682,6 @@ has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" -has-symbol-support-x@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz#66ec2e377e0c7d7ccedb07a3a84d77510ff1bc4c" - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - dependencies: - has-symbol-support-x "^1.4.1" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -5280,6 +5740,14 @@ he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" +heavy@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/heavy/-/heavy-4.0.4.tgz#36c91336c00ccfe852caa4d153086335cd2f00e9" + dependencies: + boom "5.x.x" + hoek "4.x.x" + joi "10.x.x" + hedges@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/hedges/-/hedges-1.2.1.tgz#6b41d5691c47392c76c355bbfb4900c70b71e125" @@ -5310,10 +5778,14 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -hoek@4.x.x: +hoek@4.x.x, hoek@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" +hoek@5.x.x: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.0.tgz#b88953e0fec8e58082e4abd223ed20915d535831" + hoist-non-react-statics@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" @@ -5390,7 +5862,7 @@ html-webpack-plugin@2.29.0: pretty-error "^2.0.2" toposort "^1.0.0" -html-webpack-plugin@^2.30.1: +html-webpack-plugin@^2.24.1, html-webpack-plugin@^2.30.1: version "2.30.1" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5" dependencies: @@ -5414,7 +5886,7 @@ http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" -http-errors@1.6.2, http-errors@^1.3.0, http-errors@~1.6.1, http-errors@~1.6.2: +http-errors@1.6.2, http-errors@^1.3.0, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: @@ -5435,7 +5907,7 @@ http-parser-js@>=0.4.0: version "0.4.8" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.8.tgz#763f75c4b771a0bb44653b07070bff6ca7bc5561" -http-proxy-middleware@~0.17.4: +http-proxy-middleware@~0.17.1, http-proxy-middleware@~0.17.4: version "0.17.4" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" dependencies: @@ -5499,7 +5971,7 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -icss-replace-symbols@^1.1.0: +icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -5517,6 +5989,10 @@ iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + ignore@^3.3.3: version "3.3.5" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" @@ -5557,6 +6033,17 @@ indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" +inert@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/inert/-/inert-4.2.1.tgz#da743c478a18a8378032f80ada128a28cd2bba93" + dependencies: + ammo "2.x.x" + boom "5.x.x" + hoek "4.x.x" + items "2.x.x" + joi "10.x.x" + lru-cache "4.1.x" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -5650,6 +6137,16 @@ inquirer@^3.0.6, inquirer@^3.2.2: strip-ansi "^4.0.0" through "^2.3.6" +interactive@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/interactive/-/interactive-0.1.9.tgz#6dd3e2f9a00341863bc7dd84afce9d191b6f9e8e" + +internal-ip@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + internal-ip@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-2.0.3.tgz#ed3cf9b671ac7ff23037bfacad42eb439cd9546c" @@ -5679,14 +6176,18 @@ ip@1.1.5, ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -ipaddr.js@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" - -ipaddr.js@^1.5.2: +ipaddr.js@1.5.2, ipaddr.js@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" +iron@4.x.x, iron@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/iron/-/iron-4.0.5.tgz#4f042cceb8b9738f346b59aa734c83a89bc31428" + dependencies: + boom "5.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -5982,6 +6483,16 @@ 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@2.x.x: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" + +isemail@3.x.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.0.0.tgz#c89a46bb7a3361e1759f8028f9082488ecce3dff" + dependencies: + punycode "2.x.x" + isexe@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" @@ -6000,13 +6511,17 @@ isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" -isomorphic-fetch@^2.1.1: +isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" dependencies: node-fetch "^1.0.1" whatwg-fetch ">=0.10.0" +ispromise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ispromise/-/ispromise-1.1.0.tgz#3770f7337f332a2d099ade4684fe02a9a50b893a" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6074,16 +6589,21 @@ istanbul-reports@^1.1.2: dependencies: handlebars "^4.0.3" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" +items@2.x.x, items@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" -iterall@1.1.2, iterall@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.2.tgz#413332b3cdb46f8f5ede57d6cd8e3ca8a9df8816" +iterall@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.2.tgz#41a2e96ce9eda5e61c767ee5dc312373bb046e91" + +iterall@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.0.3.tgz#e0b31958f835013c323ff0b10943829ac69aa4b7" + +iterall@1.1.3, iterall@^1.1.0, iterall@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.3.tgz#1cbbff96204056dde6656e2ed2e2226d0e6d72c9" javascript-stringify@^1.6.0: version "1.6.0" @@ -6145,9 +6665,9 @@ jest-cli@^20.0.4: worker-farm "^1.3.1" yargs "^7.0.2" -jest-cli@^21.0.1, jest-cli@^21.1.0, jest-cli@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.0.tgz#30f7f1da516701893370937f6e06cf9e35b7f758" +jest-cli@^21.0.1, jest-cli@^21.1.0, jest-cli@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -6159,16 +6679,16 @@ jest-cli@^21.0.1, jest-cli@^21.1.0, jest-cli@^21.2.0: istanbul-lib-instrument "^1.4.2" istanbul-lib-source-maps "^1.1.0" jest-changed-files "^21.2.0" - jest-config "^21.2.0" - jest-environment-jsdom "^21.2.0" + jest-config "^21.2.1" + jest-environment-jsdom "^21.2.1" jest-haste-map "^21.2.0" - jest-message-util "^21.2.0" + jest-message-util "^21.2.1" jest-regex-util "^21.2.0" jest-resolve-dependencies "^21.2.0" - jest-runner "^21.2.0" - jest-runtime "^21.2.0" - jest-snapshot "^21.2.0" - jest-util "^21.2.0" + jest-runner "^21.2.1" + jest-runtime "^21.2.1" + jest-snapshot "^21.2.1" + jest-util "^21.2.1" micromatch "^2.3.11" node-notifier "^5.0.2" pify "^3.0.0" @@ -6194,21 +6714,21 @@ jest-config@^20.0.4: jest-validate "^20.0.3" pretty-format "^20.0.3" -jest-config@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.0.tgz#e88e6e677eed4eb78acfc9a1243531e3484de143" +jest-config@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" dependencies: chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^21.2.0" - jest-environment-node "^21.2.0" + jest-environment-jsdom "^21.2.1" + jest-environment-node "^21.2.1" jest-get-type "^21.2.0" - jest-jasmine2 "^21.2.0" + jest-jasmine2 "^21.2.1" jest-regex-util "^21.2.0" jest-resolve "^21.2.0" - jest-util "^21.2.0" - jest-validate "^21.2.0" - pretty-format "^21.2.0" + jest-util "^21.2.1" + jest-validate "^21.2.1" + pretty-format "^21.2.1" jest-diff@18.1.0, jest-diff@^18.1.0: version "18.1.0" @@ -6228,14 +6748,14 @@ jest-diff@^20.0.3: jest-matcher-utils "^20.0.3" pretty-format "^20.0.3" -jest-diff@^21.0.0, jest-diff@^21.1.0, jest-diff@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.0.tgz#14fa840d498c8f8a07465877dee5a9f0a48d6e74" +jest-diff@^21.0.0, jest-diff@^21.1.0, jest-diff@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^21.2.0" - pretty-format "^21.2.0" + pretty-format "^21.2.1" jest-docblock@^20.0.3: version "20.0.3" @@ -6253,12 +6773,12 @@ jest-environment-jsdom@^20.0.3: jest-util "^20.0.3" jsdom "^9.12.0" -jest-environment-jsdom@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.0.tgz#b38a2a1c5a4070586446863ffc25c6aedc0c1ddb" +jest-environment-jsdom@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" dependencies: jest-mock "^21.2.0" - jest-util "^21.2.0" + jest-util "^21.2.1" jsdom "^9.12.0" jest-environment-node@^20.0.3: @@ -6268,12 +6788,12 @@ jest-environment-node@^20.0.3: jest-mock "^20.0.3" jest-util "^20.0.3" -jest-environment-node@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.0.tgz#5e025a86c9556e6b7024f66b340bb9e3733f0d0f" +jest-environment-node@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" dependencies: jest-mock "^21.2.0" - jest-util "^21.2.0" + jest-util "^21.2.1" jest-file-exists@^17.0.0: version "17.0.0" @@ -6319,22 +6839,22 @@ jest-jasmine2@^20.0.4: once "^1.4.0" p-map "^1.1.1" -jest-jasmine2@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.0.tgz#99907a12d94ead2815f6bd22d69b3d2bc5bb36bc" +jest-jasmine2@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" dependencies: chalk "^2.0.1" - expect "^21.2.0" + expect "^21.2.1" graceful-fs "^4.1.11" - jest-diff "^21.2.0" - jest-matcher-utils "^21.2.0" - jest-message-util "^21.2.0" - jest-snapshot "^21.2.0" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-snapshot "^21.2.1" p-cancelable "^0.3.0" jest-junit@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-3.0.0.tgz#2148cc0f844d53f1712ad72d18b4ddff22b93ecc" + version "3.1.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-3.1.0.tgz#3bd0b7a8bfd5b91f86376d44ff0f4c7f136f4287" dependencies: mkdirp "^0.5.1" strip-ansi "^4.0.0" @@ -6354,13 +6874,13 @@ jest-matcher-utils@^20.0.3: chalk "^1.1.3" pretty-format "^20.0.3" -jest-matcher-utils@^21.0.0, jest-matcher-utils@^21.1.0, jest-matcher-utils@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.0.tgz#6cfabb60aa77d9f17e9e2fa8eb939dfbe005022d" +jest-matcher-utils@^21.0.0, jest-matcher-utils@^21.1.0, jest-matcher-utils@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" dependencies: chalk "^2.0.1" jest-get-type "^21.2.0" - pretty-format "^21.2.0" + pretty-format "^21.2.1" jest-matchers@^20.0.3: version "20.0.3" @@ -6379,9 +6899,9 @@ jest-message-util@^20.0.3: micromatch "^2.3.11" slash "^1.0.0" -jest-message-util@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.0.tgz#3c6717fe21c301da3a24ffa5691aed8961d362f5" +jest-message-util@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" dependencies: chalk "^2.0.1" micromatch "^2.3.11" @@ -6435,17 +6955,17 @@ jest-resolve@^21.2.0: chalk "^2.0.1" is-builtin-module "^1.0.0" -jest-runner@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.0.tgz#632f8e0c365613b37d2c7bd2c2f9dcc6235d71f0" +jest-runner@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" dependencies: - jest-config "^21.2.0" + jest-config "^21.2.1" jest-docblock "^21.2.0" jest-haste-map "^21.2.0" - jest-jasmine2 "^21.2.0" - jest-message-util "^21.2.0" - jest-runtime "^21.2.0" - jest-util "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-message-util "^21.2.1" + jest-runtime "^21.2.1" + jest-util "^21.2.1" pify "^3.0.0" throat "^4.0.0" worker-farm "^1.3.1" @@ -6470,9 +6990,9 @@ jest-runtime@^20.0.4: strip-bom "3.0.0" yargs "^7.0.2" -jest-runtime@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.0.tgz#665882303a656103c1fe025aaef44d547935bf51" +jest-runtime@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" dependencies: babel-core "^6.0.0" babel-jest "^21.2.0" @@ -6480,11 +7000,11 @@ jest-runtime@^21.2.0: chalk "^2.0.1" convert-source-map "^1.4.0" graceful-fs "^4.1.11" - jest-config "^21.2.0" + jest-config "^21.2.1" jest-haste-map "^21.2.0" jest-regex-util "^21.2.0" jest-resolve "^21.2.0" - jest-util "^21.2.0" + jest-util "^21.2.1" json-stable-stringify "^1.0.1" micromatch "^2.3.11" slash "^1.0.0" @@ -6514,20 +7034,20 @@ jest-snapshot@^20.0.3: natural-compare "^1.4.0" pretty-format "^20.0.3" -jest-snapshot@^21.0.0, jest-snapshot@^21.1.0, jest-snapshot@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.0.tgz#e3f53df6f90d2d72054c78d0eef32592a76edc05" +jest-snapshot@^21.0.0, jest-snapshot@^21.1.0, jest-snapshot@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" dependencies: chalk "^2.0.1" - jest-diff "^21.2.0" - jest-matcher-utils "^21.2.0" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^21.2.0" + pretty-format "^21.2.1" jest-styled-components@^4.4.1, jest-styled-components@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/jest-styled-components/-/jest-styled-components-4.6.0.tgz#a5e11c9e8b007857a657b41ceff41a116a976ec4" + version "4.7.0" + resolved "https://registry.yarnpkg.com/jest-styled-components/-/jest-styled-components-4.7.0.tgz#8965fa0bed02f9c040052315c955da02ebdcb01f" dependencies: css "^2.2.1" @@ -6558,16 +7078,16 @@ jest-util@^20.0.3: leven "^2.1.0" mkdirp "^0.5.1" -jest-util@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.0.tgz#b80779fc67250eb952196233c5ce68c2bd83fe69" +jest-util@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" dependencies: callsites "^2.0.0" chalk "^2.0.1" graceful-fs "^4.1.11" - jest-message-util "^21.2.0" + jest-message-util "^21.2.1" jest-mock "^21.2.0" - jest-validate "^21.2.0" + jest-validate "^21.2.1" mkdirp "^0.5.1" jest-validate@^20.0.3: @@ -6579,14 +7099,14 @@ jest-validate@^20.0.3: leven "^2.1.0" pretty-format "^20.0.3" -jest-validate@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.0.tgz#b383fc9c2905c15fac081bd42ffa954457ea705b" +jest-validate@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" dependencies: chalk "^2.0.1" jest-get-type "^21.2.0" leven "^2.1.0" - pretty-format "^21.2.0" + pretty-format "^21.2.1" jest@20.0.4, jest@^20.0.4: version "20.0.4" @@ -6595,10 +7115,10 @@ jest@20.0.4, jest@^20.0.4: jest-cli "^20.0.4" jest@^21.0.1, jest@^21.1.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.0.tgz#d0a6171e4e36e95acb28175d8b191241872bb59a" + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" dependencies: - jest-cli "^21.2.0" + jest-cli "^21.2.1" jodid25519@^1.0.0: version "1.0.2" @@ -6606,6 +7126,40 @@ jodid25519@^1.0.0: dependencies: jsbn "~0.1.0" +joi@10.x.x: + version "10.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-10.6.0.tgz#52587f02d52b8b75cdb0c74f0b164a191a0e1fc2" + dependencies: + hoek "4.x.x" + isemail "2.x.x" + items "2.x.x" + topo "2.x.x" + +joi@8.1.x: + version "8.1.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-8.1.1.tgz#2d8b52a5d909d217ed47248577eefe8b1798f48f" + dependencies: + hoek "4.x.x" + isemail "2.x.x" + moment "2.x.x" + topo "2.x.x" + +joi@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-11.1.1.tgz#08194537d3b9c796bac8666deb3a825c1a5d83c1" + dependencies: + hoek "4.x.x" + isemail "3.x.x" + topo "2.x.x" + +joyent-manifest-editor@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/joyent-manifest-editor/-/joyent-manifest-editor-1.3.0.tgz#f06641cfb29bd37eb4c9a14ae8eaf0ba565eacff" + dependencies: + prettier "^1.7.0" + prop-types "^15.6.0" + react-codemirror "^1.0.0" + joyent-react-scripts@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/joyent-react-scripts/-/joyent-react-scripts-2.0.2.tgz#687d5b114d82acfaff0993b57f8ab2e76e5173ee" @@ -6714,7 +7268,7 @@ json-stable-stringify@^1.0.1: dependencies: jsonify "~0.0.0" -json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@5.0.1, json-stringify-safe@5.0.x, json-stringify-safe@^5.0.1, 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" @@ -6827,6 +7381,10 @@ keep-alive-agent@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/keep-alive-agent/-/keep-alive-agent-0.0.1.tgz#44847ca394ce8d6b521ae85816bd64509942b385" +keycode@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa" + kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -6876,8 +7434,8 @@ lcid@^1.0.0: invert-kv "^1.0.0" lerna@^2.0.0, lerna@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.2.0.tgz#dcf588f8c8feb57d76b34ef72cfedef23f1b5807" + version "2.3.1" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.3.1.tgz#16397bc8ad8703381c8435e42ae0cd02086e8ee3" dependencies: async "^1.5.0" chalk "^2.1.0" @@ -7042,7 +7600,7 @@ loader-utils@^0.2.15, loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.2, loader-utils@^1.0.3, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -7061,10 +7619,53 @@ lodash-es@^4.17.3, lodash-es@^4.17.4, lodash-es@^4.2.0, lodash-es@^4.2.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7" +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._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._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" +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.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -7077,10 +7678,17 @@ lodash.curry@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" -lodash.debounce@^4.0.4: +lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" +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.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -7117,6 +7725,14 @@ lodash.intersection@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.intersection/-/lodash.intersection-4.4.0.tgz#0a11ba631d0e95c23c7f2f4cbb9a692ed178e705" +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.isarraylike@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.isarraylike/-/lodash.isarraylike-4.2.0.tgz#4623310ab318804b667ddc3619058137559400c4" @@ -7149,6 +7765,10 @@ lodash.isnan@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isnan/-/lodash.isnan-3.0.2.tgz#82ed04a5f9ea8bd6226d0c26af0cac32f4507745" +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -7157,6 +7777,14 @@ 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.keys@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" @@ -7173,6 +7801,10 @@ lodash.pick@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + lodash.some@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" @@ -7210,7 +7842,7 @@ lodash@4.17.2: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" -"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.7.0: +"lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.7.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -7251,7 +7883,7 @@ 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, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -7272,7 +7904,7 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@^4.0.1, lru-cache@^4.1.1: +lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" dependencies: @@ -7315,6 +7947,10 @@ 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" + mapsome@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mapsome/-/mapsome-1.0.0.tgz#70bf732b3eeab66aee7042158202885a17625c41" @@ -7336,6 +7972,10 @@ markdown-to-jsx@^5.4.2: remark-parse "^4.0.0" unified "^6.1.5" +marked@0.3.6, marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + matchmediaquery@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.2.1.tgz#223c7005793de03e47ce92b13285a72c44ada2cf" @@ -7467,13 +8107,13 @@ micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: regex-cache "^0.4.2" miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" dependencies: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: +mime-db@1.x.x, "mime-db@>= 1.29.0 < 2", mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -7483,15 +8123,11 @@ mime-types@2.1.17, mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, m dependencies: mime-db "~1.30.0" -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - mime@1.3.x: version "1.3.6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" -mime@^1.2.11, mime@^1.3.4: +mime@1.4.1, mime@^1.2.11, mime@^1.3.4: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -7499,9 +8135,12 @@ mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" +mimos@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/mimos/-/mimos-3.0.3.tgz#b9109072ad378c2b72f6a0101c43ddfb2b36641f" + dependencies: + hoek "4.x.x" + mime-db "1.x.x" minimalistic-assert@^1.0.0: version "1.0.0" @@ -7568,7 +8207,11 @@ modify-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" -moment@^2.10.6, moment@^2.6.0, moment@~2.18.0: +moment@2.15.x: + version "2.15.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc" + +moment@2.x.x, moment@^2.10.6, moment@^2.6.0, moment@~2.18.0: version "2.18.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" @@ -7614,6 +8257,10 @@ multicast-dns@^6.0.1: dns-packet "^1.0.1" thunky "^0.1.0" +mustache@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.0.tgz#4028f7778b17708a489930a6e52ac3bca0da41d0" + mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -7672,6 +8319,13 @@ netrc@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444" +nigel@2.x.x: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nigel/-/nigel-2.0.2.tgz#93a1866fb0c52d87390aa75e2b161f4b5c75e5b1" + dependencies: + hoek "4.x.x" + vise "2.x.x" + nlcst-is-literal@^1.0.0, nlcst-is-literal@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/nlcst-is-literal/-/nlcst-is-literal-1.1.1.tgz#8d8f11dabffebf7526c13a80674e696421becaeb" @@ -7708,13 +8362,17 @@ node-dir@^0.1.10: dependencies: minimatch "^3.0.2" -node-fetch@^1.0.1: +node-fetch@^1.0.1, node-fetch@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" dependencies: encoding "^0.1.11" is-stream "^1.0.1" +node-fingerprint@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/node-fingerprint/-/node-fingerprint-0.0.2.tgz#31cbabeb71a67ae7dd5a7dc042e51c3c75868501" + node-forge@0.6.33: version "0.6.33" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" @@ -7787,6 +8445,21 @@ node-version@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.0.tgz#f437d7ba407e65e2c4eaef8887b1718ba523d4f0" +nodemon@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.12.1.tgz#996a56dc49d9f16bbf1b78a4de08f13634b3878d" + dependencies: + chokidar "^1.7.0" + debug "^2.6.8" + es6-promise "^3.3.1" + ignore-by-default "^1.0.1" + lodash.defaults "^3.1.2" + minimatch "^3.0.4" + ps-tree "^1.1.0" + touch "^3.1.0" + undefsafe "0.0.3" + update-notifier "^2.2.0" + nopt@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.2.1.tgz#2aa09b7d1768487b3b89a9c5aa52335bff0baea7" @@ -7800,6 +8473,12 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" +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.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -7966,6 +8645,10 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + opn@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" @@ -7979,7 +8662,14 @@ opn@5.1.0, opn@^5.1.0: dependencies: is-wsl "^1.1.0" -optimist@^0.6.1: +oppsy@1.x.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/oppsy/-/oppsy-1.0.2.tgz#98014cd6967653a83cfffa554226dc90050baad4" + dependencies: + hoek "4.x.x" + items "2.x.x" + +optimist@^0.6.1, optimist@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" dependencies: @@ -8080,12 +8770,6 @@ p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" -p-timeout@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.0.tgz#9820f99434c5817868b4f34809ee5291660d5b6c" - dependencies: - p-finally "^1.0.0" - package-json@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" @@ -8190,7 +8874,7 @@ parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" -parseurl@~1.3.1, parseurl@~1.3.2: +parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -8265,6 +8949,12 @@ path-type@^2.0.0: dependencies: pify "^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" + pbkdf2@^3.0.3: version "3.0.14" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" @@ -8283,6 +8973,16 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" +pez@2.x.x: + version "2.1.5" + resolved "https://registry.yarnpkg.com/pez/-/pez-2.1.5.tgz#5ec2cc62500cc3eb4236d4a414cf5a17b5eb5007" + dependencies: + b64 "3.x.x" + boom "5.x.x" + content "3.x.x" + hoek "4.x.x" + nigel "2.x.x" + pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8329,6 +9029,14 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +podium@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/podium/-/podium-1.3.0.tgz#3c490f54d16f10f5260cbe98641f1cb733a8851c" + dependencies: + hoek "4.x.x" + items "2.x.x" + joi "10.x.x" + polished@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/polished/-/polished-1.7.0.tgz#cfc55113f52e9ecec7c84dbd0c708b9a3235d7c3" @@ -8413,8 +9121,8 @@ postcss-flexbugs-fixes@3.2.0: postcss "^6.0.1" postcss-less@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.0.tgz#bdcc76be64c4324d873fbc5cd9fa2e799e4305fa" + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-1.1.1.tgz#4bd240db517ce3407583d927858184f50045f4ab" dependencies: postcss "^5.2.16" @@ -8515,33 +9223,48 @@ postcss-minify-selectors@^2.0.4: postcss "^5.0.14" postcss-selector-parser "^2.0.0" +postcss-modules-extract-imports@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" + dependencies: + postcss "^6.0.1" + postcss-modules-extract-imports@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" dependencies: postcss "^6.0.1" -postcss-modules-local-by-default@^1.0.1: +postcss-modules-local-by-default@1.2.0, postcss-modules-local-by-default@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-scope@^1.0.0: +postcss-modules-scope@1.1.0, postcss-modules-scope@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-values@^1.1.0: +postcss-modules-values@1.3.0, postcss-modules-values@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" dependencies: icss-replace-symbols "^1.1.0" postcss "^6.0.1" +postcss-modules@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-0.6.4.tgz#77a58bb77ba1b4392b270c0b59852fd75e89a8b4" + dependencies: + css-modules-loader-core "^1.0.1" + generic-names "^1.0.2" + postcss "^5.2.8" + string-hash "^1.1.1" + postcss-normalize-charset@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" @@ -8641,7 +9364,15 @@ postcss-zindex@^2.0.1: postcss "^5.0.4" uniqs "^2.0.0" -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: +postcss@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" + dependencies: + chalk "^1.1.3" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16, postcss@^5.2.8: version "5.2.17" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" dependencies: @@ -8678,6 +9409,10 @@ prettier@1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.6.1.tgz#850f411a3116226193e32ea5acfc21c0f9a76d7d" +prettier@^1.7.0, prettier@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.7.4.tgz#5e8624ae9363c80f95ec644584ecdf55d74f93fa" + pretty-bytes@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" @@ -8702,9 +9437,9 @@ pretty-format@^20.0.3: ansi-regex "^2.1.1" ansi-styles "^3.0.0" -pretty-format@^21.2.0: - version "21.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.0.tgz#8ca29556ad13eed5db48a3096b98bab9c321c6fa" +pretty-format@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" @@ -8747,7 +9482,7 @@ prop-types@15.5.8: dependencies: fbjs "^0.8.9" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0: +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0: version "15.6.0" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" dependencies: @@ -8755,17 +9490,23 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8, loose-envify "^1.3.1" object-assign "^4.1.1" -proxy-addr@~1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" dependencies: - forwarded "~0.1.0" - ipaddr.js "1.4.0" + forwarded "~0.1.2" + ipaddr.js "1.5.2" prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +ps-tree@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -8787,7 +9528,7 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: +pumpify@1.3.x, pumpify@^1.3.3: version "1.3.5" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" dependencies: @@ -8799,6 +9540,10 @@ punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" +punycode@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -8824,18 +9569,14 @@ qs@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" -qs@6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.0.tgz#8d04954d364def3efc55b5a0793e1e2c8b1e6e49" +qs@6.5.1, qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" -qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - quality-docs@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/quality-docs/-/quality-docs-3.3.0.tgz#cc2a3f35440000fe274410ab3ccfdd760b3cfc94" @@ -8888,6 +9629,10 @@ quotation@^1.0.0, quotation@^1.0.1, quotation@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quotation/-/quotation-1.1.0.tgz#3f9c9b2e7780856f27c5015bec628d690e82c70d" +ramda@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.23.0.tgz#ccd13fff73497a93974e3e86327bfd87bd6e8e2b" + random-integral@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/random-integral/-/random-integral-1.0.3.tgz#8ff3c117565c9a04b66ddd559f3aed29bd0f0f6c" @@ -8937,6 +9682,10 @@ raw-body@~2.1.7: iconv-lite "0.4.13" unpipe "1.0.0" +raw-loader@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.1" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" @@ -8946,6 +9695,13 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-addons-shallow-compare@^15.6.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.2.tgz#198a00b91fc37623db64a28fd17b596ba362702f" + dependencies: + fbjs "^0.8.4" + object-assign "^4.1.0" + react-apollo@^1.4.15: version "1.4.16" resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-1.4.16.tgz#62a623458b67a174ff8ef25f64e7b42531518e19" @@ -8974,17 +9730,45 @@ react-broadcast@^0.1.2: dependencies: invariant "^2.2.1" +react-bundle@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-bundle/-/react-bundle-1.0.4.tgz#ea03cae97be357ff8e290e785f4e30d0e065b920" + dependencies: + ispromise "^1.1.0" + prop-types "^15.5.10" + react-codemirror2@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-2.0.0.tgz#25eceff9725a2ab9e47f78fe9a23cb3923d1766e" -react-codemirror@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/react-codemirror/-/react-codemirror-0.2.6.tgz#e71e35717ce6effae68df1dbf2b5a75b84a44f84" +react-codemirror2@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-2.0.2.tgz#68b2ae8923174a2b3d8b6fe905d0fd3c91d97d97" + +react-codemirror@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/react-codemirror/-/react-codemirror-1.0.0.tgz#91467b53b1f5d80d916a2fd0b4c7adb85a9001ba" dependencies: - classnames "^2.2.3" - codemirror "^5.13.4" - lodash.debounce "^4.0.4" + classnames "^2.2.5" + codemirror "^5.18.2" + create-react-class "^15.5.1" + lodash.debounce "^4.0.8" + lodash.isequal "^4.5.0" + prop-types "^15.5.4" + +react-copy-to-clipboard@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz#8eae107bb400be73132ed3b6a7b4fb156090208e" + dependencies: + copy-to-clipboard "^3" + prop-types "^15.5.8" + +react-css-themr@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/react-css-themr/-/react-css-themr-2.1.2.tgz#e017514e471c232f43a754a55b49d81faf5dafb8" + dependencies: + hoist-non-react-statics "^1.2.0" + invariant "^2.2.1" react-dev-utils@^3.0.2: version "3.1.1" @@ -9063,6 +9847,10 @@ react-docgen@^3.0.0-beta7: node-dir "^0.1.10" recast "^0.12.6" +react-dom-factories@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/react-dom-factories/-/react-dom-factories-1.0.2.tgz#eb7705c4db36fb501b3aa38ff759616aa0ff96e0" + "react-dom@^15 || ^16": version "16.0.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.0.0.tgz#9cc3079c3dcd70d4c6e01b84aab2a7e34c303f58" @@ -9072,7 +9860,7 @@ react-docgen@^3.0.0-beta7: object-assign "^4.1.1" prop-types "^15.6.0" -react-dom@^15.6.1: +react-dom@^15.3.2, react-dom@^15.4.2, react-dom@^15.6.1: version "15.6.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730" dependencies: @@ -9128,7 +9916,26 @@ react-json-view@^1.12.4: react-base16-styling "^0.5.3" react-textarea-autosize "^5.1.0" -react-redux@^5.0.6: +react-modal@^1.6.5: + version "1.9.7" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-1.9.7.tgz#07ef56790b953e3b98ef1e2989e347983c72871d" + dependencies: + create-react-class "^15.5.2" + element-class "^0.2.0" + exenv "1.2.0" + lodash.assign "^4.2.0" + prop-types "^15.5.7" + react-dom-factories "^1.0.0" + +react-modal@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-2.3.2.tgz#af9d625da218461de3e87551609dfca12d8d4946" + dependencies: + exenv "^1.2.0" + prop-types "^15.5.10" + react-dom-factories "^1.0.0" + +react-redux@^5.0.5, react-redux@^5.0.6: version "5.0.6" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.6.tgz#23ed3a4f986359d68b5212eaaa681e60d6574946" dependencies: @@ -9147,7 +9954,7 @@ react-responsive@^1.3.4: matchmediaquery "^0.2.1" prop-types "^15.5.7" -react-router-dom@^4.1.2: +react-router-dom@^4.1.2, react-router-dom@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d" dependencies: @@ -9212,6 +10019,12 @@ react-scripts@^1.0.12, react-scripts@^1.0.13: optionalDependencies: fsevents "1.1.2" +react-style-proptype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.0.0.tgz#89e0b646f266c656abb0f0dd8202dbd5036c31e6" + dependencies: + prop-types "^15.5.4" + react-styled-flexboxgrid@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/react-styled-flexboxgrid/-/react-styled-flexboxgrid-2.0.3.tgz#308a8bbc80b1737a65f4ccf35d02afe20932a2f2" @@ -9298,6 +10111,36 @@ react-textarea-autosize@^5.1.0: dependencies: prop-types "^15.5.10" +react-toolbox@^2.0.0-beta.7: + version "2.0.0-beta.12" + resolved "https://registry.yarnpkg.com/react-toolbox/-/react-toolbox-2.0.0-beta.12.tgz#1d9dd7cc41e3b35dabdce5eb100a8068eee88c45" + dependencies: + classnames "^2.2.5" + core-js "^2.4.0" + ramda "^0.23.0" + react-css-themr "^2.1.2" + react-style-proptype "^3.0.0" + react-transition-group "^1.1.3" + +react-transition-group@^1.1.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6" + dependencies: + chain-function "^1.0.0" + dom-helpers "^3.2.0" + loose-envify "^1.3.1" + prop-types "^15.5.6" + warning "^3.0.0" + +react-virtualized@^8.11.3: + version "8.11.4" + resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-8.11.4.tgz#0bb94f1ecbd286d07145ce63983d0a11724522c0" + dependencies: + babel-runtime "^6.11.6" + classnames "^2.2.3" + dom-helpers "^2.4.0 || ^3.0.0" + loose-envify "^1.3.0" + "react@^15 || ^16": version "16.0.0" resolved "https://registry.yarnpkg.com/react/-/react-16.0.0.tgz#ce7df8f1941b036f02b2cca9dbd0cb1f0e855e2d" @@ -9307,7 +10150,7 @@ react-textarea-autosize@^5.1.0: object-assign "^4.1.1" prop-types "^15.6.0" -react@^15.6.1: +react@^15.4.2, react@^15.6.1: version "15.6.2" resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72" dependencies: @@ -9535,7 +10378,19 @@ redux-form@^7.0.3, redux-form@^7.0.4: lodash-es "^4.17.3" prop-types "^15.5.9" -redux@^3.4.0, redux@^3.7.2: +redux-localstorage-filter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/redux-localstorage-filter/-/redux-localstorage-filter-0.1.1.tgz#94c5ab68d8cda479bb3cc6cdf03569f8f63a188d" + +redux-localstorage@rc: + version "1.0.0-rc5" + resolved "https://registry.yarnpkg.com/redux-localstorage/-/redux-localstorage-1.0.0-rc5.tgz#7067bc4cb0b03b5c791025ac33dde6175d50d5d1" + +redux-thunk@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.2.0.tgz#e615a16e16b47a19a515766133d1e3e99b7852e5" + +redux@^3.4.0, redux@^3.7.1, redux@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" dependencies: @@ -9856,6 +10711,10 @@ requires-port@1.0.x, requires-port@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +reselect@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147" + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -10116,6 +10975,12 @@ rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rxjs@^5.0.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f" + dependencies: + symbol-observable "^1.0.1" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.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" @@ -10160,6 +11025,10 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" +seamless-immutable@^7.0.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/seamless-immutable/-/seamless-immutable-7.1.2.tgz#c87a1eba6767a32455311d76600ac5eddeafbb69" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -10200,27 +11069,9 @@ semver@~5.0.1: version "5.0.3" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" -send@0.15.4: - version "0.15.4" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.4.tgz#985faa3e284b0273c793364a35c6737bd93905b9" - dependencies: - debug "2.6.8" - depd "~1.1.1" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" - http-errors "~1.6.2" - mime "1.3.4" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - -send@0.15.6: - version "0.15.6" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.6.tgz#20f23a9c925b762ab82705fe2f9db252ace47e34" +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" dependencies: debug "2.6.9" depd "~1.1.1" @@ -10230,36 +11081,36 @@ send@0.15.6: etag "~1.8.1" fresh "0.5.2" http-errors "~1.6.2" - mime "1.3.4" + mime "1.4.1" ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" statuses "~1.3.1" serve-index@^1.7.2: - version "1.9.0" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.0.tgz#d2b280fc560d616ee81b48bf0fa82abed2485ce7" + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" dependencies: - accepts "~1.3.3" + accepts "~1.3.4" batch "0.6.1" - debug "2.6.8" + debug "2.6.9" escape-html "~1.0.3" - http-errors "~1.6.1" - mime-types "~2.1.15" - parseurl "~1.3.1" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" -serve-static@1.12.6: - version "1.12.6" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.6.tgz#b973773f63449934da54e5beba5e31d9f4211577" +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" dependencies: encodeurl "~1.0.1" escape-html "~1.0.3" parseurl "~1.3.2" - send "0.15.6" + send "0.16.1" serve@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/serve/-/serve-6.1.0.tgz#864c73710c18501838363a837fefe1389aa17f87" + version "6.2.0" + resolved "https://registry.yarnpkg.com/serve/-/serve-6.2.0.tgz#e0f94d7c50ee8ac3841e86d1f0b16761f7a8f05b" dependencies: args "3.0.4" basic-auth "2.0.0" @@ -10279,7 +11130,7 @@ serve@^6.1.0: node-version "1.1.0" opn "5.1.0" path-type "3.0.0" - send "0.15.4" + send "0.16.1" update-notifier "2.2.0" serviceworker-cache-polyfill@^4.0.0: @@ -10306,6 +11157,10 @@ setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + settle-promise@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/settle-promise/-/settle-promise-1.0.0.tgz#697adb58b821f387ce2757c06efc9de5f0ee33d8" @@ -10352,6 +11207,13 @@ sherlock@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sherlock/-/sherlock-1.0.0.tgz#e246eacfd72c0e3b3e8243a6c9e55340d80c854e" +shot@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/shot/-/shot-3.4.2.tgz#1e5c3f6f2b26649adc42f7eb350214a5a0291d67" + dependencies: + hoek "4.x.x" + joi "10.x.x" + 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" @@ -10374,7 +11236,13 @@ slide@^1.1.5, slide@~1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" -smartdc-auth@2.5.6, smartdc-auth@^2.5.5: +slug@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/slug/-/slug-0.9.1.tgz#af08f608a7c11516b61778aa800dce84c518cfda" + dependencies: + unicode ">= 0.3.1" + +smartdc-auth@2.5.6, smartdc-auth@^2.5.6: version "2.5.6" resolved "https://registry.yarnpkg.com/smartdc-auth/-/smartdc-auth-2.5.6.tgz#950e223342038e62c7f1e6299ce47e095ac2428c" dependencies: @@ -10393,8 +11261,8 @@ smog-formula@^1.0.0: resolved "https://registry.yarnpkg.com/smog-formula/-/smog-formula-1.0.1.tgz#b2bac5e7404cb431657b3ba9efeedc3c6abbbace" snapguidist@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/snapguidist/-/snapguidist-2.0.1.tgz#0440b019c75ea29145967227c5ccd1e53dbd3177" + version "2.1.0" + resolved "https://registry.yarnpkg.com/snapguidist/-/snapguidist-2.1.0.tgz#141ec5f6e9b90c3340d0ff8ee2335585bf2523eb" dependencies: body-parser "1.15.2" classnames "2.2.5" @@ -10402,7 +11270,7 @@ snapguidist@^2.0.0: cors "2.8.1" jest-diff "18.1.0" jest-snapshot "18.1.0" - react-codemirror "0.2.6" + react-codemirror2 "2.0.2" react-test-renderer "15.6.1" strip-ansi "3.0.1" unfetch "2.1.2" @@ -10419,7 +11287,7 @@ sntp@2.x.x: dependencies: hoek "4.x.x" -sockjs-client@1.1.4: +sockjs-client@1.1.4, sockjs-client@^1.0.3: version "1.1.4" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" dependencies: @@ -10430,7 +11298,7 @@ sockjs-client@1.1.4: json3 "^3.3.2" url-parse "^1.1.8" -sockjs@0.3.18: +sockjs@0.3.18, sockjs@^0.3.15: version "0.3.18" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" dependencies: @@ -10572,6 +11440,12 @@ split2@^2.0.0: dependencies: through2 "^2.0.2" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -10648,6 +11522,17 @@ state-toggle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425" +statehood@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/statehood/-/statehood-5.0.3.tgz#c07a75620db5379b60d2edd47f538002a8ac7dd6" + dependencies: + boom "5.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + iron "4.x.x" + items "2.x.x" + joi "10.x.x" + "statuses@>= 1.3.1 < 2", statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -10659,6 +11544,16 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-cache@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stream-cache/-/stream-cache-0.0.2.tgz#1ac5ad6832428ca55667dbdee395dad4e6db118f" + +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-consume@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" @@ -10688,6 +11583,10 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" +string-hash@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + string-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" @@ -10799,6 +11698,10 @@ strip-json-comments@2.0.1, 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" +striptags@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.1.0.tgz#763e534338d9cf542f004a4b1eb099e32d295e44" + strong-log-transformer@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz#f7fb93758a69a571140181277eea0c2eb1301fa3" @@ -10825,8 +11728,8 @@ style-search@^0.1.0: resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" styled-components@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-2.1.2.tgz#bb419978e1287c5d0d88fa9106b2dd75f66a324c" + version "2.2.0" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-2.2.0.tgz#23823d305b1929723f927837735fdc2431545956" dependencies: buffer "^5.0.3" css-to-react-native "^2.0.3" @@ -10930,8 +11833,33 @@ stylelint@^8.1.1: table "^4.0.1" stylis@^3.2.1: - version "3.2.18" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.2.18.tgz#211661f13b636e9e451456a1aadcec31248edf0e" + version "3.2.19" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.2.19.tgz#3bfeff425e12935cde5faed4a39de06b1aeb5acb" + +subscriptions-transport-ws@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.8.3.tgz#d4b22db7f5951bd30e7c6f4dc4774d34ed9f1751" + dependencies: + backo2 "^1.0.2" + eventemitter3 "^2.0.3" + graphql-subscriptions "^0.4.4" + graphql-tag "^2.4.2" + iterall "^1.1.1" + lodash.assign "^4.2.0" + lodash.isobject "^3.0.2" + lodash.isstring "^4.0.1" + symbol-observable "^1.0.4" + ws "^3.0.0" + +subtext@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/subtext/-/subtext-5.0.0.tgz#9c3f083018bb1586b167ad8cfd87083f5ccdfe0f" + dependencies: + boom "5.x.x" + content "3.x.x" + hoek "4.x.x" + pez "2.x.x" + wreck "12.x.x" sugarss@^1.0.0: version "1.0.0" @@ -10947,7 +11875,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.2, supports-color@^3.2.3: +supports-color@^3.1.1, supports-color@^3.1.2, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: @@ -10959,10 +11887,20 @@ supports-color@^4.0.0, supports-color@^4.1.0, supports-color@^4.2.1, supports-co dependencies: has-flag "^2.0.0" +svg-pan-zoom@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/svg-pan-zoom/-/svg-pan-zoom-3.5.2.tgz#18a2d68c27d15ffc562d4a7f9925519269f6abd0" + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" +svgo-loader@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/svgo-loader/-/svgo-loader-1.2.1.tgz#e255cdebf56753ff83bd28d1d7a20762c0df5130" + dependencies: + loader-utils "^1.0.3" + svgo@^0.7.0, svgo@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -11013,7 +11951,7 @@ syllable@^2.0.0: pluralize "^6.0.0" trim "0.0.1" -symbol-observable@^1.0.2, symbol-observable@^1.0.3: +symbol-observable@^1.0.1, symbol-observable@^1.0.2, symbol-observable@^1.0.3, symbol-observable@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" @@ -11124,8 +12062,8 @@ test-exclude@^4.1.1: require-main-filename "^1.0.1" text-extensions@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.6.0.tgz#771561b26022783a45f5b6c2e78ad6e7de9fe322" + version "1.7.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39" text-table@0.2.0, text-table@~0.2.0: version "0.2.0" @@ -11158,7 +12096,7 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "^2.1.5" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.4, 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" @@ -11246,9 +12184,25 @@ to-vfile@^2.1.1: is-buffer "^1.1.4" vfile "^2.0.0" +toggle-selection@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + +topo@2.x.x, topo@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" + dependencies: + hoek "4.x.x" + toposort@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.4.tgz#a86107690cbee8cae43b349d2f60162500924dfc" + version "1.0.6" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + dependencies: + nopt "~1.0.10" tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" @@ -11298,9 +12252,9 @@ trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" -triton@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/triton/-/triton-5.3.2.tgz#bb47dd3b68249da33f45032071f6fe92b4272774" +triton@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/triton/-/triton-5.4.0.tgz#44ef2206d73df3d69fa098c473b0cf2f10bdd573" dependencies: assert-plus "0.2.0" backoff "2.4.1" @@ -11391,15 +12345,15 @@ ua-parser-js@^0.7.9: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.14.tgz#110d53fa4c3f326c121292bbeac904d2e03387ca" uglify-es@^3.0.24: - version "3.1.2" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.1.2.tgz#b22cfca950f0632092aff42bb46979d83b5ec6f5" + version "3.1.3" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.1.3.tgz#a21eeb149cb120a1f8302563689e19496550780b" dependencies: commander "~2.11.0" source-map "~0.5.1" uglify-js@3.1.x, uglify-js@^3.0.13: - version "3.1.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.2.tgz#b50bcf15a5fd9e9ed40afbcdef3b59d6891b291f" + version "3.1.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.3.tgz#d61f0453b4718cab01581f3162aa90bab7520b42" dependencies: commander "~2.11.0" source-map "~0.5.1" @@ -11445,6 +12399,14 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +ultron@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864" + +undefsafe@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" + unfetch@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-2.1.2.tgz#684fee4d8acdb135bdb26c0364c642fc326ca95b" @@ -11456,6 +12418,10 @@ unherit@^1.0.4: inherits "^2.0.1" xtend "^4.0.1" +"unicode@>= 0.3.1": + version "10.0.0" + resolved "https://registry.yarnpkg.com/unicode/-/unicode-10.0.0.tgz#e5d51c1db93b6c71a0b879e0b0c4af7e6fdf688e" + unified@^6.0.0, unified@^6.1.5: version "6.1.5" resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.5.tgz#716937872621a63135e62ced2f3ac6a063c6fb87" @@ -11552,7 +12518,7 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@2.2.0, update-notifier@^2.1.0: +update-notifier@2.2.0, update-notifier@^2.1.0, update-notifier@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" dependencies: @@ -11589,8 +12555,8 @@ upper-case@^1.0.3, upper-case@^1.1.1: resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" urijs@^1.16.1: - version "1.18.12" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.18.12.tgz#f04d91e1fabb29c16fc842f9a14ee8ddc3fda64e" + version "1.19.0" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.0.tgz#d8aa284d0e7469703a6988ad045c4cbfdf08ada0" urix@^0.1.0, urix@~0.1.0: version "0.1.0" @@ -11623,10 +12589,6 @@ url-parse@^1.1.8: querystringify "~1.0.0" requires-port "1.0.x" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -11660,9 +12622,9 @@ utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" uuid@^2.0.1, uuid@^2.0.2: version "2.0.3" @@ -11689,7 +12651,7 @@ value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" -vary@^1, vary@~1.1.1, vary@~1.1.2: +vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -11768,6 +12730,12 @@ vfile@^2.0.0: replace-ext "1.0.0" unist-util-stringify-position "^1.0.0" +vise@2.x.x: + version "2.0.2" + resolved "https://registry.yarnpkg.com/vise/-/vise-2.0.2.tgz#6b08e8fb4cb76e3a50cd6dd0ec37338e811a0d39" + dependencies: + hoek "4.x.x" + vlq@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.2.tgz#e316d5257b40b86bb43cb8d5fea5d7f54d6b0ca1" @@ -11855,7 +12823,7 @@ webidl-conversions@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" -webpack-dev-middleware@^1.11.0: +webpack-dev-middleware@^1.10.2, webpack-dev-middleware@^1.11.0: version "1.12.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" dependencies: @@ -11865,7 +12833,7 @@ webpack-dev-middleware@^1.11.0: range-parser "^1.0.3" time-stamp "^2.0.0" -webpack-dev-server@2.8.2, webpack-dev-server@^2.8.2: +webpack-dev-server@2.8.2: version "2.8.2" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.8.2.tgz#abd61f410778cc4c843d7cebbf41465b1ab7734c" dependencies: @@ -11894,6 +12862,53 @@ webpack-dev-server@2.8.2, webpack-dev-server@^2.8.2: webpack-dev-middleware "^1.11.0" yargs "^6.6.0" +webpack-dev-server@^1.16.2: + version "1.16.5" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz#0cbd5f2d2ac8d4e593aacd5c9702e7bbd5e59892" + dependencies: + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + express "^4.13.3" + http-proxy-middleware "~0.17.1" + open "0.0.5" + optimist "~0.6.1" + serve-index "^1.7.2" + sockjs "^0.3.15" + sockjs-client "^1.0.3" + stream-cache "~0.0.1" + strip-ansi "^3.0.0" + supports-color "^3.1.1" + webpack-dev-middleware "^1.10.2" + +webpack-dev-server@^2.8.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.1.tgz#7ac9320b61b00eb65b2109f15c82747fc5b93585" + dependencies: + ansi-html "0.0.7" + array-includes "^3.0.3" + bonjour "^3.5.0" + chokidar "^1.6.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + del "^3.0.0" + express "^4.13.3" + html-entities "^1.2.0" + http-proxy-middleware "~0.17.4" + internal-ip "1.2.0" + ip "^1.1.5" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.18" + sockjs-client "1.1.4" + spdy "^3.4.1" + strip-ansi "^3.0.1" + supports-color "^4.2.1" + webpack-dev-middleware "^1.11.0" + yargs "^6.6.0" + webpack-manifest-plugin@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-1.2.1.tgz#e02f0846834ce98dca516946ee3ee679745e7db1" @@ -12052,7 +13067,7 @@ window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -word-wrap@^1.0.3: +word-wrap@^1.0.3, word-wrap@^1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -12086,6 +13101,13 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +wreck@12.x.x: + version "12.5.1" + resolved "https://registry.yarnpkg.com/wreck/-/wreck-12.5.1.tgz#cd2ffce167449e1f0242ed9cf80552e20fb6902a" + dependencies: + boom "5.x.x" + hoek "4.x.x" + write-file-atomic@^1.1.2: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" @@ -12133,6 +13155,14 @@ ws@1.1.1: options ">=0.0.5" ultron "1.0.x" +ws@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.2.0.tgz#d5d3d6b11aff71e73f808f40cc69d52bb6d4a185" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + x-is-function@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e" @@ -12263,7 +13293,7 @@ yargs@^8.0.2: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@^9.0.0: +yargs@^9.0.0, yargs@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" dependencies: