Răsfoiți Sursa

feat(admin-ui): Generate TypeScript types from api & client schemas

Michael Bromley 7 ani în urmă
părinte
comite
ec530da90f

+ 2 - 2
admin-ui/README.md

@@ -11,7 +11,7 @@ The UI is powered by the [Clarity Design System](https://vmware.github.io/clarit
 [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. 
+All queries should be located in the [`./src/app/data/queries`](src/app/data/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).
+types are located at [`./src/app/data/types/gql-generated-types.ts`](src/app/data/types/gql-generated-types.ts).

+ 88 - 38
admin-ui/generate-graphql-types.ts

@@ -1,55 +1,105 @@
 import { spawn } from 'child_process';
-import * as rimraf from 'rimraf';
+import * as fs from 'fs';
+import { execute, GraphQLSchema, IntrospectionQuery, IntrospectionSchema, parse } from 'graphql';
+import { makeExecutableSchema } from 'graphql-tools';
+import { buildClientSchema, introspectionQuery, printSchema } from 'graphql/utilities';
+import { fileLoader, mergeTypes } from 'merge-graphql-schemas';
 import { API_PATH, API_PORT } from '../shared/shared-constants';
 
-/*
+// tslint:disable:no-console
+const API_URL = `http://localhost:${API_PORT}/${API_PATH}`;
+const SCHEMA_JSON_FILE = '../schema.json';
+const CLIENT_SCHEMA_FILES = './src/app/data/types/**/*.graphql';
+const CLIENT_QUERY_FILES = '"./src/app/data/(queries|mutations)/**/*.ts"';
+const TYPESCRIPT_DEFINITIONS_FILE = './src/app/data/types/gql-generated-types.ts';
+
+main().catch(e => {
+    console.log('Could not generate types!', e);
+    process.exitCode = 1;
+});
+
+/**
  * 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".
  */
+async function main(): Promise<void> {
+    const introspectionQueryFromApi = await downloadSchemaFromApi(API_URL);
+    const combinedSchema = await combineSchemas(introspectionQueryFromApi, CLIENT_SCHEMA_FILES);
 
-const API_URL = `http://localhost:${API_PORT}/${API_PATH}`;
-const SCHEMA_DUMP = 'schema.temp.json';
+    fs.writeFileSync(SCHEMA_JSON_FILE, JSON.stringify(combinedSchema));
+    console.log(`Generated schema file: ${SCHEMA_JSON_FILE}`);
 
-// 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;
+    await generateTypeScriptTypesFromSchema(SCHEMA_JSON_FILE, CLIENT_QUERY_FILES, TYPESCRIPT_DEFINITIONS_FILE);
+
+    console.log('Generated TypeScript definitions!');
+}
+
+/**
+ * Downloads the schema from the provided GraphQL endpoint using the `apollo schema:download`
+ * cli command and returns the result as an IntrospectionQuery object.
+ */
+async function downloadSchemaFromApi(apiEndpoint: string): Promise<IntrospectionQuery> {
+    const TEMP_API_SCHEMA = '../schema.temp.json';
+    await runCommand('yarn', [
+        'apollo',
+        'schema:download',
+        TEMP_API_SCHEMA,
+        `--endpoint=${API_URL}`,
+    ]);
+
+    console.log(`Downloaded schema from ${API_URL}`);
+
+    const schemaFromApi = fs.readFileSync(TEMP_API_SCHEMA, { encoding: 'utf8' });
+    fs.unlinkSync(TEMP_API_SCHEMA);
+    const introspectionSchema: IntrospectionSchema = JSON.parse(schemaFromApi);
+    return {
+        __schema: introspectionSchema,
+    };
+}
+
+async function introspectionFromSchema(schema: GraphQLSchema): Promise<IntrospectionQuery> {
+    const queryAST = parse(introspectionQuery);
+    const result = await execute(schema, queryAST);
+    return result.data as IntrospectionQuery;
+}
+
+/**
+ * Combines the IntrospectionQuery from the GraphQL API with any client-side schemas as defined by the
+ * clientSchemaFiles glob.
+ */
+async function combineSchemas(introspectionQueryFromApi: IntrospectionQuery, clientSchemaFiles: string): Promise<IntrospectionQuery> {
+    const schemaFromApi = buildClientSchema(introspectionQueryFromApi);
+    const clientSchemas = fileLoader(clientSchemaFiles);
+    const remoteSchema = printSchema(schemaFromApi);
+    const typeDefs = mergeTypes([...clientSchemas, remoteSchema], {
+        all: true,
     });
+    const executableSchema = makeExecutableSchema({ typeDefs, resolverValidationOptions: { requireResolversForResolveType: false } });
+    const introspection = await introspectionFromSchema(executableSchema);
+    return introspection;
+}
+
+/**
+ * Generates TypeScript definitions from the provided schema json file sing the `apollo codegen:generate` cli command.
+ */
+async function generateTypeScriptTypesFromSchema(schemaFile: string, queryFiles: string, outputFile: string): Promise<number> {
+    return runCommand('yarn', [
+        'apollo',
+        'codegen:generate',
+        outputFile,
+        '--addTypename',
+        `--queries=${queryFiles}`,
+        `--schema ${schemaFile}`,
+    ]);
+}
 
 /**
- * Run the apollo-codegen script and wrap in a Promise.
+ * Runs a command-line command and resolves when completed.
  */
-function runApolloCodegen(args: string[]): Promise<any> {
+function runCommand(command: string, args: string[]): Promise<number> {
     return new Promise((resolve, reject) => {
-        const cp = spawn('yarn', ['apollo-codegen', ...args], { shell: true });
+        const cp = spawn(command, args, { shell: true });
 
         cp.on('error', reject);
         cp.stdout.on('data', (data) => {

+ 4 - 2
admin-ui/package.json

@@ -8,7 +8,7 @@
     "test": "ng test",
     "lint": "ng lint vendure-admin --fix",
     "e2e": "ng e2e",
-    "apollo-codegen": "apollo-codegen",
+    "apollo": "apollo",
     "generate-gql-types": "ts-node generate-graphql-types.ts"
   },
   "private": true,
@@ -51,8 +51,9 @@
     "@types/jasmine": "~2.8.6",
     "@types/jasminewd2": "~2.0.3",
     "@types/node": "~8.9.4",
-    "apollo-codegen": "^0.20.1",
+    "apollo": "^1.1.1",
     "codelyzer": "~4.2.1",
+    "graphql-tools": "^3.0.4",
     "jasmine-core": "~2.99.1",
     "jasmine-spec-reporter": "~4.2.1",
     "karma": "~1.7.1",
@@ -60,6 +61,7 @@
     "karma-coverage-istanbul-reporter": "~2.0.0",
     "karma-jasmine": "~1.1.1",
     "karma-jasmine-html-reporter": "^0.2.2",
+    "merge-graphql-schemas": "^1.5.2",
     "protractor": "~5.3.0",
     "rimraf": "^2.6.2",
     "ts-node": "~5.0.1",

+ 1 - 1
admin-ui/src/app/app.component.ts

@@ -17,7 +17,7 @@ export class AppComponent implements OnInit {
     }
 
     ngOnInit() {
-        this.loading$ = this.dataService.local.inFlightRequests().pipe(
+        this.loading$ = this.dataService.client.inFlightRequests().pipe(
             tap(val => console.log('inFlightRequests:', val)),
             map(count => 0 < count),
         );

+ 2 - 2
admin-ui/src/app/catalog/components/product-list/product-list.component.ts

@@ -3,7 +3,7 @@ import { QueryRef } from 'apollo-angular';
 import { Observable } from 'rxjs';
 import { map, tap } from 'rxjs/operators';
 
-import { GetProductListQuery, GetProductListQueryVariables } from '../../../common/types/gql-generated-types';
+import { GetProductList, GetProductListVariables } from '../../../data/types/gql-generated-types';
 import { DataService } from '../../../data/providers/data.service';
 
 @Component({
@@ -17,7 +17,7 @@ export class ProductListComponent implements OnInit {
     totalItems: number;
     itemsPerPage = 25;
     currentPage = 1;
-    private productsQuery: QueryRef<GetProductListQuery, GetProductListQueryVariables>;
+    private productsQuery: QueryRef<GetProductList, GetProductListVariables>;
 
     constructor(private dataService: DataService) { }
 

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

@@ -1,19 +0,0 @@
-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
-            }
-        }
-    }
-`;

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

@@ -1,16 +0,0 @@
-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
-        }
-    }
-`;

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

@@ -1,785 +0,0 @@
-/* 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,
-};

+ 3 - 16
admin-ui/src/app/data/data.module.ts

@@ -12,6 +12,7 @@ import { API_URL } from '../app.config';
 import { BaseDataService } from './providers/base-data.service';
 import { DataService } from './providers/data.service';
 import { DefaultInterceptor } from './providers/interceptor';
+import { GET_IN_FLIGHT_REQUESTS } from './queries/local-queries';
 
 // This is the same cache you pass into new ApolloClient
 const apolloCache = new InMemoryCache();
@@ -23,14 +24,7 @@ const stateLink = withClientState({
     resolvers: {
         Mutation: {
             requestStarted: (_, __, { cache }) => {
-                const query = gql`
-                    query GetInFlightRequests {
-                        network @client {
-                            inFlightRequests
-                        }
-                    }
-                `;
-                const previous = cache.readQuery({ query });
+                const previous = cache.readQuery({ query: GET_IN_FLIGHT_REQUESTS });
                 const data = {
                     network: {
                         __typename: 'Network',
@@ -41,14 +35,7 @@ const stateLink = withClientState({
                 return null;
             },
             requestCompleted: (_, __, { cache }) => {
-                const query = gql`
-                    query GetInFlightRequests {
-                        network @client {
-                            inFlightRequests
-                        }
-                    }
-                `;
-                const previous = cache.readQuery({ query });
+                const previous = cache.readQuery({ query: GET_IN_FLIGHT_REQUESTS });
                 const data = {
                     network: {
                         __typename: 'Network',

+ 1 - 1
admin-ui/src/app/data/providers/local-data.service.ts → admin-ui/src/app/data/providers/client-data.service.ts

@@ -4,7 +4,7 @@ import gql from 'graphql-tag';
 import { map } from 'rxjs/operators';
 import { BaseDataService } from './base-data.service';
 
-export class LocalDataService {
+export class ClientDataService {
 
     constructor(private baseDataService: BaseDataService) {}
 

+ 3 - 3
admin-ui/src/app/data/providers/data.service.ts

@@ -1,7 +1,7 @@
 import { Injectable } from '@angular/core';
 
 import { BaseDataService } from './base-data.service';
-import { LocalDataService } from './local-data.service';
+import { ClientDataService } from './client-data.service';
 import { ProductDataService } from './product-data.service';
 import { UserDataService } from './user-data.service';
 
@@ -9,12 +9,12 @@ import { UserDataService } from './user-data.service';
 export class DataService {
     user: UserDataService;
     product: ProductDataService;
-    local: LocalDataService;
+    client: ClientDataService;
 
     constructor(baseDataService: BaseDataService) {
         this.user = new UserDataService(baseDataService);
         this.product = new ProductDataService(baseDataService);
-        this.local = new LocalDataService(baseDataService);
+        this.client = new ClientDataService(baseDataService);
     }
 
 }

+ 3 - 3
admin-ui/src/app/data/providers/interceptor.ts

@@ -22,20 +22,20 @@ export class DefaultInterceptor implements HttpInterceptor {
     intercept(req: HttpRequest<any>, next: HttpHandler):
         Observable<HttpEvent<any>> {
         this.apiActions.startRequest();
-        this.dataService.local.startRequest().subscribe();
+        this.dataService.client.startRequest().subscribe();
         return next.handle(req).pipe(
             tap(event => {
                     if (event instanceof HttpResponse) {
                         this.notifyOnGraphQLErrors(event);
                         this.apiActions.requestCompleted();
-                        this.dataService.local.completeRequest().subscribe();
+                        this.dataService.client.completeRequest().subscribe();
                     }
                 },
                 err => {
                     if (err instanceof HttpErrorResponse) {
                         this.notification.error(err.message);
                         this.apiActions.requestCompleted();
-                        this.dataService.local.completeRequest().subscribe();
+                        this.dataService.client.completeRequest().subscribe();
                     }
                 }),
         );

+ 5 - 12
admin-ui/src/app/data/providers/product-data.service.ts

@@ -1,15 +1,8 @@
 import { QueryRef } from 'apollo-angular';
 
 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,
-    LanguageCode,
-} from '../../common/types/gql-generated-types';
+import { GET_PRODUCT_BY_ID, GET_PRODUCT_LIST } from '../queries/product-queries';
+import { GetProductById, GetProductByIdVariables, GetProductList, GetProductListVariables, LanguageCode } from '../types/gql-generated-types';
 
 import { BaseDataService } from './base-data.service';
 
@@ -17,14 +10,14 @@ export class ProductDataService {
 
     constructor(private baseDataService: BaseDataService) {}
 
-    getProducts(take: number = 10, skip: number = 0): QueryRef<GetProductListQuery, GetProductListQueryVariables> {
+    getProducts(take: number = 10, skip: number = 0): QueryRef<GetProductList, GetProductListVariables> {
         return this.baseDataService
-            .query<GetProductListQuery, GetProductListQueryVariables>(getProductList, { take, skip, languageCode: LanguageCode.en });
+            .query<GetProductList, GetProductListVariables>(GET_PRODUCT_LIST, { take, skip, languageCode: LanguageCode.en });
     }
 
     getProduct(id: ID): any {
         const stringId = id.toString();
-        return this.baseDataService.query<GetProductByIdQuery, GetProductByIdQueryVariables>(getProductById, { id: stringId });
+        return this.baseDataService.query<GetProductById, GetProductByIdVariables>(GET_PRODUCT_BY_ID, { id: stringId });
     }
 
 }

+ 1 - 1
admin-ui/src/app/data/providers/user-data.service.ts

@@ -1,6 +1,6 @@
 import { Observable } from 'rxjs';
 
-import { LoginResponse, UserResponse } from '../../common/types/response';
+import { LoginResponse, UserResponse } from '../types/response';
 
 import { BaseDataService } from './base-data.service';
 

+ 9 - 0
admin-ui/src/app/data/queries/local-queries.ts

@@ -0,0 +1,9 @@
+import gql from 'graphql-tag';
+
+export const GET_IN_FLIGHT_REQUESTS = gql`
+    query GetInFlightRequests {
+        network @client {
+            inFlightRequests
+        }
+    }
+`;

+ 34 - 0
admin-ui/src/app/data/queries/product-queries.ts

@@ -0,0 +1,34 @@
+import gql from 'graphql-tag';
+
+export const GET_PRODUCT_BY_ID = gql`
+    query GetProductById($id: ID!, $languageCode: LanguageCode){
+        product(languageCode: $languageCode, id: $id) {
+            id
+            languageCode
+            name
+            slug
+            description
+            translations {
+                languageCode
+                name
+                slug
+                description
+            }
+        }
+    }
+`;
+
+export const GET_PRODUCT_LIST = gql`
+    query GetProductList($take: Int, $skip: Int, $languageCode: LanguageCode){
+        products(languageCode: $languageCode, take: $take, skip: $skip) {
+            items {
+                id
+                languageCode
+                name
+                slug
+                description
+            }
+            totalItems
+        }
+    }
+`;

+ 12 - 0
admin-ui/src/app/data/types/client-types.graphql

@@ -0,0 +1,12 @@
+type Query {
+    network: Network
+}
+
+type Mutation {
+    requestStarted: Network
+    requestCompleted: Network
+}
+
+type Network {
+    inFlightRequests: Int!
+}

+ 284 - 0
admin-ui/src/app/data/types/gql-generated-types.ts

@@ -0,0 +1,284 @@
+
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
+// ====================================================
+// GraphQL query operation: GetInFlightRequests
+// ====================================================
+
+export interface GetInFlightRequests_network {
+  __typename: "Network";
+  inFlightRequests: number;
+}
+
+export interface GetInFlightRequests {
+  network: GetInFlightRequests_network | null;
+}
+
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
+// ====================================================
+// GraphQL query operation: GetProductById
+// ====================================================
+
+export interface GetProductById_product_translations {
+  __typename: "ProductTranslation";
+  languageCode: LanguageCode;
+  name: string;
+  slug: string;
+  description: string | null;
+}
+
+export interface GetProductById_product {
+  __typename: "Product";
+  id: string;
+  languageCode: LanguageCode | null;
+  name: string | null;
+  slug: string | null;
+  description: string | null;
+  translations: (GetProductById_product_translations | null)[] | null;
+}
+
+export interface GetProductById {
+  product: GetProductById_product | null;
+}
+
+export interface GetProductByIdVariables {
+  id: string;
+  languageCode?: LanguageCode | null;
+}
+
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
+// ====================================================
+// GraphQL query operation: GetProductList
+// ====================================================
+
+export interface GetProductList_products_items {
+  __typename: "Product";
+  id: string;
+  languageCode: LanguageCode | null;
+  name: string | null;
+  slug: string | null;
+  description: string | null;
+}
+
+export interface GetProductList_products {
+  __typename: "ProductList";
+  items: GetProductList_products_items[];
+  totalItems: number;
+}
+
+export interface GetProductList {
+  products: GetProductList_products | null;
+}
+
+export interface GetProductListVariables {
+  take?: number | null;
+  skip?: number | null;
+  languageCode?: LanguageCode | null;
+}
+
+/* tslint:disable */
+// This file was automatically generated and should not be edited.
+
+//==============================================================
+// START Enums and Input Objects
+//==============================================================
+
+// ISO 639-1 language code
+export enum LanguageCode {
+  aa = "aa",
+  ab = "ab",
+  ae = "ae",
+  af = "af",
+  ak = "ak",
+  am = "am",
+  an = "an",
+  ar = "ar",
+  as = "as",
+  av = "av",
+  ay = "ay",
+  az = "az",
+  ba = "ba",
+  be = "be",
+  bg = "bg",
+  bh = "bh",
+  bi = "bi",
+  bm = "bm",
+  bn = "bn",
+  bo = "bo",
+  br = "br",
+  bs = "bs",
+  ca = "ca",
+  ce = "ce",
+  ch = "ch",
+  co = "co",
+  cr = "cr",
+  cs = "cs",
+  cu = "cu",
+  cv = "cv",
+  cy = "cy",
+  da = "da",
+  de = "de",
+  dv = "dv",
+  dz = "dz",
+  ee = "ee",
+  el = "el",
+  en = "en",
+  eo = "eo",
+  es = "es",
+  et = "et",
+  eu = "eu",
+  fa = "fa",
+  ff = "ff",
+  fi = "fi",
+  fj = "fj",
+  fo = "fo",
+  fr = "fr",
+  fy = "fy",
+  ga = "ga",
+  gd = "gd",
+  gl = "gl",
+  gn = "gn",
+  gu = "gu",
+  gv = "gv",
+  ha = "ha",
+  he = "he",
+  hi = "hi",
+  ho = "ho",
+  hr = "hr",
+  ht = "ht",
+  hu = "hu",
+  hy = "hy",
+  hz = "hz",
+  ia = "ia",
+  id = "id",
+  ie = "ie",
+  ig = "ig",
+  ii = "ii",
+  ik = "ik",
+  io = "io",
+  is = "is",
+  it = "it",
+  iu = "iu",
+  ja = "ja",
+  jv = "jv",
+  ka = "ka",
+  kg = "kg",
+  ki = "ki",
+  kj = "kj",
+  kk = "kk",
+  kl = "kl",
+  km = "km",
+  kn = "kn",
+  ko = "ko",
+  kr = "kr",
+  ks = "ks",
+  ku = "ku",
+  kv = "kv",
+  kw = "kw",
+  ky = "ky",
+  la = "la",
+  lb = "lb",
+  lg = "lg",
+  li = "li",
+  ln = "ln",
+  lo = "lo",
+  lt = "lt",
+  lu = "lu",
+  lv = "lv",
+  mg = "mg",
+  mh = "mh",
+  mi = "mi",
+  mk = "mk",
+  ml = "ml",
+  mn = "mn",
+  mr = "mr",
+  ms = "ms",
+  mt = "mt",
+  my = "my",
+  na = "na",
+  nb = "nb",
+  nd = "nd",
+  ne = "ne",
+  ng = "ng",
+  nl = "nl",
+  nn = "nn",
+  no = "no",
+  nr = "nr",
+  nv = "nv",
+  ny = "ny",
+  oc = "oc",
+  oj = "oj",
+  om = "om",
+  or = "or",
+  os = "os",
+  pa = "pa",
+  pi = "pi",
+  pl = "pl",
+  ps = "ps",
+  pt = "pt",
+  qu = "qu",
+  rm = "rm",
+  rn = "rn",
+  ro = "ro",
+  ru = "ru",
+  rw = "rw",
+  sa = "sa",
+  sc = "sc",
+  sd = "sd",
+  se = "se",
+  sg = "sg",
+  si = "si",
+  sk = "sk",
+  sl = "sl",
+  sm = "sm",
+  sn = "sn",
+  so = "so",
+  sq = "sq",
+  sr = "sr",
+  ss = "ss",
+  st = "st",
+  su = "su",
+  sv = "sv",
+  sw = "sw",
+  ta = "ta",
+  te = "te",
+  tg = "tg",
+  th = "th",
+  ti = "ti",
+  tk = "tk",
+  tl = "tl",
+  tn = "tn",
+  to = "to",
+  tr = "tr",
+  ts = "ts",
+  tt = "tt",
+  tw = "tw",
+  ty = "ty",
+  ug = "ug",
+  uk = "uk",
+  ur = "ur",
+  uz = "uz",
+  ve = "ve",
+  vi = "vi",
+  vo = "vo",
+  wa = "wa",
+  wo = "wo",
+  xh = "xh",
+  yi = "yi",
+  yo = "yo",
+  za = "za",
+  zh = "zh",
+  zu = "zu",
+}
+
+//==============================================================
+// END Enums and Input Objects
+//==============================================================

+ 0 - 0
admin-ui/src/app/common/types/response.ts → admin-ui/src/app/data/types/response.ts


Fișier diff suprimat deoarece este prea mare
+ 581 - 55
admin-ui/yarn.lock


+ 2 - 18
graphql.config.json

@@ -2,30 +2,14 @@
 
   "README_schema" : "Specifies how to load the GraphQL schema that completion, error highlighting, and documentation is based on in the IDE",
   "schema": {
-
     "README_file" : "Remove 'file' to use request url below. A relative or absolute path to the JSON from a schema introspection query, e.g. '{ data: ... }' or a .graphql/.graphqls file describing the schema using GraphQL Schema Language. Changes to the file are watched.",
-
-
-    "README_request" : "To request the schema from a url instead, remove the 'file' JSON property above (and optionally delete the default graphql.schema.json file).",
-    "request": {
-      "url" : "http://localhost:3000/api",
-      "method" : "POST",
-      "README_postIntrospectionQuery" : "Whether to POST an introspectionQuery to the url. If the url always returns the schema JSON, set to false and consider using GET",
-      "postIntrospectionQuery" : true,
-      "README_options" : "See the 'Options' section at https://github.com/then/then-request",
-      "options" : {
-        "headers": {
-          "user-agent" : "JS GraphQL"
-        }
-      }
-    }
-
+    "file": "./schema.json"
   },
 
   "README_endpoints": "A list of GraphQL endpoints that can be queried from '.graphql' files in the IDE",
   "endpoints" : [
     {
-      "name": "Vendure Dev (http://localhost:8080/api)",
+      "name": "Vendure Dev",
       "url": "http://localhost:3000/api",
       "options" : {
         "headers": {

+ 4824 - 0
schema.json

@@ -0,0 +1,4824 @@
+{
+  "__schema": {
+    "queryType": {
+      "name": "Query"
+    },
+    "mutationType": {
+      "name": "Mutation"
+    },
+    "subscriptionType": null,
+    "types": [
+      {
+        "kind": "OBJECT",
+        "name": "Query",
+        "description": "",
+        "fields": [
+          {
+            "name": "network",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Network",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "administrators",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Administrator",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "administrator",
+            "description": "",
+            "args": [
+              {
+                "name": "id",
+                "description": "",
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "SCALAR",
+                    "name": "ID",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Administrator",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "customers",
+            "description": "",
+            "args": [
+              {
+                "name": "take",
+                "description": "",
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Int",
+                  "ofType": null
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "skip",
+                "description": "",
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Int",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "CustomerList",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "customer",
+            "description": "",
+            "args": [
+              {
+                "name": "id",
+                "description": "",
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "SCALAR",
+                    "name": "ID",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Customer",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "productOptionGroups",
+            "description": "",
+            "args": [
+              {
+                "name": "languageCode",
+                "description": "",
+                "type": {
+                  "kind": "ENUM",
+                  "name": "LanguageCode",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductOptionGroup",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "productOptionGroup",
+            "description": "",
+            "args": [
+              {
+                "name": "id",
+                "description": "",
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "SCALAR",
+                    "name": "ID",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "languageCode",
+                "description": "",
+                "type": {
+                  "kind": "ENUM",
+                  "name": "LanguageCode",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProductOptionGroup",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "products",
+            "description": "",
+            "args": [
+              {
+                "name": "languageCode",
+                "description": "",
+                "type": {
+                  "kind": "ENUM",
+                  "name": "LanguageCode",
+                  "ofType": null
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "take",
+                "description": "",
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Int",
+                  "ofType": null
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "skip",
+                "description": "",
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Int",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProductList",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "product",
+            "description": "",
+            "args": [
+              {
+                "name": "id",
+                "description": "",
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "SCALAR",
+                    "name": "ID",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "languageCode",
+                "description": "",
+                "type": {
+                  "kind": "ENUM",
+                  "name": "LanguageCode",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Product",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Network",
+        "description": "",
+        "fields": [
+          {
+            "name": "inFlightRequests",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "Int",
+        "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. ",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Administrator",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "firstName",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lastName",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "emailAddress",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "user",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INTERFACE",
+        "name": "Node",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": [
+          {
+            "kind": "OBJECT",
+            "name": "Administrator",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "User",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "Customer",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "Address",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ProductOptionGroup",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ProductOption",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "Product",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ProductVariant",
+            "ofType": null
+          }
+        ]
+      },
+      {
+        "kind": "SCALAR",
+        "name": "ID",
+        "description": "The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"4\"`) or integer (such as `4`) input value will be accepted as an ID.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "String",
+        "description": "The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "User",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "identifier",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "passwordHash",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "roles",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lastLogin",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createdAt",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updatedAt",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "CustomerList",
+        "description": "",
+        "fields": [
+          {
+            "name": "items",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "Customer",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "totalItems",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "PaginatedList",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INTERFACE",
+        "name": "PaginatedList",
+        "description": "",
+        "fields": [
+          {
+            "name": "items",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INTERFACE",
+                    "name": "Node",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "totalItems",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": [
+          {
+            "kind": "OBJECT",
+            "name": "CustomerList",
+            "ofType": null
+          },
+          {
+            "kind": "OBJECT",
+            "name": "ProductList",
+            "ofType": null
+          }
+        ]
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Customer",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "firstName",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lastName",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "phoneNumber",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "emailAddress",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "addresses",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "Address",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "user",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "User",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Address",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fullName",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "company",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "streetLine1",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "streetLine2",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "city",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "province",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "postalCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "country",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "phoneNumber",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "defaultShippingAddress",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "defaultBillingAddress",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "SCALAR",
+        "name": "Boolean",
+        "description": "The `Boolean` scalar type represents `true` or `false`.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "ENUM",
+        "name": "LanguageCode",
+        "description": "ISO 639-1 language code",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": [
+          {
+            "name": "aa",
+            "description": "Afar",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ab",
+            "description": "Abkhazian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "af",
+            "description": "Afrikaans",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ak",
+            "description": "Akan",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sq",
+            "description": "Albanian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "am",
+            "description": "Amharic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ar",
+            "description": "Arabic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "an",
+            "description": "Aragonese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "hy",
+            "description": "Armenian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "as",
+            "description": "Assamese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "av",
+            "description": "Avaric",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ae",
+            "description": "Avestan",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ay",
+            "description": "Aymara",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "az",
+            "description": "Azerbaijani",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ba",
+            "description": "Bashkir",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bm",
+            "description": "Bambara",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "eu",
+            "description": "Basque",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "be",
+            "description": "Belarusian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bn",
+            "description": "Bengali",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bh",
+            "description": "Bihari languages",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bi",
+            "description": "Bislama",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bs",
+            "description": "Bosnian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "br",
+            "description": "Breton",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bg",
+            "description": "Bulgarian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "my",
+            "description": "Burmese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ca",
+            "description": "Catalan; Valencian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ch",
+            "description": "Chamorro",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ce",
+            "description": "Chechen",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "zh",
+            "description": "Chinese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "cu",
+            "description": "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "cv",
+            "description": "Chuvash",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kw",
+            "description": "Cornish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "co",
+            "description": "Corsican",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "cr",
+            "description": "Cree",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "cs",
+            "description": "Czech",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "da",
+            "description": "Danish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "dv",
+            "description": "Divehi; Dhivehi; Maldivian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "nl",
+            "description": "Dutch; Flemish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "dz",
+            "description": "Dzongkha",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "en",
+            "description": "English",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "eo",
+            "description": "Esperanto",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "et",
+            "description": "Estonian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ee",
+            "description": "Ewe",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fo",
+            "description": "Faroese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fj",
+            "description": "Fijian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fi",
+            "description": "Finnish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fr",
+            "description": "French",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fy",
+            "description": "Western Frisian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ff",
+            "description": "Fulah",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ka",
+            "description": "Georgian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "de",
+            "description": "German",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "gd",
+            "description": "Gaelic; Scottish Gaelic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ga",
+            "description": "Irish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "gl",
+            "description": "Galician",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "gv",
+            "description": "Manx",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "el",
+            "description": "Greek, Modern (1453-)",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "gn",
+            "description": "Guarani",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "gu",
+            "description": "Gujarati",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ht",
+            "description": "Haitian; Haitian Creole",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ha",
+            "description": "Hausa",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "he",
+            "description": "Hebrew",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "hz",
+            "description": "Herero",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "hi",
+            "description": "Hindi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ho",
+            "description": "Hiri Motu",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "hr",
+            "description": "Croatian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "hu",
+            "description": "Hungarian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ig",
+            "description": "Igbo",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "is",
+            "description": "Icelandic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "io",
+            "description": "Ido",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ii",
+            "description": "Sichuan Yi; Nuosu",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "iu",
+            "description": "Inuktitut",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ie",
+            "description": "Interlingue; Occidental",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ia",
+            "description": "Interlingua (International Auxiliary Language Association)",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "id",
+            "description": "Indonesian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ik",
+            "description": "Inupiaq",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "it",
+            "description": "Italian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "jv",
+            "description": "Javanese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ja",
+            "description": "Japanese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kl",
+            "description": "Kalaallisut; Greenlandic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kn",
+            "description": "Kannada",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ks",
+            "description": "Kashmiri",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kr",
+            "description": "Kanuri",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kk",
+            "description": "Kazakh",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "km",
+            "description": "Central Khmer",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ki",
+            "description": "Kikuyu; Gikuyu",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "rw",
+            "description": "Kinyarwanda",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ky",
+            "description": "Kirghiz; Kyrgyz",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kv",
+            "description": "Komi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kg",
+            "description": "Kongo",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ko",
+            "description": "Korean",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "kj",
+            "description": "Kuanyama; Kwanyama",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ku",
+            "description": "Kurdish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lo",
+            "description": "Lao",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "la",
+            "description": "Latin",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lv",
+            "description": "Latvian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "li",
+            "description": "Limburgan; Limburger; Limburgish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ln",
+            "description": "Lingala",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lt",
+            "description": "Lithuanian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lb",
+            "description": "Luxembourgish; Letzeburgesch",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lu",
+            "description": "Luba-Katanga",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "lg",
+            "description": "Ganda",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mk",
+            "description": "Macedonian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mh",
+            "description": "Marshallese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ml",
+            "description": "Malayalam",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mi",
+            "description": "Maori",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mr",
+            "description": "Marathi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ms",
+            "description": "Malay",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mg",
+            "description": "Malagasy",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mt",
+            "description": "Maltese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mn",
+            "description": "Mongolian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "na",
+            "description": "Nauru",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "nv",
+            "description": "Navajo; Navaho",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "nr",
+            "description": "Ndebele, South; South Ndebele",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "nd",
+            "description": "Ndebele, North; North Ndebele",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ng",
+            "description": "Ndonga",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ne",
+            "description": "Nepali",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "nn",
+            "description": "Norwegian Nynorsk; Nynorsk, Norwegian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "nb",
+            "description": "Bokmål, Norwegian; Norwegian Bokmål",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "no",
+            "description": "Norwegian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ny",
+            "description": "Chichewa; Chewa; Nyanja",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "oc",
+            "description": "Occitan (post 1500); Provençal",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "oj",
+            "description": "Ojibwa",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "or",
+            "description": "Oriya",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "om",
+            "description": "Oromo",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "os",
+            "description": "Ossetian; Ossetic",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "pa",
+            "description": "Panjabi; Punjabi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fa",
+            "description": "Persian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "pi",
+            "description": "Pali",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "pl",
+            "description": "Polish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "pt",
+            "description": "Portuguese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ps",
+            "description": "Pushto; Pashto",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "qu",
+            "description": "Quechua",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "rm",
+            "description": "Romansh",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ro",
+            "description": "Romanian; Moldavian; Moldovan",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "rn",
+            "description": "Rundi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ru",
+            "description": "Russian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sg",
+            "description": "Sango",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sa",
+            "description": "Sanskrit",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "si",
+            "description": "Sinhala; Sinhalese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sk",
+            "description": "Slovak",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sl",
+            "description": "Slovenian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "se",
+            "description": "Northern Sami",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sm",
+            "description": "Samoan",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sn",
+            "description": "Shona",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sd",
+            "description": "Sindhi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "so",
+            "description": "Somali",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "st",
+            "description": "Sotho, Southern",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "es",
+            "description": "Spanish; Castilian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sc",
+            "description": "Sardinian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sr",
+            "description": "Serbian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ss",
+            "description": "Swati",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "su",
+            "description": "Sundanese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sw",
+            "description": "Swahili",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sv",
+            "description": "Swedish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ty",
+            "description": "Tahitian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ta",
+            "description": "Tamil",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tt",
+            "description": "Tatar",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "te",
+            "description": "Telugu",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tg",
+            "description": "Tajik",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tl",
+            "description": "Tagalog",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "th",
+            "description": "Thai",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "bo",
+            "description": "Tibetan",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ti",
+            "description": "Tigrinya",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "to",
+            "description": "Tonga (Tonga Islands)",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tn",
+            "description": "Tswana",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ts",
+            "description": "Tsonga",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tk",
+            "description": "Turkmen",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tr",
+            "description": "Turkish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "tw",
+            "description": "Twi",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ug",
+            "description": "Uighur; Uyghur",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "uk",
+            "description": "Ukrainian",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ur",
+            "description": "Urdu",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "uz",
+            "description": "Uzbek",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ve",
+            "description": "Venda",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "vi",
+            "description": "Vietnamese",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "vo",
+            "description": "Volapük",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "cy",
+            "description": "Welsh",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "wa",
+            "description": "Walloon",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "wo",
+            "description": "Wolof",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "xh",
+            "description": "Xhosa",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "yi",
+            "description": "Yiddish",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "yo",
+            "description": "Yoruba",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "za",
+            "description": "Zhuang; Chuang",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "zu",
+            "description": "Zulu",
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductOptionGroup",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "ENUM",
+              "name": "LanguageCode",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "code",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "options",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductOption",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductOptionGroupTranslation",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductOption",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "ENUM",
+              "name": "LanguageCode",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "code",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductOptionTranslation",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductOptionTranslation",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductOptionGroupTranslation",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductList",
+        "description": "",
+        "fields": [
+          {
+            "name": "items",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "Product",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "totalItems",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "PaginatedList",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Product",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "ENUM",
+              "name": "LanguageCode",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "slug",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "image",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "variants",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductVariant",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "optionGroups",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductOptionGroup",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductTranslation",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductVariant",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "sku",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "image",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "price",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "Int",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "options",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductOption",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "ProductVariantTranslation",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [
+          {
+            "kind": "INTERFACE",
+            "name": "Node",
+            "ofType": null
+          }
+        ],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductVariantTranslation",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "ProductTranslation",
+        "description": "",
+        "fields": [
+          {
+            "name": "id",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "slug",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "Mutation",
+        "description": "",
+        "fields": [
+          {
+            "name": "requestStarted",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Network",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "requestCompleted",
+            "description": "",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Network",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createAdministrator",
+            "description": "Create a new Administrator",
+            "args": [
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "CreateAdministratorInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Administrator",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createCustomer",
+            "description": "Create a new Customer. If a password is provided, a new User will also be created an linked to the Customer.",
+            "args": [
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "INPUT_OBJECT",
+                    "name": "CreateCustomerInput",
+                    "ofType": null
+                  }
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "password",
+                "description": "",
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "String",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Customer",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createCustomerAddress",
+            "description": "Create a new Address and associate it with the Customer specified by customerId",
+            "args": [
+              {
+                "name": "customerId",
+                "description": "",
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "ID",
+                  "ofType": null
+                },
+                "defaultValue": null
+              },
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "CreateAddressInput",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Address",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createProductOptionGroup",
+            "description": "Create a new ProductOptionGroup",
+            "args": [
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "CreateProductOptionGroupInput",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProductOptionGroup",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updateProductOptionGroup",
+            "description": "Update an existing ProductOptionGroup",
+            "args": [
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "UpdateProductOptionGroupInput",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "ProductOptionGroup",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "createProduct",
+            "description": "Create a new Product",
+            "args": [
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "CreateProductInput",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Product",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "updateProduct",
+            "description": "Update an existing Product",
+            "args": [
+              {
+                "name": "input",
+                "description": "",
+                "type": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "UpdateProductInput",
+                  "ofType": null
+                },
+                "defaultValue": null
+              }
+            ],
+            "type": {
+              "kind": "OBJECT",
+              "name": "Product",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateAdministratorInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "firstName",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "lastName",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "emailAddress",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "password",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateCustomerInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "firstName",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "lastName",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "phoneNumber",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "emailAddress",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateAddressInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "fullName",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "company",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "streetLine1",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "streetLine2",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "city",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "province",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "postalCode",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "country",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "phoneNumber",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "defaultShippingAddress",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "defaultBillingAddress",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "Boolean",
+              "ofType": null
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateProductOptionGroupInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "code",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "ProductOptionGroupTranslationInput",
+                  "ofType": null
+                }
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "options",
+            "description": "",
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "CreateProductOptionInput",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ProductOptionGroupTranslationInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "ID",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateProductOptionInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "code",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "ProductOptionGroupTranslationInput",
+                  "ofType": null
+                }
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UpdateProductOptionGroupInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "code",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "ProductOptionGroupTranslationInput",
+                  "ofType": null
+                }
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateProductInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "image",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "ProductTranslationInput",
+                  "ofType": null
+                }
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "variants",
+            "description": "",
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "INPUT_OBJECT",
+                "name": "CreateProductVariantInput",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "optionGroupCodes",
+            "description": "",
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ProductTranslationInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "ID",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "slug",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "description",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateProductVariantInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "translations",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "CreateProductVariantTranslation",
+                  "ofType": null
+                }
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "sku",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "image",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "price",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Int",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "optionCodes",
+            "description": "",
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "CreateProductVariantTranslation",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "languageCode",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "UpdateProductInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "ID",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "image",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "translations",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "INPUT_OBJECT",
+                  "name": "ProductTranslationInput",
+                  "ofType": null
+                }
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "optionGroupCodes",
+            "description": "",
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Schema",
+        "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
+        "fields": [
+          {
+            "name": "types",
+            "description": "A list of all types supported by this server.",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__Type",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "queryType",
+            "description": "The type that query operations will be rooted at.",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "mutationType",
+            "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "subscriptionType",
+            "description": "If this server support subscription, the type that subscription operations will be rooted at.",
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "directives",
+            "description": "A list of all directives supported by this server.",
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__Directive",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Type",
+        "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
+        "fields": [
+          {
+            "name": "kind",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "__TypeKind",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "fields",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false"
+              }
+            ],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Field",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "interfaces",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Type",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "possibleTypes",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__Type",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "enumValues",
+            "description": null,
+            "args": [
+              {
+                "name": "includeDeprecated",
+                "description": null,
+                "type": {
+                  "kind": "SCALAR",
+                  "name": "Boolean",
+                  "ofType": null
+                },
+                "defaultValue": "false"
+              }
+            ],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__EnumValue",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "inputFields",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "LIST",
+              "name": null,
+              "ofType": {
+                "kind": "NON_NULL",
+                "name": null,
+                "ofType": {
+                  "kind": "OBJECT",
+                  "name": "__InputValue",
+                  "ofType": null
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ofType",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "OBJECT",
+              "name": "__Type",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "ENUM",
+        "name": "__TypeKind",
+        "description": "An enum describing what kind of type a given `__Type` is.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": [
+          {
+            "name": "SCALAR",
+            "description": "Indicates this type is a scalar.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "OBJECT",
+            "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INTERFACE",
+            "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "UNION",
+            "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ENUM",
+            "description": "Indicates this type is an enum. `enumValues` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INPUT_OBJECT",
+            "description": "Indicates this type is an input object. `inputFields` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "LIST",
+            "description": "Indicates this type is a list. `ofType` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "NON_NULL",
+            "description": "Indicates this type is a non-null. `ofType` is a valid field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Field",
+        "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "args",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__InputValue",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isDeprecated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deprecationReason",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__InputValue",
+        "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "type",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "OBJECT",
+                "name": "__Type",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "defaultValue",
+            "description": "A GraphQL-formatted string representing the default value for this input value.",
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__EnumValue",
+        "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "isDeprecated",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "deprecationReason",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "OBJECT",
+        "name": "__Directive",
+        "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
+        "fields": [
+          {
+            "name": "name",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "description",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "locations",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "ENUM",
+                    "name": "__DirectiveLocation",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "args",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "LIST",
+                "name": null,
+                "ofType": {
+                  "kind": "NON_NULL",
+                  "name": null,
+                  "ofType": {
+                    "kind": "OBJECT",
+                    "name": "__InputValue",
+                    "ofType": null
+                  }
+                }
+              }
+            },
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "onOperation",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": true,
+            "deprecationReason": "Use `locations`."
+          },
+          {
+            "name": "onFragment",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": true,
+            "deprecationReason": "Use `locations`."
+          },
+          {
+            "name": "onField",
+            "description": null,
+            "args": [],
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "isDeprecated": true,
+            "deprecationReason": "Use `locations`."
+          }
+        ],
+        "inputFields": null,
+        "interfaces": [],
+        "enumValues": null,
+        "possibleTypes": null
+      },
+      {
+        "kind": "ENUM",
+        "name": "__DirectiveLocation",
+        "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
+        "fields": null,
+        "inputFields": null,
+        "interfaces": null,
+        "enumValues": [
+          {
+            "name": "QUERY",
+            "description": "Location adjacent to a query operation.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "MUTATION",
+            "description": "Location adjacent to a mutation operation.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "SUBSCRIPTION",
+            "description": "Location adjacent to a subscription operation.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FIELD",
+            "description": "Location adjacent to a field.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FRAGMENT_DEFINITION",
+            "description": "Location adjacent to a fragment definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FRAGMENT_SPREAD",
+            "description": "Location adjacent to a fragment spread.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INLINE_FRAGMENT",
+            "description": "Location adjacent to an inline fragment.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "SCHEMA",
+            "description": "Location adjacent to a schema definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "SCALAR",
+            "description": "Location adjacent to a scalar definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "OBJECT",
+            "description": "Location adjacent to an object type definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "FIELD_DEFINITION",
+            "description": "Location adjacent to a field definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ARGUMENT_DEFINITION",
+            "description": "Location adjacent to an argument definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INTERFACE",
+            "description": "Location adjacent to an interface definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "UNION",
+            "description": "Location adjacent to a union definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ENUM",
+            "description": "Location adjacent to an enum definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "ENUM_VALUE",
+            "description": "Location adjacent to an enum value definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INPUT_OBJECT",
+            "description": "Location adjacent to an input object type definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          },
+          {
+            "name": "INPUT_FIELD_DEFINITION",
+            "description": "Location adjacent to an input object field definition.",
+            "isDeprecated": false,
+            "deprecationReason": null
+          }
+        ],
+        "possibleTypes": null
+      },
+      {
+        "kind": "INPUT_OBJECT",
+        "name": "ProductOptionTranslationInput",
+        "description": "",
+        "fields": null,
+        "inputFields": [
+          {
+            "name": "id",
+            "description": "",
+            "type": {
+              "kind": "SCALAR",
+              "name": "ID",
+              "ofType": null
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "languageCode",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "ENUM",
+                "name": "LanguageCode",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          },
+          {
+            "name": "name",
+            "description": "",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "String",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ],
+        "interfaces": null,
+        "enumValues": null,
+        "possibleTypes": null
+      }
+    ],
+    "directives": [
+      {
+        "name": "skip",
+        "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
+        "locations": [
+          "FIELD",
+          "FRAGMENT_SPREAD",
+          "INLINE_FRAGMENT"
+        ],
+        "args": [
+          {
+            "name": "if",
+            "description": "Skipped when true.",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ]
+      },
+      {
+        "name": "include",
+        "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
+        "locations": [
+          "FIELD",
+          "FRAGMENT_SPREAD",
+          "INLINE_FRAGMENT"
+        ],
+        "args": [
+          {
+            "name": "if",
+            "description": "Included when true.",
+            "type": {
+              "kind": "NON_NULL",
+              "name": null,
+              "ofType": {
+                "kind": "SCALAR",
+                "name": "Boolean",
+                "ofType": null
+              }
+            },
+            "defaultValue": null
+          }
+        ]
+      },
+      {
+        "name": "deprecated",
+        "description": "Marks an element of a GraphQL schema as no longer supported.",
+        "locations": [
+          "FIELD_DEFINITION",
+          "ENUM_VALUE"
+        ],
+        "args": [
+          {
+            "name": "reason",
+            "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).",
+            "type": {
+              "kind": "SCALAR",
+              "name": "String",
+              "ofType": null
+            },
+            "defaultValue": "\"No longer supported\""
+          }
+        ]
+      }
+    ]
+  }
+}

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff