diff --git a/framework/shopify/README.md b/framework/shopify/README.md index d67111a41..d5c4aa942 100644 --- a/framework/shopify/README.md +++ b/framework/shopify/README.md @@ -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 +``` diff --git a/framework/shopify/api/utils/fetch-all-products.ts b/framework/shopify/api/utils/fetch-all-products.ts index 9fa70a5ee..b4eadc67a 100644 --- a/framework/shopify/api/utils/fetch-all-products.ts +++ b/framework/shopify/api/utils/fetch-all-products.ts @@ -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 => { - const { data } = await config.fetch(query, { + const { data } = await config.fetch(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({ diff --git a/framework/shopify/codegen.json b/framework/shopify/codegen.json new file mode 100644 index 000000000..f0a757142 --- /dev/null +++ b/framework/shopify/codegen.json @@ -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"] + } +} diff --git a/framework/shopify/customer/get-customer-id.ts b/framework/shopify/customer/get-customer-id.ts index ca096645a..4f38f1c72 100644 --- a/framework/shopify/customer/get-customer-id.ts +++ b/framework/shopify/customer/get-customer-id.ts @@ -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 { +}): Promise { config = getConfig(config) - const { data } = await config.fetch(getCustomerIdQuery, { + const { + data: { customer }, + } = await config.fetch(getCustomerIdQuery, { variables: { customerAccesToken: customerAccesToken || Cookies.get(config.customerCookie), }, }) - return data.customer?.id + return customer?.id } export default getCustomerId diff --git a/framework/shopify/customer/use-customer.tsx b/framework/shopify/customer/use-customer.tsx index 137f0da74..7b600838e 100644 --- a/framework/shopify/customer/use-customer.tsx +++ b/framework/shopify/customer/use-customer.tsx @@ -10,11 +10,15 @@ export const handler: SWRHook = { query: getCustomerQuery, }, async fetcher({ options, fetch }) { - const data = await fetch({ - ...options, - variables: { customerAccessToken: getCustomerToken() }, - }) - return data.customer ?? null + const customerAccessToken = getCustomerToken() + if (customerAccessToken) { + const data = await fetch({ + ...options, + variables: { customerAccessToken: getCustomerToken() }, + }) + return data.customer + } + return null }, useHook: ({ useData }) => (input) => { return useData({ diff --git a/framework/shopify/product/get-all-collections.ts b/framework/shopify/product/get-all-collections.ts index 15c4bc51a..3369f9e51 100644 --- a/framework/shopify/product/get-all-collections.ts +++ b/framework/shopify/product/get-all-collections.ts @@ -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( + 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}`, diff --git a/framework/shopify/product/get-all-product-paths.ts b/framework/shopify/product/get-all-product-paths.ts index 4431d1e53..f95b533d4 100644 --- a/framework/shopify/product/get-all-product-paths.ts +++ b/framework/shopify/product/get-all-product-paths.ts @@ -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}`, }, diff --git a/framework/shopify/product/get-all-products.ts b/framework/shopify/product/get-all-products.ts index 14e486563..3d74448dc 100644 --- a/framework/shopify/product/get-all-products.ts +++ b/framework/shopify/product/get-all-products.ts @@ -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 => { +}): Promise<{ + products: Product[] +}> => { let { config, variables = { first: 250 } } = options ?? {} config = getConfig(config) - const { data }: GraphQLFetcherResult = await config.fetch( + const { data } = await config.fetch( 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) + ), } } diff --git a/framework/shopify/product/get-product.ts b/framework/shopify/product/get-product.ts index 1d861e1a1..a3b634fcd 100644 --- a/framework/shopify/product/get-product.ts +++ b/framework/shopify/product/get-product.ts @@ -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 => { +}): Promise<{ + product?: Product +}> => { let { config, variables } = options ?? {} config = getConfig(config) - const { data }: GraphQLFetcherResult = await config.fetch(getProductQuery, { + const { + data: { productByHandle }, + } = await config.fetch(getProductQuery, { variables, }) - const { productByHandle } = data return { - product: productByHandle ? normalizeProduct(productByHandle) : null, + ...(productByHandle && { + product: normalizeProduct(productByHandle as ShopifyProduct), + }), } } diff --git a/framework/shopify/product/use-search.tsx b/framework/shopify/product/use-search.tsx index bf812af3d..16ac8b249 100644 --- a/framework/shopify/product/use-search.tsx +++ b/framework/shopify/product/use-search.tsx @@ -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( - ({ node: { vendor } }: ProductEdge) => - vendor.replace(/\s+/g, '-').toLowerCase() === brandId - ) - } + const data = await fetch({ + 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({ + 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 = {}) => { diff --git a/framework/shopify/schema.d.ts b/framework/shopify/schema.d.ts index b1b23a3e5..317351b2e 100644 --- a/framework/shopify/schema.d.ts +++ b/framework/shopify/schema.d.ts @@ -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 /** 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 /** The URL where the customer needs to be redirected so they can complete the 3D Secure payment flow. */ nextActionUrl?: Maybe @@ -4386,7 +4394,9 @@ export type QueryRoot = { collections: CollectionConnection /** Find a customer by its access token. */ customer?: Maybe + /** Returns a specific node by ID. */ node?: Maybe + /** Returns the list of nodes with the given IDs. */ nodes: Array> /** Find a page by its handle. */ pageByHandle?: Maybe @@ -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> + checkoutUserErrors: Array< + { __typename?: 'CheckoutUserError' } & Pick< + CheckoutUserError, + 'code' | 'field' | 'message' + > + > + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + } + > +} + +export type CheckoutCreateMutationVariables = Exact<{ + input?: Maybe +}> + +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 +}> + +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'] +}> + +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 +}> + +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 + > + } + > +} + +export type CustomerActivateByUrlMutationVariables = Exact<{ + activationUrl: Scalars['URL'] + password: Scalars['String'] +}> + +export type CustomerActivateByUrlMutation = { __typename?: 'Mutation' } & { + customerActivateByUrl?: Maybe< + { __typename?: 'CustomerActivateByUrlPayload' } & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + 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> + 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> + } + > +} + +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 +}> + +export type GetAllPagesQuery = { __typename?: 'QueryRoot' } & { + pages: { __typename?: 'PageConnection' } & { + edges: Array< + { __typename?: 'PageEdge' } & { + node: { __typename?: 'Page' } & Pick + } + > + } +} + +export type GetAllProductVendorsQueryVariables = Exact<{ + first?: Maybe + cursor?: Maybe +}> + +export type GetAllProductVendorsQuery = { __typename?: 'QueryRoot' } & { + products: { __typename?: 'ProductConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ProductEdge' } & Pick & { + node: { __typename?: 'Product' } & Pick + } + > + } +} + +export type GetAllProductPathsQueryVariables = Exact<{ + first?: Maybe + cursor?: Maybe +}> + +export type GetAllProductPathsQuery = { __typename?: 'QueryRoot' } & { + products: { __typename?: 'ProductConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ProductEdge' } & Pick & { + node: { __typename?: 'Product' } & Pick + } + > + } +} + +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 + query?: Maybe + sortKey?: Maybe + reverse?: Maybe +}> + +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 + sortKey?: Maybe + reverse?: Maybe +}> + +export type GetProductsFromCollectionQuery = { __typename?: 'QueryRoot' } & { + node?: Maybe< + | ({ __typename?: 'AppliedGiftCard' } & Pick) + | ({ __typename?: 'Article' } & Pick) + | ({ __typename?: 'Blog' } & Pick) + | ({ __typename?: 'Checkout' } & Pick) + | ({ __typename?: 'CheckoutLineItem' } & Pick) + | ({ __typename?: 'Collection' } & Pick & { + products: { + __typename?: 'ProductConnection' + } & ProductConnectionFragment + }) + | ({ __typename?: 'Comment' } & Pick) + | ({ __typename?: 'ExternalVideo' } & Pick) + | ({ __typename?: 'MailingAddress' } & Pick) + | ({ __typename?: 'MediaImage' } & Pick) + | ({ __typename?: 'Metafield' } & Pick) + | ({ __typename?: 'Model3d' } & Pick) + | ({ __typename?: 'Order' } & Pick) + | ({ __typename?: 'Page' } & Pick) + | ({ __typename?: 'Payment' } & Pick) + | ({ __typename?: 'Product' } & Pick) + | ({ __typename?: 'ProductOption' } & Pick) + | ({ __typename?: 'ProductVariant' } & Pick) + | ({ __typename?: 'ShopPolicy' } & Pick) + | ({ __typename?: 'Video' } & Pick) + > +} + +export type GetCustomerIdQueryVariables = Exact<{ + customerAccessToken: Scalars['String'] +}> + +export type GetCustomerIdQuery = { __typename?: 'QueryRoot' } & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> +} + +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) + | ({ __typename?: 'Article' } & Pick) + | ({ __typename?: 'Blog' } & Pick) + | ({ __typename?: 'Checkout' } & Pick) + | ({ __typename?: 'CheckoutLineItem' } & Pick) + | ({ __typename?: 'Collection' } & Pick) + | ({ __typename?: 'Comment' } & Pick) + | ({ __typename?: 'ExternalVideo' } & Pick) + | ({ __typename?: 'MailingAddress' } & Pick) + | ({ __typename?: 'MediaImage' } & Pick) + | ({ __typename?: 'Metafield' } & Pick) + | ({ __typename?: 'Model3d' } & Pick) + | ({ __typename?: 'Order' } & Pick) + | ({ __typename?: 'Page' } & Pick< + Page, + 'title' | 'handle' | 'body' | 'bodySummary' | 'id' + >) + | ({ __typename?: 'Payment' } & Pick) + | ({ __typename?: 'Product' } & Pick) + | ({ __typename?: 'ProductOption' } & Pick) + | ({ __typename?: 'ProductVariant' } & Pick) + | ({ __typename?: 'ShopPolicy' } & Pick) + | ({ __typename?: 'Video' } & Pick) + > +} + +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' + > + } + > + } + } + > +} diff --git a/framework/shopify/schema.graphql b/framework/shopify/schema.graphql index 822e6007e..7854508ef 100644 --- a/framework/shopify/schema.graphql +++ b/framework/shopify/schema.graphql @@ -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 } diff --git a/framework/shopify/types.ts b/framework/shopify/types.ts index e7bcb2476..ba0f13997 100644 --- a/framework/shopify/types.ts +++ b/framework/shopify/types.ts @@ -9,7 +9,9 @@ export type ShopifyCheckout = { export type Cart = Core.Cart & { lineItems: LineItem[] + url?: String } + export interface LineItem extends Core.LineItem { options?: any[] } diff --git a/framework/shopify/utils/checkout-to-cart.ts b/framework/shopify/utils/checkout-to-cart.ts index 034ff11d7..63e4a18ab 100644 --- a/framework/shopify/utils/checkout-to-cart.ts +++ b/framework/shopify/utils/checkout-to-cart.ts @@ -27,12 +27,6 @@ export type CheckoutPayload = | CheckoutQuery const checkoutToCart = (checkoutPayload?: Maybe): Cart => { - if (!checkoutPayload) { - throw new CommerceError({ - message: 'Missing checkout payload from response', - }) - } - const checkout = checkoutPayload?.checkout throwUserErrors(checkoutPayload?.checkoutUserErrors) diff --git a/framework/shopify/utils/mutations/checkout-create.ts b/framework/shopify/utils/mutations/checkout-create.ts index ffbd555c7..7bff7e757 100644 --- a/framework/shopify/utils/mutations/checkout-create.ts +++ b/framework/shopify/utils/mutations/checkout-create.ts @@ -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 { - ${checkoutDetailsFragment} + ...checkoutDetails } } } + + ${checkoutDetailsFragment} ` export default checkoutCreateMutation diff --git a/framework/shopify/utils/mutations/checkout-line-item-add.ts b/framework/shopify/utils/mutations/checkout-line-item-add.ts index 2282c4e26..02f5b7107 100644 --- a/framework/shopify/utils/mutations/checkout-line-item-add.ts +++ b/framework/shopify/utils/mutations/checkout-line-item-add.ts @@ -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 { - ${checkoutDetailsFragment} + ...checkoutDetails } } } + + ${checkoutDetailsFragment} ` export default checkoutLineItemAddMutation diff --git a/framework/shopify/utils/mutations/checkout-line-item-remove.ts b/framework/shopify/utils/mutations/checkout-line-item-remove.ts index 8dea4ce08..30cb83028 100644 --- a/framework/shopify/utils/mutations/checkout-line-item-remove.ts +++ b/framework/shopify/utils/mutations/checkout-line-item-remove.ts @@ -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 { - ${checkoutDetailsFragment} + ...checkoutDetails } } } + ${checkoutDetailsFragment} ` export default checkoutLineItemRemoveMutation diff --git a/framework/shopify/utils/mutations/checkout-line-item-update.ts b/framework/shopify/utils/mutations/checkout-line-item-update.ts index 76254341e..fca617fb7 100644 --- a/framework/shopify/utils/mutations/checkout-line-item-update.ts +++ b/framework/shopify/utils/mutations/checkout-line-item-update.ts @@ -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 { - ${checkoutDetailsFragment} + ...checkoutDetails } } } + + ${checkoutDetailsFragment} ` export default checkoutLineItemUpdateMutation diff --git a/framework/shopify/utils/normalize.ts b/framework/shopify/utils/normalize.ts index 4ebc3a1ae..472723afe 100644 --- a/framework/shopify/utils/normalize.ts +++ b/framework/shopify/utils/normalize.ts @@ -75,22 +75,21 @@ const normalizeProductVariants = ({ edges }: ProductVariantConnection) => { ) } -export function normalizeProduct(productNode: ShopifyProduct): Product { - const { - id, - title: name, - vendor, - images, - variants, - description, - descriptionHtml, - handle, - priceRange, - options, - ...rest - } = productNode - - const product = { +export function normalizeProduct({ + id, + title: name, + vendor, + images, + variants, + description, + descriptionHtml, + handle, + priceRange, + options, + metafields, + ...rest +}: 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, diff --git a/framework/shopify/utils/queries/get-all-products-query.ts b/framework/shopify/utils/queries/get-all-products-query.ts index f48140d31..179cf9812 100644 --- a/framework/shopify/utils/queries/get-all-products-query.ts +++ b/framework/shopify/utils/queries/get-all-products-query.ts @@ -1,46 +1,38 @@ -export const productConnection = ` -pageInfo { - hasNextPage - hasPreviousPage -} -edges { - node { - id - title - vendor - handle - priceRange { - minVariantPrice { - amount - currencyCode - } +export const productConnectionFragment = /* GraphQL */ ` + fragment productConnection on ProductConnection { + pageInfo { + hasNextPage + hasPreviousPage } - images(first: 1) { - pageInfo { - hasNextPage - hasPreviousPage - } - edges { - node { - originalSrc - altText - width - height + edges { + node { + id + title + vendor + handle + priceRange { + minVariantPrice { + amount + currencyCode + } + } + images(first: 1) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + originalSrc + altText + width + height + } + } } } } } -}` - -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 diff --git a/framework/shopify/utils/queries/get-checkout-query.ts b/framework/shopify/utils/queries/get-checkout-query.ts index d8758e321..f4f6f33c2 100644 --- a/framework/shopify/utils/queries/get-checkout-query.ts +++ b/framework/shopify/utils/queries/get-checkout-query.ts @@ -1,65 +1,66 @@ -export const checkoutDetailsFragment = ` - id - webUrl - subtotalPriceV2{ - amount - currencyCode - } - totalTaxV2 { - amount - currencyCode - } - totalPriceV2 { - amount - currencyCode - } - completedAt - createdAt - taxesIncluded - lineItems(first: 250) { - pageInfo { - hasNextPage - hasPreviousPage +export const checkoutDetailsFragment = /* GraphQL */ ` + fragment checkoutDetails on Checkout { + id + webUrl + subtotalPriceV2 { + amount + currencyCode } - edges { - node { - id - title - variant { + totalTaxV2 { + amount + currencyCode + } + totalPriceV2 { + amount + currencyCode + } + completedAt + createdAt + taxesIncluded + lineItems(first: 250) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { id - sku title - image { - originalSrc - altText - width - height - } - priceV2{ - amount - currencyCode - } - compareAtPriceV2{ - amount - currencyCode - } - product { - handle + variant { + id + sku + title + image { + originalSrc + altText + width + height + } + priceV2 { + amount + currencyCode + } + compareAtPriceV2 { + amount + currencyCode + } + product { + handle + } } + quantity } - quantity } } } ` const getCheckoutQuery = /* GraphQL */ ` - query($checkoutId: ID!) { + query getCheckout($checkoutId: ID!) { node(id: $checkoutId) { - ... on Checkout { - ${checkoutDetailsFragment} - } + ...checkoutDetails } } + ${checkoutDetailsFragment} ` export default getCheckoutQuery diff --git a/framework/shopify/utils/queries/get-collection-products-query.ts b/framework/shopify/utils/queries/get-collection-products-query.ts index 04766caa4..b773a7e65 100644 --- a/framework/shopify/utils/queries/get-collection-products-query.ts +++ b/framework/shopify/utils/queries/get-collection-products-query.ts @@ -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 diff --git a/framework/shopify/utils/queries/get-page-query.ts b/framework/shopify/utils/queries/get-page-query.ts index 2ca79abd4..7939f0278 100644 --- a/framework/shopify/utils/queries/get-page-query.ts +++ b/framework/shopify/utils/queries/get-page-query.ts @@ -1,5 +1,5 @@ export const getPageQuery = /* GraphQL */ ` - query($id: ID!) { + query getPage($id: ID!) { node(id: $id) { id ... on Page { diff --git a/package.json b/package.json index 85810ca91..93b4c5572 100644 --- a/package.json +++ b/package.json @@ -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",