2
0
Alexey Kim vor 2 Jahren
Commit
66d4eb7aae
10 geänderte Dateien mit 7607 neuen und 0 gelöschten Zeilen
  1. 0 0
      .env
  2. 1 0
      .gitignore
  3. 6 0
      .idea/vcs.xml
  4. 27 0
      Makefile
  5. 16 0
      config.yaml
  6. 4 0
      ext/in_context.graphql
  7. 1622 0
      prod.graphql
  8. 1668 0
      subgraph/customer.graphql
  9. 2969 0
      subgraph/product.graphql
  10. 1294 0
      subgraph/shop.graphql

+ 0 - 0
.env


+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.idea

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 27 - 0
Makefile

@@ -0,0 +1,27 @@
+# See http://clarkgrubb.com/makefile-style-guide
+MAKEFLAGS += --warn-undefined-variables
+SHELL := bash
+.SHELLFLAGS := -eu -o pipefail -c
+.DEFAULT_GOAL := all
+.DELETE_ON_ERROR:
+.SUFFIXES:
+
+include .env
+
+.PHONY: all
+all: supergraph add-context
+
+.PHONY: supergraph
+supergraph:
+	-@echo "-> $@"
+	rover supergraph compose --config config.yaml > superschema.graphql
+	#
+
+.PHONY: add-context
+add-context:
+	-@echo "-> $@"
+	@echo -e "\n\n$$(cat ext/in_context.graphql)" >> superschema.graphql
+	@sed 's/type Query/type Query\n  @inContext/' superschema.graphql > prod.graphql
+	@cp prod.graphql superschema.graphql
+	@sed 's/type Mutation/type Mutation\n  @inContext/' superschema.graphql > prod.graphql
+	@rm superschema.graphql

+ 16 - 0
config.yaml

@@ -0,0 +1,16 @@
+federation_version: 2
+subgraphs:
+  customer:
+    routing_url: https://customer.api.gshopper.com/
+    schema:
+      file: ./subgraph/customer.graphql
+
+  product:
+    routing_url: https://product.api.gshopper.com/
+    schema:
+      file: ./subgraph/product.graphql
+
+  shop:
+    routing_url: https://shop.api.gshopper.com/
+    schema:
+      file: ./subgraph/shop.graphql

+ 4 - 0
ext/in_context.graphql

@@ -0,0 +1,4 @@
+directive @inContext(
+    language: LanguageCode,
+    country: CountryCode
+) on QUERY | MUTATION | OBJECT

+ 1622 - 0
prod.graphql

@@ -0,0 +1,1622 @@
+schema
+  @link(url: "https://specs.apollo.dev/link/v1.0")
+  @link(url: "https://specs.apollo.dev/join/v0.2", for: EXECUTION)
+{
+  query: Query
+  mutation: Mutation
+}
+
+directive @join__field(graph: join__Graph!, requires: join__FieldSet, provides: join__FieldSet, type: String, external: Boolean, override: String, usedOverridden: Boolean) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION
+
+directive @join__graph(name: String!, url: String!) on ENUM_VALUE
+
+directive @join__implements(graph: join__Graph!, interface: String!) repeatable on OBJECT | INTERFACE
+
+directive @join__type(graph: join__Graph!, key: join__FieldSet, extension: Boolean! = false, resolvable: Boolean! = true) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR
+
+directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA
+
+type Collection implements HasMetafields & Node & OnlineStorePublishable
+  @join__implements(graph: PRODUCT, interface: "HasMetafields")
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__implements(graph: PRODUCT, interface: "OnlineStorePublishable")
+  @join__type(graph: PRODUCT)
+{
+  description(truncateAt: Int): String!
+  descriptionHtml: HTML!
+  handle: String!
+  id: ID!
+  image: Image
+  metafield(key: String!, namespace: String!): Metafield
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+  onlineStoreUrl: URL
+  products(after: String, before: String, filters: [ProductFilter!], first: Int, last: Int, reverse: Boolean = false, sortKey: ProductCollectionSortKeys = COLLECTION_DEFAULT): ProductConnection!
+  seo: SEO!
+  title: String!
+  updatedAt: DateTime!
+}
+
+type CollectionConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [CollectionEdge!]!
+  nodes: [Collection!]!
+  pageInfo: PageInfo!
+}
+
+type CollectionEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: Collection!
+}
+
+enum CollectionSortKeys
+  @join__type(graph: PRODUCT)
+{
+  ID
+  RELEVANCE
+  TITLE
+  UPDATED_AT
+}
+
+enum CollectionSortOrder
+  @join__type(graph: PRODUCT)
+{
+  ALPHA_ASC
+  ALPHA_DESC
+  BEST_SELLING
+  CREATED
+  CREATED_DESC
+  MANUAL
+  PRICE_ASC
+  PRICE_DESC
+}
+
+enum CountryCode
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP)
+{
+  AF
+  AX
+  AL
+  DZ
+  AD
+  AO
+  AI
+  AG
+  AR
+  AM
+  AW
+  AC
+  AU
+  AT
+  AZ
+  BS
+  BH
+  BD
+  BB
+  BY
+  BE
+  BZ
+  BJ
+  BM
+  BT
+  BO
+  BA
+  BW
+  BV
+  BR
+  IO
+  BN
+  BG
+  BF
+  BI
+  KH
+  CA
+  CV
+  BQ
+  KY
+  CF
+  TD
+  CL
+  CN
+  CX
+  CC
+  CO
+  KM
+  CG
+  CD
+  CK
+  CR
+  HR
+  CU
+  CW
+  CY
+  CZ
+  CI
+  DK
+  DJ
+  DM
+  DO
+  EC
+  EG
+  SV
+  GQ
+  ER
+  EE
+  SZ
+  ET
+  FK
+  FO
+  FJ
+  FI
+  FR
+  GF
+  PF
+  TF
+  GA
+  GM
+  GE
+  DE
+  GH
+  GI
+  GR
+  GL
+  GD
+  GP
+  GT
+  GG
+  GN
+  GW
+  GY
+  HT
+  HM
+  VA
+  HN
+  HK
+  HU
+  IS
+  IN
+  ID
+  IR
+  IQ
+  IE
+  IM
+  IL
+  IT
+  JM
+  JP
+  JE
+  JO
+  KZ
+  KE
+  KI
+  KP
+  XK
+  KW
+  KG
+  LA
+  LV
+  LB
+  LS
+  LR
+  LY
+  LI
+  LT
+  LU
+  MO
+  MG
+  MW
+  MY
+  MV
+  ML
+  MT
+  MQ
+  MR
+  MU
+  YT
+  MX
+  MD
+  MC
+  MN
+  ME
+  MS
+  MA
+  MZ
+  MM
+  NA
+  NR
+  NP
+  NL
+  AN
+  NC
+  NZ
+  NI
+  NE
+  NG
+  NU
+  NF
+  MK
+  NO
+  OM
+  PK
+  PS
+  PA
+  PG
+  PY
+  PE
+  PH
+  PN
+  PL
+  PT
+  QA
+  CM
+  RE
+  RO
+  RU
+  RW
+  BL
+  SH
+  KN
+  LC
+  MF
+  PM
+  WS
+  SM
+  ST
+  SA
+  SN
+  RS
+  SC
+  SL
+  SG
+  SX
+  SK
+  SI
+  SB
+  SO
+  ZA
+  GS
+  KR
+  SS
+  ES
+  LK
+  VC
+  SD
+  SR
+  SJ
+  SE
+  CH
+  SY
+  TW
+  TJ
+  TZ
+  TH
+  TL
+  TG
+  TK
+  TO
+  TT
+  TA
+  TN
+  TR
+  TM
+  TC
+  TV
+  UG
+  UA
+  AE
+  GB
+  US
+  UM
+  UY
+  UZ
+  VU
+  VE
+  VN
+  VG
+  WF
+  EH
+  YE
+  ZM
+  ZW
+  ZZ
+}
+
+enum CropRegion
+  @join__type(graph: PRODUCT)
+{
+  CENTER
+  TOP
+  BOTTOM
+  LEFT
+  RIGHT
+}
+
+enum CurrencyCode
+  @join__type(graph: PRODUCT)
+{
+  AED
+  AFN
+  ALL
+  AMD
+  ANG
+  AOA
+  ARS
+  AUD
+  AWG
+  AZN
+  BAM
+  BBD
+  BDT
+  BGN
+  BHD
+  BIF
+  BMD
+  BND
+  BOB
+  BRL
+  BSD
+  BTN
+  BWP
+  BYN
+  BZD
+  CAD
+  CDF
+  CHF
+  CLP
+  CNY
+  COP
+  CRC
+  CVE
+  CZK
+  DJF
+  DKK
+  DOP
+  DZD
+  EGP
+  ERN
+  ETB
+  EUR
+  FJD
+  FKP
+  GBP
+  GEL
+  GHS
+  GIP
+  GMD
+  GNF
+  GTQ
+  GYD
+  HKD
+  HNL
+  HRK
+  HTG
+  HUF
+  IDR
+  ILS
+  INR
+  IQD
+  IRR
+  ISK
+  JEP
+  JMD
+  JOD
+  JPY
+  KES
+  KGS
+  KHR
+  KID
+  KMF
+  KRW
+  KWD
+  KYD
+  KZT
+  LAK
+  LBP
+  LKR
+  LRD
+  LSL
+  LTL
+  LVL
+  LYD
+  MAD
+  MDL
+  MGA
+  MKD
+  MMK
+  MNT
+  MOP
+  MRU
+  MUR
+  MVR
+  MWK
+  MXN
+  MYR
+  MZN
+  NAD
+  NGN
+  NIO
+  NOK
+  NPR
+  NZD
+  OMR
+  PAB
+  PEN
+  PGK
+  PHP
+  PKR
+  PLN
+  PYG
+  QAR
+  RON
+  RSD
+  RUB
+  RWF
+  SAR
+  SBD
+  SCR
+  SDG
+  SEK
+  SGD
+  SHP
+  SLL
+  SOS
+  SRD
+  SSP
+  STN
+  SYP
+  SZL
+  THB
+  TJS
+  TMT
+  TND
+  TOP
+  TRY
+  TTD
+  TWD
+  TZS
+  UAH
+  UGX
+  USD
+  UYU
+  UZS
+  VED
+  VES
+  VND
+  VUV
+  WST
+  XAF
+  XCD
+  XOF
+  XPF
+  XXX
+  YER
+  ZAR
+  ZMW
+  BYR @deprecated
+}
+
+type Customer implements HasMetafields
+  @join__implements(graph: CUSTOMER, interface: "HasMetafields")
+  @join__type(graph: CUSTOMER)
+{
+  acceptsMarketing: Boolean!
+  addresses(after: String, before: String, first: Int, last: Int, reverse: Boolean = false): MailingAddressConnection!
+  createdAt: DateTime!
+  defaultAddress: MailingAddress
+  displayName: String!
+  email: String
+  firstName: String
+  id: ID!
+  lastName: String
+  metafield(key: String!, namespace: String!): Metafield
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+  numberOfOrders: UnsignedInt64!
+  phone: String
+  tags: [String!]!
+  updatedAt: DateTime!
+}
+
+type CustomerAccessToken
+  @join__type(graph: CUSTOMER)
+{
+  accessToken: String!
+  expiresAt: DateTime!
+}
+
+input CustomerAccessTokenCreateInput
+  @join__type(graph: CUSTOMER)
+{
+  email: String!
+  password: String!
+}
+
+type CustomerAccessTokenCreatePayload
+  @join__type(graph: CUSTOMER)
+{
+  customerAccessToken: CustomerAccessToken
+  customerUserErrors: [CustomerUserError!]!
+}
+
+type CustomerAccessTokenDeletePayload
+  @join__type(graph: CUSTOMER)
+{
+  deletedAccessToken: String
+  deletedCustomerAccessTokenId: String
+  userErrors: [UserError!]!
+}
+
+type CustomerAccessTokenRenewPayload
+  @join__type(graph: CUSTOMER)
+{
+  customerAccessToken: CustomerAccessToken
+  userErrors: [UserError!]!
+}
+
+input CustomerCreateInput
+  @join__type(graph: CUSTOMER)
+{
+  firstName: String
+  lastName: String
+  email: String!
+  phone: String
+  password: String!
+  acceptsMarketing: Boolean
+}
+
+type CustomerCreatePayload
+  @join__type(graph: CUSTOMER)
+{
+  customer: Customer
+  customerUserErrors: [CustomerUserError!]!
+}
+
+enum CustomerErrorCode
+  @join__type(graph: CUSTOMER)
+{
+  BLANK
+  INVALID
+  TAKEN
+  TOO_LONG
+  TOO_SHORT
+  UNIDENTIFIED_CUSTOMER
+  CUSTOMER_DISABLED
+  PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE
+  CONTAINS_HTML_TAGS
+  CONTAINS_URL
+  TOKEN_INVALID
+  ALREADY_ENABLED
+  NOT_FOUND
+  BAD_DOMAIN
+  INVALID_MULTIPASS_REQUEST
+}
+
+input CustomerUpdateInput
+  @join__type(graph: CUSTOMER)
+{
+  firstName: String
+  lastName: String
+  email: String
+  phone: String
+  password: String
+  acceptsMarketing: Boolean
+}
+
+type CustomerUpdatePayload
+  @join__type(graph: CUSTOMER)
+{
+  customer: Customer
+  customerAccessToken: CustomerAccessToken
+  customerUserErrors: [CustomerUserError!]!
+}
+
+type CustomerUserError implements DisplayableError
+  @join__implements(graph: CUSTOMER, interface: "DisplayableError")
+  @join__type(graph: CUSTOMER)
+{
+  code: CustomerErrorCode
+  field: [String!]
+  message: String!
+}
+
+scalar DateTime
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+
+scalar Decimal
+  @join__type(graph: PRODUCT)
+
+interface DisplayableError
+  @join__type(graph: CUSTOMER)
+{
+  field: [String!]
+  message: String!
+}
+
+type Filter
+  @join__type(graph: PRODUCT)
+{
+  id: String!
+  label: String!
+  type: FilterType!
+}
+
+enum FilterType
+  @join__type(graph: PRODUCT)
+{
+  LIST
+  PRICE_RANGE
+  BOOLEAN
+}
+
+input GeoCoordinateInput
+  @join__type(graph: SHOP)
+{
+  latitude: Float!
+  longitude: Float!
+}
+
+interface HasMetafields
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  metafield(namespace: String!, key: String!): Metafield
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+}
+
+input HasMetafieldsIdentifier
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  namespace: String!
+  key: String!
+}
+
+scalar HTML
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+
+type Image
+  @join__type(graph: PRODUCT)
+{
+  altText: String
+  height: Int
+  id: ID
+  url(transform: ImageTransformInput): URL!
+  width: Int
+  originalSrc: URL! @deprecated
+  src: URL! @deprecated
+  transformedSrc: URL! @deprecated
+}
+
+type ImageConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [ImageEdge!]!
+  nodes: [Image!]!
+  pageInfo: PageInfo!
+}
+
+enum ImageContentType
+  @join__type(graph: PRODUCT)
+{
+  PNG
+  JPG
+  WEBP
+}
+
+type ImageEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: Image!
+}
+
+input ImageTransformInput
+  @join__type(graph: PRODUCT)
+{
+  crop: CropRegion
+  maxWidth: Int
+  maxHeight: Int
+  scale: Int = 1
+  preferredContentType: ImageContentType
+}
+
+scalar join__FieldSet
+
+enum join__Graph {
+  CUSTOMER @join__graph(name: "customer", url: "https://customer.api.gshopper.com/")
+  PRODUCT @join__graph(name: "product", url: "https://product.api.gshopper.com/")
+  SHOP @join__graph(name: "shop", url: "https://shop.api.gshopper.com/")
+}
+
+scalar JSON
+  @join__type(graph: PRODUCT)
+
+enum LanguageCode
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP)
+{
+  AF
+  AK
+  AM
+  AR
+  AS
+  AZ
+  BE
+  BG
+  BM
+  BN
+  BO
+  BR
+  BS
+  CA
+  CE
+  CS
+  CU
+  CY
+  DA
+  DE
+  DZ
+  EE
+  EL
+  EN
+  EO
+  ES
+  ET
+  EU
+  FA
+  FF
+  FI
+  FO
+  FR
+  FY
+  GA
+  GD
+  GL
+  GU
+  GV
+  HA
+  HE
+  HI
+  HR
+  HU
+  HY
+  IA
+  ID
+  IG
+  II
+  IS
+  IT
+  JA
+  JV
+  KA
+  KI
+  KK
+  KL
+  KM
+  KN
+  KO
+  KS
+  KU
+  KW
+  KY
+  LB
+  LG
+  LN
+  LO
+  LT
+  LU
+  LV
+  MG
+  MI
+  MK
+  ML
+  MN
+  MR
+  MS
+  MT
+  MY
+  NB
+  ND
+  NE
+  NL
+  NN
+  NO
+  OM
+  OR
+  OS
+  PA
+  PL
+  PS
+  PT_BR
+  PT_PT
+  QU
+  RM
+  RN
+  RO
+  RU
+  RW
+  SD
+  SE
+  SG
+  SI
+  SK
+  SL
+  SN
+  SO
+  SQ
+  SR
+  SU
+  SV
+  SW
+  TA
+  TE
+  TG
+  TH
+  TI
+  TK
+  TO
+  TR
+  TT
+  UG
+  UK
+  UR
+  UZ
+  VI
+  WO
+  XH
+  YI
+  YO
+  ZH_CN
+  ZH_TW
+  ZU
+  ZH
+  PT
+  VO
+}
+
+scalar link__Import
+
+enum link__Purpose {
+  """
+  `SECURITY` features provide metadata necessary to securely resolve fields.
+  """
+  SECURITY
+
+  """
+  `EXECUTION` features provide metadata necessary for operation execution.
+  """
+  EXECUTION
+}
+
+type Location implements Node
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__implements(graph: SHOP, interface: "Node")
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP, key: "id")
+{
+  id: ID!
+  address: LocationAddress! @join__field(graph: SHOP)
+  name: String! @join__field(graph: SHOP)
+}
+
+type LocationAddress
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP)
+{
+  address1: String
+  address2: String
+  city: String
+  country: String
+  countryCode: String
+  formatted: [String!]!
+  latitude: Float
+  longitude: Float
+  phone: String
+  province: String
+  provinceCode: String
+  zip: String
+}
+
+type LocationConnection
+  @join__type(graph: SHOP)
+{
+  edges: [LocationEdge!]!
+  nodes: [Location!]!
+  pageInfo: PageInfo!
+}
+
+type LocationEdge
+  @join__type(graph: SHOP)
+{
+  cursor: String!
+  node: Location!
+}
+
+enum LocationSortKeys
+  @join__type(graph: SHOP)
+{
+  ID
+  NAME
+  CITY
+  DISTANCE
+}
+
+type MailingAddress implements Node
+  @join__implements(graph: CUSTOMER, interface: "Node")
+  @join__type(graph: CUSTOMER)
+{
+  address1: String
+  address2: String
+  city: String
+  company: String
+  country: String
+  countryCodeV2: CountryCode
+  firstName: String
+  formatted(withName: Boolean = false, withCompany: Boolean = true): [String!]!
+  formattedArea: String
+  id: ID!
+  lastName: String
+  latitude: Float
+  longitude: Float
+  name: String
+  phone: String
+  province: String
+  provinceCode: String
+  zip: String
+  countryCode: String @deprecated(reason: "Use `countryCodeV2` instead.")
+}
+
+type MailingAddressConnection
+  @join__type(graph: CUSTOMER)
+{
+  edges: [MailingAddressEdge!]!
+  nodes: [MailingAddress!]!
+  pageInfo: PageInfo!
+}
+
+type MailingAddressEdge
+  @join__type(graph: CUSTOMER)
+{
+  cursor: String!
+  node: MailingAddress!
+}
+
+interface Media
+  @join__type(graph: PRODUCT)
+{
+  alt: String
+  mediaContentType: MediaContentType!
+  previewImage: Image
+}
+
+type MediaConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [MediaEdge!]!
+  nodes: [Media!]!
+  pageInfo: PageInfo!
+}
+
+enum MediaContentType
+  @join__type(graph: PRODUCT)
+{
+  EXTERNAL_VIDEO
+  IMAGE
+  MODEL_3D
+  VIDEO
+}
+
+type MediaEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: Media!
+}
+
+type Metafield implements Node
+  @join__implements(graph: CUSTOMER, interface: "Node")
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  createdAt: DateTime!
+  description: String
+  id: ID!
+  key: String!
+  namespace: String!
+  parentResource: MetafieldParentResource!
+  reference: MetafieldReference
+  references(first: Int, after: String, last: Int, before: String): MetafieldReferenceConnection
+  type: String!
+  updatedAt: DateTime!
+  value: String!
+}
+
+input MetafieldFilter
+  @join__type(graph: PRODUCT)
+{
+  namespace: String!
+  key: String!
+  value: String!
+}
+
+union MetafieldParentResource
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+ = Customer | Collection | Product | ProductVariant
+
+union MetafieldReference
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+ = Page | Collection | Product | ProductVariant
+
+type MetafieldReferenceConnection
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  edges: [MetafieldReferenceEdge!]!
+  nodes: [MetafieldReference!]!
+  pageInfo: PageInfo!
+}
+
+type MetafieldReferenceEdge
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: MetafieldReference!
+}
+
+type MoneyV2
+  @join__type(graph: PRODUCT)
+{
+  amount: Decimal!
+  currencyCode: CurrencyCode!
+}
+
+type Mutation
+  @inContext
+  @join__type(graph: CUSTOMER)
+{
+  customerAccessTokenCreate(input: CustomerAccessTokenCreateInput!): CustomerAccessTokenCreatePayload
+  customerAccessTokenRenew(customerAccessToken: String!): CustomerAccessTokenRenewPayload
+  customerAccessTokenDelete(customerAccessToken: String!): CustomerAccessTokenDeletePayload
+  customerCreate(input: CustomerCreateInput!): CustomerCreatePayload
+  customerUpdate(customerAccessToken: String!, customer: CustomerUpdateInput!): CustomerUpdatePayload
+}
+
+interface Node
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP)
+{
+  id: ID!
+}
+
+interface OnlineStorePublishable
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  onlineStoreUrl: URL
+}
+
+type Page implements Node & HasMetafields & OnlineStorePublishable
+  @join__implements(graph: CUSTOMER, interface: "Node")
+  @join__implements(graph: CUSTOMER, interface: "HasMetafields")
+  @join__implements(graph: CUSTOMER, interface: "OnlineStorePublishable")
+  @join__type(graph: CUSTOMER)
+{
+  body: HTML!
+  bodySummary: String!
+  createdAt: DateTime!
+  handle: String!
+  id: ID!
+  metafield(namespace: String!, key: String!): Metafield
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+  onlineStoreUrl: URL
+  seo: SEO
+  title: String!
+  updatedAt: DateTime!
+}
+
+type PageInfo
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP)
+{
+  endCursor: String
+  hasNextPage: Boolean!
+  hasPreviousPage: Boolean!
+  startCursor: String
+}
+
+input PriceRangeFilter
+  @join__type(graph: PRODUCT)
+{
+  min: Float = 0
+  max: Float
+}
+
+type Product implements HasMetafields & Node & OnlineStorePublishable
+  @join__implements(graph: PRODUCT, interface: "HasMetafields")
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__implements(graph: PRODUCT, interface: "OnlineStorePublishable")
+  @join__type(graph: PRODUCT)
+{
+  availableForSale: Boolean!
+  collections(after: String, before: String, first: Int, last: Int, reverse: Boolean = false): CollectionConnection!
+  compareAtPriceRange: ProductPriceRange!
+  createdAt: DateTime!
+  description(truncateAt: Int): String!
+  descriptionHtml: HTML!
+  featuredImage: Image
+  handle: String!
+  id: ID!
+  images(after: String, before: String, first: Int, last: Int, reverse: Boolean = false, sortKey: ProductImageSortKeys = POSITION): ImageConnection!
+  isGiftCard: Boolean!
+  media(after: String, before: String, first: Int, last: Int, reverse: Boolean = false, sortKey: ProductMediaSortKeys = POSITION): MediaConnection!
+  metafield(key: String!, namespace: String!): Metafield
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+  onlineStoreUrl: URL
+  options(first: Int): [ProductOption!]!
+  priceRange: ProductPriceRange!
+  productType: String!
+  publishedAt: DateTime!
+  requiresSellingPlan: Boolean!
+  sellingPlanGroups(first: Int, after: String, last: Int, before: String, reverse: Boolean = false): SellingPlanGroupConnection!
+  seo: SEO!
+  tags: [String!]!
+  title: String!
+  totalInventory: Int
+  updatedAt: DateTime!
+  variantBySelectedOptions(selectedOptions: [SelectedOptionInput!]!): ProductVariant
+  variants(first: Int, after: String, last: Int, before: String, reverse: Boolean = false, sortKey: ProductVariantSortKeys = POSITION): ProductVariantConnection!
+  vendor: String!
+}
+
+enum ProductCollectionSortKeys
+  @join__type(graph: PRODUCT)
+{
+  BEST_SELLING
+  COLLECTION_DEFAULT
+  CREATED
+  ID
+  MANUAL
+  PRICE
+  RELEVANCE
+  TITLE
+}
+
+type ProductConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [ProductEdge!]!
+  filters: [Filter!]!
+  nodes: [Product!]!
+  pageInfo: PageInfo!
+}
+
+type ProductEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: Product!
+}
+
+input ProductFilter
+  @join__type(graph: PRODUCT)
+{
+  available: Boolean
+  variantOption: VariantOptionFilter
+  productType: String
+  productVendor: String
+  price: PriceRangeFilter
+  productMetafield: MetafieldFilter
+  variantMetafield: MetafieldFilter
+}
+
+enum ProductImageSortKeys
+  @join__type(graph: PRODUCT)
+{
+  CREATED_AT
+  ID
+  POSITION
+  RELEVANCE
+}
+
+enum ProductMediaSortKeys
+  @join__type(graph: PRODUCT)
+{
+  ID
+  POSITION
+  RELEVANCE
+}
+
+type ProductOption implements Node
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__type(graph: PRODUCT)
+{
+  id: ID!
+  name: String!
+  values: [String!]!
+}
+
+type ProductPriceRange
+  @join__type(graph: PRODUCT)
+{
+  maxVariantPrice: MoneyV2!
+  minVariantPrice: MoneyV2!
+}
+
+enum ProductSortKeys
+  @join__type(graph: PRODUCT)
+{
+  TITLE
+  PRODUCT_TYPE
+  VENDOR
+  UPDATED_AT
+  CREATED_AT
+  BEST_SELLING
+  PRICE
+  ID
+  RELEVANCE
+}
+
+type ProductVariant implements Node & HasMetafields
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__implements(graph: PRODUCT, interface: "HasMetafields")
+  @join__type(graph: PRODUCT)
+{
+  availableForSale: Boolean!
+  barcode: String
+  compareAtPrice: MoneyV2
+  currentlyNotInStock: Boolean!
+  id: ID!
+  image: Image
+  metafield(namespace: String!, key: String!): Metafield
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+  price: MoneyV2!
+  product: Product!
+  quantityAvailable: Int
+  requiresShipping: Boolean!
+  selectedOptions: [SelectedOption!]!
+  sellingPlanAllocations(first: Int, after: String, last: Int, before: String, reverse: Boolean = false): SellingPlanAllocationConnection!
+  sku: String
+  storeAvailability(first: Int, after: String, last: Int, before: String, reverse: Boolean = false): StoreAvailabilityConnection!
+  title: String!
+  unitPrice: MoneyV2
+  unitPriceMeasurement: UnitPriceMeasurement
+  weight: Float
+  weightUnit: WeightUnit!
+}
+
+type ProductVariantConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [ProductVariantEdge!]!
+  nodes: [ProductVariant!]!
+  pageInfo: PageInfo!
+}
+
+type ProductVariantEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: ProductVariant!
+}
+
+enum ProductVariantSortKeys
+  @join__type(graph: PRODUCT)
+{
+  TITLE
+  SKU
+  POSITION
+  ID
+  RELEVANCE
+}
+
+type Query
+  @inContext
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+  @join__type(graph: SHOP)
+{
+  customer(customerAccessToken: String!): Customer @join__field(graph: CUSTOMER)
+  collection(handle: String, id: ID): Collection @join__field(graph: PRODUCT)
+  collections(after: String, before: String, first: Int, last: Int, query: String, reverse: Boolean = false, sortKey: CollectionSortKeys = ID): CollectionConnection! @join__field(graph: PRODUCT)
+  product(handle: String, id: ID): Product @join__field(graph: PRODUCT)
+  products(after: String, before: String, first: Int, last: Int, query: String, reverse: Boolean = false, sortKey: ProductSortKeys = ID): ProductConnection! @join__field(graph: PRODUCT)
+  productTags(first: Int!): StringConnection! @join__field(graph: PRODUCT)
+  productTypes(first: Int!): StringConnection! @join__field(graph: PRODUCT)
+  productRecommendations(productId: ID!): [Product!] @join__field(graph: PRODUCT)
+  locations(after: String, before: String, first: Int, last: Int, near: GeoCoordinateInput, reverse: Boolean = false, sortKey: LocationSortKeys = ID): LocationConnection! @join__field(graph: SHOP)
+}
+
+type SelectedOption
+  @join__type(graph: PRODUCT)
+{
+  name: String!
+  value: String!
+}
+
+input SelectedOptionInput
+  @join__type(graph: PRODUCT)
+{
+  name: String!
+  value: String!
+}
+
+type SellingPlan implements Node
+  @join__implements(graph: PRODUCT, interface: "Node")
+  @join__type(graph: PRODUCT)
+{
+  checkoutCharge: SellingPlanCheckoutCharge!
+  description: String
+  id: ID!
+  name: String!
+  options: [SellingPlanOption!]!
+  priceAdjustments: [SellingPlanPriceAdjustment!]!
+  recurringDeliveries: Boolean!
+}
+
+type SellingPlanAllocation
+  @join__type(graph: PRODUCT)
+{
+  checkoutChargeAmount: MoneyV2!
+  priceAdjustments: [SellingPlanAllocationPriceAdjustment!]!
+  remainingBalanceChargeAmount: MoneyV2!
+  sellingPlan: SellingPlan!
+}
+
+type SellingPlanAllocationConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [SellingPlanAllocationEdge!]!
+  nodes: [SellingPlanAllocation!]!
+  pageInfo: PageInfo!
+}
+
+type SellingPlanAllocationEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: SellingPlanAllocation!
+}
+
+type SellingPlanAllocationPriceAdjustment
+  @join__type(graph: PRODUCT)
+{
+  compareAtPrice: MoneyV2!
+  perDeliveryPrice: MoneyV2!
+  price: MoneyV2!
+  unitPrice: MoneyV2
+}
+
+type SellingPlanCheckoutCharge
+  @join__type(graph: PRODUCT)
+{
+  type: SellingPlanCheckoutChargeType!
+  value: SellingPlanCheckoutChargeValue!
+}
+
+type SellingPlanCheckoutChargePercentageValue
+  @join__type(graph: PRODUCT)
+{
+  percentage: Float!
+}
+
+enum SellingPlanCheckoutChargeType
+  @join__type(graph: PRODUCT)
+{
+  PERCENTAGE
+  PRICE
+}
+
+union SellingPlanCheckoutChargeValue
+  @join__type(graph: PRODUCT)
+ = MoneyV2 | SellingPlanCheckoutChargePercentageValue
+
+type SellingPlanConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [SellingPlanEdge!]!
+  nodes: [SellingPlan!]!
+  pageInfo: PageInfo!
+}
+
+type SellingPlanEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: SellingPlan!
+}
+
+type SellingPlanFixedAmountPriceAdjustment
+  @join__type(graph: PRODUCT)
+{
+  adjustmentAmount: MoneyV2!
+}
+
+type SellingPlanFixedPriceAdjustment
+  @join__type(graph: PRODUCT)
+{
+  price: MoneyV2!
+}
+
+type SellingPlanGroup
+  @join__type(graph: PRODUCT)
+{
+  appName: String
+  name: String!
+  options: [SellingPlanGroupOption!]!
+  sellingPlans(first: Int, after: String, last: Int, before: String, reverse: Boolean = false): SellingPlanConnection!
+}
+
+type SellingPlanGroupConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [SellingPlanGroupEdge!]!
+  nodes: [SellingPlanGroup!]!
+  pageInfo: PageInfo!
+}
+
+type SellingPlanGroupEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: SellingPlanGroup!
+}
+
+type SellingPlanGroupOption
+  @join__type(graph: PRODUCT)
+{
+  name: String!
+  values: [String!]!
+}
+
+type SellingPlanOption
+  @join__type(graph: PRODUCT)
+{
+  name: String
+  value: String
+}
+
+type SellingPlanPercentagePriceAdjustment
+  @join__type(graph: PRODUCT)
+{
+  adjustmentPercentage: Int!
+}
+
+type SellingPlanPriceAdjustment
+  @join__type(graph: PRODUCT)
+{
+  adjustmentValue: SellingPlanPriceAdjustmentValue!
+  orderCount: Int
+}
+
+union SellingPlanPriceAdjustmentValue
+  @join__type(graph: PRODUCT)
+ = SellingPlanFixedAmountPriceAdjustment | SellingPlanFixedPriceAdjustment | SellingPlanPercentagePriceAdjustment
+
+type SEO
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+{
+  description: String
+  title: String
+}
+
+type StoreAvailability
+  @join__type(graph: PRODUCT)
+{
+  available: Boolean!
+  location: Location!
+  pickUpTime: String!
+}
+
+type StoreAvailabilityConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [StoreAvailabilityEdge!]!
+  nodes: [StoreAvailability!]!
+  pageInfo: PageInfo!
+}
+
+type StoreAvailabilityEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: StoreAvailability!
+}
+
+type StringConnection
+  @join__type(graph: PRODUCT)
+{
+  edges: [StringEdge!]!
+  pageInfo: PageInfo!
+}
+
+type StringEdge
+  @join__type(graph: PRODUCT)
+{
+  cursor: String!
+  node: String!
+}
+
+type UnitPriceMeasurement
+  @join__type(graph: PRODUCT)
+{
+  measuredType: UnitPriceMeasurementMeasuredType
+  quantityUnit: UnitPriceMeasurementMeasuredUnit
+  quantityValue: Float!
+  referenceUnit: UnitPriceMeasurementMeasuredUnit
+  referenceValue: Int!
+}
+
+enum UnitPriceMeasurementMeasuredType
+  @join__type(graph: PRODUCT)
+{
+  AREA
+  LENGTH
+  VOLUME
+  WEIGHT
+}
+
+enum UnitPriceMeasurementMeasuredUnit
+  @join__type(graph: PRODUCT)
+{
+  CL
+  CM
+  G
+  KG
+  L
+  M
+  M2
+  M3
+  MG
+  ML
+  MM
+}
+
+scalar UnsignedInt64
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+
+scalar URL
+  @join__type(graph: CUSTOMER)
+  @join__type(graph: PRODUCT)
+
+type UserError implements DisplayableError
+  @join__implements(graph: CUSTOMER, interface: "DisplayableError")
+  @join__type(graph: CUSTOMER)
+{
+  field: [String!]
+  message: String!
+}
+
+input VariantOptionFilter
+  @join__type(graph: PRODUCT)
+{
+  name: String!
+  value: String!
+}
+
+enum WeightUnit
+  @join__type(graph: PRODUCT)
+{
+  KILOGRAMS
+  GRAMS
+  POUNDS
+  OUNCES
+}
+
+directive @inContext(
+    language: LanguageCode,
+    country: CountryCode
+) on QUERY | MUTATION | OBJECT

+ 1668 - 0
subgraph/customer.graphql

@@ -0,0 +1,1668 @@
+directive @goTag(
+  key: String!
+  value: String
+) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
+
+scalar DateTime
+scalar UnsignedInt64
+scalar URL
+scalar HTML
+
+union MetafieldParentResource = Customer
+union MetafieldReference = Page
+
+type Query {
+  # Find a customer by its access token.
+  customer(customerAccessToken: String!): Customer
+}
+
+type Mutation {
+  # Creates a customer access token.
+  # The customer access token is required to modify the customer object in any way.
+  customerAccessTokenCreate(input: CustomerAccessTokenCreateInput!): CustomerAccessTokenCreatePayload
+
+  # Renews a customer access token.
+  #
+  # Access token renewal must happen before a token expires.
+  # If a token has already expired, a new one should be created instead via `customerAccessTokenCreate`.
+  customerAccessTokenRenew(customerAccessToken: String!): CustomerAccessTokenRenewPayload
+
+  # Permanently destroys a customer access token.
+  customerAccessTokenDelete(customerAccessToken: String!): CustomerAccessTokenDeletePayload
+
+  # Creates a new customer.
+  customerCreate(input: CustomerCreateInput!): CustomerCreatePayload
+
+  # Updates an existing customer.
+  customerUpdate(customerAccessToken: String! customer: CustomerUpdateInput!): CustomerUpdatePayload
+}
+
+type Page implements Node&HasMetafields&OnlineStorePublishable{
+  # The description of the page, complete with HTML formatting.
+  body: HTML!
+
+  # Summary of the page body.
+  bodySummary: String!
+
+  # The timestamp of the page creation.
+  createdAt: DateTime!
+
+  # A human-friendly unique string for the page automatically generated from its title.
+  handle: String!
+
+  # A globally-unique identifier.
+  id: ID!
+
+  # Returns a metafield found by namespace and key.
+  metafield(namespace: String!key: String!): Metafield
+
+  # The metafields associated with the resource matching the supplied list of namespaces and keys.
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+
+  # The URL used for viewing the resource on the shop's Online Store. Returns `null` if the resource is currently not published to the Online Store sales channel.
+  onlineStoreUrl: URL
+
+  # The page's SEO information.
+  seo: SEO
+
+  # The title of the page.
+  title: String!
+
+  # The timestamp of the latest page update.
+  updatedAt: DateTime!
+}
+
+# SEO information.
+type SEO {
+  # The meta description.
+  description: String
+
+  # The SEO title.
+  title: String
+}
+
+# Represents a resource that can be published to the Online Store sales channel.
+interface OnlineStorePublishable {
+  # The URL used for viewing the resource on the shop's Online Store. Returns `null` if the resource is currently not published to the Online Store sales channel.
+  onlineStoreUrl: URL
+}
+
+# Represents information about the metafields associated to the specified resource.
+interface HasMetafields {
+  # Returns a metafield found by namespace and key.
+  metafield(namespace: String!key: String!): Metafield
+
+  # The metafields associated with the resource matching the supplied list of namespaces and keys.
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+}
+
+type MetafieldReferenceEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of MetafieldReferenceEdge.
+  node: MetafieldReference!
+}
+
+# An object with an ID field to support global identification, in accordance with the
+# Relay specification.
+# This interface is used by the node
+# and nodes queries.
+interface Node {
+  # A globally-unique identifier.
+  id: ID!
+}
+
+# Metafields represent custom metadata attached to a resource.
+# Metafields can be sorted into namespaces and are comprised of keys, values, and value types.
+type Metafield implements Node {
+  # The date and time when the storefront metafield was created.
+  createdAt: DateTime!
+
+  # The description of a metafield.
+  description: String
+
+  # A globally-unique identifier.
+  id: ID!
+
+  # The key name for a metafield.
+  key: String!
+
+  # The namespace for a metafield.
+  namespace: String!
+
+  # The parent object that the metafield belongs to.
+  parentResource: MetafieldParentResource!
+
+  # Returns a reference object if the metafield definition's type is a resource reference.
+  reference: MetafieldReference
+
+  # A list of reference objects if the metafield's type is a resource reference list.
+  references(
+    first: Int
+    after: String
+    last: Int
+    before: String
+  ): MetafieldReferenceConnection
+
+  # The type name of the metafield. See the list of supported types.
+  type: String!
+
+  # The date and time when the storefront metafield was updated.
+  updatedAt: DateTime!
+
+  # The value of a metafield.
+  value: String!
+}
+
+# An auto-generated type for paginating through multiple MetafieldReferences.
+type MetafieldReferenceConnection {
+  # A list of edges.
+  edges: [MetafieldReferenceEdge!]!
+
+  # A list of the nodes contained in MetafieldReferenceEdge.
+  nodes: [MetafieldReference!]!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# Identifies a metafield on an owner resource by namespace and key.
+input HasMetafieldsIdentifier {
+  # A container for a set of metafields.
+  namespace: String!
+
+  # The identifier for the metafield.
+  key: String!
+}
+
+# Returns information about pagination in a connection, in accordance with the Relay specification.
+type PageInfo {
+  # The cursor corresponding to the last node in edges.
+  endCursor: String
+
+  # Whether there are more pages to fetch following the current page.
+  hasNextPage: Boolean!
+
+  # Whether there are any pages prior to the current page.
+  hasPreviousPage: Boolean!
+
+  # The cursor corresponding to the first node in edges.
+  startCursor: String
+}
+
+# A customer represents a customer account with the shop.
+# Customer accounts store contact information for the customer,
+# saving logged-in customers the trouble of having to provide it at every checkout.
+type Customer implements HasMetafields {
+  # Indicates whether the customer has consented to be sent marketing material via email.
+  acceptsMarketing: Boolean! @goTag(key: "mapstructure" value: "accepts_marketing")
+
+  # A list of addresses for the customer.
+  addresses(
+    after: String
+    before: String
+    first: Int
+    last: Int
+    reverse: Boolean = false
+  ): MailingAddressConnection! @goTag(key: "mapstructure" value: "addresses")
+
+  # The date and time when the customer was created.
+  createdAt: DateTime! @goTag(key: "mapstructure" value: "created_at")
+
+  # The customer’s default address.
+  defaultAddress: MailingAddress @goTag(key: "mapstructure" value: "default_address")
+
+  # The customer’s name, email or phone number.
+  displayName: String! @goTag(key: "mapstructure" value: "name")
+
+  # The customer’s email address.
+  email: String @goTag(key: "mapstructure" value: "email")
+
+  # The customer’s first name.
+  firstName: String @goTag(key: "mapstructure" value: "given_name")
+
+  # A unique identifier for the customer.
+  id: ID! @goTag(key: "mapstructure" value: "sub")
+
+  # The customer's most recently updated, incomplete checkout.
+  # lastIncompleteCheckout: Checkout
+
+  # The customer’s last name.
+  lastName: String @goTag(key: "mapstructure" value: "family_name")
+
+  # Returns a metafield found by namespace and key.
+  metafield(key: String!namespace: String!): Metafield @goTag(key: "mapstructure" value: "metafield")
+
+  # The metafields associated with the resource matching the supplied list of namespaces and keys.
+  metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]! @goTag(key: "mapstructure" value: "metafields")
+
+  # The number of orders that the customer has made at the store in their lifetime.
+  numberOfOrders: UnsignedInt64! @goTag(key: "mapstructure" value: "number_of_orders")
+
+  # The orders associated with the customer.
+#  orders(
+#    after: String
+#    before: String
+#    first: Int
+#    last: Int
+#    query: String
+#    reverse: Boolean = false
+#    sortKey: OrderSortKeys = ID
+#  ): OrderConnection! @goTag(key: "mapstructure" value: "orders")
+
+  # The customer’s phone number.
+  phone: String @goTag(key: "mapstructure" value: "phone_number")
+
+  # A comma separated list of tags that have been added to the customer.
+  # Additional access scope required: unauthenticated_read_customer_tags.
+  tags: [String!]! @goTag(key: "mapstructure" value: "tags")
+
+  # The date and time when the customer information was updated.
+  updatedAt: DateTime! @goTag(key: "mapstructure" value: "updated_at")
+}
+
+# An auto-generated type for paginating through multiple MailingAddresses.
+type MailingAddressConnection {
+  # A list of edges.
+  edges: [MailingAddressEdge!]!
+
+  # A list of the nodes contained in MailingAddressEdge.
+  nodes: [MailingAddress!]!
+
+  # Information to aid in pagination.
+  pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one MailingAddress and a cursor during pagination.
+type MailingAddressEdge {
+  # A cursor for use in pagination.
+  cursor: String!
+
+  # The item at the end of MailingAddressEdge.
+  node: MailingAddress!
+}
+
+# Represents a mailing address for customers and shipping.
+type MailingAddress implements Node {
+  # The first line of the address. Typically the street address or PO Box number.
+  address1: String
+
+  # The second line of the address. Typically the number of the apartment, suite, or unit.
+  address2: String
+
+  # The name of the city, district, village, or town.
+  city: String
+
+  # The name of the customer's company or organization.
+  company: String
+
+  # The name of the country.
+  country: String
+
+  # The two-letter code for the country of the address.
+  #
+  # For example, US.
+  countryCodeV2: CountryCode
+
+  # The first name of the customer.
+  firstName: String
+
+  # A formatted version of the address, customized by the provided arguments.
+  formatted(withName: Boolean = false, withCompany: Boolean = true): [String!]!
+
+  # A comma-separated list of the values for city, province, and country.
+  formattedArea: String
+
+  # A globally-unique identifier.
+  id: ID!
+
+  # The last name of the customer.
+  lastName: String
+
+  # The latitude coordinate of the customer address.
+  latitude: Float
+
+  # The longitude coordinate of the customer address.
+  longitude: Float
+
+  # The full name of the customer, based on firstName and lastName.
+  name: String
+
+  # A unique phone number for the customer.
+  #
+  # Formatted using E.164 standard. For example, +16135551111.
+  phone: String
+
+  # The region of the address, such as the province, state, or district.
+  province: String
+
+  # The two-letter code for the region.
+  #
+  # For example, ON.
+  provinceCode: String
+
+  # The zip or postal code of the address.
+  zip: String
+
+  # The two-letter code for the country of the address.
+  countryCode: String @deprecated(reason: "Use `countryCodeV2` instead.")
+}
+
+type CustomerAccessTokenCreatePayload {
+  customerAccessToken:  CustomerAccessToken
+  customerUserErrors: [CustomerUserError!]!
+}
+
+type CustomerAccessTokenRenewPayload {
+  customerAccessToken: CustomerAccessToken
+  userErrors: [UserError!]!
+}
+
+input CustomerAccessTokenCreateInput {
+  email: String!
+  password: String!
+}
+
+type CustomerAccessToken {
+  accessToken: String!
+  expiresAt: DateTime!
+}
+
+interface DisplayableError {
+  field: [String!]
+  message: String!
+}
+
+type UserError implements DisplayableError {
+  field: [String!]
+  message: String!
+}
+
+type CustomerUserError implements DisplayableError {
+  code: CustomerErrorCode
+  field: [String!]
+  message: String!
+}
+
+enum CustomerErrorCode {
+  # The input value is blank.
+  BLANK
+
+  # The input value is invalid.
+  INVALID
+
+  # The input value is already taken.
+  TAKEN
+
+  # The input value is too long.
+  TOO_LONG
+
+  # The input value is too short.
+  TOO_SHORT
+
+  # Unidentified customer.
+  UNIDENTIFIED_CUSTOMER
+
+  # Customer is disabled.
+  CUSTOMER_DISABLED
+
+  # Input password starts or ends with whitespace.
+  PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE
+
+  # Input contains HTML tags.
+  CONTAINS_HTML_TAGS
+
+  # Input contains URL.
+  CONTAINS_URL
+
+  # Invalid activation token.
+  TOKEN_INVALID
+
+  # Customer already enabled.
+  ALREADY_ENABLED
+
+  # Address does not exist.
+  NOT_FOUND
+
+  # Input email contains an invalid domain name.
+  BAD_DOMAIN
+
+  # Multipass token is not valid.
+  INVALID_MULTIPASS_REQUEST
+}
+
+# Return type for `customerAccessTokenDelete` mutation.
+type CustomerAccessTokenDeletePayload {
+  # The destroyed access token.
+  deletedAccessToken: String
+
+  # ID of the destroyed customer access token.
+  deletedCustomerAccessTokenId: String
+
+  # The list of errors that occurred from executing the mutation.
+  userErrors: [UserError!]!
+}
+
+# Specifies the fields required to update the Customer information.
+input CustomerUpdateInput {
+  # The customer’s first name.
+  firstName: String
+
+  # The customer’s last name.
+  lastName: String
+
+  # The customer’s email.
+  email: String
+
+  # A unique phone number for the customer.
+  #
+  # Formatted using E.164 standard. For example, +16135551111. To remove the phone number, specify null.
+  phone: String
+
+  # The login password used by the customer.
+  password: String
+
+  # Indicates whether the customer has consented to be sent marketing material via email.
+  acceptsMarketing: Boolean
+}
+
+# The fields required to create a new customer.
+input CustomerCreateInput {
+  # The customer’s first name.
+  firstName: String
+
+  # The customer’s last name.
+  lastName: String
+
+  # The customer’s email.
+  email: String!
+
+  # A unique phone number for the customer.
+  #
+  # Formatted using E.164 standard. For example, +16135551111.
+  phone: String
+
+  # The login password used by the customer.
+  password: String!
+
+  # Indicates whether the customer has consented to be sent marketing material via email.
+  acceptsMarketing: Boolean
+}
+
+# Return type for `customerCreate` mutation.
+type CustomerCreatePayload {
+  # The created customer object.
+  customer: Customer
+
+  # The list of errors that occurred from executing the mutation.
+  customerUserErrors: [CustomerUserError!]!
+}
+
+# Return type for `customerUpdate` mutation.
+type CustomerUpdatePayload {
+  # The updated customer object.
+  customer: Customer
+
+  # The newly created customer access token. If the customer's password is updated, all previous access tokens
+  # (including the one used to perform this mutation) become invalid, and a new token is generated.
+  customerAccessToken: CustomerAccessToken
+
+  # The list of errors that occurred from executing the mutation.
+  customerUserErrors: [CustomerUserError!]!
+}
+
+# ISO 639-1 language codes supported by Shopify.
+enum LanguageCode {
+  # Afrikaans
+  AF
+
+  # Akan
+  AK
+
+  # Amharic
+  AM
+
+  # Arabic
+  AR
+
+  # Assamese
+  AS
+
+  # Azerbaijani
+  AZ
+
+  # Belarusian
+  BE
+
+  # Bulgarian
+  BG
+
+  # Bambara
+  BM
+
+  # Bangla
+  BN
+
+  # Tibetan
+  BO
+
+  # Breton
+  BR
+
+  # Bosnian
+  BS
+
+  # Catalan
+  CA
+
+  # Chechen
+  CE
+
+  # Czech
+  CS
+
+  # Church Slavic
+  CU
+
+  # Welsh
+  CY
+
+  # Danish
+  DA
+
+  # German
+  DE
+
+  # Dzongkha
+  DZ
+
+  # Ewe
+  EE
+
+  # Greek
+  EL
+
+  # English
+  EN
+
+  # Esperanto
+  EO
+
+  # Spanish
+  ES
+
+  # Estonian
+  ET
+
+  # Basque
+  EU
+
+  # Persian
+  FA
+
+  # Fulah
+  FF
+
+  # Finnish
+  FI
+
+  # Faroese
+  FO
+
+  # French
+  FR
+
+  # Western Frisian
+  FY
+
+  # Irish
+  GA
+
+  # Scottish Gaelic
+  GD
+
+  # Galician
+  GL
+
+  # Gujarati
+  GU
+
+  # Manx
+  GV
+
+  # Hausa
+  HA
+
+  # Hebrew
+  HE
+
+  # Hindi
+  HI
+
+  # Croatian
+  HR
+
+  # Hungarian
+  HU
+
+  # Armenian
+  HY
+
+  # Interlingua
+  IA
+
+  # Indonesian
+  ID
+
+  # Igbo
+  IG
+
+  # Sichuan Yi
+  II
+
+  # Icelandic
+  IS
+
+  # Italian
+  IT
+
+  # Japanese
+  JA
+
+  # Javanese
+  JV
+
+  # Georgian.
+  KA
+
+  # Kikuyu.
+  KI
+
+  # Kazakh.
+  KK
+
+  # Kalaallisut.
+  KL
+
+  # Khmer.
+  KM
+
+  # Kannada.
+  KN
+
+  # Korean.
+  KO
+
+  # Kashmiri.
+  KS
+
+  # Kurdish.
+  KU
+
+  # Cornish.
+  KW
+
+  # Kyrgyz.
+  KY
+
+  # Luxembourgish.
+  LB
+
+  # Ganda.
+  LG
+
+  # Lingala.
+  LN
+
+  # Lao.
+  LO
+
+  # Lithuanian.
+  LT
+
+  # Luba-Katanga.
+  LU
+
+  # Latvian.
+  LV
+
+  # Malagasy.
+  MG
+
+  # Māori.
+  MI
+
+  # Macedonian.
+  MK
+
+  # Malayalam.
+  ML
+
+  # Mongolian.
+  MN
+
+  # Marathi.
+  MR
+
+  # Malay.
+  MS
+
+  # Maltese.
+  MT
+
+  # Burmese.
+  MY
+
+  # Norwegian (Bokmål).
+  NB
+
+  # North Ndebele.
+  ND
+
+  # Nepali.
+  NE
+
+  # Dutch.
+  NL
+
+  # Norwegian Nynorsk.
+  NN
+
+  # Norwegian.
+  NO
+
+  # Oromo.
+  OM
+
+  # Odia.
+  OR
+
+  # Ossetic.
+  OS
+
+  # Punjabi.
+  PA
+
+  # Polish.
+  PL
+
+  # Pashto.
+  PS
+
+  # Portuguese (Brazil).
+  PT_BR
+
+  # Portuguese (Portugal).
+  PT_PT
+
+  QU
+  # Quechua.
+
+  # Romansh.
+  RM
+
+  # Rundi.
+  RN
+
+  # Romanian.
+  RO
+
+  # Russian.
+  RU
+
+  # Kinyarwanda.
+  RW
+
+  # Sindhi.
+  SD
+
+  # Northern Sami.
+  SE
+
+  # Sango.
+  SG
+
+  # Sinhala.
+  SI
+
+  # Slovak.
+  SK
+
+  # Slovenian.
+  SL
+
+  # Shona.
+  SN
+
+  # Somali.
+  SO
+
+  # Albanian.
+  SQ
+
+  # Serbian.
+  SR
+
+  # Sundanese.
+  SU
+
+  # Swedish.
+  SV
+
+  # Swahili.
+  SW
+
+  # Tamil.
+  TA
+
+  # Telugu.
+  TE
+
+  # Tajik.
+  TG
+
+  # Thai.
+  TH
+
+  # Tigrinya.
+  TI
+
+  # Turkmen.
+  TK
+
+  # Tongan.
+  TO
+
+  # Turkish.
+  TR
+
+  # Tatar.
+  TT
+
+  # Uyghur.
+  UG
+
+  # Ukrainian.
+  UK
+
+  # Urdu.
+  UR
+
+  # Uzbek.
+  UZ
+
+  # Vietnamese.
+  VI
+
+  # Wolof.
+  WO
+
+  # Xhosa.
+  XH
+
+  # Yiddish.
+  YI
+
+  # Yoruba.
+  YO
+
+  # Chinese (Simplified).
+  ZH_CN
+
+  # Chinese (Traditional).
+  ZH_TW
+
+  # Zulu.
+  ZU
+
+  # Chinese.
+  ZH
+
+  # Portuguese.
+  PT
+
+  # Volapük.
+  VO
+}
+
+# The code designating a country/region, which generally follows ISO 3166-1 alpha-2 guidelines.
+# If a territory doesn't have a country code value in the CountryCode enum, then it might be considered a subdivision
+# of another country. For example, the territories associated with Spain are represented by the country code ES,
+# and the territories associated with the United States of America are represented by the country code US.
+enum CountryCode {
+  # Afghanistan.
+  AF
+
+  # Åland Islands.
+  AX
+
+  # Albania.
+  AL
+
+  # Algeria.
+  DZ
+
+  # Andorra.
+  AD
+
+  # Angola.
+  AO
+
+  # Anguilla.
+  AI
+
+  # Antigua & Barbuda.
+  AG
+
+  # Argentina.
+  AR
+
+  # Armenia.
+  AM
+
+  # Aruba.
+  AW
+
+  # Ascension Island.
+  AC
+
+  # Australia.
+  AU
+
+  # Austria.
+  AT
+
+  # Azerbaijan.
+  AZ
+
+  # Bahamas.
+  BS
+
+  # Bahrain.
+  BH
+
+  # Bangladesh.
+  BD
+
+  # Barbados.
+  BB
+
+  # Belarus.
+  BY
+
+  # Belgium.
+  BE
+
+  # Belize.
+  BZ
+
+  # Benin.
+  BJ
+
+  # Bermuda.
+  BM
+
+  # Bhutan.
+  BT
+
+  # Bolivia.
+  BO
+
+  # Bosnia & Herzegovina.
+  BA
+
+  # Botswana.
+  BW
+
+  # Bouvet Island.
+  BV
+
+  # Brazil.
+  BR
+
+  # British Indian Ocean Territory.
+  IO
+
+  # Brunei.
+  BN
+
+  # Bulgaria.
+  BG
+
+  # Burkina Faso.
+  BF
+
+  # Burundi.
+  BI
+
+  # Cambodia.
+  KH
+
+  # Canada.
+  CA
+
+  # Cape Verde.
+  CV
+
+  # Caribbean Netherlands.
+  BQ
+
+  # Cayman Islands.
+  KY
+
+  # Central African Republic.
+  CF
+
+  # Chad.
+  TD
+
+  # Chile.
+  CL
+
+  # China.
+  CN
+
+  # Christmas Island.
+  CX
+
+  # Cocos (Keeling) Islands.
+  CC
+
+  # Colombia.
+  CO
+
+  # Comoros.
+  KM
+
+  # Congo - Brazzaville.
+  CG
+
+  # Congo - Kinshasa.
+  CD
+
+  # Cook Islands.
+  CK
+
+  # Costa Rica.
+  CR
+
+  # Croatia.
+  HR
+
+  # Cuba.
+  CU
+
+  # Curaçao.
+  CW
+
+  # Cyprus.
+  CY
+
+  # Czechia.
+  CZ
+
+  # Côte d’Ivoire.
+  CI
+
+  # Denmark.
+  DK
+
+  # Djibouti.
+  DJ
+
+  # Dominica.
+  DM
+
+  # Dominican Republic.
+  DO
+
+  # Ecuador.
+  EC
+
+  # Egypt.
+  EG
+
+  # El Salvador.
+  SV
+
+  # Equatorial Guinea.
+  GQ
+
+  # Eritrea.
+  ER
+
+  # Estonia.
+  EE
+
+  # Eswatini.
+  SZ
+
+  # Ethiopia.
+  ET
+
+  # Falkland Islands.
+  FK
+
+  # Faroe Islands.
+  FO
+
+  # Fiji.
+  FJ
+
+  # Finland.
+  FI
+
+  # France.
+  FR
+
+  # French Guiana.
+  GF
+
+  # French Polynesia.
+  PF
+
+  # French Southern Territories.
+  TF
+
+  # Gabon.
+  GA
+
+  # Gambia.
+  GM
+
+  # Georgia.
+  GE
+
+  # Germany.
+  DE
+
+  # Ghana.
+  GH
+
+  # Gibraltar.
+  GI
+
+  # Greece.
+  GR
+
+  # Greenland.
+  GL
+
+  # Grenada.
+  GD
+
+  # Guadeloupe.
+  GP
+
+  # Guatemala.
+  GT
+
+  # Guernsey.
+  GG
+
+  # Guinea.
+  GN
+
+  # Guinea-Bissau.
+  GW
+
+  # Guyana.
+  GY
+
+  # Haiti.
+  HT
+
+  # Heard & McDonald Islands.
+  HM
+
+  # Vatican City.
+  VA
+
+  # Honduras.
+  HN
+
+  # Hong Kong SAR.
+  HK
+
+  # Hungary.
+  HU
+
+  # Iceland.
+  IS
+
+  # India.
+  IN
+
+  # Indonesia.
+  ID
+
+  # Iran.
+  IR
+
+  # Iraq.
+  IQ
+
+  # Ireland.
+  IE
+
+  # Isle of Man.
+  IM
+
+  # Israel.
+  IL
+
+  # Italy.
+  IT
+
+  # Jamaica.
+  JM
+
+  # Japan.
+  JP
+
+  # Jersey.
+  JE
+
+  # Jordan.
+  JO
+
+  # Kazakhstan.
+  KZ
+
+  # Kenya.
+  KE
+
+  # Kiribati.
+  KI
+
+  # North Korea.
+  KP
+
+  # Kosovo.
+  XK
+
+  # Kuwait.
+  KW
+
+  # Kyrgyzstan.
+  KG
+
+  # Laos.
+  LA
+
+  # Latvia.
+  LV
+
+  # Lebanon.
+  LB
+
+  # Lesotho.
+  LS
+
+  # Liberia.
+  LR
+
+  # Libya.
+  LY
+
+  # Liechtenstein.
+  LI
+
+  # Lithuania.
+  LT
+
+  # Luxembourg.
+  LU
+
+  # Macao SAR.
+  MO
+
+  # Madagascar.
+  MG
+
+  # Malawi.
+  MW
+
+  # Malaysia.
+  MY
+
+  # Maldives.
+  MV
+
+  # Mali.
+  ML
+
+  # Malta.
+  MT
+
+  # Martinique.
+  MQ
+
+  # Mauritania.
+  MR
+
+  # Mauritius.
+  MU
+
+  # Mayotte.
+  YT
+
+  # Mexico.
+  MX
+
+  # Moldova.
+  MD
+
+  # Monaco.
+  MC
+
+  # Mongolia.
+  MN
+
+  # Montenegro.
+  ME
+
+  # Montserrat.
+  MS
+
+  # Morocco.
+  MA
+
+  # Mozambique.
+  MZ
+
+  # Myanmar (Burma).
+  MM
+
+  # Namibia.
+  NA
+
+  # Nauru.
+  NR
+
+  # Nepal.
+  NP
+
+  # Netherlands.
+  NL
+
+  # Netherlands Antilles.
+  AN
+
+  # New Caledonia.
+  NC
+
+  # New Zealand.
+  NZ
+
+  # Nicaragua.
+  NI
+
+  # Niger.
+  NE
+
+  # Nigeria.
+  NG
+
+  # Niue.
+  NU
+
+  # Norfolk Island.
+  NF
+
+  # North Macedonia.
+  MK
+
+  # Norway.
+  NO
+
+  # Oman.
+  OM
+
+  # Pakistan.
+  PK
+
+  # Palestinian Territories.
+  PS
+
+  # Panama.
+  PA
+
+  # Papua New Guinea.
+  PG
+
+  # Paraguay.
+  PY
+
+  # Peru.
+  PE
+
+  # Philippines.
+  PH
+
+  # Pitcairn Islands.
+  PN
+
+  # Poland.
+  PL
+
+  # Portugal.
+  PT
+
+  # Qatar.
+  QA
+
+  # Cameroon.
+  CM
+
+  # Réunion.
+  RE
+
+  # Romania.
+  RO
+
+  # Russia.
+  RU
+
+  # Rwanda.
+  RW
+
+  # St. Barthélemy.
+  BL
+
+  # St. Helena.
+  SH
+
+  # St. Kitts & Nevis.
+  KN
+
+  # St. Lucia.
+  LC
+
+  # St. Martin.
+  MF
+
+  # St. Pierre & Miquelon.
+  PM
+
+  # Samoa.
+  WS
+
+  # San Marino.
+  SM
+
+  # São Tomé & Príncipe.
+  ST
+
+  # Saudi Arabia.
+  SA
+
+  # Senegal.
+  SN
+
+  # Serbia.
+  RS
+
+  # Seychelles.
+  SC
+
+  # Sierra Leone.
+  SL
+
+  # Singapore.
+  SG
+
+  # Sint Maarten.
+  SX
+
+  # Slovakia.
+  SK
+
+  # Slovenia.
+  SI
+
+  # Solomon Islands.
+  SB
+
+  # Somalia.
+  SO
+
+  # South Africa.
+  ZA
+
+  # South Georgia & South Sandwich Islands.
+  GS
+
+  # South Korea.
+  KR
+
+  # South Sudan.
+  SS
+
+  # Spain.
+  ES
+
+  # Sri Lanka.
+  LK
+
+  # St. Vincent & Grenadines.
+  VC
+
+  # Sudan.
+  SD
+
+  # Suriname.
+  SR
+
+  # Svalbard & Jan Mayen.
+  SJ
+
+  # Sweden.
+  SE
+
+  # Switzerland.
+  CH
+
+  # Syria.
+  SY
+
+  # Taiwan.
+  TW
+
+  # Tajikistan.
+  TJ
+
+  # Tanzania.
+  TZ
+
+  # Thailand.
+  TH
+
+  # Timor-Leste.
+  TL
+
+  # Togo.
+  TG
+
+  # Tokelau.
+  TK
+
+  # Tonga.
+  TO
+
+  # Trinidad & Tobago.
+  TT
+
+  # Tristan da Cunha.
+  TA
+
+  # Tunisia.
+  TN
+
+  # Turkey.
+  TR
+
+  # Turkmenistan.
+  TM
+
+  # Turks & Caicos Islands.
+  TC
+
+  # Tuvalu.
+  TV
+
+  # Uganda.
+  UG
+
+  # Ukraine.
+  UA
+
+  # United Arab Emirates.
+  AE
+
+  # United Kingdom.
+  GB
+
+  # United States.
+  US
+
+  # U.S. Outlying Islands.
+  UM
+
+  # Uruguay.
+  UY
+
+  # Uzbekistan.
+  UZ
+
+  # Vanuatu.
+  VU
+
+  # Venezuela.
+  VE
+
+  # Vietnam.
+  VN
+
+  # British Virgin Islands.
+  VG
+
+  # Wallis & Futuna.
+  WF
+
+  # Western Sahara.
+  EH
+
+  # Yemen.
+  YE
+
+  # Zambia.
+  ZM
+
+  # Zimbabwe.
+  ZW
+
+  # Unknown Region.
+  ZZ
+}

+ 2969 - 0
subgraph/product.graphql

@@ -0,0 +1,2969 @@
+directive @goTag(
+    key: String!
+    value: String
+) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
+
+directive @goField(
+    forceResolver: Boolean,
+    name: String
+) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
+
+scalar DateTime
+scalar UnsignedInt64
+scalar HTML
+
+# A JSON object.
+scalar JSON
+
+# A signed decimal number, which supports arbitrary precision and is serialized as a string.
+scalar Decimal
+
+# Represents an RFC 3986 and
+# RFC 3987-compliant URI string.
+#
+# For example, 'https://johns-apparel.myshopify.com' is a valid URL. It includes a scheme (https) and a host
+# (johns-apparel.myshopify.com).
+scalar URL
+
+union MetafieldParentResource = Collection | Product | ProductVariant
+
+union MetafieldReference = Collection | Product | ProductVariant
+
+union SellingPlanCheckoutChargeValue = MoneyV2 | SellingPlanCheckoutChargePercentageValue
+
+# Represents by how much the price of a variant associated with a selling plan is adjusted. Each variant can have up to two price adjustments.
+union SellingPlanPriceAdjustmentValue = SellingPlanFixedAmountPriceAdjustment | SellingPlanFixedPriceAdjustment | SellingPlanPercentagePriceAdjustment
+
+type Query {
+    collection(handle: String id: ID): Collection
+
+    collections(
+        after: String,
+        before: String,
+        first: Int,
+        last: Int,
+        query: String,
+        reverse: Boolean = false,
+        sortKey: CollectionSortKeys = ID
+    ): CollectionConnection!
+
+    product(handle: String id: ID): Product
+
+    products(
+        after: String
+        before: String
+        first: Int
+        last: Int
+        query: String
+        reverse: Boolean = false
+        sortKey: ProductSortKeys = ID
+    ): ProductConnection!
+
+    # Tags added to products.
+    # Additional access scope required: unauthenticated_read_product_tags.
+    productTags(first: Int!): StringConnection!
+
+    # List of product types for the shop's products that are published to your app.
+    productTypes(first: Int!): StringConnection!
+
+    # Find recommended products related to a given `product_id`.
+    productRecommendations(productId: ID!): [Product!]
+}
+
+type StringConnection {
+    # A list of edges.
+    edges: [StringEdge!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+type StringEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of StringEdge.
+    node: String!
+}
+
+# An auto-generated type for paginating through multiple Collections.
+type CollectionConnection {
+    # A list of edges.
+    edges: [CollectionEdge!]!
+
+    # A list of the nodes contained in CollectionEdge.
+    nodes: [Collection!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+type CollectionEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of CollectionEdge.
+    node: Collection!
+}
+
+# A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse.
+type Collection implements HasMetafields&Node&OnlineStorePublishable {
+    # Stripped description of the collection, single line with HTML tags removed.
+    description(truncateAt: Int): String! @goField(forceResolver: true)
+
+    # The description of the collection, complete with HTML formatting.
+    descriptionHtml: HTML!
+
+    # A human-friendly unique string for the collection automatically generated from its title. Limit of 255 characters.
+    handle: String!
+
+    # A globally-unique identifier.
+    id: ID!
+
+    # Image associated with the collection.
+    image: Image
+
+    # Returns a metafield found by namespace and key.
+    metafield(key: String! namespace: String!): Metafield
+
+    # The metafields associated with the resource matching the supplied list of namespaces and keys.
+    metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+
+    # The URL used for viewing the resource on the shop's Online Store. Returns null if the resource is currently not published to the Online Store sales channel.
+    onlineStoreUrl: URL
+
+    # List of products in the collection.
+    products(
+        after: String
+        before: String
+        filters: [ProductFilter!]
+        first: Int
+        last: Int
+        reverse: Boolean = false
+        sortKey: ProductCollectionSortKeys = COLLECTION_DEFAULT
+    ): ProductConnection! @goField(forceResolver: true)
+
+    # The collection's SEO information.
+    seo: SEO!
+
+    # The collection’s name. Limit of 255 characters.
+    title: String!
+
+    # The date and time when the collection was last modified.
+    updatedAt: DateTime!
+}
+
+# An object with an ID field to support global identification, in accordance with the
+# Relay specification.
+# This interface is used by the node
+# and nodes queries.
+interface Node {
+    # A globally-unique identifier.
+    id: ID!
+}
+
+# Represents information about the metafields associated to the specified resource.
+interface HasMetafields {
+    # Returns a metafield found by namespace and key.
+    metafield(namespace: String!key: String!): Metafield
+
+    # The metafields associated with the resource matching the supplied list of namespaces and keys.
+    metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+}
+
+# Represents a resource that can be published to the Online Store sales channel.
+interface OnlineStorePublishable {
+    # The URL used for viewing the resource on the shop's Online Store. Returns `null` if the resource is currently not published to the Online Store sales channel.
+    onlineStoreUrl: URL
+}
+
+# Represents a media interface.
+interface Media {
+    # A word or phrase to share the nature or contents of a media.
+    alt: String
+
+    # The media content type.
+    mediaContentType: MediaContentType!
+
+    # The preview image for the media.
+    previewImage: Image
+}
+
+type ProductConnection {
+    # A list of edges.
+    edges: [ProductEdge!]!
+
+    # A list of available filters.
+    filters: [Filter!]!
+
+    # A list of the nodes contained in ProductEdge.
+    nodes: [Product!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+type ProductEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of ProductEdge.
+    node: Product!
+}
+
+# A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be.
+# For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty).
+type Product implements HasMetafields&Node&OnlineStorePublishable {
+    # Indicates if at least one product variant is available for sale.
+    availableForSale: Boolean!
+
+    # List of collections a product belongs to.
+    collections(
+        after: String
+        before: String
+        first: Int
+        last: Int
+        reverse: Boolean = false
+    ): CollectionConnection! @goField(forceResolver: true)
+
+    # The compare at price of the product across all variants.
+    compareAtPriceRange: ProductPriceRange!
+
+    # The date and time when the product was created.
+    createdAt: DateTime!
+
+    # Stripped description of the product, single line with HTML tags removed.
+    description(truncateAt: Int): String! @goField(forceResolver: true)
+
+    # The description of the product, complete with HTML formatting.
+    descriptionHtml: HTML!
+
+    # The featured image for the product. This field is functionally equivalent to images(first: 1).
+    featuredImage: Image
+
+    # A human-friendly unique string for the Product automatically generated from its title. They are used by the Liquid templating language to refer to objects.
+    handle: String!
+
+    # A globally-unique identifier.
+    id: ID!
+
+    # List of images associated with the product.
+    images(
+        after: String
+        before: String
+        first: Int
+        last: Int
+        reverse: Boolean = false
+        sortKey: ProductImageSortKeys = POSITION
+    ): ImageConnection!
+
+    # Whether the product is a gift card.
+    isGiftCard: Boolean!
+
+    # The media associated with the product.
+    media(
+        after: String
+        before: String
+        first: Int
+        last: Int
+        reverse: Boolean = false
+        sortKey: ProductMediaSortKeys = POSITION
+    ): MediaConnection!
+
+    # Returns a metafield found by namespace and key.
+    metafield(key: String!namespace: String!): Metafield
+
+    # The metafields associated with the resource matching the supplied list of namespaces and keys.
+    metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+
+    # The URL used for viewing the resource on the shop's Online Store. Returns `null` if the resource is currently not published to the Online Store sales channel.
+    onlineStoreUrl: URL
+
+    # List of product options.
+    options(first: Int): [ProductOption!]! @goField(forceResolver: true)
+
+    # The price range.
+    priceRange: ProductPriceRange!
+
+    # A categorization that a product can be tagged with, commonly used for filtering and searching.
+    productType: String!
+
+    # The date and time when the product was published to the channel.
+    publishedAt: DateTime!
+
+    # Whether the product can only be purchased with a selling plan.
+    requiresSellingPlan: Boolean!
+
+    # A list of a product's available selling plan groups. A selling plan group represents a selling method. For example, 'Subscribe and save' is a selling method where customers pay for goods or services per delivery. A selling plan group contains individual selling plans.
+    sellingPlanGroups(
+        first: Int
+        after: String
+        last: Int
+        before: String
+        reverse: Boolean = false
+    ): SellingPlanGroupConnection!
+
+    # The product's SEO information.
+    seo: SEO!
+
+    # A comma separated list of tags that have been added to the product. Additional access scope required for private apps: unauthenticated_read_product_tags.
+    tags: [String!]!
+
+    # The product’s title.
+    title: String!
+
+    # The total quantity of inventory in stock for this Product.
+    totalInventory: Int
+
+    # The date and time when the product was last modified.
+    # A product's `updatedAt` value can change for different reasons. For example, if an order
+    # is placed for a product that has inventory tracking set up, then the inventory adjustment
+    # is counted as an update.
+    updatedAt: DateTime!
+
+    # Find a product’s variant based on its selected options.
+    # This is useful for converting a user’s selection of product options into a single matching variant.
+    # If there is not a variant for the selected options, `null` will be returned.
+    variantBySelectedOptions(selectedOptions: [SelectedOptionInput!]!): ProductVariant @goField(forceResolver: true)
+
+    # List of the product’s variants.
+    variants(
+        first: Int
+        after: String
+        last: Int
+        before: String
+        reverse: Boolean = false
+        sortKey: ProductVariantSortKeys = POSITION
+    ): ProductVariantConnection! @goField(forceResolver: true)
+
+    # The product’s vendor name.
+    vendor: String!
+}
+
+# The price range of the product.
+type ProductPriceRange {
+    # The highest variant's price.
+    maxVariantPrice: MoneyV2!
+
+    # The lowest variant's price.
+    minVariantPrice: MoneyV2!
+}
+
+# Product property names like 'Size', 'Color', and 'Material' that the customers can select.
+# Variants are selected based on permutations of these options.
+# 255 characters limit each.
+type ProductOption implements Node {
+    # A globally-unique identifier.
+    id: ID!
+
+    # The product option’s name.
+    name: String!
+
+    # The corresponding value to the product option name.
+    values: [String!]!
+}
+
+# A monetary value with currency.
+type MoneyV2 {
+    # Decimal money amount.
+    amount: Decimal!
+
+    # Currency of the money.
+    currencyCode: CurrencyCode!
+}
+
+# A filter that is supported on the parent field.
+type Filter {
+    # A unique identifier.
+    id: String!
+
+    # A human-friendly string for this filter.
+    label: String!
+
+    # An enumeration that denotes the type of data this filter represents.
+    type: FilterType!
+}
+
+# SEO information.
+type SEO {
+    # The meta description.
+    description: String
+
+    # The SEO title.
+    title: String
+}
+
+# An auto-generated type for paginating through multiple Media.
+type MediaConnection {
+    # A list of edges.
+    edges: [MediaEdge!]!
+
+    # A list of the nodes contained in MediaEdge.
+    nodes: [Media!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one Media and a cursor during pagination.
+type MediaEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of MediaEdge.
+    node: Media!
+}
+
+# Represents an image resource.
+type Image {
+    # A word or phrase to share the nature or contents of an image.
+    altText: String
+
+    # The original height of the image in pixels. Returns `null` if the image is not hosted by Shopify.
+    height: Int
+
+    # A unique identifier for the image.
+    id: ID
+
+    # The location of the image as a URL.
+    # If no transform options are specified, then the original image will be preserved including any pre-applied transforms.
+    # All transformation options are considered 'best-effort'. Any transformation that the original image type doesn't support will be ignored.
+    # If you need multiple variations of the same image, then you can use GraphQL aliases.
+    url(transform: ImageTransformInput): URL!
+
+    # The original width of the image in pixels. Returns null if the image is not hosted by Shopify.
+    width: Int
+
+    # The location of the original image as a URL.
+    #
+    # If there are any existing transformations in the original source URL, they will remain and not be stripped. Use url instead.
+    originalSrc: URL! @deprecated
+
+    # The location of the image as a URL. Use url instead.
+    src: URL! @deprecated
+
+    # The location of the transformed image as a URL.
+    # All transformation arguments are considered 'best-effort'. If they can be applied to an image, they will be. Otherwise any transformations which an image type does not support will be ignored. Use `url(transform:)` instead
+    transformedSrc: URL! @deprecated
+}
+
+# An auto-generated type for paginating through multiple Images.
+type ImageConnection {
+    # A list of edges.
+    edges: [ImageEdge!]!
+
+    # A list of the nodes contained in ImageEdge.
+    nodes: [Image!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one Image and a cursor during pagination.
+type ImageEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of ImageEdge.
+    node: Image!
+}
+
+# An auto-generated type for paginating through multiple SellingPlanGroups.
+type SellingPlanGroupConnection {
+    # A list of edges.
+    edges: [SellingPlanGroupEdge!]!
+
+    # A list of the nodes contained in SellingPlanGroupEdge.
+    nodes: [SellingPlanGroup!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one SellingPlanGroup and a cursor during pagination.
+type SellingPlanGroupEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of SellingPlanGroupEdge.
+    node: SellingPlanGroup!
+}
+
+# Represents a selling method. For example, 'Subscribe and save' is a selling method where customers pay for goods or services per delivery. A selling plan group contains individual selling plans.
+type SellingPlanGroup {
+    # A display friendly name for the app that created the selling plan group.
+    appName: String
+
+    # The name of the selling plan group.
+    name: String!
+
+    # Represents the selling plan options available in the drop-down list in the storefront. For example, 'Delivery every week' or 'Delivery every 2 weeks' specifies the delivery frequency options for the product.
+    options: [SellingPlanGroupOption!]!
+
+    # A list of selling plans in a selling plan group. A selling plan is a representation of how products and variants can be sold and purchased. For example, an individual selling plan could be '6 weeks of prepaid granola, delivered weekly'.
+    sellingPlans(
+        first: Int
+        after: String
+        last: Int
+        before: String
+        reverse: Boolean = false
+    ): SellingPlanConnection!
+}
+
+# Represents an option on a selling plan group that's available in the drop-down list in the storefront.
+#
+# Individual selling plans contribute their options to the associated selling plan group. For example, a selling plan group might have an option called option1: Delivery every. One selling plan in that group could contribute option1: 2 weeks with the pricing for that option, and another selling plan could contribute option1: 4 weeks, with different pricing.
+type SellingPlanGroupOption {
+    # The name of the option. For example, 'Delivery every'.
+    name: String!
+
+    # The values for the options specified by the selling plans in the selling plan group. For example, '1 week', '2 weeks', '3 weeks'.
+    values: [String!]!
+}
+
+# An auto-generated type for paginating through multiple SellingPlans.
+type SellingPlanConnection {
+    # A list of edges.
+    edges: [SellingPlanEdge!]!
+
+    # A list of the nodes contained in SellingPlanEdge.
+    nodes: [SellingPlan!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one SellingPlan and a cursor during pagination.
+type SellingPlanEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of SellingPlanEdge.
+    node: SellingPlan!
+}
+
+# Represents how products and variants can be sold and purchased.
+type SellingPlan implements Node {
+    # The initial payment due for the purchase.
+    checkoutCharge: SellingPlanCheckoutCharge!
+
+    # The description of the selling plan.
+    description: String
+
+    # A globally-unique identifier.
+    id: ID!
+
+    # The name of the selling plan. For example, '6 weeks of prepaid granola, delivered weekly'.
+    name: String!
+
+    # The selling plan options available in the drop-down list in the storefront. For example, 'Delivery every week' or 'Delivery every 2 weeks' specifies the delivery frequency options for the product. Individual selling plans contribute their options to the associated selling plan group. For example, a selling plan group might have an option called option1: Delivery every. One selling plan in that group could contribute option1: 2 weeks with the pricing for that option, and another selling plan could contribute option1: 4 weeks, with different pricing.
+    options: [SellingPlanOption!]!
+
+    # The price adjustments that a selling plan makes when a variant is purchased with a selling plan.
+    priceAdjustments: [SellingPlanPriceAdjustment!]!
+
+    # Whether purchasing the selling plan will result in multiple deliveries.
+    recurringDeliveries: Boolean!
+}
+
+# The initial payment due for the purchase.
+type SellingPlanCheckoutCharge {
+    # The charge type for the checkout charge.
+    type: SellingPlanCheckoutChargeType!
+
+    # The charge value for the checkout charge.
+    value: SellingPlanCheckoutChargeValue!
+}
+
+# The percentage value of the price used for checkout charge.
+type SellingPlanCheckoutChargePercentageValue {
+    # The percentage value of the price used for checkout charge.
+    percentage: Float!
+}
+
+# An option provided by a Selling Plan.
+type SellingPlanOption {
+    # The name of the option (ie 'Delivery every').
+    name: String
+
+    # The value of the option (ie 'Month').
+    value: String
+}
+
+# Represents by how much the price of a variant associated with a selling plan is adjusted. Each variant can have up to two price adjustments. If a variant has multiple price adjustments, then the first price adjustment applies when the variant is initially purchased. The second price adjustment applies after a certain number of orders (specified by the `orderCount` field) are made. If a selling plan doesn't have any price adjustments, then the unadjusted price of the variant is the effective price.
+type SellingPlanPriceAdjustment {
+    # The type of price adjustment. An adjustment value can have one of three types: percentage, amount off, or a new price.
+    adjustmentValue: SellingPlanPriceAdjustmentValue!
+
+    # The number of orders that the price adjustment applies to. If the price adjustment always applies, then this field is `null`.
+    orderCount: Int
+}
+
+# A fixed amount that's deducted from the original variant price. For example, $10.00 off.
+type SellingPlanFixedAmountPriceAdjustment {
+    # The money value of the price adjustment.
+    adjustmentAmount: MoneyV2!
+}
+
+# A fixed price adjustment for a variant that's purchased with a selling plan.
+type SellingPlanFixedPriceAdjustment {
+    # A new price of the variant when it's purchased with the selling plan.
+    price: MoneyV2!
+}
+
+# A percentage amount that's deducted from the original variant price. For example, 10% off.
+type SellingPlanPercentagePriceAdjustment {
+    # The percentage value of the price adjustment.
+    adjustmentPercentage: Int!
+}
+
+# A product variant represents a different version of a product, such as differing sizes or differing colors.
+type ProductVariant implements Node&HasMetafields {
+    # Indicates if the product variant is available for sale.
+    availableForSale: Boolean!
+
+    # The barcode (for example, ISBN, UPC, or GTIN) associated with the variant.
+    barcode: String
+
+    # The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPrice` is higher than `price`.
+    compareAtPrice: MoneyV2
+
+    # Whether a product is out of stock but still available for purchase (used for backorders).
+    currentlyNotInStock: Boolean!
+
+    # A globally-unique identifier.
+    id: ID!
+
+    # Image associated with the product variant. This field falls back to the product image if no image is available.
+    image: Image
+
+    # Returns a metafield found by namespace and key.
+    metafield(namespace: String!key: String!): Metafield
+
+    # The metafields associated with the resource matching the supplied list of namespaces and keys.
+    metafields(identifiers: [HasMetafieldsIdentifier!]!): [Metafield]!
+
+    # The product variant’s price.
+    price: MoneyV2!
+
+    # The product object that the product variant belongs to.
+    product: Product! @goField(forceResolver: true)
+
+    # The total sellable quantity of the variant for online sales channels.
+    quantityAvailable: Int
+
+    # Whether a customer needs to provide a shipping address when placing an order for the product variant.
+    requiresShipping: Boolean!
+
+    # List of product options applied to the variant.
+    selectedOptions: [SelectedOption!]! @goField(forceResolver: true)
+
+    # Represents an association between a variant and a selling plan. Selling plan allocations describe which selling plans are available for each variant, and what their impact is on pricing.
+    sellingPlanAllocations(
+        first: Int
+        after: String
+        last: Int
+        before: String
+        reverse: Boolean = false
+    ): SellingPlanAllocationConnection!
+
+    # The SKU (stock keeping unit) associated with the variant.
+    sku: String
+
+    # The in-store pickup availability of this variant by location.
+    storeAvailability(
+        first: Int
+        after: String
+        last: Int
+        before: String
+        reverse: Boolean = false
+    ): StoreAvailabilityConnection! @goField(forceResolver: true)
+
+    # The product variant’s title.
+    title: String! @goField(forceResolver: true)
+
+    # The unit price value for the variant based on the variant's measurement.
+    unitPrice: MoneyV2
+
+    # The unit price measurement for the variant.
+    unitPriceMeasurement: UnitPriceMeasurement
+
+    # The weight of the product variant in the unit system specified with `weight_unit`.
+    weight: Float
+
+    # Unit of measurement for weight.
+    weightUnit: WeightUnit!
+}
+
+# Properties used by customers to select a product variant.
+# Products can have multiple options, like different sizes or colors.
+type SelectedOption {
+    # The product option’s name.
+    name: String!
+
+    # The product option’s value.
+    value: String!
+}
+
+# An auto-generated type for paginating through multiple SellingPlanAllocations.
+type SellingPlanAllocationConnection {
+    # A list of edges.
+    edges: [SellingPlanAllocationEdge!]!
+
+    # A list of the nodes contained in SellingPlanAllocationEdge.
+    nodes: [SellingPlanAllocation!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one SellingPlanAllocation and a cursor during pagination.
+type SellingPlanAllocationEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of SellingPlanAllocationEdge.
+    node: SellingPlanAllocation!
+}
+
+# Represents an association between a variant and a selling plan. Selling plan allocations describe the options offered for each variant, and the price of the variant when purchased with a selling plan.
+type SellingPlanAllocation {
+    # The checkout charge amount due for the purchase.
+    checkoutChargeAmount: MoneyV2!
+
+    # A list of price adjustments, with a maximum of two. When there are two, the first price adjustment goes into effect at the time of purchase, while the second one starts after a certain number of orders. A price adjustment represents how a selling plan affects pricing when a variant is purchased with a selling plan. Prices display in the customer's currency if the shop is configured for it.
+    priceAdjustments: [SellingPlanAllocationPriceAdjustment!]!
+
+    # The remaining balance charge amount due for the purchase.
+    remainingBalanceChargeAmount: MoneyV2!
+
+    # A representation of how products and variants can be sold and purchased. For example, an individual selling plan could be '6 weeks of prepaid granola, delivered weekly'.
+    sellingPlan: SellingPlan!
+}
+
+# The resulting prices for variants when they're purchased with a specific selling plan.
+type SellingPlanAllocationPriceAdjustment {
+    # The price of the variant when it's purchased without a selling plan for the same number of deliveries. For example, if a customer purchases 6 deliveries of $10.00 granola separately, then the price is 6 x $10.00 = $60.00.
+    compareAtPrice: MoneyV2!
+
+    # The effective price for a single delivery. For example, for a prepaid subscription plan that includes 6 deliveries at the price of $48.00, the per delivery price is $8.00.
+    perDeliveryPrice: MoneyV2!
+
+    # The price of the variant when it's purchased with a selling plan For example, for a prepaid subscription plan that includes 6 deliveries of $10.00 granola, where the customer gets 20% off, the price is 6 x $10.00 x 0.80 = $48.00.
+    price: MoneyV2!
+
+    # The resulting price per unit for the variant associated with the selling plan. If the variant isn't sold by quantity or measurement, then this field returns `null`.
+    unitPrice: MoneyV2
+}
+
+# An auto-generated type for paginating through multiple StoreAvailabilities.
+type StoreAvailabilityConnection {
+    # A list of edges.
+    edges: [StoreAvailabilityEdge!]!
+
+    # A list of the nodes contained in StoreAvailabilityEdge.
+    nodes: [StoreAvailability!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# An auto-generated type which holds one StoreAvailability and a cursor during pagination.
+type StoreAvailabilityEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of StoreAvailabilityEdge.
+    node: StoreAvailability!
+}
+
+# The availability of a product variant at a particular location.
+# Local pick-up must be enabled in the store's shipping settings, otherwise this will return an empty result.
+type StoreAvailability {
+    # Whether the product variant is in-stock at this location.
+    available: Boolean!
+
+    # The location where this product variant is stocked at.
+    location: Location! @provides(fields: "id")
+
+    # Returns the estimated amount of time it takes for pickup to be ready (Example: Usually ready in 24 hours).
+    pickUpTime: String!
+}
+
+# Represents a location where product inventory is held.
+extend type Location implements Node {
+    # The address of the location.
+    address: LocationAddress! @external
+
+    # A globally-unique identifier.
+    id: ID! @external
+
+    # The name of the location.
+    name: String! @external
+}
+
+# Represents the address of a location.
+extend type LocationAddress {
+    # The first line of the address for the location.
+    address1: String
+
+    # The second line of the address for the location.
+    address2: String
+
+    # The city of the location.
+    city: String
+
+    # The country of the location.
+    country: String
+
+    # The country code of the location.
+    countryCode: String
+
+    # A formatted version of the address for the location.
+    formatted: [String!]!
+
+    # The latitude coordinates of the location.
+    latitude: Float
+
+    # The longitude coordinates of the location.
+    longitude: Float
+
+    # The phone number of the location.
+    phone: String
+
+    # The province of the location.
+    province: String
+
+    # The code for the province, state, or district of the address of the location.
+    provinceCode: String
+
+    # The ZIP code of the location.
+    zip: String
+}
+
+# The measurement used to calculate a unit price for a product variant (e.g. $9.99 / 100ml).
+type UnitPriceMeasurement {
+    # The type of unit of measurement for the unit price measurement.
+    measuredType: UnitPriceMeasurementMeasuredType
+
+    # The quantity unit for the unit price measurement.
+    quantityUnit: UnitPriceMeasurementMeasuredUnit
+
+    # The quantity value for the unit price measurement.
+    quantityValue: Float!
+
+    # The reference unit for the unit price measurement.
+    referenceUnit: UnitPriceMeasurementMeasuredUnit
+
+    # The reference value for the unit price measurement.
+    referenceValue: Int!
+}
+
+# The available options for transforming an image.
+# All transformation options are considered best effort. Any transformation that the original image type doesn't support will be ignored.
+input ImageTransformInput {
+    # The region of the image to remain after cropping.
+    # Must be used in conjunction with the maxWidth and/or maxHeight fields, where the maxWidth and maxHeight aren't equal.
+    # The crop argument should coincide with the smaller value. A smaller maxWidth indicates a LEFT or RIGHT crop, while
+    # a smaller maxHeight indicates a TOP or BOTTOM crop. For example, { maxWidth: 5, maxHeight: 10, crop: LEFT } will result
+    # in an image with a width of 5 and height of 10, where the right side of the image is removed.
+    crop: CropRegion
+
+    # Image width in pixels between 1 and 5760.
+    maxWidth: Int
+
+    # Image height in pixels between 1 and 5760.
+    maxHeight: Int
+
+    # Image size multiplier for high-resolution retina displays. Must be within 1..3.
+    scale: Int = 1
+
+    # Convert the source image into the preferred content type.
+    # Supported conversions: .svg to .png, any file type to .jpg, and any file type to .webp.
+    preferredContentType: ImageContentType
+}
+
+# Identifies a metafield on an owner resource by namespace and key.
+input HasMetafieldsIdentifier {
+    # A container for a set of metafields.
+    namespace: String!
+
+    # The identifier for the metafield.
+    key: String!
+}
+
+input ProductFilter {
+    # Filter on if the product is available for sale.
+    available: Boolean
+
+    # A variant option to filter on.
+    variantOption: VariantOptionFilter
+
+    # The product type to filter on.
+    productType: String
+
+    # The product vendor to filter on.
+    productVendor: String
+
+    # A range of prices to filter with-in.
+    price: PriceRangeFilter
+
+    # A product metafield to filter on.
+    productMetafield: MetafieldFilter
+
+    # A variant metafield to filter on.
+    variantMetafield: MetafieldFilter
+}
+
+enum ProductSortKeys {
+    # Sort by the `title` value.
+    TITLE
+
+    # Sort by the `product_type` value.
+    PRODUCT_TYPE
+
+    # Sort by the `vendor` value.
+    VENDOR
+
+    # Sort by the `updated_at` value.
+    UPDATED_AT
+
+    # Sort by the `created_at` value.
+    CREATED_AT
+
+    # Sort by the `best_selling` value.
+    BEST_SELLING
+
+    # Sort by the price value.
+    PRICE
+
+    # Sort by the id value.
+    ID
+
+    # Sort by relevance to the search terms when the query parameter is specified on the connection.
+    # Don't use this sort key when no search query is specified.
+    RELEVANCE
+}
+
+# A filter used to view a subset of products in a collection matching a specific price range.
+input PriceRangeFilter {
+    # The minimum price in the range. Defaults to zero.
+    min: Float = 0
+
+    # The maximum price in the range. Empty indicates no max price.
+    max: Float
+}
+
+input VariantOptionFilter {
+    # The name of the variant option to filter on.
+    name: String!
+
+    # The value of the variant option to filter on.
+    value: String!
+}
+
+# Specifies the input fields required for a selected option.
+input SelectedOptionInput {
+    # The product option’s name.
+    name: String!
+
+    # The product option’s value.
+    value: String!
+}
+
+# Metafields represent custom metadata attached to a resource.
+# Metafields can be sorted into namespaces and are comprised of keys, values, and value types.
+type Metafield implements Node {
+    # The date and time when the storefront metafield was created.
+    createdAt: DateTime!
+
+    # The description of a metafield.
+    description: String
+
+    # A globally-unique identifier.
+    id: ID!
+
+    # The key name for a metafield.
+    key: String!
+
+    # The namespace for a metafield.
+    namespace: String!
+
+    # The parent object that the metafield belongs to.
+    parentResource: MetafieldParentResource!
+
+    # Returns a reference object if the metafield definition's type is a resource reference.
+    reference: MetafieldReference
+
+    # A list of reference objects if the metafield's type is a resource reference list.
+    references(
+        first: Int
+        after: String
+        last: Int
+        before: String
+    ): MetafieldReferenceConnection
+
+    # The type name of the metafield. See the list of supported types.
+    type: String!
+
+    # The date and time when the storefront metafield was updated.
+    updatedAt: DateTime!
+
+    # The value of a metafield.
+    value: String!
+}
+
+# An auto-generated type for paginating through multiple MetafieldReferences.
+type MetafieldReferenceConnection {
+    # A list of edges.
+    edges: [MetafieldReferenceEdge!]!
+
+    # A list of the nodes contained in MetafieldReferenceEdge.
+    nodes: [MetafieldReference!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+# Returns information about pagination in a connection, in accordance with the Relay specification.
+type PageInfo {
+    # The cursor corresponding to the last node in edges.
+    endCursor: String
+
+    # Whether there are more pages to fetch following the current page.
+    hasNextPage: Boolean!
+
+    # Whether there are any pages prior to the current page.
+    hasPreviousPage: Boolean!
+
+    # The cursor corresponding to the first node in edges.
+    startCursor: String
+}
+
+type MetafieldReferenceEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of MetafieldReferenceEdge.
+    node: MetafieldReference!
+}
+
+# A filter used to view a subset of products in a collection matching a specific metafield value.
+#
+# Only the following metafield types are currently supported:
+#
+# number_integer
+# number_decimal
+# single_line_text_field
+# boolean as of 2022-04.
+input MetafieldFilter {
+    # The namespace of the metafield to filter on.
+    namespace: String!
+
+    # The key of the metafield to filter on.
+    key: String!
+
+    # The value of the metafield.
+    value: String!
+}
+
+enum CollectionSortKeys {
+    # Sort by the `id` value.
+    ID,
+
+    # Sort by relevance to the search terms when the `query` parameter is specified on the connection. Don't use this sort key when no search query is specified.
+    RELEVANCE,
+
+    # Sort by the `title` value.
+    TITLE,
+
+    # Sort by the `updated_at` value.
+    UPDATED_AT
+}
+
+enum CollectionSortOrder {
+    # Alphabetically, in ascending order (A - Z).
+    ALPHA_ASC,
+
+    # Alphabetically, in descending order (Z - A).
+    ALPHA_DESC,
+
+    # By best-selling products.
+    BEST_SELLING,
+
+    # By date created, in ascending order (oldest - newest).
+    CREATED,
+
+    # By date created, in descending order (newest - oldest).
+    CREATED_DESC,
+
+    # In the order set manually by the merchant.
+    MANUAL,
+
+    # By price, in ascending order (lowest - highest).
+    PRICE_ASC,
+
+    # By price, in descending order (highest - lowest).
+    PRICE_DESC
+}
+
+enum ProductCollectionSortKeys {
+    # Sort by the `best-selling` value.
+    BEST_SELLING,
+
+    # Sort by the `collection-default` value.
+    COLLECTION_DEFAULT,
+
+    # Sort by the `created` value.
+    CREATED,
+
+    # Sort by the `id` value.
+    ID,
+
+    # Sort by the `manual` value.
+    MANUAL,
+
+    # Sort by the `price` value.
+    PRICE,
+
+    # Sort by relevance to the search terms when the `query` parameter is specified on the connection. Don't use this sort key when no search query is specified.
+    RELEVANCE,
+
+    # Sort by the `title` value.
+    TITLE
+}
+
+# List of supported image content types.
+enum ImageContentType {
+    # A PNG image.
+    PNG
+
+    # A JPG image.
+    JPG
+
+    # A WEBP image.
+    WEBP
+}
+
+# The part of the image that should remain after cropping.
+enum CropRegion {
+    # Keep the center of the image.
+    CENTER
+
+    # Keep the top of the image.
+    TOP
+
+    # Keep the bottom of the image.
+    BOTTOM
+
+    # Keep the left of the image.
+    LEFT
+
+    # Keep the right of the image.
+    RIGHT
+}
+
+# The type of data that the filter group represents.
+#
+# For more information, refer to [Filter products in a collection with the Storefront API]
+# (https://shopify.dev/custom-storefronts/products-collections/filter-products).
+enum FilterType {
+    # A list of selectable values.
+    LIST
+
+    # A range of prices.
+    PRICE_RANGE
+
+    # A boolean value.
+    BOOLEAN
+}
+
+# The three-letter currency codes that represent the world currencies used in stores. These include standard ISO 4217 codes, legacy codes, and non-standard codes.
+enum CurrencyCode {
+    # United Arab Emirates Dirham (AED).
+    AED
+
+    # Afghan Afghani (AFN).
+    AFN
+
+    # Albanian Lek (ALL).
+    ALL
+
+    # Armenian Dram (AMD).
+    AMD
+
+    # Netherlands Antillean Guilder.
+    ANG
+
+    # Angolan Kwanza (AOA).
+    AOA
+
+    # Argentine Pesos (ARS).
+    ARS
+
+    # Australian Dollars (AUD).
+    AUD
+
+    # Aruban Florin (AWG).
+    AWG
+
+    # Azerbaijani Manat (AZN).
+    AZN
+
+    # Bosnia and Herzegovina Convertible Mark (BAM).
+    BAM
+
+    # Barbadian Dollar (BBD).
+    BBD
+
+    # Bangladesh Taka (BDT).
+    BDT
+
+    # Bulgarian Lev (BGN).
+    BGN
+
+    # Bahraini Dinar (BHD).
+    BHD
+
+    # Burundian Franc (BIF).
+    BIF
+
+    # Bermudian Dollar (BMD).
+    BMD
+
+    # Brunei Dollar (BND).
+    BND
+
+    # Bolivian Boliviano (BOB).
+    BOB
+
+    # Brazilian Real (BRL).
+    BRL
+
+    # Bahamian Dollar (BSD).
+    BSD
+
+    # Bhutanese Ngultrum (BTN).
+    BTN
+
+    # Botswana Pula (BWP).
+    BWP
+
+    # Belarusian Ruble (BYN).
+    BYN
+
+    # Belize Dollar (BZD).
+    BZD
+
+    # Canadian Dollars (CAD).
+    CAD
+
+    # Congolese franc (CDF).
+    CDF
+
+    # Swiss Francs (CHF).
+    CHF
+
+    # Chilean Peso (CLP).
+    CLP
+
+    # Chinese Yuan Renminbi (CNY).
+    CNY
+
+    # Colombian Peso (COP).
+    COP
+
+    # Costa Rican Colones (CRC).
+    CRC
+
+    # Cape Verdean escudo (CVE).
+    CVE
+
+    # Czech Koruny (CZK).
+    CZK
+
+    # Djiboutian Franc (DJF).
+    DJF
+
+    # Danish Kroner (DKK).
+    DKK
+
+    # Dominican Peso (DOP).
+    DOP
+
+    # Algerian Dinar (DZD).
+    DZD
+
+    # Egyptian Pound (EGP).
+    EGP
+
+    # Eritrean Nakfa (ERN).
+    ERN
+
+    # Ethiopian Birr (ETB).
+    ETB
+
+    # Euro (EUR).
+    EUR
+
+    # Fijian Dollars (FJD).
+    FJD
+
+    # Falkland Islands Pounds (FKP).
+    FKP
+
+    # United Kingdom Pounds (GBP).
+    GBP
+
+    # Georgian Lari (GEL).
+    GEL
+
+    # Ghanaian Cedi (GHS).
+    GHS
+
+    # Gibraltar Pounds (GIP).
+    GIP
+
+    # Gambian Dalasi (GMD).
+    GMD
+
+    # Guinean Franc (GNF).
+    GNF
+
+    # Guatemalan Quetzal (GTQ).
+    GTQ
+
+    # Guyanese Dollar (GYD).
+    GYD
+
+    # Hong Kong Dollars (HKD).
+    HKD
+
+    # Honduran Lempira (HNL).
+    HNL
+
+    # Croatian Kuna (HRK).
+    HRK
+
+    # Haitian Gourde (HTG).
+    HTG
+
+    # Hungarian Forint (HUF).
+    HUF
+
+    # Indonesian Rupiah (IDR).
+    IDR
+
+    # Israeli New Shekel (NIS).
+    ILS
+
+    # Indian Rupees (INR).
+    INR
+
+    # Iraqi Dinar (IQD).
+    IQD
+
+    # Iranian Rial (IRR).
+    IRR
+
+    # Icelandic Kronur (ISK).
+    ISK
+
+    # Jersey Pound.
+    JEP
+
+    # Jamaican Dollars (JMD).
+    JMD
+
+    # Jordanian Dinar (JOD).
+    JOD
+
+    # Japanese Yen (JPY).
+    JPY
+
+    # Kenyan Shilling (KES).
+    KES
+
+    # Kyrgyzstani Som (KGS).
+    KGS
+
+    # Cambodian Riel.
+    KHR
+
+    # Kiribati Dollar (KID).
+    KID
+
+    # Comorian Franc (KMF).
+    KMF
+
+    # South Korean Won (KRW).
+    KRW
+
+    # Kuwaiti Dinar (KWD).
+    KWD
+
+    # Cayman Dollars (KYD).
+    KYD
+
+    # Kazakhstani Tenge (KZT).
+    KZT
+
+    # Laotian Kip (LAK).
+    LAK
+
+    # Lebanese Pounds (LBP).
+    LBP
+
+    # Sri Lankan Rupees (LKR).
+    LKR
+
+    # Liberian Dollar (LRD).
+    LRD
+
+    # Lesotho Loti (LSL).
+    LSL
+
+    # Lithuanian Litai (LTL).
+    LTL
+
+    # Latvian Lati (LVL).
+    LVL
+
+    # Libyan Dinar (LYD).
+    LYD
+
+    # Moroccan Dirham.
+    MAD
+
+    # Moldovan Leu (MDL).
+    MDL
+
+    # Malagasy Ariary (MGA).
+    MGA
+
+    # Macedonia Denar (MKD).
+    MKD
+
+    # Burmese Kyat (MMK).
+    MMK
+
+    # Mongolian Tugrik.
+    MNT
+
+    # Macanese Pataca (MOP).
+    MOP
+
+    # Mauritanian Ouguiya (MRU).
+    MRU
+
+    # Mauritian Rupee (MUR).
+    MUR
+
+    # Maldivian Rufiyaa (MVR).
+    MVR
+
+    # Malawian Kwacha (MWK).
+    MWK
+
+    # Mexican Pesos (MXN).
+    MXN
+
+    # Malaysian Ringgits (MYR).
+    MYR
+
+    # Mozambican Metical.
+    MZN
+
+    # Namibian Dollar.
+    NAD
+
+    # Nigerian Naira (NGN).
+    NGN
+
+    # Nicaraguan Córdoba (NIO).
+    NIO
+
+    # Norwegian Kroner (NOK).
+    NOK
+
+    # Nepalese Rupee (NPR).
+    NPR
+
+    # New Zealand Dollars (NZD).
+    NZD
+
+    # Omani Rial (OMR).
+    OMR
+
+    # Panamian Balboa (PAB).
+    PAB
+
+    # Peruvian Nuevo Sol (PEN).
+    PEN
+
+    # Papua New Guinean Kina (PGK).
+    PGK
+
+    # Philippine Peso (PHP).
+    PHP
+
+    # Pakistani Rupee (PKR).
+    PKR
+
+    # Polish Zlotych (PLN).
+    PLN
+
+    # Paraguayan Guarani (PYG).
+    PYG
+
+    # Qatari Rial (QAR).
+    QAR
+
+    # Romanian Lei (RON).
+    RON
+
+    # Serbian dinar (RSD).
+    RSD
+
+    # Russian Rubles (RUB).
+    RUB
+
+    # Rwandan Franc (RWF).
+    RWF
+
+    # Saudi Riyal (SAR).
+    SAR
+
+    # Solomon Islands Dollar (SBD).
+    SBD
+
+    # Seychellois Rupee (SCR).
+    SCR
+
+    # Sudanese Pound (SDG).
+    SDG
+
+    # Swedish Kronor (SEK).
+    SEK
+
+    # Singapore Dollars (SGD).
+    SGD
+
+    # Saint Helena Pounds (SHP).
+    SHP
+
+    # Sierra Leonean Leone (SLL).
+    SLL
+
+    # Somali Shilling (SOS).
+    SOS
+
+    # Surinamese Dollar (SRD).
+    SRD
+
+    # South Sudanese Pound (SSP).
+    SSP
+
+    # Sao Tome And Principe Dobra (STN).
+    STN
+
+    # Syrian Pound (SYP).
+    SYP
+
+    # Swazi Lilangeni (SZL).
+    SZL
+
+    # Thai baht (THB).
+    THB
+
+    # Tajikistani Somoni (TJS).
+    TJS
+
+    # Turkmenistani Manat (TMT).
+    TMT
+
+    # Tunisian Dinar (TND).
+    TND
+
+    # Tongan Pa'anga (TOP).
+    TOP
+
+    # Turkish Lira (TRY).
+    TRY
+
+    # Trinidad and Tobago Dollars (TTD).
+    TTD
+
+    # Taiwan Dollars (TWD).
+    TWD
+
+    # Tanzanian Shilling (TZS).
+    TZS
+
+    # Ukrainian Hryvnia (UAH).
+    UAH
+
+    # Ugandan Shilling (UGX).
+    UGX
+
+    # United States Dollars (USD).
+    USD
+
+    # Uruguayan Pesos (UYU).
+    UYU
+
+    # Uzbekistan som (UZS).
+    UZS
+
+    # Venezuelan Bolivares (VED).
+    VED
+
+    # Venezuelan Bolivares (VES).
+    VES
+
+    # Vietnamese đồng (VND).
+    VND
+
+    # Vanuatu Vatu (VUV).
+    VUV
+
+    # Samoan Tala (WST).
+    WST
+
+    # Central African CFA Franc (XAF).
+    XAF
+
+    # East Caribbean Dollar (XCD).
+    XCD
+
+    # West African CFA franc (XOF).
+    XOF
+
+    # CFP Franc (XPF).
+    XPF
+
+    # Unrecognized currency.
+    XXX
+
+    # Yemeni Rial (YER).
+    YER
+
+    # South African Rand (ZAR).
+    ZAR
+
+    # Zambian Kwacha (ZMW).
+    ZMW
+
+    # Belarusian Ruble (BYR).
+    BYR @deprecated
+}
+
+type ProductVariantConnection {
+    # A list of edges.
+    edges: [ProductVariantEdge!]!
+
+    # A list of the nodes contained in ProductVariantEdge.
+    nodes: [ProductVariant!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+type ProductVariantEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    # The item at the end of ProductVariantEdge.
+    node: ProductVariant!
+}
+
+# The set of valid sort keys for the ProductVariant query.
+enum ProductVariantSortKeys {
+    # Sort by the `title` value.
+    TITLE
+
+    # Sort by the `sku` value.
+    SKU
+
+    # Sort by the `position` value.
+    POSITION
+
+    # Sort by the `id` value.
+    ID
+
+    # Sort by relevance to the search terms when the `query` parameter is specified on the connection.
+    # Don't use this sort key when no search query is specified.
+    RELEVANCE
+}
+
+# The set of valid sort keys for the ProductImage query.
+enum ProductImageSortKeys {
+    # Sort by the `created_at` value.
+    CREATED_AT
+
+    # Sort by the `id` value.
+    ID
+
+    # Sort by the `position` value.
+    POSITION
+
+    # Sort by relevance to the search terms when the `query` parameter is specified on the connection. Don't use this sort key when no search query is specified.
+    RELEVANCE
+}
+
+# The set of valid sort keys for the ProductMedia query.
+enum ProductMediaSortKeys {
+    # Sort by the `id` value.
+    ID
+
+    # Sort by the `position` value.
+    POSITION
+
+    # Sort by relevance to the search terms when the `query` parameter is specified on the connection. Don't use this sort key when no search query is specified.
+    RELEVANCE
+}
+
+# The possible content types for a media object.
+enum MediaContentType {
+    # An externally hosted video.
+    EXTERNAL_VIDEO
+
+    # A Shopify hosted image.
+    IMAGE
+
+    # A 3d model.
+    MODEL_3D
+
+    # A Shopify hosted video.
+    VIDEO
+}
+
+# The checkout charge when the full amount isn't charged at checkout.
+enum SellingPlanCheckoutChargeType {
+    # The checkout charge is a percentage of the product or variant price.
+    PERCENTAGE
+
+    # The checkout charge is a fixed price amount.
+    PRICE
+}
+
+# Units of measurement for weight.
+enum WeightUnit {
+    # 1 kilogram equals 1000 grams.
+    KILOGRAMS
+
+    # Metric system unit of mass.
+    GRAMS
+
+    # 1 pound equals 16 ounces.
+    POUNDS
+
+    # Imperial system unit of mass.
+    OUNCES
+}
+
+# The accepted types of unit of measurement.
+enum UnitPriceMeasurementMeasuredType {
+    # Unit of measurements representing areas.
+    AREA
+
+    # Unit of measurements representing lengths.
+    LENGTH
+
+    # Unit of measurements representing volumes.
+    VOLUME
+
+    # Unit of measurements representing weights.
+    WEIGHT
+}
+
+# The valid units of measurement for a unit price measurement.
+enum UnitPriceMeasurementMeasuredUnit {
+    # 100 centiliters equals 1 liter.
+    CL
+
+    # 100 centimeters equals 1 meter.
+    CM
+
+    # Metric system unit of weight.
+    G
+
+    # 1 kilogram equals 1000 grams.
+    KG
+
+    # Metric system unit of volume.
+    L
+
+    # Metric system unit of length.
+    M
+
+    # Metric system unit of area.
+    M2
+
+    # 1 cubic meter equals 1000 liters.
+    M3
+
+    # 1000 milligrams equals 1 gram.
+    MG
+
+    # 1000 milliliters equals 1 liter.
+    ML
+
+    # 1000 millimeters equals 1 meter.
+    MM
+}
+
+# ISO 639-1 language codes supported by Shopify.
+enum LanguageCode {
+    # Afrikaans
+    AF
+
+    # Akan
+    AK
+
+    # Amharic
+    AM
+
+    # Arabic
+    AR
+
+    # Assamese
+    AS
+
+    # Azerbaijani
+    AZ
+
+    # Belarusian
+    BE
+
+    # Bulgarian
+    BG
+
+    # Bambara
+    BM
+
+    # Bangla
+    BN
+
+    # Tibetan
+    BO
+
+    # Breton
+    BR
+
+    # Bosnian
+    BS
+
+    # Catalan
+    CA
+
+    # Chechen
+    CE
+
+    # Czech
+    CS
+
+    # Church Slavic
+    CU
+
+    # Welsh
+    CY
+
+    # Danish
+    DA
+
+    # German
+    DE
+
+    # Dzongkha
+    DZ
+
+    # Ewe
+    EE
+
+    # Greek
+    EL
+
+    # English
+    EN
+
+    # Esperanto
+    EO
+
+    # Spanish
+    ES
+
+    # Estonian
+    ET
+
+    # Basque
+    EU
+
+    # Persian
+    FA
+
+    # Fulah
+    FF
+
+    # Finnish
+    FI
+
+    # Faroese
+    FO
+
+    # French
+    FR
+
+    # Western Frisian
+    FY
+
+    # Irish
+    GA
+
+    # Scottish Gaelic
+    GD
+
+    # Galician
+    GL
+
+    # Gujarati
+    GU
+
+    # Manx
+    GV
+
+    # Hausa
+    HA
+
+    # Hebrew
+    HE
+
+    # Hindi
+    HI
+
+    # Croatian
+    HR
+
+    # Hungarian
+    HU
+
+    # Armenian
+    HY
+
+    # Interlingua
+    IA
+
+    # Indonesian
+    ID
+
+    # Igbo
+    IG
+
+    # Sichuan Yi
+    II
+
+    # Icelandic
+    IS
+
+    # Italian
+    IT
+
+    # Japanese
+    JA
+
+    # Javanese
+    JV
+
+    # Georgian.
+    KA
+
+    # Kikuyu.
+    KI
+
+    # Kazakh.
+    KK
+
+    # Kalaallisut.
+    KL
+
+    # Khmer.
+    KM
+
+    # Kannada.
+    KN
+
+    # Korean.
+    KO
+
+    # Kashmiri.
+    KS
+
+    # Kurdish.
+    KU
+
+    # Cornish.
+    KW
+
+    # Kyrgyz.
+    KY
+
+    # Luxembourgish.
+    LB
+
+    # Ganda.
+    LG
+
+    # Lingala.
+    LN
+
+    # Lao.
+    LO
+
+    # Lithuanian.
+    LT
+
+    # Luba-Katanga.
+    LU
+
+    # Latvian.
+    LV
+
+    # Malagasy.
+    MG
+
+    # Māori.
+    MI
+
+    # Macedonian.
+    MK
+
+    # Malayalam.
+    ML
+
+    # Mongolian.
+    MN
+
+    # Marathi.
+    MR
+
+    # Malay.
+    MS
+
+    # Maltese.
+    MT
+
+    # Burmese.
+    MY
+
+    # Norwegian (Bokmål).
+    NB
+
+    # North Ndebele.
+    ND
+
+    # Nepali.
+    NE
+
+    # Dutch.
+    NL
+
+    # Norwegian Nynorsk.
+    NN
+
+    # Norwegian.
+    NO
+
+    # Oromo.
+    OM
+
+    # Odia.
+    OR
+
+    # Ossetic.
+    OS
+
+    # Punjabi.
+    PA
+
+    # Polish.
+    PL
+
+    # Pashto.
+    PS
+
+    # Portuguese (Brazil).
+    PT_BR
+
+    # Portuguese (Portugal).
+    PT_PT
+
+    QU
+    # Quechua.
+
+    # Romansh.
+    RM
+
+    # Rundi.
+    RN
+
+    # Romanian.
+    RO
+
+    # Russian.
+    RU
+
+    # Kinyarwanda.
+    RW
+
+    # Sindhi.
+    SD
+
+    # Northern Sami.
+    SE
+
+    # Sango.
+    SG
+
+    # Sinhala.
+    SI
+
+    # Slovak.
+    SK
+
+    # Slovenian.
+    SL
+
+    # Shona.
+    SN
+
+    # Somali.
+    SO
+
+    # Albanian.
+    SQ
+
+    # Serbian.
+    SR
+
+    # Sundanese.
+    SU
+
+    # Swedish.
+    SV
+
+    # Swahili.
+    SW
+
+    # Tamil.
+    TA
+
+    # Telugu.
+    TE
+
+    # Tajik.
+    TG
+
+    # Thai.
+    TH
+
+    # Tigrinya.
+    TI
+
+    # Turkmen.
+    TK
+
+    # Tongan.
+    TO
+
+    # Turkish.
+    TR
+
+    # Tatar.
+    TT
+
+    # Uyghur.
+    UG
+
+    # Ukrainian.
+    UK
+
+    # Urdu.
+    UR
+
+    # Uzbek.
+    UZ
+
+    # Vietnamese.
+    VI
+
+    # Wolof.
+    WO
+
+    # Xhosa.
+    XH
+
+    # Yiddish.
+    YI
+
+    # Yoruba.
+    YO
+
+    # Chinese (Simplified).
+    ZH_CN
+
+    # Chinese (Traditional).
+    ZH_TW
+
+    # Zulu.
+    ZU
+
+    # Chinese.
+    ZH
+
+    # Portuguese.
+    PT
+
+    # Volapük.
+    VO
+}
+
+# The code designating a country/region, which generally follows ISO 3166-1 alpha-2 guidelines.
+# If a territory doesn't have a country code value in the CountryCode enum, then it might be considered a subdivision
+# of another country. For example, the territories associated with Spain are represented by the country code ES,
+# and the territories associated with the United States of America are represented by the country code US.
+enum CountryCode {
+    # Afghanistan.
+    AF
+
+    # Åland Islands.
+    AX
+
+    # Albania.
+    AL
+
+    # Algeria.
+    DZ
+
+    # Andorra.
+    AD
+
+    # Angola.
+    AO
+
+    # Anguilla.
+    AI
+
+    # Antigua & Barbuda.
+    AG
+
+    # Argentina.
+    AR
+
+    # Armenia.
+    AM
+
+    # Aruba.
+    AW
+
+    # Ascension Island.
+    AC
+
+    # Australia.
+    AU
+
+    # Austria.
+    AT
+
+    # Azerbaijan.
+    AZ
+
+    # Bahamas.
+    BS
+
+    # Bahrain.
+    BH
+
+    # Bangladesh.
+    BD
+
+    # Barbados.
+    BB
+
+    # Belarus.
+    BY
+
+    # Belgium.
+    BE
+
+    # Belize.
+    BZ
+
+    # Benin.
+    BJ
+
+    # Bermuda.
+    BM
+
+    # Bhutan.
+    BT
+
+    # Bolivia.
+    BO
+
+    # Bosnia & Herzegovina.
+    BA
+
+    # Botswana.
+    BW
+
+    # Bouvet Island.
+    BV
+
+    # Brazil.
+    BR
+
+    # British Indian Ocean Territory.
+    IO
+
+    # Brunei.
+    BN
+
+    # Bulgaria.
+    BG
+
+    # Burkina Faso.
+    BF
+
+    # Burundi.
+    BI
+
+    # Cambodia.
+    KH
+
+    # Canada.
+    CA
+
+    # Cape Verde.
+    CV
+
+    # Caribbean Netherlands.
+    BQ
+
+    # Cayman Islands.
+    KY
+
+    # Central African Republic.
+    CF
+
+    # Chad.
+    TD
+
+    # Chile.
+    CL
+
+    # China.
+    CN
+
+    # Christmas Island.
+    CX
+
+    # Cocos (Keeling) Islands.
+    CC
+
+    # Colombia.
+    CO
+
+    # Comoros.
+    KM
+
+    # Congo - Brazzaville.
+    CG
+
+    # Congo - Kinshasa.
+    CD
+
+    # Cook Islands.
+    CK
+
+    # Costa Rica.
+    CR
+
+    # Croatia.
+    HR
+
+    # Cuba.
+    CU
+
+    # Curaçao.
+    CW
+
+    # Cyprus.
+    CY
+
+    # Czechia.
+    CZ
+
+    # Côte d’Ivoire.
+    CI
+
+    # Denmark.
+    DK
+
+    # Djibouti.
+    DJ
+
+    # Dominica.
+    DM
+
+    # Dominican Republic.
+    DO
+
+    # Ecuador.
+    EC
+
+    # Egypt.
+    EG
+
+    # El Salvador.
+    SV
+
+    # Equatorial Guinea.
+    GQ
+
+    # Eritrea.
+    ER
+
+    # Estonia.
+    EE
+
+    # Eswatini.
+    SZ
+
+    # Ethiopia.
+    ET
+
+    # Falkland Islands.
+    FK
+
+    # Faroe Islands.
+    FO
+
+    # Fiji.
+    FJ
+
+    # Finland.
+    FI
+
+    # France.
+    FR
+
+    # French Guiana.
+    GF
+
+    # French Polynesia.
+    PF
+
+    # French Southern Territories.
+    TF
+
+    # Gabon.
+    GA
+
+    # Gambia.
+    GM
+
+    # Georgia.
+    GE
+
+    # Germany.
+    DE
+
+    # Ghana.
+    GH
+
+    # Gibraltar.
+    GI
+
+    # Greece.
+    GR
+
+    # Greenland.
+    GL
+
+    # Grenada.
+    GD
+
+    # Guadeloupe.
+    GP
+
+    # Guatemala.
+    GT
+
+    # Guernsey.
+    GG
+
+    # Guinea.
+    GN
+
+    # Guinea-Bissau.
+    GW
+
+    # Guyana.
+    GY
+
+    # Haiti.
+    HT
+
+    # Heard & McDonald Islands.
+    HM
+
+    # Vatican City.
+    VA
+
+    # Honduras.
+    HN
+
+    # Hong Kong SAR.
+    HK
+
+    # Hungary.
+    HU
+
+    # Iceland.
+    IS
+
+    # India.
+    IN
+
+    # Indonesia.
+    ID
+
+    # Iran.
+    IR
+
+    # Iraq.
+    IQ
+
+    # Ireland.
+    IE
+
+    # Isle of Man.
+    IM
+
+    # Israel.
+    IL
+
+    # Italy.
+    IT
+
+    # Jamaica.
+    JM
+
+    # Japan.
+    JP
+
+    # Jersey.
+    JE
+
+    # Jordan.
+    JO
+
+    # Kazakhstan.
+    KZ
+
+    # Kenya.
+    KE
+
+    # Kiribati.
+    KI
+
+    # North Korea.
+    KP
+
+    # Kosovo.
+    XK
+
+    # Kuwait.
+    KW
+
+    # Kyrgyzstan.
+    KG
+
+    # Laos.
+    LA
+
+    # Latvia.
+    LV
+
+    # Lebanon.
+    LB
+
+    # Lesotho.
+    LS
+
+    # Liberia.
+    LR
+
+    # Libya.
+    LY
+
+    # Liechtenstein.
+    LI
+
+    # Lithuania.
+    LT
+
+    # Luxembourg.
+    LU
+
+    # Macao SAR.
+    MO
+
+    # Madagascar.
+    MG
+
+    # Malawi.
+    MW
+
+    # Malaysia.
+    MY
+
+    # Maldives.
+    MV
+
+    # Mali.
+    ML
+
+    # Malta.
+    MT
+
+    # Martinique.
+    MQ
+
+    # Mauritania.
+    MR
+
+    # Mauritius.
+    MU
+
+    # Mayotte.
+    YT
+
+    # Mexico.
+    MX
+
+    # Moldova.
+    MD
+
+    # Monaco.
+    MC
+
+    # Mongolia.
+    MN
+
+    # Montenegro.
+    ME
+
+    # Montserrat.
+    MS
+
+    # Morocco.
+    MA
+
+    # Mozambique.
+    MZ
+
+    # Myanmar (Burma).
+    MM
+
+    # Namibia.
+    NA
+
+    # Nauru.
+    NR
+
+    # Nepal.
+    NP
+
+    # Netherlands.
+    NL
+
+    # Netherlands Antilles.
+    AN
+
+    # New Caledonia.
+    NC
+
+    # New Zealand.
+    NZ
+
+    # Nicaragua.
+    NI
+
+    # Niger.
+    NE
+
+    # Nigeria.
+    NG
+
+    # Niue.
+    NU
+
+    # Norfolk Island.
+    NF
+
+    # North Macedonia.
+    MK
+
+    # Norway.
+    NO
+
+    # Oman.
+    OM
+
+    # Pakistan.
+    PK
+
+    # Palestinian Territories.
+    PS
+
+    # Panama.
+    PA
+
+    # Papua New Guinea.
+    PG
+
+    # Paraguay.
+    PY
+
+    # Peru.
+    PE
+
+    # Philippines.
+    PH
+
+    # Pitcairn Islands.
+    PN
+
+    # Poland.
+    PL
+
+    # Portugal.
+    PT
+
+    # Qatar.
+    QA
+
+    # Cameroon.
+    CM
+
+    # Réunion.
+    RE
+
+    # Romania.
+    RO
+
+    # Russia.
+    RU
+
+    # Rwanda.
+    RW
+
+    # St. Barthélemy.
+    BL
+
+    # St. Helena.
+    SH
+
+    # St. Kitts & Nevis.
+    KN
+
+    # St. Lucia.
+    LC
+
+    # St. Martin.
+    MF
+
+    # St. Pierre & Miquelon.
+    PM
+
+    # Samoa.
+    WS
+
+    # San Marino.
+    SM
+
+    # São Tomé & Príncipe.
+    ST
+
+    # Saudi Arabia.
+    SA
+
+    # Senegal.
+    SN
+
+    # Serbia.
+    RS
+
+    # Seychelles.
+    SC
+
+    # Sierra Leone.
+    SL
+
+    # Singapore.
+    SG
+
+    # Sint Maarten.
+    SX
+
+    # Slovakia.
+    SK
+
+    # Slovenia.
+    SI
+
+    # Solomon Islands.
+    SB
+
+    # Somalia.
+    SO
+
+    # South Africa.
+    ZA
+
+    # South Georgia & South Sandwich Islands.
+    GS
+
+    # South Korea.
+    KR
+
+    # South Sudan.
+    SS
+
+    # Spain.
+    ES
+
+    # Sri Lanka.
+    LK
+
+    # St. Vincent & Grenadines.
+    VC
+
+    # Sudan.
+    SD
+
+    # Suriname.
+    SR
+
+    # Svalbard & Jan Mayen.
+    SJ
+
+    # Sweden.
+    SE
+
+    # Switzerland.
+    CH
+
+    # Syria.
+    SY
+
+    # Taiwan.
+    TW
+
+    # Tajikistan.
+    TJ
+
+    # Tanzania.
+    TZ
+
+    # Thailand.
+    TH
+
+    # Timor-Leste.
+    TL
+
+    # Togo.
+    TG
+
+    # Tokelau.
+    TK
+
+    # Tonga.
+    TO
+
+    # Trinidad & Tobago.
+    TT
+
+    # Tristan da Cunha.
+    TA
+
+    # Tunisia.
+    TN
+
+    # Turkey.
+    TR
+
+    # Turkmenistan.
+    TM
+
+    # Turks & Caicos Islands.
+    TC
+
+    # Tuvalu.
+    TV
+
+    # Uganda.
+    UG
+
+    # Ukraine.
+    UA
+
+    # United Arab Emirates.
+    AE
+
+    # United Kingdom.
+    GB
+
+    # United States.
+    US
+
+    # U.S. Outlying Islands.
+    UM
+
+    # Uruguay.
+    UY
+
+    # Uzbekistan.
+    UZ
+
+    # Vanuatu.
+    VU
+
+    # Venezuela.
+    VE
+
+    # Vietnam.
+    VN
+
+    # British Virgin Islands.
+    VG
+
+    # Wallis & Futuna.
+    WF
+
+    # Western Sahara.
+    EH
+
+    # Yemen.
+    YE
+
+    # Zambia.
+    ZM
+
+    # Zimbabwe.
+    ZW
+
+    # Unknown Region.
+    ZZ
+}

+ 1294 - 0
subgraph/shop.graphql

@@ -0,0 +1,1294 @@
+directive @goTag(
+    key: String!
+    value: String
+) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
+
+directive @goField(
+    forceResolver: Boolean,
+    name: String
+) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
+
+type Query {
+    locations(
+        after: String
+        before: String
+        first: Int
+        last: Int
+        near: GeoCoordinateInput
+        reverse: Boolean = false
+        sortKey: LocationSortKeys = ID
+    ): LocationConnection!
+}
+
+type LocationConnection {
+    # A list of edges.
+    edges: [LocationEdge!]!
+
+    # A list of the nodes contained in LocationEdge.
+    nodes: [Location!]!
+
+    # Information to aid in pagination.
+    pageInfo: PageInfo!
+}
+
+type LocationEdge {
+    # A cursor for use in pagination.
+    cursor: String!
+
+    #  The item at the end of LocationEdge.
+    node: Location!
+}
+
+input GeoCoordinateInput {
+    # The coordinate's latitude value.
+    latitude: Float!
+
+    # The coordinate's longitude value.
+    longitude: Float!
+}
+
+enum LocationSortKeys {
+    # Sort by the `id` value.
+    ID
+
+    # Sort by the `name` value.
+    NAME
+
+    # Sort by the `city` value.
+    CITY
+
+    # Sort by the `distance` value.
+    DISTANCE
+}
+
+# An object with an ID field to support global identification, in accordance with the
+# Relay specification.
+# This interface is used by the node
+# and nodes queries.
+interface Node {
+    # A globally-unique identifier.
+    id: ID!
+
+
+}
+
+# Returns information about pagination in a connection, in accordance with the Relay specification.
+type PageInfo {
+    # The cursor corresponding to the last node in edges.
+    endCursor: String
+
+    # Whether there are more pages to fetch following the current page.
+    hasNextPage: Boolean!
+
+    # Whether there are any pages prior to the current page.
+    hasPreviousPage: Boolean!
+
+    # The cursor corresponding to the first node in edges.
+    startCursor: String
+}
+
+# Represents a location where product inventory is held.
+type Location implements Node @key(fields: "id") {
+    # The address of the location.
+    address: LocationAddress!
+
+    # A globally-unique identifier.
+    id: ID!
+
+    # The name of the location.
+    name: String!
+}
+
+# Represents the address of a location.
+type LocationAddress {
+    # The first line of the address for the location.
+    address1: String
+
+    # The second line of the address for the location.
+    address2: String
+
+    # The city of the location.
+    city: String
+
+    # The country of the location.
+    country: String
+
+    # The country code of the location.
+    countryCode: String
+
+    # A formatted version of the address for the location.
+    formatted: [String!]!
+
+    # The latitude coordinates of the location.
+    latitude: Float
+
+    # The longitude coordinates of the location.
+    longitude: Float
+
+    # The phone number of the location.
+    phone: String
+
+    # The province of the location.
+    province: String
+
+    # The code for the province, state, or district of the address of the location.
+    provinceCode: String
+
+    # The ZIP code of the location.
+    zip: String
+}
+
+# ISO 639-1 language codes supported by Shopify.
+enum LanguageCode {
+    # Afrikaans
+    AF
+
+    # Akan
+    AK
+
+    # Amharic
+    AM
+
+    # Arabic
+    AR
+
+    # Assamese
+    AS
+
+    # Azerbaijani
+    AZ
+
+    # Belarusian
+    BE
+
+    # Bulgarian
+    BG
+
+    # Bambara
+    BM
+
+    # Bangla
+    BN
+
+    # Tibetan
+    BO
+
+    # Breton
+    BR
+
+    # Bosnian
+    BS
+
+    # Catalan
+    CA
+
+    # Chechen
+    CE
+
+    # Czech
+    CS
+
+    # Church Slavic
+    CU
+
+    # Welsh
+    CY
+
+    # Danish
+    DA
+
+    # German
+    DE
+
+    # Dzongkha
+    DZ
+
+    # Ewe
+    EE
+
+    # Greek
+    EL
+
+    # English
+    EN
+
+    # Esperanto
+    EO
+
+    # Spanish
+    ES
+
+    # Estonian
+    ET
+
+    # Basque
+    EU
+
+    # Persian
+    FA
+
+    # Fulah
+    FF
+
+    # Finnish
+    FI
+
+    # Faroese
+    FO
+
+    # French
+    FR
+
+    # Western Frisian
+    FY
+
+    # Irish
+    GA
+
+    # Scottish Gaelic
+    GD
+
+    # Galician
+    GL
+
+    # Gujarati
+    GU
+
+    # Manx
+    GV
+
+    # Hausa
+    HA
+
+    # Hebrew
+    HE
+
+    # Hindi
+    HI
+
+    # Croatian
+    HR
+
+    # Hungarian
+    HU
+
+    # Armenian
+    HY
+
+    # Interlingua
+    IA
+
+    # Indonesian
+    ID
+
+    # Igbo
+    IG
+
+    # Sichuan Yi
+    II
+
+    # Icelandic
+    IS
+
+    # Italian
+    IT
+
+    # Japanese
+    JA
+
+    # Javanese
+    JV
+
+    # Georgian.
+    KA
+
+    # Kikuyu.
+    KI
+
+    # Kazakh.
+    KK
+
+    # Kalaallisut.
+    KL
+
+    # Khmer.
+    KM
+
+    # Kannada.
+    KN
+
+    # Korean.
+    KO
+
+    # Kashmiri.
+    KS
+
+    # Kurdish.
+    KU
+
+    # Cornish.
+    KW
+
+    # Kyrgyz.
+    KY
+
+    # Luxembourgish.
+    LB
+
+    # Ganda.
+    LG
+
+    # Lingala.
+    LN
+
+    # Lao.
+    LO
+
+    # Lithuanian.
+    LT
+
+    # Luba-Katanga.
+    LU
+
+    # Latvian.
+    LV
+
+    # Malagasy.
+    MG
+
+    # Māori.
+    MI
+
+    # Macedonian.
+    MK
+
+    # Malayalam.
+    ML
+
+    # Mongolian.
+    MN
+
+    # Marathi.
+    MR
+
+    # Malay.
+    MS
+
+    # Maltese.
+    MT
+
+    # Burmese.
+    MY
+
+    # Norwegian (Bokmål).
+    NB
+
+    # North Ndebele.
+    ND
+
+    # Nepali.
+    NE
+
+    # Dutch.
+    NL
+
+    # Norwegian Nynorsk.
+    NN
+
+    # Norwegian.
+    NO
+
+    # Oromo.
+    OM
+
+    # Odia.
+    OR
+
+    # Ossetic.
+    OS
+
+    # Punjabi.
+    PA
+
+    # Polish.
+    PL
+
+    # Pashto.
+    PS
+
+    # Portuguese (Brazil).
+    PT_BR
+
+    # Portuguese (Portugal).
+    PT_PT
+
+    QU
+    # Quechua.
+
+    # Romansh.
+    RM
+
+    # Rundi.
+    RN
+
+    # Romanian.
+    RO
+
+    # Russian.
+    RU
+
+    # Kinyarwanda.
+    RW
+
+    # Sindhi.
+    SD
+
+    # Northern Sami.
+    SE
+
+    # Sango.
+    SG
+
+    # Sinhala.
+    SI
+
+    # Slovak.
+    SK
+
+    # Slovenian.
+    SL
+
+    # Shona.
+    SN
+
+    # Somali.
+    SO
+
+    # Albanian.
+    SQ
+
+    # Serbian.
+    SR
+
+    # Sundanese.
+    SU
+
+    # Swedish.
+    SV
+
+    # Swahili.
+    SW
+
+    # Tamil.
+    TA
+
+    # Telugu.
+    TE
+
+    # Tajik.
+    TG
+
+    # Thai.
+    TH
+
+    # Tigrinya.
+    TI
+
+    # Turkmen.
+    TK
+
+    # Tongan.
+    TO
+
+    # Turkish.
+    TR
+
+    # Tatar.
+    TT
+
+    # Uyghur.
+    UG
+
+    # Ukrainian.
+    UK
+
+    # Urdu.
+    UR
+
+    # Uzbek.
+    UZ
+
+    # Vietnamese.
+    VI
+
+    # Wolof.
+    WO
+
+    # Xhosa.
+    XH
+
+    # Yiddish.
+    YI
+
+    # Yoruba.
+    YO
+
+    # Chinese (Simplified).
+    ZH_CN
+
+    # Chinese (Traditional).
+    ZH_TW
+
+    # Zulu.
+    ZU
+
+    # Chinese.
+    ZH
+
+    # Portuguese.
+    PT
+
+    # Volapük.
+    VO
+}
+
+# The code designating a country/region, which generally follows ISO 3166-1 alpha-2 guidelines.
+# If a territory doesn't have a country code value in the CountryCode enum, then it might be considered a subdivision
+# of another country. For example, the territories associated with Spain are represented by the country code ES,
+# and the territories associated with the United States of America are represented by the country code US.
+enum CountryCode {
+    # Afghanistan.
+    AF
+
+    # Åland Islands.
+    AX
+
+    # Albania.
+    AL
+
+    # Algeria.
+    DZ
+
+    # Andorra.
+    AD
+
+    # Angola.
+    AO
+
+    # Anguilla.
+    AI
+
+    # Antigua & Barbuda.
+    AG
+
+    # Argentina.
+    AR
+
+    # Armenia.
+    AM
+
+    # Aruba.
+    AW
+
+    # Ascension Island.
+    AC
+
+    # Australia.
+    AU
+
+    # Austria.
+    AT
+
+    # Azerbaijan.
+    AZ
+
+    # Bahamas.
+    BS
+
+    # Bahrain.
+    BH
+
+    # Bangladesh.
+    BD
+
+    # Barbados.
+    BB
+
+    # Belarus.
+    BY
+
+    # Belgium.
+    BE
+
+    # Belize.
+    BZ
+
+    # Benin.
+    BJ
+
+    # Bermuda.
+    BM
+
+    # Bhutan.
+    BT
+
+    # Bolivia.
+    BO
+
+    # Bosnia & Herzegovina.
+    BA
+
+    # Botswana.
+    BW
+
+    # Bouvet Island.
+    BV
+
+    # Brazil.
+    BR
+
+    # British Indian Ocean Territory.
+    IO
+
+    # Brunei.
+    BN
+
+    # Bulgaria.
+    BG
+
+    # Burkina Faso.
+    BF
+
+    # Burundi.
+    BI
+
+    # Cambodia.
+    KH
+
+    # Canada.
+    CA
+
+    # Cape Verde.
+    CV
+
+    # Caribbean Netherlands.
+    BQ
+
+    # Cayman Islands.
+    KY
+
+    # Central African Republic.
+    CF
+
+    # Chad.
+    TD
+
+    # Chile.
+    CL
+
+    # China.
+    CN
+
+    # Christmas Island.
+    CX
+
+    # Cocos (Keeling) Islands.
+    CC
+
+    # Colombia.
+    CO
+
+    # Comoros.
+    KM
+
+    # Congo - Brazzaville.
+    CG
+
+    # Congo - Kinshasa.
+    CD
+
+    # Cook Islands.
+    CK
+
+    # Costa Rica.
+    CR
+
+    # Croatia.
+    HR
+
+    # Cuba.
+    CU
+
+    # Curaçao.
+    CW
+
+    # Cyprus.
+    CY
+
+    # Czechia.
+    CZ
+
+    # Côte d’Ivoire.
+    CI
+
+    # Denmark.
+    DK
+
+    # Djibouti.
+    DJ
+
+    # Dominica.
+    DM
+
+    # Dominican Republic.
+    DO
+
+    # Ecuador.
+    EC
+
+    # Egypt.
+    EG
+
+    # El Salvador.
+    SV
+
+    # Equatorial Guinea.
+    GQ
+
+    # Eritrea.
+    ER
+
+    # Estonia.
+    EE
+
+    # Eswatini.
+    SZ
+
+    # Ethiopia.
+    ET
+
+    # Falkland Islands.
+    FK
+
+    # Faroe Islands.
+    FO
+
+    # Fiji.
+    FJ
+
+    # Finland.
+    FI
+
+    # France.
+    FR
+
+    # French Guiana.
+    GF
+
+    # French Polynesia.
+    PF
+
+    # French Southern Territories.
+    TF
+
+    # Gabon.
+    GA
+
+    # Gambia.
+    GM
+
+    # Georgia.
+    GE
+
+    # Germany.
+    DE
+
+    # Ghana.
+    GH
+
+    # Gibraltar.
+    GI
+
+    # Greece.
+    GR
+
+    # Greenland.
+    GL
+
+    # Grenada.
+    GD
+
+    # Guadeloupe.
+    GP
+
+    # Guatemala.
+    GT
+
+    # Guernsey.
+    GG
+
+    # Guinea.
+    GN
+
+    # Guinea-Bissau.
+    GW
+
+    # Guyana.
+    GY
+
+    # Haiti.
+    HT
+
+    # Heard & McDonald Islands.
+    HM
+
+    # Vatican City.
+    VA
+
+    # Honduras.
+    HN
+
+    # Hong Kong SAR.
+    HK
+
+    # Hungary.
+    HU
+
+    # Iceland.
+    IS
+
+    # India.
+    IN
+
+    # Indonesia.
+    ID
+
+    # Iran.
+    IR
+
+    # Iraq.
+    IQ
+
+    # Ireland.
+    IE
+
+    # Isle of Man.
+    IM
+
+    # Israel.
+    IL
+
+    # Italy.
+    IT
+
+    # Jamaica.
+    JM
+
+    # Japan.
+    JP
+
+    # Jersey.
+    JE
+
+    # Jordan.
+    JO
+
+    # Kazakhstan.
+    KZ
+
+    # Kenya.
+    KE
+
+    # Kiribati.
+    KI
+
+    # North Korea.
+    KP
+
+    # Kosovo.
+    XK
+
+    # Kuwait.
+    KW
+
+    # Kyrgyzstan.
+    KG
+
+    # Laos.
+    LA
+
+    # Latvia.
+    LV
+
+    # Lebanon.
+    LB
+
+    # Lesotho.
+    LS
+
+    # Liberia.
+    LR
+
+    # Libya.
+    LY
+
+    # Liechtenstein.
+    LI
+
+    # Lithuania.
+    LT
+
+    # Luxembourg.
+    LU
+
+    # Macao SAR.
+    MO
+
+    # Madagascar.
+    MG
+
+    # Malawi.
+    MW
+
+    # Malaysia.
+    MY
+
+    # Maldives.
+    MV
+
+    # Mali.
+    ML
+
+    # Malta.
+    MT
+
+    # Martinique.
+    MQ
+
+    # Mauritania.
+    MR
+
+    # Mauritius.
+    MU
+
+    # Mayotte.
+    YT
+
+    # Mexico.
+    MX
+
+    # Moldova.
+    MD
+
+    # Monaco.
+    MC
+
+    # Mongolia.
+    MN
+
+    # Montenegro.
+    ME
+
+    # Montserrat.
+    MS
+
+    # Morocco.
+    MA
+
+    # Mozambique.
+    MZ
+
+    # Myanmar (Burma).
+    MM
+
+    # Namibia.
+    NA
+
+    # Nauru.
+    NR
+
+    # Nepal.
+    NP
+
+    # Netherlands.
+    NL
+
+    # Netherlands Antilles.
+    AN
+
+    # New Caledonia.
+    NC
+
+    # New Zealand.
+    NZ
+
+    # Nicaragua.
+    NI
+
+    # Niger.
+    NE
+
+    # Nigeria.
+    NG
+
+    # Niue.
+    NU
+
+    # Norfolk Island.
+    NF
+
+    # North Macedonia.
+    MK
+
+    # Norway.
+    NO
+
+    # Oman.
+    OM
+
+    # Pakistan.
+    PK
+
+    # Palestinian Territories.
+    PS
+
+    # Panama.
+    PA
+
+    # Papua New Guinea.
+    PG
+
+    # Paraguay.
+    PY
+
+    # Peru.
+    PE
+
+    # Philippines.
+    PH
+
+    # Pitcairn Islands.
+    PN
+
+    # Poland.
+    PL
+
+    # Portugal.
+    PT
+
+    # Qatar.
+    QA
+
+    # Cameroon.
+    CM
+
+    # Réunion.
+    RE
+
+    # Romania.
+    RO
+
+    # Russia.
+    RU
+
+    # Rwanda.
+    RW
+
+    # St. Barthélemy.
+    BL
+
+    # St. Helena.
+    SH
+
+    # St. Kitts & Nevis.
+    KN
+
+    # St. Lucia.
+    LC
+
+    # St. Martin.
+    MF
+
+    # St. Pierre & Miquelon.
+    PM
+
+    # Samoa.
+    WS
+
+    # San Marino.
+    SM
+
+    # São Tomé & Príncipe.
+    ST
+
+    # Saudi Arabia.
+    SA
+
+    # Senegal.
+    SN
+
+    # Serbia.
+    RS
+
+    # Seychelles.
+    SC
+
+    # Sierra Leone.
+    SL
+
+    # Singapore.
+    SG
+
+    # Sint Maarten.
+    SX
+
+    # Slovakia.
+    SK
+
+    # Slovenia.
+    SI
+
+    # Solomon Islands.
+    SB
+
+    # Somalia.
+    SO
+
+    # South Africa.
+    ZA
+
+    # South Georgia & South Sandwich Islands.
+    GS
+
+    # South Korea.
+    KR
+
+    # South Sudan.
+    SS
+
+    # Spain.
+    ES
+
+    # Sri Lanka.
+    LK
+
+    # St. Vincent & Grenadines.
+    VC
+
+    # Sudan.
+    SD
+
+    # Suriname.
+    SR
+
+    # Svalbard & Jan Mayen.
+    SJ
+
+    # Sweden.
+    SE
+
+    # Switzerland.
+    CH
+
+    # Syria.
+    SY
+
+    # Taiwan.
+    TW
+
+    # Tajikistan.
+    TJ
+
+    # Tanzania.
+    TZ
+
+    # Thailand.
+    TH
+
+    # Timor-Leste.
+    TL
+
+    # Togo.
+    TG
+
+    # Tokelau.
+    TK
+
+    # Tonga.
+    TO
+
+    # Trinidad & Tobago.
+    TT
+
+    # Tristan da Cunha.
+    TA
+
+    # Tunisia.
+    TN
+
+    # Turkey.
+    TR
+
+    # Turkmenistan.
+    TM
+
+    # Turks & Caicos Islands.
+    TC
+
+    # Tuvalu.
+    TV
+
+    # Uganda.
+    UG
+
+    # Ukraine.
+    UA
+
+    # United Arab Emirates.
+    AE
+
+    # United Kingdom.
+    GB
+
+    # United States.
+    US
+
+    # U.S. Outlying Islands.
+    UM
+
+    # Uruguay.
+    UY
+
+    # Uzbekistan.
+    UZ
+
+    # Vanuatu.
+    VU
+
+    # Venezuela.
+    VE
+
+    # Vietnam.
+    VN
+
+    # British Virgin Islands.
+    VG
+
+    # Wallis & Futuna.
+    WF
+
+    # Western Sahara.
+    EH
+
+    # Yemen.
+    YE
+
+    # Zambia.
+    ZM
+
+    # Zimbabwe.
+    ZW
+
+    # Unknown Region.
+    ZZ
+}