diff --git a/legacy/spikes/graphql/graphql-server/src/resolvers.js b/legacy/spikes/graphql/graphql-server/src/resolvers.js new file mode 100644 index 00000000..3bf1c72c --- /dev/null +++ b/legacy/spikes/graphql/graphql-server/src/resolvers.js @@ -0,0 +1,257 @@ +import { find, filter } from 'lodash'; +import data from './mock-data'; +import { normalMetricData, leakMetricData } from './mock-data/metrics'; + +// TMP / Util +const datacenter = { + id: 'datacenter-id', + region: 'us-east-1' +}; +const user = { + id: 'unique-user-id', + firstName: 'Judit', + lastName: 'Greskovits', + email: 'name@email.com', + login: 'juditgreskovits' +}; +const portal = { user, host: 'dockerhost', datacenter }; +const deploymentGroups = data.projects.data.map(p => { + p.slug = p.id; + p.id = p.uuid; + return p; +}); +const services = data.services.data.map(s => { + s.slug = s.id; + s.id = s.uuid; + return s; +}); +const instances = data.instances.data.map(i => { + i.slug = i.id; + i.id = i.uuid; + return i; +}); +const metricTypes = data.metrics.data.types; + +const count = 10; +let index = 0; +const getInstanceMetricData = (dataset, type) => { + return dataset[type].slice(index, index + count); +}; + +const tick = setInterval(() => index++, 15 * 1000); + +// GraphQL + +const queries = { + portal() { + return portal; + }, + + deploymentGroups(_, { name, slug }) { + return deploymentGroups; + }, + deploymentGroup(_, { id, name, slug }) { + if (id) { + return find(deploymentGroups, { id: id }); + } + if (slug) { + return find(deploymentGroups, { slug: slug }); + } + return null; + }, + + serviceScales(_, { serviceName, versionUuid }) { + // : [ServiceScale] + return []; + }, + serviceScale(_, { id }) { + // : ServiceScale + return {}; + }, + + convergenceActions(_, { type, service, versionUuid }) { + // : [ConvergenceAction] + return []; + }, + convergenceAction(id) { + // : ConvergenceAction + return {}; + }, + + stateConvergencePlans(_, { running, versionUuid }) { + // : [StateConvergencePlan] + return []; + }, + stateConvergencePlan(_, { id }) { + // : StateConvergencePlan + return []; + }, + + versions(_, { manifestUuid, deploymentGroupUuid }) { + // : [Version] + return []; + }, + version(_, { id, manifestUuid }) { + // : Version + return null; + }, + + manifests(_, { type, deploymentGroupUuid }) { + // : [Manifest] + return []; + }, + manifest(_, { id }) { + // : Manifest + return null; + }, + + services( + _, + { name, slug, parentUuid, deploymentGroupUuid, deploymentGroupSlug } + ) { + // }: [Service] + if (deploymentGroupUuid) { + return filter(services, { project: deploymentGroupUuid }); + } + if (deploymentGroupSlug) { + const deploymentGroup = find(deploymentGroups, { + slug: deploymentGroupSlug + }); + if (deploymentGroup) { + if (slug) { + return filter(services, { project: deploymentGroup.id, slug: slug }); + } + return filter(services, { project: deploymentGroup.id }); + } + return null; + } + return services; + }, + service(_, { id, hash }) { + // : Service + if (id) { + return find(services, { id: id }); + } + if (hash) { + return find(services, { hash: hash }); + } + return null; + }, + + packages(_, { name, type, memory, disk, swap, lwps, vcpus, version, group }) { + // : [Package] + return []; + }, + package(_, { id }) { + // : Package + return {}; + }, + + instances( + _, + { + name, + machineId, + status, + serviceUuid, + serviceSlug, + deploymentGroupUuid, + deploymentGroupSlug + } + ) { + // : [Instance] + if (serviceUuid) { + return filter(instances, { service: serviceUuid }); + } + if (serviceSlug) { + const service = find(services, { slug: serviceSlug }); + if (service) { + return filter(instances, { service: service.id }); + } + return null; + } + return instances; + }, + instance(_, { id }) { + // : Instance + if (id) { + return find(instances, { id: id }); + } + }, + + datacenter() { + return datacenter; + } + + /*metricTypes() { + return metricTypes; + }, + // tmp test + instanceMetric() { + return { + type: { + id: 'node_memory_rss_bytes', + id: 'node_memory_rss_bytes', + name: 'node_memory_rss_bytes', + }, + data: getInstanceMetricData(leakMetricData, 'node_memory_rss_bytes') + }; + }*/ +}; + +const resolveFunctions = { + Query: queries, + Portal: { + deploymentGroups(portal, args, context) { + return deploymentGroups; + } + }, + DeploymentGroup: { + services(deploymentGroup, args, context) { + const a = Object.assign({}, args, { + deploymentGroupSlug: deploymentGroup.slug + }); + return queries.services(null, a); + } + }, + Service: { + instances(service, args, context) { + return filter(instances, { service: service.id }); + } + /*metrics(service) { + return service.metrics ? + service.metrics.map((metric) => + find(metricTypes, { id: metric.type })) : []; + },*/ + /*currentMetrics(service) { + // tmp + return [{ + "name": "CPU", + "value": 50, + "measurement": "%", + }, { + "name": "Memory", + "value": 20, + "measurement": "%", + }, { + "name": "Network", + "value": 2.9, + "measurement": "Kb/sec", + }]; + },*/ + } + /*Instance: { + metrics(instance) { + return ([{ + type: { + id: 'metric-type-id', + id: 'metric-type-id', + name: 'metric-type-name' + }, + data: normalMetricData.node_memory_rss_bytes + }]); + } + }*/ +}; + +export default resolveFunctions; diff --git a/legacy/spikes/graphql/graphql-server/src/schema.gql b/legacy/spikes/graphql/graphql-server/src/schema.gql new file mode 100644 index 00000000..afe62585 --- /dev/null +++ b/legacy/spikes/graphql/graphql-server/src/schema.gql @@ -0,0 +1,213 @@ + + scalar Date + scalar Object + + type Portal { + user: User! + datacenter: Datacenter! + deploymentGroups: [DeploymentGroup]! + } + + type User { + id: ID! + firstName: String! + lastName: String! + email: String! + login: String! + } + + type DeploymentGroup { + id: ID! + name: String! + slug: String! + services(slug: String): [Service]! + version: Version! + history: [Version]! + } + + type ServiceScale { + id: ID! + serviceName: String! + replicas: Int! + } + + enum ConvergenceActionType { + NOOP + CREATE + RECREATE + START + } + + type ConvergenceAction { + id: String! + type: ConvergenceActionType! + service: String! # service name + machines: [String]! # instance machine ids + } + + type StateConvergencePlan { + id: String! + running: Boolean! + actions: [ConvergenceAction]! + } + + type Version { + created: Date! # Either Int or define scalar + manifest: Manifest! + scale: [ServiceScale]! + plan: StateConvergencePlan + } + + enum ManifestType { + COMPOSE + MARIPOSA + } + + enum ManifestFormat { + JSON + YAML + } + + type Manifest { + id: String! + created: Date! + type: ManifestType! + format: ManifestFormat! + raw: String! + obj: Object! + } + + # immutable + type Service { + id: String! # unique id for db row + hash: String! # unique id for version of service + name: String! # human readable name + slug: String! + instances: [Instance]! + # metrics: [MetricType]! + currentMetrics: [CurrentMetric]! + connections: [String!] # list of serviceUuids + parent: ID # parent service id + package: Package! # we don't have this in current mock data + } + + # for metrics max / min (I guess) + type Package { + id: ID! + name: String! + type: String! + memory: Float! + disk: Float! + swap: Float! + lwps: Int! + vcpus: Int! + version: String! + group: String! + } + + enum InstanceStatus { + CREATED + RESTARTING + RUNNING + PAUSED + EXITED + DELETED + } + + type Instance { + id: String! + name: String! + machineId: String! + status: InstanceStatus! + # metrics: [InstanceMetric]! + } + + type Datacenter { + id: String! + # name: String! # Do we have 'official' human readable names? + region: String! + } + + type InstanceMetric { + type: MetricType! + data: [MetricData]! + } + + type CurrentMetric { + name: String! + value: Float! + measurement: String! + } + + type MetricType { + id: String! + name: String! + id: String! + } + + type MetricData { + timestamp: Int! + value: Float! + } + + # Need to review queries + type Query { + portal: Portal + deploymentGroups: [DeploymentGroup] + deploymentGroup(id: String, slug: String): DeploymentGroup + services(deploymentGroupUuid: String, deploymentGroupSlug: String): [Service] + service(id: String, slug: String): Service + instances(serviceUuid: String, serviceSlug: String): [Instance] + instance(id: String, machineId: String): Instance + metricTypes: [MetricType] + metricData(instanceUuid: String!, metricType: String!, from: Date!, to: Date!): [InstanceMetric]! + package: Package + datacenters: [Datacenter] + # tmp test + instanceMetric: InstanceMetric! + } + + # we probably wont use some of these queries or arguments + # but this way we expose the entire db through gql + type Query { + portal: Portal + user: User + deploymentGroups(name: String, slug: String): [DeploymentGroup] + deploymentGroup(id: ID, name: String, slug: String): DeploymentGroup + serviceScales(serviceName: String, versionUuid: ID): [ServiceScale] + serviceScale(id: ID!): ServiceScale + convergenceActions(type: ConvergenceActionType, service: String, versionUuid: ID): [ConvergenceAction] + convergenceAction(id: ID!): ConvergenceAction + stateConvergencePlans(running: Boolean, versionUuid: ID): [StateConvergencePlan] + stateConvergencePlan(id: ID!): StateConvergencePlan + versions(manifestUuid: ID, deploymentGroupUuid: ID): [Version] + version(id: ID, manifestUuid: ID): Version + manifests(type: String, deploymentGroupUuid: ID): [Manifest] + manifest(id: ID!): Manifest + services(name: String, slug: String, parentUuid: ID, deploymentGroupUuid: ID, deploymentGroupSlug: String): [Service] + service(id: ID, hash: ID): Service + packages(name: String, type: String, memory: Int, disk: Int, swap: Int, lwps: Int, vcpus: Int, version: String, group: String): [Package] + package(id: ID!): Package + instances(name: String!, machineId: ID, status: InstanceStatus, serviceUuid: ID, serviceSlug: String, deploymentGroupUuid: ID, deploymentGroupSlug: String): [Instance] + instance(id: ID!): Instance + datacenter(id: ID, region: String): Datacenter + } + + type Mutation { + createDeploymentGroup(name: String!) : DeploymentGroup + updateDeploymentGroup(id: ID!, name: String!) : DeploymentGroup + + provisionManifest(deploymentGroupUuid: ID!, type: ManifestType!, format: ManifestFormat!, raw: String!) : Version + scale(service: ID!, replicas: Int!) : Version + + stopServices(ids: [ID]!) : [Service] + startServices(ids: [ID]!) : [Service] + restartServices(ids: [ID]!) : [Service] + deleteServices(ids: [ID]!) : [Service] + + stopInstances(ids: [ID]!) : [Instance] + startInstances(ids: [ID]!) : [Instance] + restartInstances(ids: [ID]!) : [Instance] + + # reprovision() ??? + } diff --git a/package.json b/package.json index 0461014a..5fd82e23 100644 --- a/package.json +++ b/package.json @@ -87,5 +87,8 @@ "portal-api", "control-tower" ] + }, + "dependencies": { + "styled-components": "^2.0.0" } } diff --git a/packages/babel-preset/.eslintrc b/packages/babel-preset/.eslintrc deleted file mode 100644 index 14dc524b..00000000 --- a/packages/babel-preset/.eslintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "joyent-portal" -} diff --git a/packages/babel-preset/.tern-project b/packages/babel-preset/.tern-project deleted file mode 100644 index 960bbe87..00000000 --- a/packages/babel-preset/.tern-project +++ /dev/null @@ -1,9 +0,0 @@ -{ - "libs": [ - "ecmascript" - ], - "plugins": { - "doc_comment": true, - "local-scope": true - } -} diff --git a/packages/babel-preset/README.md b/packages/babel-preset/README.md deleted file mode 100644 index a9535c86..00000000 --- a/packages/babel-preset/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# babel-preset-joyent-portal - -[![License: MPL 2.0](https://img.shields.io/badge/License-MPL%202.0-brightgreen.svg)](https://opensource.org/licenses/MPL-2.0) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg)](https://github.com/RichardLitt/standard-readme) - -[`babel`](http://github.com/babel/babel) preset to be used across this repo. At the moment it only extends the one used by [`create-react-app`](https://github.com/facebookincubator/create-react-app/tree/master/packages/babel-preset-react-app) but it can be extended as needed. - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [License](#license) - -## Install - -``` -yarn add --dev babel-preset-joyent-portal -``` - -## Usage - -```json -{ - "presets": "joyent-portal" -} -``` - -## License - -MPL-2.0 diff --git a/packages/babel-preset/index.js b/packages/babel-preset/index.js deleted file mode 100644 index b373bf79..00000000 --- a/packages/babel-preset/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (ctx, opts) => ({ - presets: [require('babel-preset-react-app')] -}); diff --git a/packages/babel-preset/package.json b/packages/babel-preset/package.json deleted file mode 100644 index 2e692c12..00000000 --- a/packages/babel-preset/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "babel-preset-joyent-portal", - "version": "1.0.0", - "license": "MPL-2.0", - "repository": "github:yldio/joyent-portal", - "main": "index.js", - "scripts": { - "lint": "eslint . --fix", - "lint-ci": "eslint . --format junit --output-file $CIRCLE_TEST_REPORTS/lint/babel-preset-joyent-portal.xml", - "test": "echo 0", - "test-ci": "echo 0" - }, - "dependencies": { - "babel-preset-react-app": "^3.0.0" - }, - "devDependencies": { - "eslint": "^3.19.0", - "eslint-config-joyent-portal": "1.0.0" - } -} diff --git a/packages/babel-preset/yarn.lock b/packages/babel-preset/yarn.lock deleted file mode 100644 index 5a9b9b7c..00000000 --- a/packages/babel-preset/yarn.lock +++ /dev/null @@ -1,1423 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" - -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - -ajv@^4.7.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - esutils "^2.0.0" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-dynamic-import-node@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.0.2.tgz#adb5bc8f48a89311540395ae9f0cc3ed4b10bb2e" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-dynamic-import@6.18.0, babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-properties@6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - lodash "^4.2.0" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-constant-elements@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-display-name@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@6.24.1, babel-plugin-transform-regenerator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" - dependencies: - regenerator-transform "0.9.11" - -babel-plugin-transform-runtime@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.4.0.tgz#c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^1.4.0" - invariant "^2.2.2" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react-app@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.0.0.tgz#f4505092f8bba0f0147c764dc72055fe46ac1416" - dependencies: - babel-plugin-dynamic-import-node "1.0.2" - babel-plugin-syntax-dynamic-import "6.18.0" - babel-plugin-transform-class-properties "6.24.1" - babel-plugin-transform-object-rest-spread "6.23.0" - babel-plugin-transform-react-constant-elements "6.23.0" - babel-plugin-transform-react-jsx "6.24.1" - babel-plugin-transform-react-jsx-self "6.22.0" - babel-plugin-transform-react-jsx-source "6.22.0" - babel-plugin-transform-regenerator "6.24.1" - babel-plugin-transform-runtime "6.23.0" - babel-preset-env "1.4.0" - babel-preset-react "6.24.1" - -babel-preset-react@6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-template@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-traverse@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - babylon "^6.15.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.19.0, babel-types@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.11.0, babylon@^6.15.0: - version "6.17.1" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" - -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -brace-expansion@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" - dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" - -browserslist@^1.4.0: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -caniuse-db@^1.0.30000639: - version "1.0.30000676" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000676.tgz#82ea578237637c8ff34a28acaade373b624c4ea8" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -circular-json@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" - -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -debug@^2.1.1, debug@^2.2.0: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -electron-to-chromium@^1.2.7: - version "1.3.13" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.13.tgz#1b3a5eace6e087bb5e257a100b0cbfe81b2891fc" - -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.21" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.21.tgz#19a725f9e51d0300bbc1e8e821109fd9daf55925" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint@^3.19.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" - dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" - strip-json-comments "~2.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - -espree@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" - dependencies: - acorn "^5.0.1" - acorn-jsx "^3.0.0" - -esprima@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" - dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" - -estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^9.0.0, globals@^9.14.0: - version "9.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -ignore@^3.2.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" - -invariant@^2.2.0, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-my-json-valid@^2.10.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - -isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" - -js-yaml@^3.5.1: - version "3.8.4" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" - dependencies: - argparse "^1.0.7" - esprima "^3.1.1" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -private@^0.1.6: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -readable-stream@^2.2.2: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" - dependencies: - buffer-shims "~1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~1.0.0" - util-deprecate "~1.0.1" - -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" - -regenerator-runtime@^0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-transform@0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -require-uncached@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve@^1.1.6: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - -rimraf@^2.2.8: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" - dependencies: - glob "^7.0.5" - -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - -shelljs@^0.7.5: - version "0.7.7" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -string_decoder@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" - dependencies: - safe-buffer "^5.0.1" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -to-fast-properties@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" diff --git a/packages/cp-frontend/src/components/service/delete.js b/packages/cp-frontend/src/components/service/delete.js new file mode 100644 index 00000000..d781a48c --- /dev/null +++ b/packages/cp-frontend/src/components/service/delete.js @@ -0,0 +1,37 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import { H2, Button, P } from 'joyent-ui-toolkit'; + +const ModalHeading = styled(H2)` + line-height: 1.25; + color: ${props => props.theme.secondary}; + `; + +const ModalText = styled(P)` + color: ${props => props.theme.secondary}; + `; + +const propTypes = { + service: PropTypes.object, + onCancelClick: PropTypes.func.isRequired, + onConfirmClick: PropTypes.func.isRequired +}; + +const ServiceDelete = ({ service, onCancelClick, onConfirmClick }) => ( +
+ + Deleting a service:
{service.name} +
+ + Deleting a service can lead to irreverasable loss of data and failures + in your application. Are you sure you want to continue? + + + +
+); + +ServiceDelete.propTypes = propTypes; + +export default ServiceDelete; diff --git a/packages/cp-frontend/src/components/service/index.js b/packages/cp-frontend/src/components/service/index.js new file mode 100644 index 00000000..43c4de71 --- /dev/null +++ b/packages/cp-frontend/src/components/service/index.js @@ -0,0 +1,2 @@ +export { default as ServiceScale } from './scale'; +export { default as ServiceDelete } from './delete'; diff --git a/packages/cp-frontend/src/components/service/scale.js b/packages/cp-frontend/src/components/service/scale.js new file mode 100644 index 00000000..2c43b70a --- /dev/null +++ b/packages/cp-frontend/src/components/service/scale.js @@ -0,0 +1,36 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import unitcalc from 'unitcalc'; + +import { H2, P, Button } from 'joyent-ui-toolkit'; +import { FormGroup, Input, NumberInput } from 'joyent-ui-toolkit'; + +const StyledH2 = styled(H2)` + margin: 0 0 ${unitcalc(2)} 0; +`; + +const ServiceScale = ({ service, onConfirmClick, onCancelClick }) => { + const handleScaleClick = () => { + onConfirmClick(2); + }; + return ( +
+ Scaling a service:
{service.name}
+

Choose how many instances of a service you want to have running.

+
{}}> + + + + +
+ ); +}; + +ServiceScale.propTypes = { + service: PropTypes.object, + onScaleClick: PropTypes.func, + onCancelClick: PropTypes.func +}; + +export default ServiceScale; diff --git a/packages/cp-frontend/src/components/services/list-item.js b/packages/cp-frontend/src/components/services/list-item.js index 2555e20f..df351f3c 100644 --- a/packages/cp-frontend/src/components/services/list-item.js +++ b/packages/cp-frontend/src/components/services/list-item.js @@ -21,8 +21,6 @@ import { // InstancesMultipleIcon } from 'joyent-ui-toolkit'; -import { ServicesQuickActions } from '@components/services'; - const StyledCardHeader = styled(CardHeader)` position: relative; `; @@ -35,9 +33,7 @@ const TitleInnerContainer = styled.div` `; const ServiceListItem = ({ - showQuickActions, onQuickActionsClick = () => {}, - onQuickActionsBlur = () => {}, deploymentGroup = '', service = {} }) => { @@ -73,10 +69,6 @@ const ServiceListItem = ({ onQuickActionsClick({ service }); }; - const handleQuickActionsBlur = evt => { - onQuickActionsBlur({ show: false }); - }; - const header = isChild ? null : @@ -95,12 +87,6 @@ const ServiceListItem = ({ - ; const view = children @@ -135,9 +121,7 @@ const ServiceListItem = ({ }; ServiceListItem.propTypes = { - showQuickActions: PropTypes.bool, onQuickActionsClick: PropTypes.func, - onQuickActionsBlur: PropTypes.func, deploymentGroup: PropTypes.string, service: PropTypes.object.isRequired // Define better }; diff --git a/packages/cp-frontend/src/components/services/quick-actions.js b/packages/cp-frontend/src/components/services/quick-actions.js index 236ab9cb..5f7a87bf 100644 --- a/packages/cp-frontend/src/components/services/quick-actions.js +++ b/packages/cp-frontend/src/components/services/quick-actions.js @@ -2,7 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { Tooltip, TooltipButton, TooltipDivider } from 'joyent-ui-toolkit'; -const ServicesQuickActions = ({ show, position, service, onBlur }) => { +const ServicesQuickActions = ({ show, position, service, url, onBlur }) => { + if (!show) { return null; } @@ -16,19 +17,23 @@ const ServicesQuickActions = ({ show, position, service, onBlur }) => { return p; }, {}); + const scaleUrl = `${url}/${service.slug}/scale`; + const deleteUrl = `${url}/${service.slug}/delete`; + return ( - {}}>Scale + Scale Restart Stop - Delete + Delete ); }; ServicesQuickActions.propTypes = { - service: PropTypes.object, + service: PropTypes.object.isRequired, + url: PropTypes.string.isRequired, position: PropTypes.object, show: PropTypes.bool, onBlur: PropTypes.func diff --git a/packages/cp-frontend/src/containers/service/delete.js b/packages/cp-frontend/src/containers/service/delete.js new file mode 100644 index 00000000..6a425d0d --- /dev/null +++ b/packages/cp-frontend/src/containers/service/delete.js @@ -0,0 +1,69 @@ +import React, { PureComponent } from 'react'; +import PropTypes from 'prop-types'; +import { compose, graphql, gql } from 'react-apollo'; +import ServiceScaleMutation from '@graphql/ServiceScale.gql'; +import { Loader, ErrorMessage } from '@components/messaging'; +import { ServiceDelete as ServiceDeleteComponent } from '@components/service'; +import { Modal } from 'joyent-ui-toolkit'; +import ServiceGql from './service-gql'; + +class ServiceDelete extends PureComponent { + render() { + if (this.props.loading) { + return ; + } + if (this.props.error) { + return ( + + ); + } + + const { service, deleteServices, history, match } = this.props; + + const handleCloseClick = evt => { + const closeUrl = match.url.split('/').slice(0, -2).join('/'); + history.replace(closeUrl); + }; + + const handleConfirmClick = evt => { + deleteServices(service.id); + }; + + return ( + + + + ); + } +} + +ServiceDelete.propTypes = { + service: PropTypes.object, + history: PropTypes.object, + deleteServices: PropTypes.func.isRequired +}; + +const DeleteGql = gql` + mutation deleteServices($ids: [ID]!) { + deleteServices(ids: $ids) { + id + slug + } + } +`; + +const DeleteServicesGql = graphql(DeleteGql, { + props: ({ mutate }) => ({ + deleteServices: serviceId => mutate({ variables: { ids: [serviceId] } }) + }) +}); + +const ServiceDeleteWithData = compose(DeleteServicesGql, ServiceGql)( + ServiceDelete +); + +export default ServiceDeleteWithData; diff --git a/packages/cp-frontend/src/containers/service/index.js b/packages/cp-frontend/src/containers/service/index.js index e69de29b..43c4de71 100644 --- a/packages/cp-frontend/src/containers/service/index.js +++ b/packages/cp-frontend/src/containers/service/index.js @@ -0,0 +1,2 @@ +export { default as ServiceScale } from './scale'; +export { default as ServiceDelete } from './delete'; diff --git a/packages/cp-frontend/src/containers/service/scale.js b/packages/cp-frontend/src/containers/service/scale.js new file mode 100644 index 00000000..d54b9172 --- /dev/null +++ b/packages/cp-frontend/src/containers/service/scale.js @@ -0,0 +1,64 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { compose, graphql } from 'react-apollo'; +import ServiceScaleMutation from '@graphql/ServiceScale.gql'; +import { Loader, ErrorMessage } from '@components/messaging'; +import { ServiceScale as ServiceScaleComponent } from '@components/service'; +import { Modal } from 'joyent-ui-toolkit'; +import ServiceGql from './service-gql'; + +class ServiceScale extends Component { + render() { + if (this.props.loading) { + return ; + } + if (this.props.error) { + return ( + + ); + } + + const { service, scale, history, match } = this.props; + + const handleCloseClick = evt => { + const closeUrl = match.url.split('/').slice(0, -2).join('/'); + history.replace(closeUrl); + }; + + const handleConfirmClick = evt => { + scale(service.id, 2); + }; + + return ( + + + + ); + } +} + +ServiceScale.propTypes = { + service: PropTypes.object, + history: PropTypes.object, + scale: PropTypes.func.isRequired +}; + +const ServiceScaleGql = graphql(ServiceScaleMutation, { + props: ({ mutate }) => ({ + scale: (serviceId, replicas) => + mutate({ + variables: { + serviceId, + replicas + } + }) + }) +}); + +const ServiceScaleWithData = compose(ServiceScaleGql, ServiceGql)(ServiceScale); + +export default ServiceScaleWithData; diff --git a/packages/cp-frontend/src/containers/service/service-gql.js b/packages/cp-frontend/src/containers/service/service-gql.js new file mode 100644 index 00000000..2b67955e --- /dev/null +++ b/packages/cp-frontend/src/containers/service/service-gql.js @@ -0,0 +1,25 @@ +import { graphql } from 'react-apollo'; +import InstancesQuery from '@graphql/Instances.gql'; + +export default graphql(InstancesQuery, { + options(props) { + const params = props.match.params; + const deploymentGroupSlug = params.deploymentGroup; + const serviceSlug = params.service; + return { + variables: { + deploymentGroupSlug, + serviceSlug + } + }; + }, + props: ({ data: { deploymentGroup, loading, error } }) => ({ + service: deploymentGroup && + deploymentGroup.services && + deploymentGroup.services.length + ? deploymentGroup.services[0] + : null, + loading, + error + }) +}); diff --git a/packages/cp-frontend/src/containers/services/list.js b/packages/cp-frontend/src/containers/services/list.js index 6443a63f..35a1800e 100644 --- a/packages/cp-frontend/src/containers/services/list.js +++ b/packages/cp-frontend/src/containers/services/list.js @@ -11,11 +11,21 @@ import { LayoutContainer } from '@components/layout'; import { Loader, ErrorMessage } from '@components/messaging'; import { ServiceListItem } from '@components/services'; +import { ServicesQuickActions } from '@components/services'; + const StyledContainer = styled.div` position: relative; `; class ServiceList extends Component { + ref(name) { + this._refs = this._refs || {}; + + return el => { + this._refs[name] = el; + }; + } + render() { const { deploymentGroup, @@ -23,7 +33,8 @@ class ServiceList extends Component { loading, error, servicesQuickActions, - toggleServicesQuickActions + toggleServicesQuickActions, + url } = this.props; if (loading) { @@ -40,12 +51,27 @@ class ServiceList extends Component { ); } - const handleQuickActionsClick = o => { - toggleServicesQuickActions(o); + const handleQuickActionsClick = (evt, service) => { + const list = this._refs.container; + const listRect = list.getBoundingClientRect(); + const button = evt.currentTarget; + const buttonRect = button.getBoundingClientRect(); + + const position = { + left: buttonRect.left - + listRect.left + + (buttonRect.right - buttonRect.left) / 2, + top: buttonRect.bottom - listRect.top + }; + + toggleServicesQuickActions({ + service, + position + }); }; const handleQuickActionsBlur = o => { - toggleServicesQuickActions(o); + toggleServicesQuickActions({ show: false }); }; const serviceList = services.map(service => @@ -53,22 +79,22 @@ class ServiceList extends Component { key={service.id} deploymentGroup={deploymentGroup.slug} service={service} - showQuickActions={ - servicesQuickActions.service && - servicesQuickActions.service.id === service.id - } onQuickActionsClick={handleQuickActionsClick} - onQuickActionsBlur={handleQuickActionsBlur} /> ); return ( -
- {/*
*/} +
{serviceList} - {/* */} +
@@ -77,7 +103,8 @@ class ServiceList extends Component { } const mapStateToProps = (state, ownProps) => ({ - servicesQuickActions: state.ui.services.quickActions + servicesQuickActions: state.ui.services.quickActions, + url: ownProps.match.url }); const mapDispatchToProps = dispatch => ({ diff --git a/packages/cp-frontend/src/containers/services/topology.js b/packages/cp-frontend/src/containers/services/topology.js index 6ead108f..82e5bd42 100644 --- a/packages/cp-frontend/src/containers/services/topology.js +++ b/packages/cp-frontend/src/containers/services/topology.js @@ -68,8 +68,10 @@ const ServicesTopology = ({ onNodeTitleClick={handleNodeTitleClick} /> diff --git a/packages/cp-frontend/src/graphql/ServiceScale.gql b/packages/cp-frontend/src/graphql/ServiceScale.gql new file mode 100644 index 00000000..e0a7616b --- /dev/null +++ b/packages/cp-frontend/src/graphql/ServiceScale.gql @@ -0,0 +1,9 @@ +mutation scale($serviceId: ID!, $replicas: Int!) { + scale(serviceId: $serviceId, replicas: $replicas) { + scale { + id + serviceName + replicas + } + } +} diff --git a/packages/cp-frontend/src/router.js b/packages/cp-frontend/src/router.js index bbaae20e..8de4c156 100644 --- a/packages/cp-frontend/src/router.js +++ b/packages/cp-frontend/src/router.js @@ -2,7 +2,6 @@ import React from 'react'; import { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom'; import { Header, Breadcrumb, Menu } from '@containers/navigation'; -import { InstanceList } from '@containers/instances'; import { DeploymentGroupList, @@ -15,6 +14,10 @@ import { ServicesMenu } from '@containers/services'; +import { ServiceScale, ServiceDelete } from '@containers/service'; + +import { InstanceList } from '@containers/instances'; + const rootRedirect = p => ; const deploymentGroupRedirect = p => @@ -30,7 +33,7 @@ const serviceRedirect = p => const Router = ( -
+
@@ -82,25 +85,41 @@ const Router = ( + + + + : null ); +const instancesByServiceId = serviceId => + createSelector( + [apollo], + apollo => + apollo && apollo.data + ? Object.keys(apollo.data).reduce((is, i, k) => { + if ( + apollo.data[k].__typename === 'Instance' && + apollo.data[k].service === serviceId + ) { + is.push(apollo.data[k]); + } + return is; + }, []) + : null + ); + +const serviceWidthInstancesBySlug = serviceSlug => { + const service = serviceBySlug(serviceSlug); +}; + // Apollo gql utils // const findService = (services, uuid) => diff --git a/packages/cp-frontend/src/state/store.js b/packages/cp-frontend/src/state/store.js index 5351d2f6..08154e0e 100644 --- a/packages/cp-frontend/src/state/store.js +++ b/packages/cp-frontend/src/state/store.js @@ -1,6 +1,6 @@ import { createStore, combineReducers, applyMiddleware, compose } from 'redux'; import { reducer as formReducer } from 'redux-form'; -// import { enableBatching } from 'redux-batched-actions'; +import { enableBatching } from 'redux-batched-actions'; import { ApolloClient, createNetworkInterface } from 'react-apollo'; import state from './state'; import { ui } from './reducers'; diff --git a/packages/cp-gql-mock-server/src/resolvers.js b/packages/cp-gql-mock-server/src/resolvers.js index 9f9548f3..5941f60e 100644 --- a/packages/cp-gql-mock-server/src/resolvers.js +++ b/packages/cp-gql-mock-server/src/resolvers.js @@ -100,6 +100,21 @@ const createServicesFromManifest = ({ deploymentGroupId, raw }) => { return Promise.resolve(undefined); }; +const deleteServices = options => getServices({ id: options.ids[0] }); + +const scale = options => { + const service = getServices({ id: options.serviceId })[0]; + return { + scale: [ + { + id: service.id, + serviceName: service.name, + replicas: 2 + } + ] + }; +}; + module.exports = { portal: getPortal, deploymentGroups: getDeploymentGroups, @@ -114,5 +129,7 @@ module.exports = { id: uuid(), type: options.type, format: options.format - })) + })), + deleteServices: (options, request, fn) => fn(null, deleteServices(options)), + scale: (options, reguest, fn) => fn(null, scale(options)) }; diff --git a/packages/cp-gql-schema/schema.gql b/packages/cp-gql-schema/schema.gql index 5fc9db18..b48d2718 100644 --- a/packages/cp-gql-schema/schema.gql +++ b/packages/cp-gql-schema/schema.gql @@ -1,4 +1,3 @@ - scalar Date scalar Object diff --git a/packages/normalized-styled-components/.babelrc b/packages/normalized-styled-components/.babelrc deleted file mode 100644 index 8914de81..00000000 --- a/packages/normalized-styled-components/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "sourceMaps": "inline", - "plugins": [ - "styled-components" - ], - "env": { - "test": { - "presets": [ - "react-app" - ] - } - } -} diff --git a/packages/normalized-styled-components/.eslintignore b/packages/normalized-styled-components/.eslintignore deleted file mode 100644 index 6db80622..00000000 --- a/packages/normalized-styled-components/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -.nyc_output -coverage -dist \ No newline at end of file diff --git a/packages/normalized-styled-components/.eslintrc b/packages/normalized-styled-components/.eslintrc deleted file mode 100644 index 14dc524b..00000000 --- a/packages/normalized-styled-components/.eslintrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "joyent-portal" -} diff --git a/packages/normalized-styled-components/.stylelintrc b/packages/normalized-styled-components/.stylelintrc deleted file mode 100644 index 42c893e9..00000000 --- a/packages/normalized-styled-components/.stylelintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "syntax": "scss", - "processors": ["stylelint-processor-styled-components"], - "extends": ["stylelint-config-standard", "stylelint-config-primer"] -} \ No newline at end of file diff --git a/packages/normalized-styled-components/.tern-project b/packages/normalized-styled-components/.tern-project deleted file mode 100644 index 6d78dea5..00000000 --- a/packages/normalized-styled-components/.tern-project +++ /dev/null @@ -1,10 +0,0 @@ -{ - "libs": [ - "ecmascript" - ], - "plugins": { - "doc_comment": true, - "local-scope": true, - "node": true - } -} \ No newline at end of file diff --git a/packages/normalized-styled-components/CHANGELOG.md b/packages/normalized-styled-components/CHANGELOG.md deleted file mode 100644 index 4771c951..00000000 --- a/packages/normalized-styled-components/CHANGELOG.md +++ /dev/null @@ -1,13 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - - -## 1.0.5 (2017-05-25) - - - - - -## 1.0.4 (2017-05-25) diff --git a/packages/normalized-styled-components/README.md b/packages/normalized-styled-components/README.md deleted file mode 100644 index 0cfa6250..00000000 --- a/packages/normalized-styled-components/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# normalized-styled-components - -[![License: MPL 2.0](https://img.shields.io/badge/License-MPL%202.0-brightgreen.svg)](https://opensource.org/licenses/MPL-2.0) -[![npm](https://img.shields.io/npm/v/normalized-styled-components.svg)](https://npmjs.com/package/normalized-styled-components) -[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg)](https://github.com/RichardLitt/standard-readme) - -[`normalize.css`](https://github.com/necolas/normalize.css) with a [`styled-components`](https://github.com/styled-components/styled-components) mindset. - -## Table of Contents - -- [Install](#install) -- [Usage](#usage) -- [License](#license) - -## Install - -``` -yarn add --dev normalized-styled-components -``` - -## Usage - -```js -import { Button } from 'normalized-styled-components'; - -export default () => ( - -) -``` -```css -.jdhBdT { - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; - overflow: visible; - text-transform: none; - appearance: button; - -moz-appearance: button; - -webkit-appearance: button; -} - -.jdhBdT::-moz-focus-inner, -.jdhBdT[type="button"]::-moz-focus-inner, -.jdhBdT[type="reset"]::-moz-focus-inner, -.jdhBdT[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -.jdhBdT:-moz-focusring, -.jdhBdT[type="button"]:-moz-focusring, -.jdhBdT[type="reset"]:-moz-focusring, -.jdhBdT[type="submit"]:-moz-focusring { - outline: 0.0625rem dotted ButtonText; -} -``` -```html - -``` - -## License - -MPL-2.0 diff --git a/packages/normalized-styled-components/package.json b/packages/normalized-styled-components/package.json deleted file mode 100644 index 613844fb..00000000 --- a/packages/normalized-styled-components/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "normalized-styled-components", - "version": "1.0.5", - "license": "MPL-2.0", - "description": "normalize.css with a styled-components mindset", - "keywords": [ - "normalizations", - "style", - "css", - "react", - "css", - "css-in-js", - "styled-components" - ], - "repository": "github:yldio/joyent-portal", - "main": "dist/normalized-styled-components.umd.js", - "jsnext:main": "dist/normalized-styled-components.es.js", - "module": "dist/normalized-styled-components.es.js", - "entry": "src/index.js", - "scripts": { - "lint:css": "echo 0", - "lint-ci:css": "echo 0", - "lint:js": "eslint . --fix", - "lint-ci:js": "eslint . --format junit --output-file $CIRCLE_TEST_REPORTS/lint/normalized-styled-components.xml", - "lint": "redrun -s lint:*", - "lint-ci": "redrun -p lint-ci:*", - "test": "bup && NODE_ENV=test jest --coverage", - "test-ci": "NODE_ENV=test JEST_JUNIT_OUTPUT=$CIRCLE_TEST_REPORTS/test/normalized-styled-components.xml jest --coverage --coverageDirectory=$CIRCLE_ARTIFACTS/normalized-styled-components --testResultsProcessor=$(node -e \"console.log(require.resolve('jest-junit'))\")", - "build": "bup", - "prepublish": "redrun build" - }, - "dependencies": { - "remcalc": "^1.0.8" - }, - "devDependencies": { - "babel-plugin-styled-components": "^1.1.4", - "babel-preset-react-app": "^3.0.0", - "bup": "^1.0.9", - "chalk": "^1.1.3", - "eslint": "^3.19.0", - "eslint-config-joyent-portal": "1.0.0", - "jest": "^20.0.4", - "jest-diff": "^20.0.3", - "jest-junit": "^1.5.1", - "jest-matcher-utils": "^20.0.3", - "jest-snapshot": "^20.0.3", - "jest-styled-components": "^3.0.0-2", - "react": "^15.5.4", - "react-scripts": "^1.0.7", - "react-test-renderer": "^15.5.4", - "redrun": "^5.9.14", - "strip-ansi": "^3.0.1", - "styled-components": "^2.0.1", - "stylelint": "^7.11.0", - "stylelint-config-primer": "^1.4.0", - "stylelint-config-standard": "^16.0.0", - "stylelint-processor-styled-components": "styled-components/stylelint-processor-styled-components#68b4c4f" - }, - "peerDependencies": { - "react": "*", - "styled-components": "*" - }, - "jest": { - "testEnvironment": "jsdom", - "testRegex": "test/index.js", - "setupFiles": [ - "/node_modules/react-scripts/config/polyfills.js" - ], - "testEnvironment": "node", - "transform": { - "^.+\\.(js|jsx)$": "/node_modules/react-scripts/config/jest/babelTransform.js", - "^(?!.*\\.(js|jsx|css|json)$)": "/node_modules/react-scripts/config/jest/fileTransform.js" - }, - "transformIgnorePatterns": [ - "[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$" - ], - "rootDir": "." - } -} diff --git a/packages/normalized-styled-components/src/index.js b/packages/normalized-styled-components/src/index.js deleted file mode 100644 index 0cd671fe..00000000 --- a/packages/normalized-styled-components/src/index.js +++ /dev/null @@ -1,259 +0,0 @@ -import styled from 'styled-components'; -import remcalc from 'remcalc'; - -export const Article = styled.article` - display: block; -`; - -export const Aside = styled.aside` - display: block; -`; - -export const Footer = styled.footer` - display: block; -`; - -export const Header = styled.header` - display: block; -`; - -export const Nav = styled.nav` - display: block; -`; - -export const Section = styled.section` - display: block; -`; - -export const FigCaption = styled.figcaption` - display: block; -`; - -export const Figure = styled.figure` - display: block; - margin: ${remcalc(16)} ${remcalc(40)}; -`; - -export const Main = styled.main` - display: block; -`; - -export const H1 = styled.h1` - font-size: ${remcalc(32)}; - margin: ${remcalc(10)} 0; -`; - -export const Hr = styled.hr` - box-sizing: content-box; - height: 0; - overflow: visible; -`; - -export const Pre = styled.pre` - font-family: monospace, monospace; - font-size: ${remcalc(16)}; -`; - -export const A = styled.a` - background-color: transparent; - text-decoration-skip: objects; -`; - -export const Abbr = styled.abbr` - &[title] { - border-bottom: none; - text-decoration: underline; - text-decoration: underline dotted; - } -`; - -export const B = styled.b` - font-weight: bolder; -`; - -export const Strong = styled.strong` - font-weight: bolder; -`; - -export const Code = styled.code` - font-family: monospace, monospace; - font-size: ${remcalc(16)}; -`; - -export const Kbd = styled.kbd` - font-family: monospace, monospace; - font-size: ${remcalc(16)}; -`; - -export const Samp = styled.samp` - font-family: monospace, monospace; - font-size: ${remcalc(16)}; -`; - -export const Dfn = styled.dfn` - font-style: italic; -`; - -export const Mark = styled.mark` - background-color: #ff0; - color: #000; -`; - -export const Small = styled.small` - font-size: 80%; -`; - -export const Sub = styled.sub` - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - bottom: -0.25em; -`; - -export const Sup = styled.sup` - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - top: -0.5em; -`; - -export const Audio = styled.audio` - display: inline-block; - - &:not([controls]) { - display: none; - height: 0; - } -`; - -export const Video = styled.video` - display: inline-block; -`; - -export const Img = styled.img` - border-style: none; -`; - -export const Svg = styled.svg` - &:not(:root) { - overflow: hidden; - } -`; - -export const Button = styled.button` - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; - overflow: visible; - text-transform: none; - appearance: button; - - &::-moz-focus-inner, - &[type="button"]::-moz-focus-inner, - &[type="reset"]::-moz-focus-inner, - &[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; - } - - &:-moz-focusring, - &[type="button"]:-moz-focusring, - &[type="reset"]:-moz-focusring, - &[type="submit"]:-moz-focusring { - outline: ${remcalc(1)} dotted ButtonText; - } -`; - -export const Input = styled.input` - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; - overflow: visible; - - &[type="checkbox"], - &[type="radio"] { - box-sizing: border-box; - padding: 0; - } - - &[type="number"]::-webkit-inner-spin-button, - &[type="number"]::-webkit-outer-spin-button { - height: auto; - } - - &[type="search"] { - appearance: textfield; - outline-offset: ${remcalc(-2)}; - } - - &[type="search"]::-webkit-search-cancel-button, - &[type="search"]::-webkit-search-decoration { - appearance: none; - } - - &::-webkit-file-upload-button { - appearance: button; - font: inherit; - } -`; - -export const Optgroup = styled.optgroup` - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; -`; - -export const Select = styled.select` - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; - text-transform: none; -`; - -export const Textarea = styled.textarea` - font-family: sans-serif; - font-size: 100%; - line-height: 1.15; - margin: 0; - overflow: auto; -`; - -export const Fieldset = styled.fieldset` - padding: 0.35em 0.75em 0.625em; -`; - -export const Legend = styled.legend` - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; -`; - -export const Progress = styled.progress` - display: inline-block; - vertical-align: baseline; -`; - -export const Details = styled.details` - display: block; -`; - -export const Menu = styled.menu` - display: block; -`; - -export const Summary = styled.summary` - display: list-item; -`; - -export const Canvas = styled.canvas` - display: inline-block; -`; diff --git a/packages/normalized-styled-components/test/__snapshots__/index.js.snap b/packages/normalized-styled-components/test/__snapshots__/index.js.snap deleted file mode 100644 index 43754094..00000000 --- a/packages/normalized-styled-components/test/__snapshots__/index.js.snap +++ /dev/null @@ -1,476 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`renders correctly 1`] = ` -.jleQxG { - background-color: transparent; - -webkit-text-decoration-skip: objects; - text-decoration-skip: objects; -} - - -`; - -exports[`renders correctly 1`] = ` - - - -`; - -exports[`renders
correctly 1`] = ` -.fpcbkF { - display: block; -} - -
-`; - -exports[`renders