Merge branch 'addGraphQLCodegen' of https://github.com/cond0r/commerce into shopify-updates

This commit is contained in:
cond0r 2021-05-24 08:30:11 +03:00
commit 03ad9ba902
24 changed files with 1082 additions and 354 deletions

View File

@ -121,3 +121,15 @@ const pages = await getAllPages({
config,
})
```
## Code generation
This provider makes use of GraphQL code generation. The [schema.graphql](./schema.graphql) and [schema.d.ts](./schema.d.ts) files contain the generated types & schema introspection results.
When developing the provider, changes to any GraphQL operations should be followed by re-generation of the types and schema files:
From the project root dir, run:
```sh
yarn generate:shopify
```

View File

@ -1,6 +1,12 @@
import { ProductEdge } from '../../schema'
import {
GetAllProductPathsQuery,
GetAllProductVendorsQuery,
ProductEdge,
} from '../../schema'
import { ShopifyConfig } from '..'
type FetchAllProductsQuery = GetAllProductPathsQuery | GetAllProductVendorsQuery
const fetchAllProducts = async ({
config,
query,
@ -10,19 +16,18 @@ const fetchAllProducts = async ({
}: {
config: ShopifyConfig
query: string
acc?: ProductEdge[]
acc?: any[]
variables?: any
cursor?: string
}): Promise<ProductEdge[]> => {
const { data } = await config.fetch(query, {
const { data } = await config.fetch<FetchAllProductsQuery>(query, {
variables: { ...variables, cursor },
})
const edges: ProductEdge[] = data.products?.edges ?? []
const hasNextPage = data.products?.pageInfo?.hasNextPage
const edges = data.products.edges
acc = acc.concat(edges)
if (hasNextPage) {
if (data.products.pageInfo.hasNextPage) {
const cursor = edges.pop()?.cursor
if (cursor) {
return fetchAllProducts({

View File

@ -0,0 +1,32 @@
{
"schema": {
"https://${NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN}/api/2021-01/graphql.json": {
"headers": {
"X-Shopify-Storefront-Access-Token": "${NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN}"
}
}
},
"documents": [
{
"./framework/shopify/**/*.{ts,tsx}": {
"noRequire": true
}
}
],
"generates": {
"./framework/shopify/schema.d.ts": {
"plugins": ["typescript", "typescript-operations"],
"config": {
"scalars": {
"ID": "string"
}
}
},
"./framework/shopify/schema.graphql": {
"plugins": ["schema-ast"]
}
},
"hooks": {
"afterAllFileWrite": ["prettier --write"]
}
}

View File

@ -1,6 +1,7 @@
import { getConfig, ShopifyConfig } from '../api'
import getCustomerIdQuery from '../utils/queries/get-customer-id-query'
import Cookies from 'js-cookie'
import { GetCustomerIdQuery } from '../schema'
async function getCustomerId({
customerToken: customerAccesToken,
@ -8,17 +9,19 @@ async function getCustomerId({
}: {
customerToken: string
config?: ShopifyConfig
}): Promise<number | undefined> {
}): Promise<string | undefined> {
config = getConfig(config)
const { data } = await config.fetch(getCustomerIdQuery, {
const {
data: { customer },
} = await config.fetch<GetCustomerIdQuery>(getCustomerIdQuery, {
variables: {
customerAccesToken:
customerAccesToken || Cookies.get(config.customerCookie),
},
})
return data.customer?.id
return customer?.id
}
export default getCustomerId

View File

@ -10,11 +10,15 @@ export const handler: SWRHook<Customer | null> = {
query: getCustomerQuery,
},
async fetcher({ options, fetch }) {
const data = await fetch<any | null>({
const customerAccessToken = getCustomerToken()
if (customerAccessToken) {
const data = await fetch({
...options,
variables: { customerAccessToken: getCustomerToken() },
})
return data.customer ?? null
return data.customer
}
return null
},
useHook: ({ useData }) => (input) => {
return useData({

View File

@ -1,4 +1,4 @@
import { CollectionEdge } from '../schema'
import { GetSiteCollectionsQuery } from '../schema'
import { getConfig, ShopifyConfig } from '../api'
import getAllCollectionsQuery from '../utils/queries/get-all-collections-query'
@ -10,11 +10,13 @@ const getAllCollections = async (options?: {
let { config, variables = { first: 250 } } = options ?? {}
config = getConfig(config)
const { data } = await config.fetch(getAllCollectionsQuery, { variables })
const edges = data.collections?.edges ?? []
const { data } = await config.fetch<GetSiteCollectionsQuery>(
getAllCollectionsQuery,
{ variables }
)
const categories = edges.map(
({ node: { id: entityId, title: name, handle } }: CollectionEdge) => ({
const categories = data.collections.edges.map(
({ node: { id: entityId, title: name, handle } }) => ({
entityId,
name,
path: `/${handle}`,

View File

@ -1,7 +1,5 @@
import { Product } from '@commerce/types'
import { getConfig, ShopifyConfig } from '../api'
import fetchAllProducts from '../api/utils/fetch-all-products'
import { ProductEdge } from '../schema'
import getAllProductsPathsQuery from '../utils/queries/get-all-products-paths-query'
type ProductPath = {
@ -31,7 +29,7 @@ const getAllProductPaths = async (options?: {
})
return {
products: products?.map(({ node: { handle } }: ProductEdge) => ({
products: products?.map(({ node: { handle } }) => ({
node: {
path: `/${handle}`,
},

View File

@ -1,6 +1,5 @@
import { GraphQLFetcherResult } from '@commerce/api'
import { getConfig, ShopifyConfig } from '../api'
import { ProductEdge } from '../schema'
import { GetAllProductsQuery, Product as ShopifyProduct } from '../schema'
import { getAllProductsQuery } from '../utils/queries'
import { normalizeProduct } from '../utils/normalize'
import { Product } from '@commerce/types'
@ -10,30 +9,25 @@ type Variables = {
field?: string
}
type ReturnType = {
products: Product[]
}
const getAllProducts = async (options: {
variables?: Variables
config?: ShopifyConfig
preview?: boolean
}): Promise<ReturnType> => {
}): Promise<{
products: Product[]
}> => {
let { config, variables = { first: 250 } } = options ?? {}
config = getConfig(config)
const { data }: GraphQLFetcherResult = await config.fetch(
const { data } = await config.fetch<GetAllProductsQuery>(
getAllProductsQuery,
{ variables }
)
const products =
data.products?.edges?.map(({ node: p }: ProductEdge) =>
normalizeProduct(p)
) ?? []
return {
products,
products: data.products.edges.map(({ node }) =>
normalizeProduct(node as ShopifyProduct)
),
}
}

View File

@ -1,30 +1,32 @@
import { GraphQLFetcherResult } from '@commerce/api'
import { GetProductBySlugQuery, Product as ShopifyProduct } from '../schema'
import { getConfig, ShopifyConfig } from '../api'
import { normalizeProduct, getProductQuery } from '../utils'
import { Product } from '@commerce/types'
type Variables = {
slug: string
}
type ReturnType = {
product: any
}
const getProduct = async (options: {
variables: Variables
config: ShopifyConfig
preview?: boolean
}): Promise<ReturnType> => {
}): Promise<{
product?: Product
}> => {
let { config, variables } = options ?? {}
config = getConfig(config)
const { data }: GraphQLFetcherResult = await config.fetch(getProductQuery, {
const {
data: { productByHandle },
} = await config.fetch<GetProductBySlugQuery>(getProductQuery, {
variables,
})
const { productByHandle } = data
return {
product: productByHandle ? normalizeProduct(productByHandle) : null,
...(productByHandle && {
product: normalizeProduct(productByHandle as ShopifyProduct),
}),
}
}

View File

@ -1,7 +1,12 @@
import { SWRHook } from '@commerce/utils/types'
import useSearch, { UseSearch } from '@commerce/product/use-search'
import { ProductEdge } from '../schema'
import {
CollectionEdge,
GetAllProductsQuery,
Product as ShopifyProduct,
ProductEdge,
} from '../schema'
import {
getAllProductsQuery,
getCollectionProductsQuery,
@ -35,30 +40,38 @@ export const handler: SWRHook<
},
async fetcher({ input, options, fetch }) {
const { categoryId, brandId } = input
const method = options?.method
const variables = getSearchVariables(input)
let products
const data = await fetch({
query: categoryId ? getCollectionProductsQuery : options.query,
method: options?.method,
variables: getSearchVariables(input),
})
let edges
// change the query to getCollectionProductsQuery when categoryId is set
if (categoryId) {
edges = data.node?.products?.edges ?? []
if (brandId) {
edges = edges.filter(
const data = await fetch<CollectionEdge>({
query: getCollectionProductsQuery,
method,
variables,
})
// filter on client when brandId & categoryId are set since is not available on collection product query
products = brandId
? data.node.products.edges.filter(
({ node: { vendor } }: ProductEdge) =>
vendor.replace(/\s+/g, '-').toLowerCase() === brandId
)
}
: data.node.products.edges
} else {
edges = data.products?.edges ?? []
const data = await fetch<GetAllProductsQuery>({
query: options.query,
method,
variables,
})
products = data.products.edges
}
return {
products: edges.map(({ node }: ProductEdge) => normalizeProduct(node)),
found: !!edges.length,
products: products?.map(({ node }) =>
normalizeProduct(node as ShopifyProduct)
),
found: !!products?.length,
}
},
useHook: ({ useData }) => (input = {}) => {

View File

@ -37,7 +37,7 @@ export type ApiVersion = {
displayName: Scalars['String']
/** The unique identifier of an ApiVersion. All supported API versions have a date-based (YYYY-MM) or `unstable` handle. */
handle: Scalars['String']
/** Whether the version is supported by Shopify. */
/** Whether the version is actively supported by Shopify. Supported API versions are guaranteed to be stable. Unsupported API versions include unstable, release candidate, and end-of-life versions that are marked as unsupported. For more information, refer to [Versioning](https://shopify.dev/concepts/about-apis/versioning). */
supported: Scalars['Boolean']
}
@ -306,17 +306,17 @@ export enum BlogSortKeys {
/** Card brand, such as Visa or Mastercard, which can be used for payments. */
export enum CardBrand {
/** Visa */
/** Visa. */
Visa = 'VISA',
/** Mastercard */
/** Mastercard. */
Mastercard = 'MASTERCARD',
/** Discover */
/** Discover. */
Discover = 'DISCOVER',
/** American Express */
/** American Express. */
AmericanExpress = 'AMERICAN_EXPRESS',
/** Diners Club */
/** Diners Club. */
DinersClub = 'DINERS_CLUB',
/** JCB */
/** JCB. */
Jcb = 'JCB',
}
@ -1195,6 +1195,8 @@ export enum CountryCode {
Am = 'AM',
/** Aruba. */
Aw = 'AW',
/** Ascension Island. */
Ac = 'AC',
/** Australia. */
Au = 'AU',
/** Austria. */
@ -1613,6 +1615,8 @@ export enum CountryCode {
To = 'TO',
/** Trinidad & Tobago. */
Tt = 'TT',
/** Tristan da Cunha. */
Ta = 'TA',
/** Tunisia. */
Tn = 'TN',
/** Turkey. */
@ -1687,7 +1691,7 @@ export type CreditCard = {
export type CreditCardPaymentInput = {
/** The amount of the payment. */
amount: Scalars['Money']
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */
idempotencyKey: Scalars['String']
/** The billing address for the payment. */
billingAddress: MailingAddressInput
@ -1704,7 +1708,7 @@ export type CreditCardPaymentInput = {
export type CreditCardPaymentInputV2 = {
/** The amount and currency of the payment. */
paymentAmount: MoneyInput
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */
idempotencyKey: Scalars['String']
/** The billing address for the payment. */
billingAddress: MailingAddressInput
@ -1766,10 +1770,6 @@ export enum CurrencyCode {
Bhd = 'BHD',
/** Burundian Franc (BIF). */
Bif = 'BIF',
/** Belarusian Ruble (BYN). */
Byn = 'BYN',
/** Belarusian Ruble (BYR). */
Byr = 'BYR',
/** Belize Dollar (BZD). */
Bzd = 'BZD',
/** Bermudian Dollar (BMD). */
@ -1816,26 +1816,18 @@ export enum CurrencyCode {
Czk = 'CZK',
/** Danish Kroner (DKK). */
Dkk = 'DKK',
/** Djiboutian Franc (DJF). */
Djf = 'DJF',
/** Dominican Peso (DOP). */
Dop = 'DOP',
/** East Caribbean Dollar (XCD). */
Xcd = 'XCD',
/** Egyptian Pound (EGP). */
Egp = 'EGP',
/** Eritrean Nakfa (ERN). */
Ern = 'ERN',
/** Ethiopian Birr (ETB). */
Etb = 'ETB',
/** Falkland Islands Pounds (FKP). */
Fkp = 'FKP',
/** CFP Franc (XPF). */
Xpf = 'XPF',
/** Fijian Dollars (FJD). */
Fjd = 'FJD',
/** Gibraltar Pounds (GIP). */
Gip = 'GIP',
/** Gambian Dalasi (GMD). */
Gmd = 'GMD',
/** Ghanaian Cedi (GHS). */
@ -1846,8 +1838,6 @@ export enum CurrencyCode {
Gyd = 'GYD',
/** Georgian Lari (GEL). */
Gel = 'GEL',
/** Guinean Franc (GNF). */
Gnf = 'GNF',
/** Haitian Gourde (HTG). */
Htg = 'HTG',
/** Honduran Lempira (HNL). */
@ -1864,8 +1854,6 @@ export enum CurrencyCode {
Idr = 'IDR',
/** Israeli New Shekel (NIS). */
Ils = 'ILS',
/** Iranian Rial (IRR). */
Irr = 'IRR',
/** Iraqi Dinar (IQD). */
Iqd = 'IQD',
/** Jamaican Dollars (JMD). */
@ -1880,8 +1868,6 @@ export enum CurrencyCode {
Kzt = 'KZT',
/** Kenyan Shilling (KES). */
Kes = 'KES',
/** Kiribati Dollar (KID). */
Kid = 'KID',
/** Kuwaiti Dinar (KWD). */
Kwd = 'KWD',
/** Kyrgyzstani Som (KGS). */
@ -1896,8 +1882,6 @@ export enum CurrencyCode {
Lsl = 'LSL',
/** Liberian Dollar (LRD). */
Lrd = 'LRD',
/** Libyan Dinar (LYD). */
Lyd = 'LYD',
/** Lithuanian Litai (LTL). */
Ltl = 'LTL',
/** Malagasy Ariary (MGA). */
@ -1910,8 +1894,6 @@ export enum CurrencyCode {
Mwk = 'MWK',
/** Maldivian Rufiyaa (MVR). */
Mvr = 'MVR',
/** Mauritanian Ouguiya (MRU). */
Mru = 'MRU',
/** Mexican Pesos (MXN). */
Mxn = 'MXN',
/** Malaysian Ringgits (MYR). */
@ -1966,8 +1948,6 @@ export enum CurrencyCode {
Rwf = 'RWF',
/** Samoan Tala (WST). */
Wst = 'WST',
/** Saint Helena Pounds (SHP). */
Shp = 'SHP',
/** Saudi Riyal (SAR). */
Sar = 'SAR',
/** Sao Tome And Principe Dobra (STD). */
@ -1976,14 +1956,10 @@ export enum CurrencyCode {
Rsd = 'RSD',
/** Seychellois Rupee (SCR). */
Scr = 'SCR',
/** Sierra Leonean Leone (SLL). */
Sll = 'SLL',
/** Singapore Dollars (SGD). */
Sgd = 'SGD',
/** Sudanese Pound (SDG). */
Sdg = 'SDG',
/** Somali Shilling (SOS). */
Sos = 'SOS',
/** Syrian Pound (SYP). */
Syp = 'SYP',
/** South African Rand (ZAR). */
@ -2008,12 +1984,8 @@ export enum CurrencyCode {
Twd = 'TWD',
/** Thai baht (THB). */
Thb = 'THB',
/** Tajikistani Somoni (TJS). */
Tjs = 'TJS',
/** Tanzanian Shilling (TZS). */
Tzs = 'TZS',
/** Tongan Pa'anga (TOP). */
Top = 'TOP',
/** Trinidad and Tobago Dollars (TTD). */
Ttd = 'TTD',
/** Tunisian Dinar (TND). */
@ -2034,10 +2006,6 @@ export enum CurrencyCode {
Uzs = 'UZS',
/** Vanuatu Vatu (VUV). */
Vuv = 'VUV',
/** Venezuelan Bolivares (VEF). */
Vef = 'VEF',
/** Venezuelan Bolivares (VES). */
Ves = 'VES',
/** Vietnamese đồng (VND). */
Vnd = 'VND',
/** West African CFA franc (XOF). */
@ -2046,6 +2014,42 @@ export enum CurrencyCode {
Yer = 'YER',
/** Zambian Kwacha (ZMW). */
Zmw = 'ZMW',
/** Belarusian Ruble (BYN). */
Byn = 'BYN',
/** Belarusian Ruble (BYR). */
Byr = 'BYR',
/** Djiboutian Franc (DJF). */
Djf = 'DJF',
/** Eritrean Nakfa (ERN). */
Ern = 'ERN',
/** Falkland Islands Pounds (FKP). */
Fkp = 'FKP',
/** Gibraltar Pounds (GIP). */
Gip = 'GIP',
/** Guinean Franc (GNF). */
Gnf = 'GNF',
/** Iranian Rial (IRR). */
Irr = 'IRR',
/** Kiribati Dollar (KID). */
Kid = 'KID',
/** Libyan Dinar (LYD). */
Lyd = 'LYD',
/** Mauritanian Ouguiya (MRU). */
Mru = 'MRU',
/** Sierra Leonean Leone (SLL). */
Sll = 'SLL',
/** Saint Helena Pounds (SHP). */
Shp = 'SHP',
/** Somali Shilling (SOS). */
Sos = 'SOS',
/** Tajikistani Somoni (TJS). */
Tjs = 'TJS',
/** Tongan Pa'anga (TOP). */
Top = 'TOP',
/** Venezuelan Bolivares (VEF). */
Vef = 'VEF',
/** Venezuelan Bolivares (VES). */
Ves = 'VES',
}
/** 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. */
@ -3817,7 +3821,11 @@ export type Payment = Node & {
errorMessage?: Maybe<Scalars['String']>
/** Globally unique identifier. */
id: Scalars['ID']
/** A client-side generated token to identify a payment and perform idempotent operations. */
/**
* A client-side generated token to identify a payment and perform idempotent operations.
* For more information, refer to
* [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
*/
idempotencyKey?: Maybe<Scalars['String']>
/** The URL where the customer needs to be redirected so they can complete the 3D Secure payment flow. */
nextActionUrl?: Maybe<Scalars['URL']>
@ -4386,7 +4394,9 @@ export type QueryRoot = {
collections: CollectionConnection
/** Find a customer by its access token. */
customer?: Maybe<Customer>
/** Returns a specific node by ID. */
node?: Maybe<Node>
/** Returns the list of nodes with the given IDs. */
nodes: Array<Maybe<Node>>
/** Find a page by its handle. */
pageByHandle?: Maybe<Page>
@ -4768,7 +4778,7 @@ export type StringEdge = {
export type TokenizedPaymentInput = {
/** The amount of the payment. */
amount: Scalars['Money']
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */
idempotencyKey: Scalars['String']
/** The billing address for the payment. */
billingAddress: MailingAddressInput
@ -4789,7 +4799,7 @@ export type TokenizedPaymentInput = {
export type TokenizedPaymentInputV2 = {
/** The amount and currency of the payment. */
paymentAmount: MoneyInput
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */
idempotencyKey: Scalars['String']
/** The billing address for the payment. */
billingAddress: MailingAddressInput
@ -4810,7 +4820,7 @@ export type TokenizedPaymentInputV2 = {
export type TokenizedPaymentInputV3 = {
/** The amount and currency of the payment. */
paymentAmount: MoneyInput
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */
/** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */
idempotencyKey: Scalars['String']
/** The billing address for the payment. */
billingAddress: MailingAddressInput
@ -4847,18 +4857,32 @@ export type Transaction = {
test: Scalars['Boolean']
}
/** The different kinds of order transactions. */
export enum TransactionKind {
/** An authorization and capture performed together in a single step. */
Sale = 'SALE',
/** A transfer of the money that was reserved during the authorization stage. */
Capture = 'CAPTURE',
/**
* An amount reserved against the cardholder's funding source.
* Money does not change hands until the authorization is captured.
*/
Authorization = 'AUTHORIZATION',
/** An authorization for a payment taken with an EMV credit card reader. */
EmvAuthorization = 'EMV_AUTHORIZATION',
/** Money returned to the customer when they have paid too much. */
Change = 'CHANGE',
}
/** Transaction statuses describe the status of a transaction. */
export enum TransactionStatus {
/** The transaction is pending. */
Pending = 'PENDING',
/** The transaction succeeded. */
Success = 'SUCCESS',
/** The transaction failed. */
Failure = 'FAILURE',
/** There was an error while processing the transaction. */
Error = 'ERROR',
}
@ -4967,19 +4991,590 @@ export enum WeightUnit {
Ounces = 'OUNCES',
}
export type Unnamed_1_QueryVariables = Exact<{
export type AssociateCustomerWithCheckoutMutationVariables = Exact<{
checkoutId: Scalars['ID']
customerAccessToken: Scalars['String']
}>
export type AssociateCustomerWithCheckoutMutation = {
__typename?: 'Mutation'
} & {
checkoutCustomerAssociateV2?: Maybe<
{ __typename?: 'CheckoutCustomerAssociateV2Payload' } & {
checkout?: Maybe<{ __typename?: 'Checkout' } & Pick<Checkout, 'id'>>
checkoutUserErrors: Array<
{ __typename?: 'CheckoutUserError' } & Pick<
CheckoutUserError,
'code' | 'field' | 'message'
>
>
customer?: Maybe<{ __typename?: 'Customer' } & Pick<Customer, 'id'>>
}
>
}
export type CheckoutCreateMutationVariables = Exact<{
input?: Maybe<CheckoutCreateInput>
}>
export type CheckoutCreateMutation = { __typename?: 'Mutation' } & {
checkoutCreate?: Maybe<
{ __typename?: 'CheckoutCreatePayload' } & {
checkoutUserErrors: Array<
{ __typename?: 'CheckoutUserError' } & Pick<
CheckoutUserError,
'code' | 'field' | 'message'
>
>
checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment>
}
>
}
export type CheckoutLineItemAddMutationVariables = Exact<{
checkoutId: Scalars['ID']
lineItems: Array<CheckoutLineItemInput> | CheckoutLineItemInput
}>
export type CheckoutLineItemAddMutation = { __typename?: 'Mutation' } & {
checkoutLineItemsAdd?: Maybe<
{ __typename?: 'CheckoutLineItemsAddPayload' } & {
checkoutUserErrors: Array<
{ __typename?: 'CheckoutUserError' } & Pick<
CheckoutUserError,
'code' | 'field' | 'message'
>
>
checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment>
}
>
}
export type CheckoutLineItemRemoveMutationVariables = Exact<{
checkoutId: Scalars['ID']
lineItemIds: Array<Scalars['ID']> | Scalars['ID']
}>
export type CheckoutLineItemRemoveMutation = { __typename?: 'Mutation' } & {
checkoutLineItemsRemove?: Maybe<
{ __typename?: 'CheckoutLineItemsRemovePayload' } & {
checkoutUserErrors: Array<
{ __typename?: 'CheckoutUserError' } & Pick<
CheckoutUserError,
'code' | 'field' | 'message'
>
>
checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment>
}
>
}
export type CheckoutLineItemUpdateMutationVariables = Exact<{
checkoutId: Scalars['ID']
lineItems: Array<CheckoutLineItemUpdateInput> | CheckoutLineItemUpdateInput
}>
export type CheckoutLineItemUpdateMutation = { __typename?: 'Mutation' } & {
checkoutLineItemsUpdate?: Maybe<
{ __typename?: 'CheckoutLineItemsUpdatePayload' } & {
checkoutUserErrors: Array<
{ __typename?: 'CheckoutUserError' } & Pick<
CheckoutUserError,
'code' | 'field' | 'message'
>
>
checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment>
}
>
}
export type CustomerAccessTokenCreateMutationVariables = Exact<{
input: CustomerAccessTokenCreateInput
}>
export type CustomerAccessTokenCreateMutation = { __typename?: 'Mutation' } & {
customerAccessTokenCreate?: Maybe<
{ __typename?: 'CustomerAccessTokenCreatePayload' } & {
customerAccessToken?: Maybe<
{ __typename?: 'CustomerAccessToken' } & Pick<
CustomerAccessToken,
'accessToken' | 'expiresAt'
>
>
customerUserErrors: Array<
{ __typename?: 'CustomerUserError' } & Pick<
CustomerUserError,
'code' | 'field' | 'message'
>
>
}
>
}
export type CustomerAccessTokenDeleteMutationVariables = Exact<{
customerAccessToken: Scalars['String']
}>
export type CustomerAccessTokenDeleteMutation = { __typename?: 'Mutation' } & {
customerAccessTokenDelete?: Maybe<
{ __typename?: 'CustomerAccessTokenDeletePayload' } & Pick<
CustomerAccessTokenDeletePayload,
'deletedAccessToken' | 'deletedCustomerAccessTokenId'
> & {
userErrors: Array<
{ __typename?: 'UserError' } & Pick<UserError, 'field' | 'message'>
>
}
>
}
export type CustomerActivateByUrlMutationVariables = Exact<{
activationUrl: Scalars['URL']
password: Scalars['String']
}>
export type CustomerActivateByUrlMutation = { __typename?: 'Mutation' } & {
customerActivateByUrl?: Maybe<
{ __typename?: 'CustomerActivateByUrlPayload' } & {
customer?: Maybe<{ __typename?: 'Customer' } & Pick<Customer, 'id'>>
customerAccessToken?: Maybe<
{ __typename?: 'CustomerAccessToken' } & Pick<
CustomerAccessToken,
'accessToken' | 'expiresAt'
>
>
customerUserErrors: Array<
{ __typename?: 'CustomerUserError' } & Pick<
CustomerUserError,
'code' | 'field' | 'message'
>
>
}
>
}
export type CustomerActivateMutationVariables = Exact<{
id: Scalars['ID']
input: CustomerActivateInput
}>
export type CustomerActivateMutation = { __typename?: 'Mutation' } & {
customerActivate?: Maybe<
{ __typename?: 'CustomerActivatePayload' } & {
customer?: Maybe<{ __typename?: 'Customer' } & Pick<Customer, 'id'>>
customerAccessToken?: Maybe<
{ __typename?: 'CustomerAccessToken' } & Pick<
CustomerAccessToken,
'accessToken' | 'expiresAt'
>
>
customerUserErrors: Array<
{ __typename?: 'CustomerUserError' } & Pick<
CustomerUserError,
'code' | 'field' | 'message'
>
>
}
>
}
export type CustomerCreateMutationVariables = Exact<{
input: CustomerCreateInput
}>
export type CustomerCreateMutation = { __typename?: 'Mutation' } & {
customerCreate?: Maybe<
{ __typename?: 'CustomerCreatePayload' } & {
customerUserErrors: Array<
{ __typename?: 'CustomerUserError' } & Pick<
CustomerUserError,
'code' | 'field' | 'message'
>
>
customer?: Maybe<{ __typename?: 'Customer' } & Pick<Customer, 'id'>>
}
>
}
export type GetSiteCollectionsQueryVariables = Exact<{
first: Scalars['Int']
}>
export type Unnamed_1_Query = { __typename?: 'QueryRoot' } & {
pages: { __typename?: 'PageConnection' } & {
export type GetSiteCollectionsQuery = { __typename?: 'QueryRoot' } & {
collections: { __typename?: 'CollectionConnection' } & {
edges: Array<
{ __typename?: 'PageEdge' } & {
node: { __typename?: 'Page' } & Pick<
Page,
'id' | 'title' | 'handle' | 'body' | 'bodySummary' | 'url'
{ __typename?: 'CollectionEdge' } & {
node: { __typename?: 'Collection' } & Pick<
Collection,
'id' | 'title' | 'handle'
>
}
>
}
}
export type GetAllPagesQueryVariables = Exact<{
first?: Maybe<Scalars['Int']>
}>
export type GetAllPagesQuery = { __typename?: 'QueryRoot' } & {
pages: { __typename?: 'PageConnection' } & {
edges: Array<
{ __typename?: 'PageEdge' } & {
node: { __typename?: 'Page' } & Pick<Page, 'id' | 'title' | 'handle'>
}
>
}
}
export type GetAllProductVendorsQueryVariables = Exact<{
first?: Maybe<Scalars['Int']>
cursor?: Maybe<Scalars['String']>
}>
export type GetAllProductVendorsQuery = { __typename?: 'QueryRoot' } & {
products: { __typename?: 'ProductConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'ProductEdge' } & Pick<ProductEdge, 'cursor'> & {
node: { __typename?: 'Product' } & Pick<Product, 'vendor'>
}
>
}
}
export type GetAllProductPathsQueryVariables = Exact<{
first?: Maybe<Scalars['Int']>
cursor?: Maybe<Scalars['String']>
}>
export type GetAllProductPathsQuery = { __typename?: 'QueryRoot' } & {
products: { __typename?: 'ProductConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'ProductEdge' } & Pick<ProductEdge, 'cursor'> & {
node: { __typename?: 'Product' } & Pick<Product, 'handle'>
}
>
}
}
export type ProductConnectionFragment = { __typename?: 'ProductConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'ProductEdge' } & {
node: { __typename?: 'Product' } & Pick<
Product,
'id' | 'title' | 'vendor' | 'handle'
> & {
priceRange: { __typename?: 'ProductPriceRange' } & {
minVariantPrice: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
}
images: { __typename?: 'ImageConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'ImageEdge' } & {
node: { __typename?: 'Image' } & Pick<
Image,
'originalSrc' | 'altText' | 'width' | 'height'
>
}
>
}
}
}
>
}
export type GetAllProductsQueryVariables = Exact<{
first?: Maybe<Scalars['Int']>
query?: Maybe<Scalars['String']>
sortKey?: Maybe<ProductSortKeys>
reverse?: Maybe<Scalars['Boolean']>
}>
export type GetAllProductsQuery = { __typename?: 'QueryRoot' } & {
products: { __typename?: 'ProductConnection' } & ProductConnectionFragment
}
export type CheckoutDetailsFragment = { __typename?: 'Checkout' } & Pick<
Checkout,
'id' | 'webUrl' | 'completedAt' | 'createdAt' | 'taxesIncluded'
> & {
subtotalPriceV2: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
totalTaxV2: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
totalPriceV2: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
lineItems: { __typename?: 'CheckoutLineItemConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'CheckoutLineItemEdge' } & {
node: { __typename?: 'CheckoutLineItem' } & Pick<
CheckoutLineItem,
'id' | 'title' | 'quantity'
> & {
variant?: Maybe<
{ __typename?: 'ProductVariant' } & Pick<
ProductVariant,
'id' | 'sku' | 'title'
> & {
image?: Maybe<
{ __typename?: 'Image' } & Pick<
Image,
'originalSrc' | 'altText' | 'width' | 'height'
>
>
priceV2: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
compareAtPriceV2?: Maybe<
{ __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
>
product: { __typename?: 'Product' } & Pick<
Product,
'handle'
>
}
>
}
}
>
}
}
export type GetCheckoutQueryVariables = Exact<{
checkoutId: Scalars['ID']
}>
export type GetCheckoutQuery = { __typename?: 'QueryRoot' } & {
node?: Maybe<
| { __typename?: 'AppliedGiftCard' }
| { __typename?: 'Article' }
| { __typename?: 'Blog' }
| ({ __typename?: 'Checkout' } & CheckoutDetailsFragment)
| { __typename?: 'CheckoutLineItem' }
| { __typename?: 'Collection' }
| { __typename?: 'Comment' }
| { __typename?: 'ExternalVideo' }
| { __typename?: 'MailingAddress' }
| { __typename?: 'MediaImage' }
| { __typename?: 'Metafield' }
| { __typename?: 'Model3d' }
| { __typename?: 'Order' }
| { __typename?: 'Page' }
| { __typename?: 'Payment' }
| { __typename?: 'Product' }
| { __typename?: 'ProductOption' }
| { __typename?: 'ProductVariant' }
| { __typename?: 'ShopPolicy' }
| { __typename?: 'Video' }
>
}
export type GetProductsFromCollectionQueryVariables = Exact<{
categoryId: Scalars['ID']
first?: Maybe<Scalars['Int']>
sortKey?: Maybe<ProductCollectionSortKeys>
reverse?: Maybe<Scalars['Boolean']>
}>
export type GetProductsFromCollectionQuery = { __typename?: 'QueryRoot' } & {
node?: Maybe<
| ({ __typename?: 'AppliedGiftCard' } & Pick<AppliedGiftCard, 'id'>)
| ({ __typename?: 'Article' } & Pick<Article, 'id'>)
| ({ __typename?: 'Blog' } & Pick<Blog, 'id'>)
| ({ __typename?: 'Checkout' } & Pick<Checkout, 'id'>)
| ({ __typename?: 'CheckoutLineItem' } & Pick<CheckoutLineItem, 'id'>)
| ({ __typename?: 'Collection' } & Pick<Collection, 'id'> & {
products: {
__typename?: 'ProductConnection'
} & ProductConnectionFragment
})
| ({ __typename?: 'Comment' } & Pick<Comment, 'id'>)
| ({ __typename?: 'ExternalVideo' } & Pick<ExternalVideo, 'id'>)
| ({ __typename?: 'MailingAddress' } & Pick<MailingAddress, 'id'>)
| ({ __typename?: 'MediaImage' } & Pick<MediaImage, 'id'>)
| ({ __typename?: 'Metafield' } & Pick<Metafield, 'id'>)
| ({ __typename?: 'Model3d' } & Pick<Model3d, 'id'>)
| ({ __typename?: 'Order' } & Pick<Order, 'id'>)
| ({ __typename?: 'Page' } & Pick<Page, 'id'>)
| ({ __typename?: 'Payment' } & Pick<Payment, 'id'>)
| ({ __typename?: 'Product' } & Pick<Product, 'id'>)
| ({ __typename?: 'ProductOption' } & Pick<ProductOption, 'id'>)
| ({ __typename?: 'ProductVariant' } & Pick<ProductVariant, 'id'>)
| ({ __typename?: 'ShopPolicy' } & Pick<ShopPolicy, 'id'>)
| ({ __typename?: 'Video' } & Pick<Video, 'id'>)
>
}
export type GetCustomerIdQueryVariables = Exact<{
customerAccessToken: Scalars['String']
}>
export type GetCustomerIdQuery = { __typename?: 'QueryRoot' } & {
customer?: Maybe<{ __typename?: 'Customer' } & Pick<Customer, 'id'>>
}
export type GetCustomerQueryVariables = Exact<{
customerAccessToken: Scalars['String']
}>
export type GetCustomerQuery = { __typename?: 'QueryRoot' } & {
customer?: Maybe<
{ __typename?: 'Customer' } & Pick<
Customer,
| 'id'
| 'firstName'
| 'lastName'
| 'displayName'
| 'email'
| 'phone'
| 'tags'
| 'acceptsMarketing'
| 'createdAt'
>
>
}
export type GetPageQueryVariables = Exact<{
id: Scalars['ID']
}>
export type GetPageQuery = { __typename?: 'QueryRoot' } & {
node?: Maybe<
| ({ __typename?: 'AppliedGiftCard' } & Pick<AppliedGiftCard, 'id'>)
| ({ __typename?: 'Article' } & Pick<Article, 'id'>)
| ({ __typename?: 'Blog' } & Pick<Blog, 'id'>)
| ({ __typename?: 'Checkout' } & Pick<Checkout, 'id'>)
| ({ __typename?: 'CheckoutLineItem' } & Pick<CheckoutLineItem, 'id'>)
| ({ __typename?: 'Collection' } & Pick<Collection, 'id'>)
| ({ __typename?: 'Comment' } & Pick<Comment, 'id'>)
| ({ __typename?: 'ExternalVideo' } & Pick<ExternalVideo, 'id'>)
| ({ __typename?: 'MailingAddress' } & Pick<MailingAddress, 'id'>)
| ({ __typename?: 'MediaImage' } & Pick<MediaImage, 'id'>)
| ({ __typename?: 'Metafield' } & Pick<Metafield, 'id'>)
| ({ __typename?: 'Model3d' } & Pick<Model3d, 'id'>)
| ({ __typename?: 'Order' } & Pick<Order, 'id'>)
| ({ __typename?: 'Page' } & Pick<
Page,
'title' | 'handle' | 'body' | 'bodySummary' | 'id'
>)
| ({ __typename?: 'Payment' } & Pick<Payment, 'id'>)
| ({ __typename?: 'Product' } & Pick<Product, 'id'>)
| ({ __typename?: 'ProductOption' } & Pick<ProductOption, 'id'>)
| ({ __typename?: 'ProductVariant' } & Pick<ProductVariant, 'id'>)
| ({ __typename?: 'ShopPolicy' } & Pick<ShopPolicy, 'id'>)
| ({ __typename?: 'Video' } & Pick<Video, 'id'>)
>
}
export type GetProductBySlugQueryVariables = Exact<{
slug: Scalars['String']
}>
export type GetProductBySlugQuery = { __typename?: 'QueryRoot' } & {
productByHandle?: Maybe<
{ __typename?: 'Product' } & Pick<
Product,
| 'id'
| 'handle'
| 'title'
| 'productType'
| 'vendor'
| 'description'
| 'descriptionHtml'
> & {
options: Array<
{ __typename?: 'ProductOption' } & Pick<
ProductOption,
'id' | 'name' | 'values'
>
>
priceRange: { __typename?: 'ProductPriceRange' } & {
maxVariantPrice: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
minVariantPrice: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
}
variants: { __typename?: 'ProductVariantConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'ProductVariantEdge' } & {
node: { __typename?: 'ProductVariant' } & Pick<
ProductVariant,
'id' | 'title' | 'sku'
> & {
selectedOptions: Array<
{ __typename?: 'SelectedOption' } & Pick<
SelectedOption,
'name' | 'value'
>
>
priceV2: { __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
compareAtPriceV2?: Maybe<
{ __typename?: 'MoneyV2' } & Pick<
MoneyV2,
'amount' | 'currencyCode'
>
>
}
}
>
}
images: { __typename?: 'ImageConnection' } & {
pageInfo: { __typename?: 'PageInfo' } & Pick<
PageInfo,
'hasNextPage' | 'hasPreviousPage'
>
edges: Array<
{ __typename?: 'ImageEdge' } & {
node: { __typename?: 'Image' } & Pick<
Image,
'originalSrc' | 'altText' | 'width' | 'height'
>
}
>
}
}
>
}

View File

@ -28,7 +28,7 @@ type ApiVersion {
handle: String!
"""
Whether the version is supported by Shopify.
Whether the version is actively supported by Shopify. Supported API versions are guaranteed to be stable. Unsupported API versions include unstable, release candidate, and end-of-life versions that are marked as unsupported. For more information, refer to [Versioning](https://shopify.dev/concepts/about-apis/versioning).
"""
supported: Boolean!
}
@ -547,32 +547,32 @@ Card brand, such as Visa or Mastercard, which can be used for payments.
"""
enum CardBrand {
"""
Visa
Visa.
"""
VISA
"""
Mastercard
Mastercard.
"""
MASTERCARD
"""
Discover
Discover.
"""
DISCOVER
"""
American Express
American Express.
"""
AMERICAN_EXPRESS
"""
Diners Club
Diners Club.
"""
DINERS_CLUB
"""
JCB
JCB.
"""
JCB
}
@ -2142,6 +2142,11 @@ enum CountryCode {
"""
AW
"""
Ascension Island.
"""
AC
"""
Australia.
"""
@ -3187,6 +3192,11 @@ enum CountryCode {
"""
TT
"""
Tristan da Cunha.
"""
TA
"""
Tunisia.
"""
@ -3354,7 +3364,7 @@ input CreditCardPaymentInput {
amount: Money!
"""
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one.
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
"""
idempotencyKey: String!
@ -3385,7 +3395,7 @@ input CreditCardPaymentInputV2 {
paymentAmount: MoneyInput!
"""
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one.
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
"""
idempotencyKey: String!
@ -3529,16 +3539,6 @@ enum CurrencyCode {
"""
BIF
"""
Belarusian Ruble (BYN).
"""
BYN
"""
Belarusian Ruble (BYR).
"""
BYR
"""
Belize Dollar (BZD).
"""
@ -3654,11 +3654,6 @@ enum CurrencyCode {
"""
DKK
"""
Djiboutian Franc (DJF).
"""
DJF
"""
Dominican Peso (DOP).
"""
@ -3674,21 +3669,11 @@ enum CurrencyCode {
"""
EGP
"""
Eritrean Nakfa (ERN).
"""
ERN
"""
Ethiopian Birr (ETB).
"""
ETB
"""
Falkland Islands Pounds (FKP).
"""
FKP
"""
CFP Franc (XPF).
"""
@ -3699,11 +3684,6 @@ enum CurrencyCode {
"""
FJD
"""
Gibraltar Pounds (GIP).
"""
GIP
"""
Gambian Dalasi (GMD).
"""
@ -3729,11 +3709,6 @@ enum CurrencyCode {
"""
GEL
"""
Guinean Franc (GNF).
"""
GNF
"""
Haitian Gourde (HTG).
"""
@ -3774,11 +3749,6 @@ enum CurrencyCode {
"""
ILS
"""
Iranian Rial (IRR).
"""
IRR
"""
Iraqi Dinar (IQD).
"""
@ -3814,11 +3784,6 @@ enum CurrencyCode {
"""
KES
"""
Kiribati Dollar (KID).
"""
KID
"""
Kuwaiti Dinar (KWD).
"""
@ -3854,11 +3819,6 @@ enum CurrencyCode {
"""
LRD
"""
Libyan Dinar (LYD).
"""
LYD
"""
Lithuanian Litai (LTL).
"""
@ -3889,11 +3849,6 @@ enum CurrencyCode {
"""
MVR
"""
Mauritanian Ouguiya (MRU).
"""
MRU
"""
Mexican Pesos (MXN).
"""
@ -4029,11 +3984,6 @@ enum CurrencyCode {
"""
WST
"""
Saint Helena Pounds (SHP).
"""
SHP
"""
Saudi Riyal (SAR).
"""
@ -4054,11 +4004,6 @@ enum CurrencyCode {
"""
SCR
"""
Sierra Leonean Leone (SLL).
"""
SLL
"""
Singapore Dollars (SGD).
"""
@ -4069,11 +4014,6 @@ enum CurrencyCode {
"""
SDG
"""
Somali Shilling (SOS).
"""
SOS
"""
Syrian Pound (SYP).
"""
@ -4134,21 +4074,11 @@ enum CurrencyCode {
"""
THB
"""
Tajikistani Somoni (TJS).
"""
TJS
"""
Tanzanian Shilling (TZS).
"""
TZS
"""
Tongan Pa'anga (TOP).
"""
TOP
"""
Trinidad and Tobago Dollars (TTD).
"""
@ -4199,16 +4129,6 @@ enum CurrencyCode {
"""
VUV
"""
Venezuelan Bolivares (VEF).
"""
VEF
"""
Venezuelan Bolivares (VES).
"""
VES
"""
Vietnamese đồng (VND).
"""
@ -4228,6 +4148,96 @@ enum CurrencyCode {
Zambian Kwacha (ZMW).
"""
ZMW
"""
Belarusian Ruble (BYN).
"""
BYN
"""
Belarusian Ruble (BYR).
"""
BYR
"""
Djiboutian Franc (DJF).
"""
DJF
"""
Eritrean Nakfa (ERN).
"""
ERN
"""
Falkland Islands Pounds (FKP).
"""
FKP
"""
Gibraltar Pounds (GIP).
"""
GIP
"""
Guinean Franc (GNF).
"""
GNF
"""
Iranian Rial (IRR).
"""
IRR
"""
Kiribati Dollar (KID).
"""
KID
"""
Libyan Dinar (LYD).
"""
LYD
"""
Mauritanian Ouguiya (MRU).
"""
MRU
"""
Sierra Leonean Leone (SLL).
"""
SLL
"""
Saint Helena Pounds (SHP).
"""
SHP
"""
Somali Shilling (SOS).
"""
SOS
"""
Tajikistani Somoni (TJS).
"""
TJS
"""
Tongan Pa'anga (TOP).
"""
TOP
"""
Venezuelan Bolivares (VEF).
"""
VEF
"""
Venezuelan Bolivares (VES).
"""
VES
}
"""
@ -7355,6 +7365,8 @@ type Payment implements Node {
"""
A client-side generated token to identify a payment and perform idempotent operations.
For more information, refer to
[Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
"""
idempotencyKey: String
@ -8589,12 +8601,20 @@ type QueryRoot {
"""
customerAccessToken: String!
): Customer
"""
Returns a specific node by ID.
"""
node(
"""
The ID of the Node to return.
"""
id: ID!
): Node
"""
Returns the list of nodes with the given IDs.
"""
nodes(
"""
The IDs of the Nodes to return.
@ -9246,7 +9266,7 @@ input TokenizedPaymentInput {
amount: Money!
"""
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one.
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
"""
idempotencyKey: String!
@ -9287,7 +9307,7 @@ input TokenizedPaymentInputV2 {
paymentAmount: MoneyInput!
"""
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one.
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
"""
idempotencyKey: String!
@ -9328,7 +9348,7 @@ input TokenizedPaymentInputV3 {
paymentAmount: MoneyInput!
"""
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one.
A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests).
"""
idempotencyKey: String!
@ -9393,18 +9413,59 @@ type Transaction {
test: Boolean!
}
"""
The different kinds of order transactions.
"""
enum TransactionKind {
"""
An authorization and capture performed together in a single step.
"""
SALE
"""
A transfer of the money that was reserved during the authorization stage.
"""
CAPTURE
"""
An amount reserved against the cardholder's funding source.
Money does not change hands until the authorization is captured.
"""
AUTHORIZATION
"""
An authorization for a payment taken with an EMV credit card reader.
"""
EMV_AUTHORIZATION
"""
Money returned to the customer when they have paid too much.
"""
CHANGE
}
"""
Transaction statuses describe the status of a transaction.
"""
enum TransactionStatus {
"""
The transaction is pending.
"""
PENDING
"""
The transaction succeeded.
"""
SUCCESS
"""
The transaction failed.
"""
FAILURE
"""
There was an error while processing the transaction.
"""
ERROR
}

View File

@ -9,7 +9,9 @@ export type ShopifyCheckout = {
export type Cart = Core.Cart & {
lineItems: LineItem[]
url?: String
}
export interface LineItem extends Core.LineItem {
options?: any[]
}

View File

@ -27,12 +27,6 @@ export type CheckoutPayload =
| CheckoutQuery
const checkoutToCart = (checkoutPayload?: Maybe<CheckoutPayload>): Cart => {
if (!checkoutPayload) {
throw new CommerceError({
message: 'Missing checkout payload from response',
})
}
const checkout = checkoutPayload?.checkout
throwUserErrors(checkoutPayload?.checkoutUserErrors)

View File

@ -1,17 +1,19 @@
import { checkoutDetailsFragment } from '../queries/get-checkout-query'
const checkoutCreateMutation = /* GraphQL */ `
mutation {
checkoutCreate(input: {}) {
mutation checkoutCreate($input: CheckoutCreateInput = {}) {
checkoutCreate(input: $input) {
checkoutUserErrors {
code
field
message
}
checkout {
...checkoutDetails
}
}
}
${checkoutDetailsFragment}
}
}
}
`
export default checkoutCreateMutation

View File

@ -1,7 +1,10 @@
import { checkoutDetailsFragment } from '../queries/get-checkout-query'
const checkoutLineItemAddMutation = /* GraphQL */ `
mutation($checkoutId: ID!, $lineItems: [CheckoutLineItemInput!]!) {
mutation checkoutLineItemAdd(
$checkoutId: ID!
$lineItems: [CheckoutLineItemInput!]!
) {
checkoutLineItemsAdd(checkoutId: $checkoutId, lineItems: $lineItems) {
checkoutUserErrors {
code
@ -9,9 +12,11 @@ const checkoutLineItemAddMutation = /* GraphQL */ `
message
}
checkout {
...checkoutDetails
}
}
}
${checkoutDetailsFragment}
}
}
}
`
export default checkoutLineItemAddMutation

View File

@ -1,7 +1,7 @@
import { checkoutDetailsFragment } from '../queries/get-checkout-query'
const checkoutLineItemRemoveMutation = /* GraphQL */ `
mutation($checkoutId: ID!, $lineItemIds: [ID!]!) {
mutation checkoutLineItemRemove($checkoutId: ID!, $lineItemIds: [ID!]!) {
checkoutLineItemsRemove(
checkoutId: $checkoutId
lineItemIds: $lineItemIds
@ -12,9 +12,10 @@ const checkoutLineItemRemoveMutation = /* GraphQL */ `
message
}
checkout {
...checkoutDetails
}
}
}
${checkoutDetailsFragment}
}
}
}
`
export default checkoutLineItemRemoveMutation

View File

@ -1,7 +1,10 @@
import { checkoutDetailsFragment } from '../queries/get-checkout-query'
const checkoutLineItemUpdateMutation = /* GraphQL */ `
mutation($checkoutId: ID!, $lineItems: [CheckoutLineItemUpdateInput!]!) {
mutation checkoutLineItemUpdate(
$checkoutId: ID!
$lineItems: [CheckoutLineItemUpdateInput!]!
) {
checkoutLineItemsUpdate(checkoutId: $checkoutId, lineItems: $lineItems) {
checkoutUserErrors {
code
@ -9,9 +12,11 @@ const checkoutLineItemUpdateMutation = /* GraphQL */ `
message
}
checkout {
...checkoutDetails
}
}
}
${checkoutDetailsFragment}
}
}
}
`
export default checkoutLineItemUpdateMutation

View File

@ -75,8 +75,7 @@ const normalizeProductVariants = ({ edges }: ProductVariantConnection) => {
)
}
export function normalizeProduct(productNode: ShopifyProduct): Product {
const {
export function normalizeProduct({
id,
title: name,
vendor,
@ -87,10 +86,10 @@ export function normalizeProduct(productNode: ShopifyProduct): Product {
handle,
priceRange,
options,
metafields,
...rest
} = productNode
const product = {
}: ShopifyProduct): Product {
return {
id,
name,
vendor,
@ -108,13 +107,12 @@ export function normalizeProduct(productNode: ShopifyProduct): Product {
...(descriptionHtml && { descriptionHtml }),
...rest,
}
return product
}
export function normalizeCart(checkout: Checkout): Cart {
return {
id: checkout.id,
url: checkout.webUrl,
customerId: '',
email: '',
createdAt: checkout.createdAt,
@ -131,7 +129,7 @@ export function normalizeCart(checkout: Checkout): Cart {
}
function normalizeLineItem({
node: { id, title, variant, quantity, ...rest },
node: { id, title, variant, quantity },
}: CheckoutLineItemEdge): LineItem {
return {
id,
@ -144,7 +142,7 @@ function normalizeLineItem({
sku: variant?.sku ?? '',
name: variant?.title!,
image: {
url: variant?.image?.originalSrc ?? '/product-img-placeholder.svg',
url: variant?.image?.originalSrc || '/product-img-placeholder.svg',
},
requiresShipping: variant?.requiresShipping ?? false,
price: variant?.priceV2?.amount,

View File

@ -1,9 +1,10 @@
export const productConnection = `
pageInfo {
export const productConnectionFragment = /* GraphQL */ `
fragment productConnection on ProductConnection {
pageInfo {
hasNextPage
hasPreviousPage
}
edges {
}
edges {
node {
id
title
@ -30,17 +31,8 @@ edges {
}
}
}
}`
export const productsFragment = `
products(
first: $first
sortKey: $sortKey
reverse: $reverse
query: $query
) {
${productConnection}
}
}
}
`
const getAllProductsQuery = /* GraphQL */ `
@ -50,7 +42,16 @@ const getAllProductsQuery = /* GraphQL */ `
$sortKey: ProductSortKeys = RELEVANCE
$reverse: Boolean = false
) {
${productsFragment}
products(
first: $first
sortKey: $sortKey
reverse: $reverse
query: $query
) {
...productConnection
}
}
${productConnectionFragment}
`
export default getAllProductsQuery

View File

@ -1,7 +1,8 @@
export const checkoutDetailsFragment = `
export const checkoutDetailsFragment = /* GraphQL */ `
fragment checkoutDetails on Checkout {
id
webUrl
subtotalPriceV2{
subtotalPriceV2 {
amount
currencyCode
}
@ -35,11 +36,11 @@ export const checkoutDetailsFragment = `
width
height
}
priceV2{
priceV2 {
amount
currencyCode
}
compareAtPriceV2{
compareAtPriceV2 {
amount
currencyCode
}
@ -51,15 +52,15 @@ export const checkoutDetailsFragment = `
}
}
}
}
`
const getCheckoutQuery = /* GraphQL */ `
query($checkoutId: ID!) {
query getCheckout($checkoutId: ID!) {
node(id: $checkoutId) {
... on Checkout {
...checkoutDetails
}
}
${checkoutDetailsFragment}
}
}
}
`
export default getCheckoutQuery

View File

@ -1,4 +1,4 @@
import { productConnection } from './get-all-products-query'
import { productConnectionFragment } from './get-all-products-query'
const getCollectionProductsQuery = /* GraphQL */ `
query getProductsFromCollection(
@ -10,15 +10,12 @@ const getCollectionProductsQuery = /* GraphQL */ `
node(id: $categoryId) {
id
... on Collection {
products(
first: $first
sortKey: $sortKey
reverse: $reverse
) {
${productConnection}
products(first: $first, sortKey: $sortKey, reverse: $reverse) {
...productConnection
}
}
}
}
${productConnectionFragment}
`
export default getCollectionProductsQuery

View File

@ -1,5 +1,5 @@
export const getPageQuery = /* GraphQL */ `
query($id: ID!) {
query getPage($id: ID!) {
node(id: $id) {
id
... on Page {

View File

@ -9,7 +9,8 @@
"prettier-fix": "prettier --write .",
"find:unused": "next-unused",
"generate": "graphql-codegen",
"generate:definitions": "node framework/bigcommerce/scripts/generate-definitions.js"
"generate:definitions": "node framework/bigcommerce/scripts/generate-definitions.js",
"generate:shopify": "DOTENV_CONFIG_PATH=./.env.local graphql-codegen -r dotenv/config --config framework/shopify/codegen.json"
},
"sideEffects": false,
"license": "MIT",