Просмотр исходного кода

feat(admin-ui): Use apollo-codegen to generate types from gql queries

Michael Bromley 7 лет назад
Родитель
Сommit
1bd57e577e

+ 10 - 0
admin-ui/README.md

@@ -5,3 +5,13 @@ This is the administration interface for Vendure.
 It is an Angular application built with the Angular CLI.
 
 The UI is powered by the [Clarity Design System](https://vmware.github.io/clarity/).
+
+## GraphQL & Typings
+
+[apollo-codegen](https://github.com/apollographql/apollo-codegen) is used to automatically create TypeScript interfaces
+for all GraphQL queries used in the application.
+
+All queries should be located in the [`./src/app/common/queries`](./src/app/common/queries) directory. 
+
+Run `yarn generate-gql-types` to generate TypeScript interfaces based on these queries. The generated
+types are located at [`./src/app/common/types/gql-generated-types.ts`](./src/app/common/types/gql-generated-types.ts).

+ 72 - 0
admin-ui/generate-graphql-types.ts

@@ -0,0 +1,72 @@
+import { spawn } from 'child_process';
+import * as rimraf from 'rimraf';
+import { API_PATH, API_PORT } from '../shared/shared-constants';
+
+/*
+ * This script uses apollo-codegen to generate TypeScript interfaces for all
+ * GraphQL queries defined in the admin-ui app. Run it via the package.json
+ * script "generate-gql-types".
+ */
+
+const API_URL = `http://localhost:${API_PORT}/${API_PATH}`;
+const SCHEMA_DUMP = 'schema.temp.json';
+
+// tslint:disable:no-console
+runApolloCodegen([
+    'introspect-schema',
+    API_URL,
+    '--add-typename',
+    `--output ${SCHEMA_DUMP}`,
+])
+    .then(() => {
+        console.log('Generated schema dump...');
+        return runApolloCodegen([
+            'generate',
+            './src/app/common/queries/**/*.ts',
+            `--schema ${SCHEMA_DUMP}`,
+            '--target typescript',
+            '--output ./src/app/common/types/gql-generated-types.ts',
+        ]);
+    })
+    .then(() => {
+        console.log('Generated TypeScript definitions!');
+    })
+    .then(() => {
+        rimraf(SCHEMA_DUMP, (err) => {
+            if (err) {
+                console.log('Could not delete schema dump');
+            }
+            console.log('Deleted schema dump');
+        });
+    })
+    .catch(() => {
+        console.log('Could not generate types!');
+        process.exitCode = 1;
+    });
+
+/**
+ * Run the apollo-codegen script and wrap in a Promise.
+ */
+function runApolloCodegen(args: string[]): Promise<any> {
+    return new Promise((resolve, reject) => {
+        const cp = spawn('yarn', ['apollo-codegen', ...args], { shell: true });
+
+        cp.on('error', reject);
+        cp.stdout.on('data', (data) => {
+            if (4 < data.length) {
+                console.log(`${data}`);
+            }
+        });
+        cp.stderr.on('data', data => {
+            if (4 < data.length) {
+                console.log(`${data}`);
+            }
+        });
+        cp.on('close', code => {
+            if (code !== 0) {
+                reject(code);
+            }
+            resolve(code);
+        });
+    });
+}

+ 5 - 1
admin-ui/package.json

@@ -7,7 +7,9 @@
     "build": "ng build",
     "test": "ng test",
     "lint": "ng lint vendure-admin --fix",
-    "e2e": "ng e2e"
+    "e2e": "ng e2e",
+    "apollo-codegen": "apollo-codegen",
+    "generate-gql-types": "ts-node generate-graphql-types.ts"
   },
   "private": true,
   "dependencies": {
@@ -46,6 +48,7 @@
     "@types/jasmine": "~2.8.6",
     "@types/jasminewd2": "~2.0.3",
     "@types/node": "~8.9.4",
+    "apollo-codegen": "^0.20.1",
     "codelyzer": "~4.2.1",
     "jasmine-core": "~2.99.1",
     "jasmine-spec-reporter": "~4.2.1",
@@ -55,6 +58,7 @@
     "karma-jasmine": "~1.1.1",
     "karma-jasmine-html-reporter": "^0.2.2",
     "protractor": "~5.3.0",
+    "rimraf": "^2.6.2",
     "ts-node": "~5.0.1",
     "tslint": "~5.9.1",
     "typescript": "~2.7.2"

+ 3 - 1
admin-ui/src/app/app.config.ts

@@ -1 +1,3 @@
-export const API_URL = 'http://localhost:3000';
+import { API_PORT } from '../../../shared/shared-constants';
+
+export const API_URL = `http://localhost:${API_PORT}`;

+ 19 - 0
admin-ui/src/app/common/queries/get-product-by-id.ts

@@ -0,0 +1,19 @@
+import gql from 'graphql-tag';
+
+export const getProductById = gql`
+    query GetProductById($id: ID!, $languageCode: LanguageCode){
+        product(languageCode: $languageCode, id: $id) {
+            id
+            languageCode
+            name
+            slug
+            description
+            translations {
+                languageCode
+                name
+                slug
+                description
+            }
+        }
+    }
+`;

+ 16 - 0
admin-ui/src/app/common/queries/get-product-list.ts

@@ -0,0 +1,16 @@
+import gql from 'graphql-tag';
+
+export const getProductList = gql`
+    query GetProductList($take: Int, $skip: Int, $languageCode: LanguageCode){
+        products(languageCode: $languageCode, take: $take, skip: $skip) {
+            items {
+                id
+                languageCode
+                name
+                slug
+                description
+            }
+            totalItems
+        }
+    }
+`;

+ 785 - 0
admin-ui/src/app/common/types/gql-generated-types.ts

@@ -0,0 +1,785 @@
+/* tslint:disable */
+//  This file was automatically generated and should not be edited.
+
+/**
+ * ISO 639-1 language code
+ */
+export enum LanguageCode {
+  /**
+   * Afar
+   */
+  aa = "aa",
+  /**
+   * Abkhazian
+   */
+  ab = "ab",
+  /**
+   * Avestan
+   */
+  ae = "ae",
+  /**
+   * Afrikaans
+   */
+  af = "af",
+  /**
+   * Akan
+   */
+  ak = "ak",
+  /**
+   * Amharic
+   */
+  am = "am",
+  /**
+   * Aragonese
+   */
+  an = "an",
+  /**
+   * Arabic
+   */
+  ar = "ar",
+  /**
+   * Assamese
+   */
+  as = "as",
+  /**
+   * Avaric
+   */
+  av = "av",
+  /**
+   * Aymara
+   */
+  ay = "ay",
+  /**
+   * Azerbaijani
+   */
+  az = "az",
+  /**
+   * Bashkir
+   */
+  ba = "ba",
+  /**
+   * Belarusian
+   */
+  be = "be",
+  /**
+   * Bulgarian
+   */
+  bg = "bg",
+  /**
+   * Bihari languages
+   */
+  bh = "bh",
+  /**
+   * Bislama
+   */
+  bi = "bi",
+  /**
+   * Bambara
+   */
+  bm = "bm",
+  /**
+   * Bengali
+   */
+  bn = "bn",
+  /**
+   * Tibetan
+   */
+  bo = "bo",
+  /**
+   * Breton
+   */
+  br = "br",
+  /**
+   * Bosnian
+   */
+  bs = "bs",
+  /**
+   * Catalan; Valencian
+   */
+  ca = "ca",
+  /**
+   * Chechen
+   */
+  ce = "ce",
+  /**
+   * Chamorro
+   */
+  ch = "ch",
+  /**
+   * Corsican
+   */
+  co = "co",
+  /**
+   * Cree
+   */
+  cr = "cr",
+  /**
+   * Czech
+   */
+  cs = "cs",
+  /**
+   * Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic
+   */
+  cu = "cu",
+  /**
+   * Chuvash
+   */
+  cv = "cv",
+  /**
+   * Welsh
+   */
+  cy = "cy",
+  /**
+   * Danish
+   */
+  da = "da",
+  /**
+   * German
+   */
+  de = "de",
+  /**
+   * Divehi; Dhivehi; Maldivian
+   */
+  dv = "dv",
+  /**
+   * Dzongkha
+   */
+  dz = "dz",
+  /**
+   * Ewe
+   */
+  ee = "ee",
+  /**
+   * Greek, Modern (1453-)
+   */
+  el = "el",
+  /**
+   * English
+   */
+  en = "en",
+  /**
+   * Esperanto
+   */
+  eo = "eo",
+  /**
+   * Spanish; Castilian
+   */
+  es = "es",
+  /**
+   * Estonian
+   */
+  et = "et",
+  /**
+   * Basque
+   */
+  eu = "eu",
+  /**
+   * Persian
+   */
+  fa = "fa",
+  /**
+   * Fulah
+   */
+  ff = "ff",
+  /**
+   * Finnish
+   */
+  fi = "fi",
+  /**
+   * Fijian
+   */
+  fj = "fj",
+  /**
+   * Faroese
+   */
+  fo = "fo",
+  /**
+   * French
+   */
+  fr = "fr",
+  /**
+   * Western Frisian
+   */
+  fy = "fy",
+  /**
+   * Irish
+   */
+  ga = "ga",
+  /**
+   * Gaelic; Scottish Gaelic
+   */
+  gd = "gd",
+  /**
+   * Galician
+   */
+  gl = "gl",
+  /**
+   * Guarani
+   */
+  gn = "gn",
+  /**
+   * Gujarati
+   */
+  gu = "gu",
+  /**
+   * Manx
+   */
+  gv = "gv",
+  /**
+   * Hausa
+   */
+  ha = "ha",
+  /**
+   * Hebrew
+   */
+  he = "he",
+  /**
+   * Hindi
+   */
+  hi = "hi",
+  /**
+   * Hiri Motu
+   */
+  ho = "ho",
+  /**
+   * Croatian
+   */
+  hr = "hr",
+  /**
+   * Haitian; Haitian Creole
+   */
+  ht = "ht",
+  /**
+   * Hungarian
+   */
+  hu = "hu",
+  /**
+   * Armenian
+   */
+  hy = "hy",
+  /**
+   * Herero
+   */
+  hz = "hz",
+  /**
+   * Interlingua (International Auxiliary Language Association)
+   */
+  ia = "ia",
+  /**
+   * Indonesian
+   */
+  id = "id",
+  /**
+   * Interlingue; Occidental
+   */
+  ie = "ie",
+  /**
+   * Igbo
+   */
+  ig = "ig",
+  /**
+   * Sichuan Yi; Nuosu
+   */
+  ii = "ii",
+  /**
+   * Inupiaq
+   */
+  ik = "ik",
+  /**
+   * Ido
+   */
+  io = "io",
+  /**
+   * Icelandic
+   */
+  is = "is",
+  /**
+   * Italian
+   */
+  it = "it",
+  /**
+   * Inuktitut
+   */
+  iu = "iu",
+  /**
+   * Japanese
+   */
+  ja = "ja",
+  /**
+   * Javanese
+   */
+  jv = "jv",
+  /**
+   * Georgian
+   */
+  ka = "ka",
+  /**
+   * Kongo
+   */
+  kg = "kg",
+  /**
+   * Kikuyu; Gikuyu
+   */
+  ki = "ki",
+  /**
+   * Kuanyama; Kwanyama
+   */
+  kj = "kj",
+  /**
+   * Kazakh
+   */
+  kk = "kk",
+  /**
+   * Kalaallisut; Greenlandic
+   */
+  kl = "kl",
+  /**
+   * Central Khmer
+   */
+  km = "km",
+  /**
+   * Kannada
+   */
+  kn = "kn",
+  /**
+   * Korean
+   */
+  ko = "ko",
+  /**
+   * Kanuri
+   */
+  kr = "kr",
+  /**
+   * Kashmiri
+   */
+  ks = "ks",
+  /**
+   * Kurdish
+   */
+  ku = "ku",
+  /**
+   * Komi
+   */
+  kv = "kv",
+  /**
+   * Cornish
+   */
+  kw = "kw",
+  /**
+   * Kirghiz; Kyrgyz
+   */
+  ky = "ky",
+  /**
+   * Latin
+   */
+  la = "la",
+  /**
+   * Luxembourgish; Letzeburgesch
+   */
+  lb = "lb",
+  /**
+   * Ganda
+   */
+  lg = "lg",
+  /**
+   * Limburgan; Limburger; Limburgish
+   */
+  li = "li",
+  /**
+   * Lingala
+   */
+  ln = "ln",
+  /**
+   * Lao
+   */
+  lo = "lo",
+  /**
+   * Lithuanian
+   */
+  lt = "lt",
+  /**
+   * Luba-Katanga
+   */
+  lu = "lu",
+  /**
+   * Latvian
+   */
+  lv = "lv",
+  /**
+   * Malagasy
+   */
+  mg = "mg",
+  /**
+   * Marshallese
+   */
+  mh = "mh",
+  /**
+   * Maori
+   */
+  mi = "mi",
+  /**
+   * Macedonian
+   */
+  mk = "mk",
+  /**
+   * Malayalam
+   */
+  ml = "ml",
+  /**
+   * Mongolian
+   */
+  mn = "mn",
+  /**
+   * Marathi
+   */
+  mr = "mr",
+  /**
+   * Malay
+   */
+  ms = "ms",
+  /**
+   * Maltese
+   */
+  mt = "mt",
+  /**
+   * Burmese
+   */
+  my = "my",
+  /**
+   * Nauru
+   */
+  na = "na",
+  /**
+   * Bokmål, Norwegian; Norwegian Bokmål
+   */
+  nb = "nb",
+  /**
+   * Ndebele, North; North Ndebele
+   */
+  nd = "nd",
+  /**
+   * Nepali
+   */
+  ne = "ne",
+  /**
+   * Ndonga
+   */
+  ng = "ng",
+  /**
+   * Dutch; Flemish
+   */
+  nl = "nl",
+  /**
+   * Norwegian Nynorsk; Nynorsk, Norwegian
+   */
+  nn = "nn",
+  /**
+   * Norwegian
+   */
+  no = "no",
+  /**
+   * Ndebele, South; South Ndebele
+   */
+  nr = "nr",
+  /**
+   * Navajo; Navaho
+   */
+  nv = "nv",
+  /**
+   * Chichewa; Chewa; Nyanja
+   */
+  ny = "ny",
+  /**
+   * Occitan (post 1500); Provençal
+   */
+  oc = "oc",
+  /**
+   * Ojibwa
+   */
+  oj = "oj",
+  /**
+   * Oromo
+   */
+  om = "om",
+  /**
+   * Oriya
+   */
+  or = "or",
+  /**
+   * Ossetian; Ossetic
+   */
+  os = "os",
+  /**
+   * Panjabi; Punjabi
+   */
+  pa = "pa",
+  /**
+   * Pali
+   */
+  pi = "pi",
+  /**
+   * Polish
+   */
+  pl = "pl",
+  /**
+   * Pushto; Pashto
+   */
+  ps = "ps",
+  /**
+   * Portuguese
+   */
+  pt = "pt",
+  /**
+   * Quechua
+   */
+  qu = "qu",
+  /**
+   * Romansh
+   */
+  rm = "rm",
+  /**
+   * Rundi
+   */
+  rn = "rn",
+  /**
+   * Romanian; Moldavian; Moldovan
+   */
+  ro = "ro",
+  /**
+   * Russian
+   */
+  ru = "ru",
+  /**
+   * Kinyarwanda
+   */
+  rw = "rw",
+  /**
+   * Sanskrit
+   */
+  sa = "sa",
+  /**
+   * Sardinian
+   */
+  sc = "sc",
+  /**
+   * Sindhi
+   */
+  sd = "sd",
+  /**
+   * Northern Sami
+   */
+  se = "se",
+  /**
+   * Sango
+   */
+  sg = "sg",
+  /**
+   * Sinhala; Sinhalese
+   */
+  si = "si",
+  /**
+   * Slovak
+   */
+  sk = "sk",
+  /**
+   * Slovenian
+   */
+  sl = "sl",
+  /**
+   * Samoan
+   */
+  sm = "sm",
+  /**
+   * Shona
+   */
+  sn = "sn",
+  /**
+   * Somali
+   */
+  so = "so",
+  /**
+   * Albanian
+   */
+  sq = "sq",
+  /**
+   * Serbian
+   */
+  sr = "sr",
+  /**
+   * Swati
+   */
+  ss = "ss",
+  /**
+   * Sotho, Southern
+   */
+  st = "st",
+  /**
+   * Sundanese
+   */
+  su = "su",
+  /**
+   * Swedish
+   */
+  sv = "sv",
+  /**
+   * Swahili
+   */
+  sw = "sw",
+  /**
+   * Tamil
+   */
+  ta = "ta",
+  /**
+   * Telugu
+   */
+  te = "te",
+  /**
+   * Tajik
+   */
+  tg = "tg",
+  /**
+   * Thai
+   */
+  th = "th",
+  /**
+   * Tigrinya
+   */
+  ti = "ti",
+  /**
+   * Turkmen
+   */
+  tk = "tk",
+  /**
+   * Tagalog
+   */
+  tl = "tl",
+  /**
+   * Tswana
+   */
+  tn = "tn",
+  /**
+   * Tonga (Tonga Islands)
+   */
+  to = "to",
+  /**
+   * Turkish
+   */
+  tr = "tr",
+  /**
+   * Tsonga
+   */
+  ts = "ts",
+  /**
+   * Tatar
+   */
+  tt = "tt",
+  /**
+   * Twi
+   */
+  tw = "tw",
+  /**
+   * Tahitian
+   */
+  ty = "ty",
+  /**
+   * Uighur; Uyghur
+   */
+  ug = "ug",
+  /**
+   * Ukrainian
+   */
+  uk = "uk",
+  /**
+   * Urdu
+   */
+  ur = "ur",
+  /**
+   * Uzbek
+   */
+  uz = "uz",
+  /**
+   * Venda
+   */
+  ve = "ve",
+  /**
+   * Vietnamese
+   */
+  vi = "vi",
+  /**
+   * Volapük
+   */
+  vo = "vo",
+  /**
+   * Walloon
+   */
+  wa = "wa",
+  /**
+   * Wolof
+   */
+  wo = "wo",
+  /**
+   * Xhosa
+   */
+  xh = "xh",
+  /**
+   * Yiddish
+   */
+  yi = "yi",
+  /**
+   * Yoruba
+   */
+  yo = "yo",
+  /**
+   * Zhuang; Chuang
+   */
+  za = "za",
+  /**
+   * Chinese
+   */
+  zh = "zh",
+  /**
+   * Zulu
+   */
+  zu = "zu",
+}
+
+
+export interface GetProductByIdQueryVariables {
+  id: string,
+  languageCode?: LanguageCode | null,
+};
+
+export interface GetProductByIdQuery {
+  product:  {
+    id: string,
+    languageCode: LanguageCode | null,
+    name: string | null,
+    slug: string | null,
+    description: string | null,
+    translations:  Array< {
+      languageCode: LanguageCode,
+      name: string,
+      slug: string,
+      description: string | null,
+    } | null > | null,
+  } | null,
+};
+
+export interface GetProductListQueryVariables {
+  take?: number | null,
+  skip?: number | null,
+  languageCode?: LanguageCode | null,
+};
+
+export interface GetProductListQuery {
+  products:  {
+    items:  Array< {
+      id: string,
+      languageCode: LanguageCode | null,
+      name: string | null,
+      slug: string | null,
+      description: string | null,
+    } >,
+    totalItems: number,
+  } | null,
+};

+ 19 - 18
admin-ui/src/app/core/providers/data/product-data.service.ts

@@ -1,30 +1,31 @@
-import { BaseDataService } from './base-data.service';
-import gql from 'graphql-tag';
 import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
+import { ID } from '../../../../../../shared/shared-types';
+import { getProductById } from '../../../common/queries/get-product-by-id';
+import { getProductList } from '../../../common/queries/get-product-list';
+import {
+    GetProductByIdQuery,
+    GetProductByIdQueryVariables,
+    GetProductListQuery,
+    GetProductListQueryVariables,
+} from '../../../common/types/gql-generated-types';
+import { BaseDataService } from './base-data.service';
 
 export class ProductDataService {
 
     constructor(private baseDataService: BaseDataService) {}
 
-    getProducts(take: number = 10, skip: number = 0): Observable<any> {
-        const query = gql`
-            query ($take: Int, $skip: Int){
-                products(languageCode: en, take: $take, skip: $skip) {
-                    items {
-                        id
-                        languageCode
-                        name
-                        slug
-                        description
-                    }
-                    totalItems
-                }
-            }
-        `;
-        return this.baseDataService.query<any>(query, { take, skip }).pipe(
+    getProducts(take: number = 10, skip: number = 0): Observable<GetProductListQuery['products']> {
+        return this.baseDataService.query<GetProductListQuery, GetProductListQueryVariables>(getProductList, { take, skip }).pipe(
             map(data => data.products),
         );
     }
 
+    getProduct(id: ID): Observable<GetProductByIdQuery['product']> {
+        const stringId = id.toString();
+        return this.baseDataService.query<GetProductByIdQuery, GetProductByIdQueryVariables>(getProductById, { id: stringId }).pipe(
+            map(data => data.product),
+        );
+    }
+
 }

+ 298 - 12
admin-ui/yarn.lock

@@ -175,6 +175,24 @@
   dependencies:
     tslib "^1.9.0"
 
+"@babel/generator@7.0.0-beta.38":
+  version "7.0.0-beta.38"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.38.tgz#6115a66663e3adfd1d6844029ffb2354680182eb"
+  dependencies:
+    "@babel/types" "7.0.0-beta.38"
+    jsesc "^2.5.1"
+    lodash "^4.2.0"
+    source-map "^0.5.0"
+    trim-right "^1.0.1"
+
+"@babel/types@7.0.0-beta.38":
+  version "7.0.0-beta.38"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.38.tgz#2ce2443f7dc6ad535a67db4940cbd34e64035a6f"
+  dependencies:
+    esutils "^2.0.2"
+    lodash "^4.2.0"
+    to-fast-properties "^2.0.0"
+
 "@clr/angular@^0.11.21":
   version "0.11.21"
   resolved "https://registry.yarnpkg.com/@clr/angular/-/angular-0.11.21.tgz#af004553c3c48a0f1b2c87018adf2244dadb5ef8"
@@ -563,6 +581,78 @@ apollo-client@^2.3.4:
   optionalDependencies:
     "@types/async" "2.0.49"
 
+apollo-codegen-core@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-core/-/apollo-codegen-core-0.20.0.tgz#0617d982686d670aa39dc52cc64fae268713f56e"
+  dependencies:
+    "@babel/generator" "7.0.0-beta.38"
+    "@babel/types" "7.0.0-beta.38"
+    common-tags "^1.5.1"
+    core-js "^2.5.3"
+    graphql-config "^2.0.1"
+
+apollo-codegen-flow-legacy@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-flow-legacy/-/apollo-codegen-flow-legacy-0.20.0.tgz#a9f1a0bb16c0fbde22b7dc7509b835d822861c67"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+
+apollo-codegen-flow@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-flow/-/apollo-codegen-flow-0.20.0.tgz#6d6219150235efd74620d421f42d96216292070d"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+    change-case "^3.0.1"
+    inflected "^2.0.3"
+
+apollo-codegen-scala@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-scala/-/apollo-codegen-scala-0.20.0.tgz#3ce29057cbb72f47806b27e6b780252dfa4fc349"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+    change-case "^3.0.1"
+    inflected "^2.0.3"
+
+apollo-codegen-swift@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-swift/-/apollo-codegen-swift-0.20.0.tgz#84a3f7b8d2c0f99fc65fb57acbe0abf9a9932f45"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+    change-case "^3.0.1"
+    inflected "^2.0.3"
+
+apollo-codegen-typescript-legacy@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-typescript-legacy/-/apollo-codegen-typescript-legacy-0.20.0.tgz#e3dab94e6b8f0136f30d92a517c5dfd172452240"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+
+apollo-codegen-typescript@^0.20.0:
+  version "0.20.0"
+  resolved "https://registry.yarnpkg.com/apollo-codegen-typescript/-/apollo-codegen-typescript-0.20.0.tgz#a77eea6a68c0d09b29855667371bcd836cadfa78"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+    change-case "^3.0.1"
+    inflected "^2.0.3"
+
+apollo-codegen@^0.20.1:
+  version "0.20.1"
+  resolved "https://registry.yarnpkg.com/apollo-codegen/-/apollo-codegen-0.20.1.tgz#aff1ce5126051747c8b03ede42270b26f42e1cfd"
+  dependencies:
+    apollo-codegen-core "^0.20.0"
+    apollo-codegen-flow "^0.20.0"
+    apollo-codegen-flow-legacy "^0.20.0"
+    apollo-codegen-scala "^0.20.0"
+    apollo-codegen-swift "^0.20.0"
+    apollo-codegen-typescript "^0.20.0"
+    apollo-codegen-typescript-legacy "^0.20.0"
+    glob "^7.1.2"
+    graphql "^0.13.1"
+    node-fetch "^1.7.3"
+    rimraf "^2.6.2"
+    source-map-support "^0.5.0"
+    yargs "^10.0.3"
+
 apollo-link-dedup@^1.0.0:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.9.tgz#3c4e4af88ef027cbddfdb857c043fd0574051dad"
@@ -1142,7 +1232,7 @@ callsite@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
 
-camel-case@3.0.x:
+camel-case@3.0.x, camel-case@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
   dependencies:
@@ -1217,6 +1307,29 @@ chalk@~2.2.2:
     escape-string-regexp "^1.0.5"
     supports-color "^4.0.0"
 
+change-case@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037"
+  dependencies:
+    camel-case "^3.0.0"
+    constant-case "^2.0.0"
+    dot-case "^2.1.0"
+    header-case "^1.0.0"
+    is-lower-case "^1.1.0"
+    is-upper-case "^1.1.0"
+    lower-case "^1.1.1"
+    lower-case-first "^1.0.0"
+    no-case "^2.3.2"
+    param-case "^2.1.0"
+    pascal-case "^2.0.0"
+    path-case "^2.1.0"
+    sentence-case "^2.1.0"
+    snake-case "^2.1.0"
+    swap-case "^1.1.0"
+    title-case "^2.1.0"
+    upper-case "^1.1.1"
+    upper-case-first "^1.1.0"
+
 chokidar@^1.4.1, chokidar@^1.4.2:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
@@ -1385,6 +1498,10 @@ commander@~2.13.0:
   version "2.13.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
 
+common-tags@^1.5.1:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
+
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -1463,6 +1580,13 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
 
+constant-case@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46"
+  dependencies:
+    snake-case "^2.1.0"
+    upper-case "^1.1.1"
+
 constants-browserify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
@@ -1515,7 +1639,7 @@ copy-webpack-plugin@^4.5.1:
     p-limit "^1.0.0"
     serialize-javascript "^1.4.0"
 
-core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.4:
+core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.3, core-js@^2.5.4:
   version "2.5.7"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
 
@@ -1567,6 +1691,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
+cross-fetch@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.0.0.tgz#a17475449561e0f325146cea636a8619efb9b382"
+  dependencies:
+    node-fetch "2.0.0"
+    whatwg-fetch "2.0.3"
+
 cross-spawn@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
@@ -1906,6 +2037,12 @@ domutils@1.5.1:
     dom-serializer "0"
     domelementtype "1"
 
+dot-case@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee"
+  dependencies:
+    no-case "^2.2.0"
+
 duplexify@^3.4.2, duplexify@^3.6.0:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
@@ -1953,6 +2090,12 @@ encodeurl@~1.0.1, encodeurl@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
 
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
@@ -2696,11 +2839,33 @@ graphql-anywhere@^4.1.13:
   dependencies:
     apollo-utilities "^1.0.15"
 
+graphql-config@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.0.1.tgz#d34a9bdf1d7360af7b01db9b20260a342ddc7390"
+  dependencies:
+    graphql-import "^0.4.4"
+    graphql-request "^1.5.0"
+    js-yaml "^3.10.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+
+graphql-import@^0.4.4:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.4.5.tgz#e2f18c28d335733f46df8e0733d8deb1c6e2a645"
+  dependencies:
+    lodash "^4.17.4"
+
+graphql-request@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.6.0.tgz#afe87cf2a336acabb0cc2a875900202eda89f412"
+  dependencies:
+    cross-fetch "2.0.0"
+
 graphql-tag@^2.9.2:
   version "2.9.2"
   resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.9.2.tgz#2f60a5a981375f430bf1e6e95992427dc18af686"
 
-graphql@^0.13.2:
+graphql@^0.13.1, graphql@^0.13.2:
   version "0.13.2"
   resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270"
   dependencies:
@@ -2847,6 +3012,13 @@ he@1.1.x:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
 
+header-case@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d"
+  dependencies:
+    no-case "^2.2.0"
+    upper-case "^1.1.3"
+
 hmac-drbg@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -2983,7 +3155,7 @@ iconv-lite@0.4.19:
   version "0.4.19"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
 
-iconv-lite@0.4.23, iconv-lite@^0.4.4:
+iconv-lite@0.4.23, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
   version "0.4.23"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
   dependencies:
@@ -3044,6 +3216,10 @@ indexof@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
 
+inflected@^2.0.3:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77"
+
 inflight@^1.0.4:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -3221,6 +3397,12 @@ is-glob@^4.0.0:
   dependencies:
     is-extglob "^2.1.1"
 
+is-lower-case@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393"
+  dependencies:
+    lower-case "^1.1.0"
+
 is-my-ip-valid@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
@@ -3301,7 +3483,7 @@ is-regex@^1.0.4:
   dependencies:
     has "^1.0.1"
 
-is-stream@^1.1.0:
+is-stream@^1.0.1, is-stream@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
 
@@ -3313,6 +3495,12 @@ is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
 
+is-upper-case@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f"
+  dependencies:
+    upper-case "^1.1.0"
+
 is-utf8@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
@@ -3485,7 +3673,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
 
-js-yaml@3.x, js-yaml@^3.4.3, js-yaml@^3.7.0:
+js-yaml@3.x, js-yaml@^3.10.0, js-yaml@^3.4.3, js-yaml@^3.7.0:
   version "3.12.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
   dependencies:
@@ -3500,6 +3688,10 @@ jsesc@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
 
+jsesc@^2.5.1:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
+
 jsesc@~0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
@@ -3759,7 +3951,7 @@ lodash@^3.8.0:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
 
-lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@~4.17.10:
+lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.5.0, lodash@~4.17.10:
   version "4.17.10"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
 
@@ -3808,7 +4000,13 @@ loud-rejection@^1.0.0, loud-rejection@^1.6.0:
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
 
-lower-case@^1.1.1:
+lower-case-first@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1"
+  dependencies:
+    lower-case "^1.1.2"
+
+lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
 
@@ -4123,12 +4321,23 @@ next-tick@1:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
 
-no-case@^2.2.0:
+no-case@^2.2.0, no-case@^2.3.2:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
   dependencies:
     lower-case "^1.1.1"
 
+node-fetch@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0.tgz#982bba43ecd4f2922a29cc186a6bbb0bb73fcba6"
+
+node-fetch@^1.7.3:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
 node-forge@0.7.5:
   version "0.7.5"
   resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
@@ -4506,7 +4715,7 @@ parallel-transform@^1.1.0:
     inherits "^2.0.3"
     readable-stream "^2.1.5"
 
-param-case@2.1.x:
+param-case@2.1.x, param-case@^2.1.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
   dependencies:
@@ -4563,6 +4772,13 @@ parseurl@~1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
 
+pascal-case@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e"
+  dependencies:
+    camel-case "^3.0.0"
+    upper-case-first "^1.1.0"
+
 pascalcase@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
@@ -4571,6 +4787,12 @@ path-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
 
+path-case@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5"
+  dependencies:
+    no-case "^2.2.0"
+
 path-dirname@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
@@ -5395,6 +5617,13 @@ send@0.16.2:
     range-parser "~1.2.0"
     statuses "~1.4.0"
 
+sentence-case@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4"
+  dependencies:
+    no-case "^2.2.0"
+    upper-case-first "^1.1.2"
+
 serialize-javascript@^1.4.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
@@ -5501,6 +5730,12 @@ slide@^1.1.3:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
 
+snake-case@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f"
+  dependencies:
+    no-case "^2.2.0"
+
 snapdragon-node@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -5637,7 +5872,7 @@ source-map@0.1.x:
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
 
@@ -5909,6 +6144,13 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0:
   dependencies:
     has-flag "^3.0.0"
 
+swap-case@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3"
+  dependencies:
+    lower-case "^1.1.1"
+    upper-case "^1.1.1"
+
 symbol-observable@^1.0.2, symbol-observable@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
@@ -5958,6 +6200,13 @@ timers-browserify@^2.0.4:
   dependencies:
     setimmediate "^1.0.4"
 
+title-case@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa"
+  dependencies:
+    no-case "^2.2.0"
+    upper-case "^1.0.3"
+
 tmp@0.0.24:
   version "0.0.24"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.24.tgz#d6a5e198d14a9835cc6f2d7c3d9e302428c8cf12"
@@ -5992,6 +6241,10 @@ to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+
 to-object-path@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
@@ -6214,7 +6467,13 @@ upath@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
 
-upper-case@^1.1.1:
+upper-case-first@^1.1.0, upper-case-first@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115"
+  dependencies:
+    upper-case "^1.1.1"
+
+upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
 
@@ -6512,6 +6771,10 @@ websocket-extensions@>=0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
 
+whatwg-fetch@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
 when@~3.6.x:
   version "3.6.4"
   resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
@@ -6651,6 +6914,12 @@ yargs-parser@^5.0.0:
   dependencies:
     camelcase "^3.0.0"
 
+yargs-parser@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+  dependencies:
+    camelcase "^4.1.0"
+
 yargs-parser@^9.0.2:
   version "9.0.2"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@@ -6674,6 +6943,23 @@ yargs@11.0.0:
     y18n "^3.2.1"
     yargs-parser "^9.0.2"
 
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
 yargs@^7.0.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"