4
0
forked from crowetic/commerce

Update Vendure provider to latest API changes (#352)

Relates to #349
This commit is contained in:
Michael Bromley 2021-06-02 16:46:38 +02:00 committed by GitHub
parent a98c95d447
commit 0e804d09f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
81 changed files with 1265 additions and 698 deletions

View File

@ -1 +1,4 @@
COMMERCE_PROVIDER=vendure
NEXT_PUBLIC_VENDURE_SHOP_API_URL=http://localhost:3001/shop-api
NEXT_PUBLIC_VENDURE_LOCAL_URL=/vendure-shop-api

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -1 +0,0 @@
export default function () {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -1,6 +1,13 @@
import { NextApiHandler } from 'next'
import { CommerceAPI, createEndpoint, GetAPISchema } from '@commerce/api'
import { CheckoutSchema } from '@commerce/types/checkout'
import checkoutEndpoint from '@commerce/api/endpoints/checkout'
const checkoutApi = async (req: any, res: any, config: any) => {
const checkout: CheckoutEndpoint['handlers']['checkout'] = async ({
req,
res,
config,
}) => {
try {
const html = `
<!DOCTYPE html>
@ -37,27 +44,15 @@ const checkoutApi = async (req: any, res: any, config: any) => {
}
}
export function createApiHandler<T = any, H = {}, Options extends {} = {}>(
handler: any,
handlers: H,
defaultOptions: Options
) {
return function getApiHandler({
config,
operations,
options,
}: {
config?: any
operations?: Partial<H>
options?: Options extends {} ? Partial<Options> : never
} = {}): NextApiHandler {
const ops = { ...operations, ...handlers }
const opts = { ...defaultOptions, ...options }
export type CheckoutAPI = GetAPISchema<CommerceAPI, CheckoutSchema>
return function apiHandler(req, res) {
return handler(req, res, config, ops, opts)
}
}
}
export type CheckoutEndpoint = CheckoutAPI['endpoint']
export default createApiHandler(checkoutApi, {}, {})
export const handlers: CheckoutEndpoint['handlers'] = { checkout }
const checkoutApi = createEndpoint<CheckoutAPI>({
handler: checkoutEndpoint,
handlers,
})
export default checkoutApi

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -0,0 +1 @@
export default function noopApi(...args: any[]): void {}

View File

@ -1,6 +1,16 @@
import type { CommerceAPIConfig } from '@commerce/api'
import type { APIProvider, CommerceAPIConfig } from '@commerce/api'
import { CommerceAPI, getCommerceApi as commerceApi } from '@commerce/api'
import fetchGraphqlApi from './utils/fetch-graphql-api'
import login from './operations/login'
import getAllPages from './operations/get-all-pages'
import getPage from './operations/get-page'
import getSiteInfo from './operations/get-site-info'
import getCustomerWishlist from './operations/get-customer-wishlist'
import getAllProductPaths from './operations/get-all-product-paths'
import getAllProducts from './operations/get-all-products'
import getProduct from './operations/get-product'
export interface VendureConfig extends CommerceAPIConfig {}
const API_URL = process.env.NEXT_PUBLIC_VENDURE_SHOP_API_URL
@ -11,41 +21,33 @@ if (!API_URL) {
)
}
export class Config {
private config: VendureConfig
constructor(config: VendureConfig) {
this.config = {
...config,
}
}
getConfig(userConfig: Partial<VendureConfig> = {}) {
return Object.entries(userConfig).reduce<VendureConfig>(
(cfg, [key, value]) => Object.assign(cfg, { [key]: value }),
{ ...this.config }
)
}
setConfig(newConfig: Partial<VendureConfig>) {
Object.assign(this.config, newConfig)
}
}
const ONE_DAY = 60 * 60 * 24
const config = new Config({
const config: VendureConfig = {
commerceUrl: API_URL,
apiToken: '',
cartCookie: '',
customerCookie: '',
cartCookieMaxAge: ONE_DAY * 30,
fetch: fetchGraphqlApi,
})
export function getConfig(userConfig?: Partial<VendureConfig>) {
return config.getConfig(userConfig)
}
export function setConfig(newConfig: Partial<VendureConfig>) {
return config.setConfig(newConfig)
const operations = {
login,
getAllPages,
getPage,
getSiteInfo,
getCustomerWishlist,
getAllProductPaths,
getAllProducts,
getProduct,
}
export const provider = { config, operations }
export type Provider = typeof provider
export function getCommerceApi<P extends Provider>(
customProvider: P = provider as any
): CommerceAPI<P> {
return commerceApi(customProvider)
}

View File

@ -0,0 +1,41 @@
import { VendureConfig } from '../'
import { OperationContext } from '@commerce/api/operations'
import { Provider } from '../../../bigcommerce/api'
export type Page = any
export type GetAllPagesResult<
T extends { pages: any[] } = { pages: Page[] }
> = T
export default function getAllPagesOperation({
commerce,
}: OperationContext<Provider>) {
async function getAllPages(opts?: {
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<GetAllPagesResult>
async function getAllPages<T extends { pages: any[] }>(opts: {
url: string
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<GetAllPagesResult<T>>
async function getAllPages({
config: cfg,
preview,
}: {
url?: string
config?: Partial<VendureConfig>
preview?: boolean
} = {}): Promise<GetAllPagesResult> {
const config = commerce.getConfig(cfg)
return {
pages: [],
}
}
return getAllPages
}

View File

@ -0,0 +1,52 @@
import { OperationContext, OperationOptions } from '@commerce/api/operations'
import type { GetAllProductPathsQuery } from '../../schema'
import { Provider } from '../index'
import { getAllProductPathsQuery } from '../../utils/queries/get-all-product-paths-query'
import { GetAllProductPathsOperation } from '@commerce/types/product'
import { BigcommerceConfig } from '../../../bigcommerce/api'
export type GetAllProductPathsResult = {
products: Array<{ node: { path: string } }>
}
export default function getAllProductPathsOperation({
commerce,
}: OperationContext<Provider>) {
async function getAllProductPaths<
T extends GetAllProductPathsOperation
>(opts?: {
variables?: T['variables']
config?: BigcommerceConfig
}): Promise<T['data']>
async function getAllProductPaths<T extends GetAllProductPathsOperation>(
opts: {
variables?: T['variables']
config?: BigcommerceConfig
} & OperationOptions
): Promise<T['data']>
async function getAllProductPaths<T extends GetAllProductPathsOperation>({
query = getAllProductPathsQuery,
variables,
config: cfg,
}: {
query?: string
variables?: T['variables']
config?: BigcommerceConfig
} = {}): Promise<T['data']> {
const config = commerce.getConfig(cfg)
// RecursivePartial forces the method to check for every prop in the data, which is
// required in case there's a custom `query`
const { data } = await config.fetch<GetAllProductPathsQuery>(query, {
variables,
})
const products = data.products.items
return {
products: products.map((p) => ({ path: `/${p.slug}` })),
}
}
return getAllProductPaths
}

View File

@ -0,0 +1,46 @@
import { Product } from '@commerce/types/product'
import { Provider, VendureConfig } from '../'
import { GetAllProductsQuery } from '../../schema'
import { normalizeSearchResult } from '../../utils/normalize'
import { getAllProductsQuery } from '../../utils/queries/get-all-products-query'
import { OperationContext } from '@commerce/api/operations'
export type ProductVariables = { first?: number }
export default function getAllProductsOperation({
commerce,
}: OperationContext<Provider>) {
async function getAllProducts(opts?: {
variables?: ProductVariables
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<{ products: Product[] }>
async function getAllProducts({
query = getAllProductsQuery,
variables: { ...vars } = {},
config: cfg,
}: {
query?: string
variables?: ProductVariables
config?: Partial<VendureConfig>
preview?: boolean
} = {}): Promise<{ products: Product[] | any[] }> {
const config = commerce.getConfig(cfg)
const variables = {
input: {
take: vars.first,
groupByProduct: true,
},
}
const { data } = await config.fetch<GetAllProductsQuery>(query, {
variables,
})
return {
products: data.search.items.map((item) => normalizeSearchResult(item)),
}
}
return getAllProducts
}

View File

@ -0,0 +1,23 @@
import { OperationContext } from '@commerce/api/operations'
import { Provider, VendureConfig } from '../'
export default function getCustomerWishlistOperation({
commerce,
}: OperationContext<Provider>) {
async function getCustomerWishlist({
config: cfg,
variables,
includeProducts,
}: {
url?: string
variables: any
config?: Partial<VendureConfig>
includeProducts?: boolean
}): Promise<any> {
// Not implemented as Vendure does not ship with wishlist functionality at present
const config = commerce.getConfig(cfg)
return { wishlist: {} }
}
return getCustomerWishlist
}

View File

@ -0,0 +1,45 @@
import { VendureConfig, Provider } from '../'
import { OperationContext } from '@commerce/api/operations'
export type Page = any
export type GetPageResult<T extends { page?: any } = { page?: Page }> = T
export type PageVariables = {
id: number
}
export default function getPageOperation({
commerce,
}: OperationContext<Provider>) {
async function getPage(opts: {
url?: string
variables: PageVariables
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<GetPageResult>
async function getPage<T extends { page?: any }, V = any>(opts: {
url: string
variables: V
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<GetPageResult<T>>
async function getPage({
url,
variables,
config: cfg,
preview,
}: {
url?: string
variables: PageVariables
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<GetPageResult> {
const config = commerce.getConfig(cfg)
return {}
}
return getPage
}

View File

@ -0,0 +1,69 @@
import { Product } from '@commerce/types/product'
import { OperationContext } from '@commerce/api/operations'
import { Provider, VendureConfig } from '../'
import { GetProductQuery } from '../../schema'
import { getProductQuery } from '../../utils/queries/get-product-query'
export default function getProductOperation({
commerce,
}: OperationContext<Provider>) {
async function getProduct({
query = getProductQuery,
variables,
config: cfg,
}: {
query?: string
variables: { slug: string }
config?: Partial<VendureConfig>
preview?: boolean
}): Promise<Product | {} | any> {
const config = commerce.getConfig(cfg)
const locale = config.locale
const { data } = await config.fetch<GetProductQuery>(query, { variables })
const product = data.product
if (product) {
const getOptionGroupName = (id: string): string => {
return product.optionGroups.find((og) => og.id === id)!.name
}
return {
product: {
id: product.id,
name: product.name,
description: product.description,
slug: product.slug,
images: product.assets.map((a) => ({
url: a.preview,
alt: a.name,
})),
variants: product.variants.map((v) => ({
id: v.id,
options: v.options.map((o) => ({
// This __typename property is required in order for the correct
// variant selection to work, see `components/product/helpers.ts`
// `getVariant()` function.
__typename: 'MultipleChoiceOption',
id: o.id,
displayName: getOptionGroupName(o.groupId),
values: [{ label: o.name }],
})),
})),
price: {
value: product.variants[0].priceWithTax / 100,
currencyCode: product.variants[0].currencyCode,
},
options: product.optionGroups.map((og) => ({
id: og.id,
displayName: og.name,
values: og.options.map((o) => ({ label: o.name })),
})),
} as Product,
}
}
return {}
}
return getProduct
}

View File

@ -0,0 +1,50 @@
import { Provider, VendureConfig } from '../'
import { GetCollectionsQuery } from '../../schema'
import { arrayToTree } from '../../utils/array-to-tree'
import { getCollectionsQuery } from '../../utils/queries/get-collections-query'
import { OperationContext } from '@commerce/api/operations'
import { Category } from '@commerce/types/site'
export type GetSiteInfoResult<
T extends { categories: any[]; brands: any[] } = {
categories: Category[]
brands: any[]
}
> = T
export default function getSiteInfoOperation({
commerce,
}: OperationContext<Provider>) {
async function getSiteInfo({
query = getCollectionsQuery,
variables,
config: cfg,
}: {
query?: string
variables?: any
config?: Partial<VendureConfig>
preview?: boolean
} = {}): Promise<GetSiteInfoResult> {
const config = commerce.getConfig(cfg)
// RecursivePartial forces the method to check for every prop in the data, which is
// required in case there's a custom `query`
const { data } = await config.fetch<GetCollectionsQuery>(query, {
variables,
})
const collections = data.collections?.items.map((i) => ({
...i,
entityId: i.id,
path: i.slug,
productCount: i.productVariants.totalItems,
}))
const categories = arrayToTree(collections).children
const brands = [] as any[]
return {
categories: categories ?? [],
brands,
}
}
return getSiteInfo
}

View File

@ -0,0 +1,60 @@
import type { ServerResponse } from 'http'
import type {
OperationContext,
OperationOptions,
} from '@commerce/api/operations'
import { ValidationError } from '@commerce/utils/errors'
import type { LoginOperation } from '../../types/login'
import type { LoginMutation } from '../../schema'
import { Provider, VendureConfig } from '..'
import { loginMutation } from '../../utils/mutations/log-in-mutation'
export default function loginOperation({
commerce,
}: OperationContext<Provider>) {
async function login<T extends LoginOperation>(opts: {
variables: T['variables']
config?: Partial<VendureConfig>
res: ServerResponse
}): Promise<T['data']>
async function login<T extends LoginOperation>(
opts: {
variables: T['variables']
config?: Partial<VendureConfig>
res: ServerResponse
} & OperationOptions
): Promise<T['data']>
async function login<T extends LoginOperation>({
query = loginMutation,
variables,
res: response,
config: cfg,
}: {
query?: string
variables: T['variables']
res: ServerResponse
config?: Partial<VendureConfig>
}): Promise<T['data']> {
const config = commerce.getConfig(cfg)
const { data, res } = await config.fetch<LoginMutation>(query, {
variables,
})
switch (data.login.__typename) {
case 'NativeAuthStrategyError':
case 'InvalidCredentialsError':
case 'NotVerifiedError':
throw new ValidationError({
code: data.login.errorCode,
message: data.login.message,
})
}
return {
result: data.login.id,
}
}
return login
}

View File

@ -1,6 +1,6 @@
import { FetcherError } from '@commerce/utils/errors'
import type { GraphQLFetcher } from '@commerce/api'
import { getConfig } from '..'
import { getCommerceApi } from '../'
import fetch from './fetch'
const fetchGraphqlApi: GraphQLFetcher = async (
@ -8,12 +8,11 @@ const fetchGraphqlApi: GraphQLFetcher = async (
{ variables, preview } = {},
fetchOptions
) => {
const config = getConfig()
const config = getCommerceApi().getConfig()
const res = await fetch(config.commerceUrl, {
...fetchOptions,
method: 'POST',
headers: {
Authorization: `Bearer ${config.apiToken}`,
...fetchOptions?.headers,
'Content-Type': 'application/json',
},

View File

@ -1,2 +0,0 @@
export type WishlistItem = { product: any; id: number }
export default function () {}

View File

@ -0,0 +1,3 @@
export { default as useLogin } from './use-login'
export { default as useLogout } from './use-logout'
export { default as useSignup } from './use-signup'

View File

@ -1,14 +1,15 @@
import { useCallback } from 'react'
import { MutationHook } from '@commerce/utils/types'
import useLogin, { UseLogin } from '@commerce/auth/use-login'
import { LoginHook } from '../types/login'
import { CommerceError, ValidationError } from '@commerce/utils/errors'
import useCustomer from '../customer/use-customer'
import { LoginMutation, LoginMutationVariables } from '../schema'
import { loginMutation } from '../lib/mutations/log-in-mutation'
import { loginMutation } from '../utils/mutations/log-in-mutation'
export default useLogin as UseLogin<typeof handler>
export const handler: MutationHook<null, {}, any> = {
export const handler: MutationHook<LoginHook> = {
fetchOptions: {
query: loginMutation,
},

View File

@ -3,11 +3,12 @@ import { MutationHook } from '@commerce/utils/types'
import useLogout, { UseLogout } from '@commerce/auth/use-logout'
import useCustomer from '../customer/use-customer'
import { LogoutMutation } from '../schema'
import { logoutMutation } from '../lib/mutations/log-out-mutation'
import { logoutMutation } from '../utils/mutations/log-out-mutation'
import { LogoutHook } from '../types/logout'
export default useLogout as UseLogout<typeof handler>
export const handler: MutationHook<null> = {
export const handler: MutationHook<LogoutHook> = {
fetchOptions: {
query: logoutMutation,
},

View File

@ -8,7 +8,8 @@ import {
SignupMutation,
SignupMutationVariables,
} from '../schema'
import { signupMutation } from '../lib/mutations/sign-up-mutation'
import { signupMutation } from '../utils/mutations/sign-up-mutation'
import { SignupHook } from '../types/signup'
export default useSignup as UseSignup<typeof handler>
@ -19,7 +20,7 @@ export type SignupInput = {
password: string
}
export const handler: MutationHook<null, {}, SignupInput, SignupInput> = {
export const handler: MutationHook<SignupHook> = {
fetchOptions: {
query: signupMutation,
},

View File

@ -1,5 +1,4 @@
export { default as useCart } from './use-cart'
export { default as useAddItem } from './use-add-item'
export { default as useRemoveItem } from './use-remove-item'
export { default as useWishlistActions } from './use-cart-actions'
export { default as useUpdateItem } from './use-cart-actions'
export { default as useUpdateItem } from './use-update-item'

View File

@ -1,16 +1,16 @@
import { Cart, CartItemBody } from '@commerce/types'
import useAddItem, { UseAddItem } from '@commerce/cart/use-add-item'
import { CommerceError } from '@commerce/utils/errors'
import { MutationHook } from '@commerce/utils/types'
import { useCallback } from 'react'
import useCart from './use-cart'
import { AddItemToOrderMutation } from '../schema'
import { normalizeCart } from '../lib/normalize'
import { addItemToOrderMutation } from '../lib/mutations/add-item-to-order-mutation'
import { normalizeCart } from '../utils/normalize'
import { addItemToOrderMutation } from '../utils/mutations/add-item-to-order-mutation'
import { AddItemHook } from '../types/cart'
export default useAddItem as UseAddItem<typeof handler>
export const handler: MutationHook<Cart, {}, CartItemBody> = {
export const handler: MutationHook<AddItemHook> = {
fetchOptions: {
query: addItemToOrderMutation,
},

View File

@ -1,13 +0,0 @@
import useAddItem from './use-add-item'
import useRemoveItem from './use-remove-item'
import useUpdateItem from './use-update-item'
// This hook is probably not going to be used, but it's here
// to show how a commerce should be structuring it
export default function useCartActions() {
const addItem = useAddItem()
const updateItem = useUpdateItem()
const removeItem = useRemoveItem()
return { addItem, updateItem, removeItem }
}

View File

@ -1,10 +1,10 @@
import { Cart } from '@commerce/types'
import { SWRHook } from '@commerce/utils/types'
import useCart, { FetchCartInput, UseCart } from '@commerce/cart/use-cart'
import useCart, { UseCart } from '@commerce/cart/use-cart'
import { ActiveOrderQuery, CartFragment } from '../schema'
import { normalizeCart } from '../lib/normalize'
import { normalizeCart } from '../utils/normalize'
import { useMemo } from 'react'
import { getCartQuery } from '../lib/queries/get-cart-query'
import { getCartQuery } from '../utils/queries/get-cart-query'
import { GetCartHook } from '../types/cart'
export type CartResult = {
activeOrder?: CartFragment
@ -15,12 +15,7 @@ export type CartResult = {
export default useCart as UseCart<typeof handler>
export const handler: SWRHook<
Cart | null,
{},
FetchCartInput,
{ isEmpty?: boolean }
> = {
export const handler: SWRHook<GetCartHook> = {
fetchOptions: {
query: getCartQuery,
},

View File

@ -1,25 +1,31 @@
import { useCallback } from 'react'
import { HookFetcherContext, MutationHookContext } from '@commerce/utils/types'
import {
HookFetcherContext,
MutationHook,
MutationHookContext,
SWRHook,
} from '@commerce/utils/types'
import useRemoveItem, { UseRemoveItem } from '@commerce/cart/use-remove-item'
import { CommerceError } from '@commerce/utils/errors'
import { Cart } from '@commerce/types/cart'
import useCart from './use-cart'
import {
RemoveOrderLineMutation,
RemoveOrderLineMutationVariables,
} from '../schema'
import { Cart, LineItem, RemoveCartItemBody } from '@commerce/types'
import { normalizeCart } from '../lib/normalize'
import { removeOrderLineMutation } from '../lib/mutations/remove-order-line-mutation'
import { normalizeCart } from '../utils/normalize'
import { RemoveItemHook } from '../types/cart'
import { removeOrderLineMutation } from '../utils/mutations/remove-order-line-mutation'
export default useRemoveItem as UseRemoveItem<typeof handler>
export const handler = {
export const handler: MutationHook<RemoveItemHook> = {
fetchOptions: {
query: removeOrderLineMutation,
},
async fetcher({ input, options, fetch }: HookFetcherContext<LineItem>) {
async fetcher({ input, options, fetch }) {
const variables: RemoveOrderLineMutationVariables = {
orderLineId: input.id,
orderLineId: input.itemId,
}
const { removeOrderLine } = await fetch<RemoveOrderLineMutation>({
...options,
@ -31,14 +37,12 @@ export const handler = {
}
throw new CommerceError(removeOrderLine)
},
useHook: ({
fetch,
}: MutationHookContext<Cart | null, RemoveCartItemBody>) => (ctx = {}) => {
useHook: ({ fetch }) => () => {
const { mutate } = useCart()
return useCallback(
async function removeItem(input) {
const data = await fetch({ input })
const data = await fetch({ input: { itemId: input.id } })
await mutate(data, false)
return data
},

View File

@ -1,20 +1,24 @@
import { useCallback } from 'react'
import { HookFetcherContext, MutationHookContext } from '@commerce/utils/types'
import {
HookFetcherContext,
MutationHook,
MutationHookContext,
} from '@commerce/utils/types'
import { CommerceError, ValidationError } from '@commerce/utils/errors'
import useUpdateItem, { UseUpdateItem } from '@commerce/cart/use-update-item'
import {
Cart,
CartItemBody,
LineItem,
UpdateCartItemBody,
} from '@commerce/types'
import { CartItemBody, LineItem } from '@commerce/types/cart'
import useCart from './use-cart'
import {
AdjustOrderLineMutation,
AdjustOrderLineMutationVariables,
} from '../schema'
import { normalizeCart } from '../lib/normalize'
import { adjustOrderLineMutation } from '../lib/mutations/adjust-order-line-mutation'
import { normalizeCart } from '../utils/normalize'
import { adjustOrderLineMutation } from '../utils/mutations/adjust-order-line-mutation'
import { UpdateItemHook } from '../types/cart'
export type UpdateItemActionInput<T = any> = T extends LineItem
? Partial<UpdateItemHook['actionInput']>
: UpdateItemHook['actionInput']
export default useUpdateItem as UseUpdateItem<typeof handler>
@ -22,7 +26,7 @@ export const handler = {
fetchOptions: {
query: adjustOrderLineMutation,
},
async fetcher(context: HookFetcherContext<UpdateCartItemBody<CartItemBody>>) {
async fetcher(context: HookFetcherContext<UpdateItemHook>) {
const { input, options, fetch } = context
const variables: AdjustOrderLineMutationVariables = {
quantity: input.item.quantity || 1,
@ -38,9 +42,7 @@ export const handler = {
}
throw new CommerceError(adjustOrderLine)
},
useHook: ({
fetch,
}: MutationHookContext<Cart | null, UpdateCartItemBody<CartItemBody>>) => (
useHook: ({ fetch }: MutationHookContext<UpdateItemHook>) => (
ctx: {
item?: LineItem
wait?: number
@ -50,7 +52,7 @@ export const handler = {
const { mutate } = useCart()
return useCallback(
async function addItem(input: Partial<CartItemBody>) {
async function addItem(input: UpdateItemActionInput) {
const itemId = item?.id
const productId = input.productId ?? item?.productId
const variantId = input.productId ?? item?.variantId

View File

@ -1,35 +0,0 @@
import { getConfig, VendureConfig } from '../api'
export type Page = any
export type GetAllPagesResult<
T extends { pages: any[] } = { pages: Page[] }
> = T
async function getAllPages(opts?: {
config?: VendureConfig
preview?: boolean
}): Promise<GetAllPagesResult>
async function getAllPages<T extends { pages: any[] }>(opts: {
url: string
config?: VendureConfig
preview?: boolean
}): Promise<GetAllPagesResult<T>>
async function getAllPages({
config,
preview,
}: {
url?: string
config?: VendureConfig
preview?: boolean
} = {}): Promise<GetAllPagesResult> {
config = getConfig(config)
return {
pages: [],
}
}
export default getAllPages

View File

@ -1,40 +0,0 @@
import { VendureConfig, getConfig } from '../api'
export type Page = any
export type GetPageResult<T extends { page?: any } = { page?: Page }> = T
export type PageVariables = {
id: number
}
async function getPage(opts: {
url?: string
variables: PageVariables
config?: VendureConfig
preview?: boolean
}): Promise<GetPageResult>
async function getPage<T extends { page?: any }, V = any>(opts: {
url: string
variables: V
config?: VendureConfig
preview?: boolean
}): Promise<GetPageResult<T>>
async function getPage({
url,
variables,
config,
preview,
}: {
url?: string
variables: PageVariables
config?: VendureConfig
preview?: boolean
}): Promise<GetPageResult> {
config = getConfig(config)
return {}
}
export default getPage

View File

@ -1,43 +0,0 @@
import { getConfig, VendureConfig } from '../api'
import { GetCollectionsQuery } from '../schema'
import { arrayToTree } from '../lib/array-to-tree'
import { getCollectionsQuery } from '../lib/queries/get-collections-query'
import { Category } from '@commerce/types'
export type GetSiteInfoResult<
T extends { categories: any[]; brands: any[] } = {
categories: Category[]
brands: any[]
}
> = T
async function getSiteInfo({
query = getCollectionsQuery,
variables,
config,
}: {
query?: string
variables?: any
config?: VendureConfig
preview?: boolean
} = {}): Promise<GetSiteInfoResult> {
config = getConfig(config)
// RecursivePartial forces the method to check for every prop in the data, which is
// required in case there's a custom `query`
const { data } = await config.fetch<GetCollectionsQuery>(query, { variables })
const collections = data.collections?.items.map((i) => ({
...i,
entityId: i.id,
path: i.slug,
productCount: i.productVariants.totalItems,
}))
const categories = arrayToTree(collections).children
const brands = [] as any[]
return {
categories: categories ?? [],
brands,
}
}
export default getSiteInfo

View File

@ -1,18 +0,0 @@
import { getConfig, VendureConfig } from '../api'
async function getCustomerWishlist({
config,
variables,
includeProducts,
}: {
url?: string
variables: any
config?: VendureConfig
includeProducts?: boolean
}): Promise<any> {
// Not implemented as Vendure does not ship with wishlist functionality at present
config = getConfig(config)
return { wishlist: {} }
}
export default getCustomerWishlist

View File

@ -1,12 +1,12 @@
import { SWRHook } from '@commerce/utils/types'
import useCustomer, { UseCustomer } from '@commerce/customer/use-customer'
import { Customer } from '@commerce/types'
import { ActiveCustomerQuery } from '../schema'
import { activeCustomerQuery } from '../lib/queries/active-customer-query'
import { activeCustomerQuery } from '../utils/queries/active-customer-query'
import { CustomerHook } from '../types/customer'
export default useCustomer as UseCustomer<typeof handler>
export const handler: SWRHook<Customer | null> = {
export const handler: SWRHook<CustomerHook> = {
fetchOptions: {
query: activeCustomerQuery,
},

View File

@ -1,48 +0,0 @@
import type {
GetAllProductPathsQuery,
GetAllProductPathsQueryVariables,
} from '../schema'
import { getConfig, VendureConfig } from '../api'
import { getAllProductPathsQuery } from '../lib/queries/get-all-product-paths-query'
export type GetAllProductPathsResult = {
products: Array<{ node: { path: string } }>
}
async function getAllProductPaths(opts?: {
variables?: GetAllProductPathsQueryVariables
config?: VendureConfig
}): Promise<GetAllProductPathsResult>
async function getAllProductPaths<
T extends { products: any[] },
V = any
>(opts: {
query: string
variables?: V
config?: VendureConfig
}): Promise<GetAllProductPathsResult>
async function getAllProductPaths({
query = getAllProductPathsQuery,
variables,
config,
}: {
query?: string
variables?: GetAllProductPathsQueryVariables
config?: VendureConfig
} = {}): Promise<GetAllProductPathsResult> {
config = getConfig(config)
// RecursivePartial forces the method to check for every prop in the data, which is
// required in case there's a custom `query`
const { data } = await config.fetch<GetAllProductPathsQuery>(query, {
variables,
})
const products = data.products.items
return {
products: products.map((p) => ({ node: { path: `/${p.slug}` } })),
}
}
export default getAllProductPaths

View File

@ -1,39 +0,0 @@
import { Product } from '@commerce/types'
import { getConfig, VendureConfig } from '../api'
import { GetAllProductsQuery } from '../schema'
import { normalizeSearchResult } from '../lib/normalize'
import { getAllProductsQuery } from '../lib/queries/get-all-products-query'
export type ProductVariables = { first?: number }
async function getAllProducts(opts?: {
variables?: ProductVariables
config?: VendureConfig
preview?: boolean
}): Promise<{ products: Product[] }>
async function getAllProducts({
query = getAllProductsQuery,
variables: { ...vars } = {},
config,
}: {
query?: string
variables?: ProductVariables
config?: VendureConfig
preview?: boolean
} = {}): Promise<{ products: Product[] | any[] }> {
config = getConfig(config)
const variables = {
input: {
take: vars.first,
groupByProduct: true,
},
}
const { data } = await config.fetch<GetAllProductsQuery>(query, { variables })
return {
products: data.search.items.map((item) => normalizeSearchResult(item)),
}
}
export default getAllProducts

View File

@ -1,64 +0,0 @@
import { Product } from '@commerce/types'
import { getConfig, VendureConfig } from '../api'
import { GetProductQuery } from '../schema'
import { getProductQuery } from '../lib/queries/get-product-query'
async function getProduct({
query = getProductQuery,
variables,
config,
}: {
query?: string
variables: { slug: string }
config?: VendureConfig
preview?: boolean
}): Promise<Product | {} | any> {
config = getConfig(config)
const locale = config.locale
const { data } = await config.fetch<GetProductQuery>(query, { variables })
const product = data.product
if (product) {
const getOptionGroupName = (id: string): string => {
return product.optionGroups.find((og) => og.id === id)!.name
}
return {
product: {
id: product.id,
name: product.name,
description: product.description,
slug: product.slug,
images: product.assets.map((a) => ({
url: a.preview,
alt: a.name,
})),
variants: product.variants.map((v) => ({
id: v.id,
options: v.options.map((o) => ({
// This __typename property is required in order for the correct
// variant selection to work, see `components/product/helpers.ts`
// `getVariant()` function.
__typename: 'MultipleChoiceOption',
id: o.id,
displayName: getOptionGroupName(o.groupId),
values: [{ label: o.name }],
})),
})),
price: {
value: product.variants[0].priceWithTax / 100,
currencyCode: product.variants[0].currencyCode,
},
options: product.optionGroups.map((og) => ({
id: og.id,
displayName: og.name,
values: og.options.map((o) => ({ label: o.name })),
})),
} as Product,
}
}
return {}
}
export default getProduct

View File

@ -1,4 +1,2 @@
export { default as usePrice } from './use-price'
export { default as useSearch } from './use-search'
export { default as getProduct } from './get-product'
export { default as getAllProducts } from './get-all-products'

View File

@ -1,9 +1,10 @@
import { SWRHook } from '@commerce/utils/types'
import useSearch, { UseSearch } from '@commerce/product/use-search'
import { Product } from '@commerce/types'
import { Product } from '@commerce/types/product'
import { SearchQuery, SearchQueryVariables } from '../schema'
import { normalizeSearchResult } from '../lib/normalize'
import { searchQuery } from '../lib/queries/search-query'
import { normalizeSearchResult } from '../utils/normalize'
import { searchQuery } from '../utils/queries/search-query'
import { SearchProductsHook } from '../types/product'
export default useSearch as UseSearch<typeof handler>
@ -19,11 +20,7 @@ export type SearchProductsData = {
found: boolean
}
export const handler: SWRHook<
SearchProductsData,
SearchProductsInput,
SearchProductsInput
> = {
export const handler: SWRHook<SearchProductsHook> = {
fetchOptions: {
query: searchQuery,
},
@ -33,7 +30,7 @@ export const handler: SWRHook<
const variables: SearchQueryVariables = {
input: {
term: input.search,
collectionId: input.categoryId,
collectionId: input.categoryId?.toString(),
groupByProduct: true,
// TODO: what is the "sort" value?
},

View File

@ -437,6 +437,13 @@ export type ProductVariantList = PaginatedList & {
totalItems: Scalars['Int']
}
export type ProductVariantListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<ProductVariantSortParameter>
filter?: Maybe<ProductVariantFilterParameter>
}
export enum GlobalFlag {
True = 'TRUE',
False = 'FALSE',
@ -463,6 +470,7 @@ export enum DeletionResult {
* @docsCategory common
*/
export enum Permission {
Placeholder = 'Placeholder',
/** Authenticated means simply that the user is logged in */
Authenticated = 'Authenticated',
/** SuperAdmin has unrestricted access to all operations */
@ -471,22 +479,24 @@ export enum Permission {
Owner = 'Owner',
/** Public means any unauthenticated user may perform the operation */
Public = 'Public',
/** Grants permission to create Catalog */
/** Grants permission to update GlobalSettings */
UpdateGlobalSettings = 'UpdateGlobalSettings',
/** Grants permission to create Products, Facets, Assets, Collections */
CreateCatalog = 'CreateCatalog',
/** Grants permission to read Catalog */
/** Grants permission to read Products, Facets, Assets, Collections */
ReadCatalog = 'ReadCatalog',
/** Grants permission to update Catalog */
/** Grants permission to update Products, Facets, Assets, Collections */
UpdateCatalog = 'UpdateCatalog',
/** Grants permission to delete Catalog */
/** Grants permission to delete Products, Facets, Assets, Collections */
DeleteCatalog = 'DeleteCatalog',
/** Grants permission to create Customer */
CreateCustomer = 'CreateCustomer',
/** Grants permission to read Customer */
ReadCustomer = 'ReadCustomer',
/** Grants permission to update Customer */
UpdateCustomer = 'UpdateCustomer',
/** Grants permission to delete Customer */
DeleteCustomer = 'DeleteCustomer',
/** Grants permission to create PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */
CreateSettings = 'CreateSettings',
/** Grants permission to read PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */
ReadSettings = 'ReadSettings',
/** Grants permission to update PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */
UpdateSettings = 'UpdateSettings',
/** Grants permission to delete PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */
DeleteSettings = 'DeleteSettings',
/** Grants permission to create Administrator */
CreateAdministrator = 'CreateAdministrator',
/** Grants permission to read Administrator */
@ -495,6 +505,62 @@ export enum Permission {
UpdateAdministrator = 'UpdateAdministrator',
/** Grants permission to delete Administrator */
DeleteAdministrator = 'DeleteAdministrator',
/** Grants permission to create Asset */
CreateAsset = 'CreateAsset',
/** Grants permission to read Asset */
ReadAsset = 'ReadAsset',
/** Grants permission to update Asset */
UpdateAsset = 'UpdateAsset',
/** Grants permission to delete Asset */
DeleteAsset = 'DeleteAsset',
/** Grants permission to create Channel */
CreateChannel = 'CreateChannel',
/** Grants permission to read Channel */
ReadChannel = 'ReadChannel',
/** Grants permission to update Channel */
UpdateChannel = 'UpdateChannel',
/** Grants permission to delete Channel */
DeleteChannel = 'DeleteChannel',
/** Grants permission to create Collection */
CreateCollection = 'CreateCollection',
/** Grants permission to read Collection */
ReadCollection = 'ReadCollection',
/** Grants permission to update Collection */
UpdateCollection = 'UpdateCollection',
/** Grants permission to delete Collection */
DeleteCollection = 'DeleteCollection',
/** Grants permission to create Country */
CreateCountry = 'CreateCountry',
/** Grants permission to read Country */
ReadCountry = 'ReadCountry',
/** Grants permission to update Country */
UpdateCountry = 'UpdateCountry',
/** Grants permission to delete Country */
DeleteCountry = 'DeleteCountry',
/** Grants permission to create Customer */
CreateCustomer = 'CreateCustomer',
/** Grants permission to read Customer */
ReadCustomer = 'ReadCustomer',
/** Grants permission to update Customer */
UpdateCustomer = 'UpdateCustomer',
/** Grants permission to delete Customer */
DeleteCustomer = 'DeleteCustomer',
/** Grants permission to create CustomerGroup */
CreateCustomerGroup = 'CreateCustomerGroup',
/** Grants permission to read CustomerGroup */
ReadCustomerGroup = 'ReadCustomerGroup',
/** Grants permission to update CustomerGroup */
UpdateCustomerGroup = 'UpdateCustomerGroup',
/** Grants permission to delete CustomerGroup */
DeleteCustomerGroup = 'DeleteCustomerGroup',
/** Grants permission to create Facet */
CreateFacet = 'CreateFacet',
/** Grants permission to read Facet */
ReadFacet = 'ReadFacet',
/** Grants permission to update Facet */
UpdateFacet = 'UpdateFacet',
/** Grants permission to delete Facet */
DeleteFacet = 'DeleteFacet',
/** Grants permission to create Order */
CreateOrder = 'CreateOrder',
/** Grants permission to read Order */
@ -503,6 +569,22 @@ export enum Permission {
UpdateOrder = 'UpdateOrder',
/** Grants permission to delete Order */
DeleteOrder = 'DeleteOrder',
/** Grants permission to create PaymentMethod */
CreatePaymentMethod = 'CreatePaymentMethod',
/** Grants permission to read PaymentMethod */
ReadPaymentMethod = 'ReadPaymentMethod',
/** Grants permission to update PaymentMethod */
UpdatePaymentMethod = 'UpdatePaymentMethod',
/** Grants permission to delete PaymentMethod */
DeletePaymentMethod = 'DeletePaymentMethod',
/** Grants permission to create Product */
CreateProduct = 'CreateProduct',
/** Grants permission to read Product */
ReadProduct = 'ReadProduct',
/** Grants permission to update Product */
UpdateProduct = 'UpdateProduct',
/** Grants permission to delete Product */
DeleteProduct = 'DeleteProduct',
/** Grants permission to create Promotion */
CreatePromotion = 'CreatePromotion',
/** Grants permission to read Promotion */
@ -511,14 +593,54 @@ export enum Permission {
UpdatePromotion = 'UpdatePromotion',
/** Grants permission to delete Promotion */
DeletePromotion = 'DeletePromotion',
/** Grants permission to create Settings */
CreateSettings = 'CreateSettings',
/** Grants permission to read Settings */
ReadSettings = 'ReadSettings',
/** Grants permission to update Settings */
UpdateSettings = 'UpdateSettings',
/** Grants permission to delete Settings */
DeleteSettings = 'DeleteSettings',
/** Grants permission to create ShippingMethod */
CreateShippingMethod = 'CreateShippingMethod',
/** Grants permission to read ShippingMethod */
ReadShippingMethod = 'ReadShippingMethod',
/** Grants permission to update ShippingMethod */
UpdateShippingMethod = 'UpdateShippingMethod',
/** Grants permission to delete ShippingMethod */
DeleteShippingMethod = 'DeleteShippingMethod',
/** Grants permission to create Tag */
CreateTag = 'CreateTag',
/** Grants permission to read Tag */
ReadTag = 'ReadTag',
/** Grants permission to update Tag */
UpdateTag = 'UpdateTag',
/** Grants permission to delete Tag */
DeleteTag = 'DeleteTag',
/** Grants permission to create TaxCategory */
CreateTaxCategory = 'CreateTaxCategory',
/** Grants permission to read TaxCategory */
ReadTaxCategory = 'ReadTaxCategory',
/** Grants permission to update TaxCategory */
UpdateTaxCategory = 'UpdateTaxCategory',
/** Grants permission to delete TaxCategory */
DeleteTaxCategory = 'DeleteTaxCategory',
/** Grants permission to create TaxRate */
CreateTaxRate = 'CreateTaxRate',
/** Grants permission to read TaxRate */
ReadTaxRate = 'ReadTaxRate',
/** Grants permission to update TaxRate */
UpdateTaxRate = 'UpdateTaxRate',
/** Grants permission to delete TaxRate */
DeleteTaxRate = 'DeleteTaxRate',
/** Grants permission to create System */
CreateSystem = 'CreateSystem',
/** Grants permission to read System */
ReadSystem = 'ReadSystem',
/** Grants permission to update System */
UpdateSystem = 'UpdateSystem',
/** Grants permission to delete System */
DeleteSystem = 'DeleteSystem',
/** Grants permission to create Zone */
CreateZone = 'CreateZone',
/** Grants permission to read Zone */
ReadZone = 'ReadZone',
/** Grants permission to update Zone */
UpdateZone = 'UpdateZone',
/** Grants permission to delete Zone */
DeleteZone = 'DeleteZone',
}
export enum SortOrder {
@ -734,10 +856,24 @@ export type DateOperators = {
between?: Maybe<DateRange>
}
/**
* Used to construct boolean expressions for filtering search results
* by FacetValue ID. Examples:
*
* * ID=1 OR ID=2: `{ facetValueFilters: [{ or: [1,2] }] }`
* * ID=1 AND ID=2: `{ facetValueFilters: [{ and: 1 }, { and: 2 }] }`
* * ID=1 AND (ID=2 OR ID=3): `{ facetValueFilters: [{ and: 1 }, { or: [2,3] }] }`
*/
export type FacetValueFilterInput = {
and?: Maybe<Scalars['ID']>
or?: Maybe<Array<Scalars['ID']>>
}
export type SearchInput = {
term?: Maybe<Scalars['String']>
facetValueIds?: Maybe<Array<Scalars['ID']>>
facetValueOperator?: Maybe<LogicalOperator>
facetValueFilters?: Maybe<Array<FacetValueFilterInput>>
collectionId?: Maybe<Scalars['ID']>
collectionSlug?: Maybe<Scalars['String']>
groupByProduct?: Maybe<Scalars['Boolean']>
@ -802,6 +938,7 @@ export type ShippingMethodQuote = {
id: Scalars['ID']
price: Scalars['Int']
priceWithTax: Scalars['Int']
code: Scalars['String']
name: Scalars['String']
description: Scalars['String']
/** Any optional metadata returned by the ShippingCalculator in the ShippingCalculationResult */
@ -812,6 +949,8 @@ export type PaymentMethodQuote = {
__typename?: 'PaymentMethodQuote'
id: Scalars['ID']
code: Scalars['String']
name: Scalars['String']
description: Scalars['String']
isEligible: Scalars['Boolean']
eligibilityMessage?: Maybe<Scalars['String']>
}
@ -1307,6 +1446,13 @@ export type CustomerGroupCustomersArgs = {
options?: Maybe<CustomerListOptions>
}
export type CustomerListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<CustomerSortParameter>
filter?: Maybe<CustomerFilterParameter>
}
export type Customer = Node & {
__typename?: 'Customer'
id: Scalars['ID']
@ -1425,6 +1571,13 @@ export type HistoryEntryList = PaginatedList & {
totalItems: Scalars['Int']
}
export type HistoryEntryListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<HistoryEntrySortParameter>
filter?: Maybe<HistoryEntryFilterParameter>
}
/**
* @description
* Languages in the form of a ISO 639-1 language code with optional
@ -1777,12 +1930,7 @@ export type Order = Node & {
* methods.
*/
surcharges: Array<Surcharge>
/**
* Order-level adjustments to the order total, such as discounts from promotions
* @deprecated Use `discounts` instead
*/
adjustments: Array<Adjustment>
discounts: Array<Adjustment>
discounts: Array<Discount>
/** An array of all coupon codes applied to the Order */
couponCodes: Array<Scalars['String']>
/** Promotions applied to the order. Only gets populated after the payment process has completed. */
@ -1861,7 +2009,16 @@ export type ShippingLine = {
priceWithTax: Scalars['Int']
discountedPrice: Scalars['Int']
discountedPriceWithTax: Scalars['Int']
discounts: Array<Adjustment>
discounts: Array<Discount>
}
export type Discount = {
__typename?: 'Discount'
adjustmentSource: Scalars['String']
type: AdjustmentType
description: Scalars['String']
amount: Scalars['Int']
amountWithTax: Scalars['Int']
}
export type OrderItem = Node & {
@ -1894,8 +2051,6 @@ export type OrderItem = Node & {
/** The proratedUnitPrice including tax */
proratedUnitPriceWithTax: Scalars['Int']
unitTax: Scalars['Int']
/** @deprecated `unitPrice` is now always without tax */
unitPriceIncludesTax: Scalars['Boolean']
taxRate: Scalars['Float']
adjustments: Array<Adjustment>
taxLines: Array<TaxLine>
@ -1939,8 +2094,6 @@ export type OrderLine = Node & {
proratedUnitPriceWithTax: Scalars['Int']
quantity: Scalars['Int']
items: Array<OrderItem>
/** @deprecated Use `linePriceWithTax` instead */
totalPrice: Scalars['Int']
taxRate: Scalars['Float']
/** The total price of the line excluding tax and discounts. */
linePrice: Scalars['Int']
@ -1960,9 +2113,7 @@ export type OrderLine = Node & {
proratedLinePriceWithTax: Scalars['Int']
/** The total tax on this line */
lineTax: Scalars['Int']
/** @deprecated Use `discounts` instead */
adjustments: Array<Adjustment>
discounts: Array<Adjustment>
discounts: Array<Discount>
taxLines: Array<TaxLine>
order: Order
customFields?: Maybe<Scalars['JSON']>
@ -2105,13 +2256,9 @@ export type SearchResult = {
slug: Scalars['String']
productId: Scalars['ID']
productName: Scalars['String']
/** @deprecated Use `productAsset.preview` instead */
productPreview: Scalars['String']
productAsset?: Maybe<SearchResultAsset>
productVariantId: Scalars['ID']
productVariantName: Scalars['String']
/** @deprecated Use `productVariantAsset.preview` instead */
productVariantPreview: Scalars['String']
productVariantAsset?: Maybe<SearchResultAsset>
price: SearchResultPrice
priceWithTax: SearchResultPrice
@ -2191,8 +2338,6 @@ export type ProductVariant = Node & {
assets: Array<Asset>
price: Scalars['Int']
currencyCode: CurrencyCode
/** @deprecated price now always excludes tax */
priceIncludesTax: Scalars['Boolean']
priceWithTax: Scalars['Int']
stockLevel: Scalars['String']
taxRateApplied: TaxRate
@ -2200,7 +2345,7 @@ export type ProductVariant = Node & {
options: Array<ProductOption>
facetValues: Array<FacetValue>
translations: Array<ProductVariantTranslation>
customFields?: Maybe<Scalars['JSON']>
customFields?: Maybe<ProductVariantCustomFields>
}
export type ProductVariantTranslation = {
@ -2524,6 +2669,10 @@ export type NoActiveOrderError = ErrorResult & {
message: Scalars['String']
}
export type AuthenticationInput = {
native?: Maybe<NativeAuthInput>
}
export type RegisterCustomerInput = {
emailAddress: Scalars['String']
title?: Maybe<Scalars['String']>
@ -2541,6 +2690,10 @@ export type UpdateCustomerInput = {
customFields?: Maybe<Scalars['JSON']>
}
export type UpdateOrderInput = {
customFields?: Maybe<Scalars['JSON']>
}
/** Passed as input to the `addPaymentToOrder` mutation. */
export type PaymentInput = {
/** This field should correspond to the `code` property of a PaymentMethodHandler. */
@ -2553,6 +2706,27 @@ export type PaymentInput = {
metadata: Scalars['JSON']
}
export type CollectionListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<CollectionSortParameter>
filter?: Maybe<CollectionFilterParameter>
}
export type OrderListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<OrderSortParameter>
filter?: Maybe<OrderFilterParameter>
}
export type ProductListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<ProductSortParameter>
filter?: Maybe<ProductFilterParameter>
}
export type UpdateOrderItemsResult =
| Order
| OrderModificationError
@ -2646,48 +2820,6 @@ export type AuthenticationResult =
export type ActiveOrderResult = Order | NoActiveOrderError
export type CollectionListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<CollectionSortParameter>
filter?: Maybe<CollectionFilterParameter>
}
export type ProductListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<ProductSortParameter>
filter?: Maybe<ProductFilterParameter>
}
export type ProductVariantListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<ProductVariantSortParameter>
filter?: Maybe<ProductVariantFilterParameter>
}
export type CustomerListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<CustomerSortParameter>
filter?: Maybe<CustomerFilterParameter>
}
export type OrderListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<OrderSortParameter>
filter?: Maybe<OrderFilterParameter>
}
export type HistoryEntryListOptions = {
skip?: Maybe<Scalars['Int']>
take?: Maybe<Scalars['Int']>
sort?: Maybe<HistoryEntrySortParameter>
filter?: Maybe<HistoryEntryFilterParameter>
}
export type CollectionFilterParameter = {
createdAt?: Maybe<DateOperators>
updatedAt?: Maybe<DateOperators>
@ -2734,9 +2866,9 @@ export type ProductVariantFilterParameter = {
name?: Maybe<StringOperators>
price?: Maybe<NumberOperators>
currencyCode?: Maybe<StringOperators>
priceIncludesTax?: Maybe<BooleanOperators>
priceWithTax?: Maybe<NumberOperators>
stockLevel?: Maybe<StringOperators>
discountPrice?: Maybe<NumberOperators>
}
export type ProductVariantSortParameter = {
@ -2749,6 +2881,7 @@ export type ProductVariantSortParameter = {
price?: Maybe<SortOrder>
priceWithTax?: Maybe<SortOrder>
stockLevel?: Maybe<SortOrder>
discountPrice?: Maybe<SortOrder>
}
export type CustomerFilterParameter = {
@ -2817,12 +2950,9 @@ export type HistoryEntrySortParameter = {
updatedAt?: Maybe<SortOrder>
}
export type UpdateOrderInput = {
customFields?: Maybe<Scalars['JSON']>
}
export type AuthenticationInput = {
native?: Maybe<NativeAuthInput>
export type ProductVariantCustomFields = {
__typename?: 'ProductVariantCustomFields'
discountPrice?: Maybe<Scalars['Int']>
}
export type NativeAuthInput = {
@ -2846,14 +2976,19 @@ export type CartFragment = { __typename?: 'Order' } & Pick<
lines: Array<
{ __typename?: 'OrderLine' } & Pick<
OrderLine,
'id' | 'quantity' | 'linePriceWithTax' | 'discountedLinePriceWithTax'
| 'id'
| 'quantity'
| 'linePriceWithTax'
| 'discountedLinePriceWithTax'
| 'unitPriceWithTax'
| 'discountedUnitPriceWithTax'
> & {
featuredAsset?: Maybe<
{ __typename?: 'Asset' } & Pick<Asset, 'id' | 'preview'>
>
discounts: Array<
{ __typename?: 'Adjustment' } & Pick<
Adjustment,
{ __typename?: 'Discount' } & Pick<
Discount,
'description' | 'amount'
>
>
@ -2886,51 +3021,6 @@ export type SearchResultFragment = { __typename?: 'SearchResult' } & Pick<
| ({ __typename?: 'SinglePrice' } & Pick<SinglePrice, 'value'>)
}
export type LoginMutationVariables = Exact<{
username: Scalars['String']
password: Scalars['String']
}>
export type LoginMutation = { __typename?: 'Mutation' } & {
login:
| ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
| ({ __typename: 'InvalidCredentialsError' } & Pick<
InvalidCredentialsError,
'errorCode' | 'message'
>)
| ({ __typename: 'NotVerifiedError' } & Pick<
NotVerifiedError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
}
export type LogoutMutationVariables = Exact<{ [key: string]: never }>
export type LogoutMutation = { __typename?: 'Mutation' } & {
logout: { __typename?: 'Success' } & Pick<Success, 'success'>
}
export type SignupMutationVariables = Exact<{
input: RegisterCustomerInput
}>
export type SignupMutation = { __typename?: 'Mutation' } & {
registerCustomerAccount:
| ({ __typename: 'Success' } & Pick<Success, 'success'>)
| ({ __typename: 'MissingPasswordError' } & Pick<
MissingPasswordError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
}
export type AddItemToOrderMutationVariables = Exact<{
variantId: Scalars['ID']
quantity: Scalars['Int']
@ -2957,25 +3047,6 @@ export type AddItemToOrderMutation = { __typename?: 'Mutation' } & {
>)
}
export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }>
export type ActiveOrderQuery = { __typename?: 'Query' } & {
activeOrder?: Maybe<{ __typename?: 'Order' } & CartFragment>
}
export type RemoveOrderLineMutationVariables = Exact<{
orderLineId: Scalars['ID']
}>
export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & {
removeOrderLine:
| ({ __typename: 'Order' } & CartFragment)
| ({ __typename: 'OrderModificationError' } & Pick<
OrderModificationError,
'errorCode' | 'message'
>)
}
export type AdjustOrderLineMutationVariables = Exact<{
orderLineId: Scalars['ID']
quantity: Scalars['Int']
@ -3002,26 +3073,62 @@ export type AdjustOrderLineMutation = { __typename?: 'Mutation' } & {
>)
}
export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }>
export type LoginMutationVariables = Exact<{
username: Scalars['String']
password: Scalars['String']
}>
export type GetCollectionsQuery = { __typename?: 'Query' } & {
collections: { __typename?: 'CollectionList' } & {
items: Array<
{ __typename?: 'Collection' } & Pick<
Collection,
'id' | 'name' | 'description' | 'slug'
> & {
productVariants: { __typename?: 'ProductVariantList' } & Pick<
ProductVariantList,
'totalItems'
>
parent?: Maybe<{ __typename?: 'Collection' } & Pick<Collection, 'id'>>
children?: Maybe<
Array<{ __typename?: 'Collection' } & Pick<Collection, 'id'>>
>
}
>
}
export type LoginMutation = { __typename?: 'Mutation' } & {
login:
| ({ __typename: 'CurrentUser' } & Pick<CurrentUser, 'id'>)
| ({ __typename: 'InvalidCredentialsError' } & Pick<
InvalidCredentialsError,
'errorCode' | 'message'
>)
| ({ __typename: 'NotVerifiedError' } & Pick<
NotVerifiedError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
}
export type LogoutMutationVariables = Exact<{ [key: string]: never }>
export type LogoutMutation = { __typename?: 'Mutation' } & {
logout: { __typename?: 'Success' } & Pick<Success, 'success'>
}
export type RemoveOrderLineMutationVariables = Exact<{
orderLineId: Scalars['ID']
}>
export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & {
removeOrderLine:
| ({ __typename: 'Order' } & CartFragment)
| ({ __typename: 'OrderModificationError' } & Pick<
OrderModificationError,
'errorCode' | 'message'
>)
}
export type SignupMutationVariables = Exact<{
input: RegisterCustomerInput
}>
export type SignupMutation = { __typename?: 'Mutation' } & {
registerCustomerAccount:
| ({ __typename: 'Success' } & Pick<Success, 'success'>)
| ({ __typename: 'MissingPasswordError' } & Pick<
MissingPasswordError,
'errorCode' | 'message'
>)
| ({ __typename: 'NativeAuthStrategyError' } & Pick<
NativeAuthStrategyError,
'errorCode' | 'message'
>)
}
export type ActiveCustomerQueryVariables = Exact<{ [key: string]: never }>
@ -3055,6 +3162,34 @@ export type GetAllProductsQuery = { __typename?: 'Query' } & {
}
}
export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }>
export type ActiveOrderQuery = { __typename?: 'Query' } & {
activeOrder?: Maybe<{ __typename?: 'Order' } & CartFragment>
}
export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }>
export type GetCollectionsQuery = { __typename?: 'Query' } & {
collections: { __typename?: 'CollectionList' } & {
items: Array<
{ __typename?: 'Collection' } & Pick<
Collection,
'id' | 'name' | 'description' | 'slug'
> & {
productVariants: { __typename?: 'ProductVariantList' } & Pick<
ProductVariantList,
'totalItems'
>
parent?: Maybe<{ __typename?: 'Collection' } & Pick<Collection, 'id'>>
children?: Maybe<
Array<{ __typename?: 'Collection' } & Pick<Collection, 'id'>>
>
}
>
}
}
export type GetProductQueryVariables = Exact<{
slug: Scalars['String']
}>

View File

@ -386,6 +386,13 @@ type ProductVariantList implements PaginatedList {
totalItems: Int!
}
input ProductVariantListOptions {
skip: Int
take: Int
sort: ProductVariantSortParameter
filter: ProductVariantFilterParameter
}
enum GlobalFlag {
TRUE
FALSE
@ -417,6 +424,8 @@ GraphQL resolvers via the {@link Allow} decorator.
@docsCategory common
"""
enum Permission {
Placeholder
"""
Authenticated means simply that the user is logged in
"""
@ -438,44 +447,49 @@ enum Permission {
Public
"""
Grants permission to create Catalog
Grants permission to update GlobalSettings
"""
UpdateGlobalSettings
"""
Grants permission to create Products, Facets, Assets, Collections
"""
CreateCatalog
"""
Grants permission to read Catalog
Grants permission to read Products, Facets, Assets, Collections
"""
ReadCatalog
"""
Grants permission to update Catalog
Grants permission to update Products, Facets, Assets, Collections
"""
UpdateCatalog
"""
Grants permission to delete Catalog
Grants permission to delete Products, Facets, Assets, Collections
"""
DeleteCatalog
"""
Grants permission to create Customer
Grants permission to create PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings
"""
CreateCustomer
CreateSettings
"""
Grants permission to read Customer
Grants permission to read PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings
"""
ReadCustomer
ReadSettings
"""
Grants permission to update Customer
Grants permission to update PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings
"""
UpdateCustomer
UpdateSettings
"""
Grants permission to delete Customer
Grants permission to delete PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings
"""
DeleteCustomer
DeleteSettings
"""
Grants permission to create Administrator
@ -497,6 +511,146 @@ enum Permission {
"""
DeleteAdministrator
"""
Grants permission to create Asset
"""
CreateAsset
"""
Grants permission to read Asset
"""
ReadAsset
"""
Grants permission to update Asset
"""
UpdateAsset
"""
Grants permission to delete Asset
"""
DeleteAsset
"""
Grants permission to create Channel
"""
CreateChannel
"""
Grants permission to read Channel
"""
ReadChannel
"""
Grants permission to update Channel
"""
UpdateChannel
"""
Grants permission to delete Channel
"""
DeleteChannel
"""
Grants permission to create Collection
"""
CreateCollection
"""
Grants permission to read Collection
"""
ReadCollection
"""
Grants permission to update Collection
"""
UpdateCollection
"""
Grants permission to delete Collection
"""
DeleteCollection
"""
Grants permission to create Country
"""
CreateCountry
"""
Grants permission to read Country
"""
ReadCountry
"""
Grants permission to update Country
"""
UpdateCountry
"""
Grants permission to delete Country
"""
DeleteCountry
"""
Grants permission to create Customer
"""
CreateCustomer
"""
Grants permission to read Customer
"""
ReadCustomer
"""
Grants permission to update Customer
"""
UpdateCustomer
"""
Grants permission to delete Customer
"""
DeleteCustomer
"""
Grants permission to create CustomerGroup
"""
CreateCustomerGroup
"""
Grants permission to read CustomerGroup
"""
ReadCustomerGroup
"""
Grants permission to update CustomerGroup
"""
UpdateCustomerGroup
"""
Grants permission to delete CustomerGroup
"""
DeleteCustomerGroup
"""
Grants permission to create Facet
"""
CreateFacet
"""
Grants permission to read Facet
"""
ReadFacet
"""
Grants permission to update Facet
"""
UpdateFacet
"""
Grants permission to delete Facet
"""
DeleteFacet
"""
Grants permission to create Order
"""
@ -517,6 +671,46 @@ enum Permission {
"""
DeleteOrder
"""
Grants permission to create PaymentMethod
"""
CreatePaymentMethod
"""
Grants permission to read PaymentMethod
"""
ReadPaymentMethod
"""
Grants permission to update PaymentMethod
"""
UpdatePaymentMethod
"""
Grants permission to delete PaymentMethod
"""
DeletePaymentMethod
"""
Grants permission to create Product
"""
CreateProduct
"""
Grants permission to read Product
"""
ReadProduct
"""
Grants permission to update Product
"""
UpdateProduct
"""
Grants permission to delete Product
"""
DeleteProduct
"""
Grants permission to create Promotion
"""
@ -538,24 +732,124 @@ enum Permission {
DeletePromotion
"""
Grants permission to create Settings
Grants permission to create ShippingMethod
"""
CreateSettings
CreateShippingMethod
"""
Grants permission to read Settings
Grants permission to read ShippingMethod
"""
ReadSettings
ReadShippingMethod
"""
Grants permission to update Settings
Grants permission to update ShippingMethod
"""
UpdateSettings
UpdateShippingMethod
"""
Grants permission to delete Settings
Grants permission to delete ShippingMethod
"""
DeleteSettings
DeleteShippingMethod
"""
Grants permission to create Tag
"""
CreateTag
"""
Grants permission to read Tag
"""
ReadTag
"""
Grants permission to update Tag
"""
UpdateTag
"""
Grants permission to delete Tag
"""
DeleteTag
"""
Grants permission to create TaxCategory
"""
CreateTaxCategory
"""
Grants permission to read TaxCategory
"""
ReadTaxCategory
"""
Grants permission to update TaxCategory
"""
UpdateTaxCategory
"""
Grants permission to delete TaxCategory
"""
DeleteTaxCategory
"""
Grants permission to create TaxRate
"""
CreateTaxRate
"""
Grants permission to read TaxRate
"""
ReadTaxRate
"""
Grants permission to update TaxRate
"""
UpdateTaxRate
"""
Grants permission to delete TaxRate
"""
DeleteTaxRate
"""
Grants permission to create System
"""
CreateSystem
"""
Grants permission to read System
"""
ReadSystem
"""
Grants permission to update System
"""
UpdateSystem
"""
Grants permission to delete System
"""
DeleteSystem
"""
Grants permission to create Zone
"""
CreateZone
"""
Grants permission to read Zone
"""
ReadZone
"""
Grants permission to update Zone
"""
UpdateZone
"""
Grants permission to delete Zone
"""
DeleteZone
}
enum SortOrder {
@ -789,10 +1083,24 @@ input DateOperators {
between: DateRange
}
"""
Used to construct boolean expressions for filtering search results
by FacetValue ID. Examples:
* ID=1 OR ID=2: `{ facetValueFilters: [{ or: [1,2] }] }`
* ID=1 AND ID=2: `{ facetValueFilters: [{ and: 1 }, { and: 2 }] }`
* ID=1 AND (ID=2 OR ID=3): `{ facetValueFilters: [{ and: 1 }, { or: [2,3] }] }`
"""
input FacetValueFilterInput {
and: ID
or: [ID!]
}
input SearchInput {
term: String
facetValueIds: [ID!]
facetValueOperator: LogicalOperator
facetValueFilters: [FacetValueFilterInput!]
collectionId: ID
collectionSlug: String
groupByProduct: Boolean
@ -857,6 +1165,7 @@ type ShippingMethodQuote {
id: ID!
price: Int!
priceWithTax: Int!
code: String!
name: String!
description: String!
@ -869,6 +1178,8 @@ type ShippingMethodQuote {
type PaymentMethodQuote {
id: ID!
code: String!
name: String!
description: String!
isEligible: Boolean!
eligibilityMessage: String
}
@ -1817,6 +2128,13 @@ type CustomerGroup implements Node {
customers(options: CustomerListOptions): CustomerList!
}
input CustomerListOptions {
skip: Int
take: Int
sort: CustomerSortParameter
filter: CustomerFilterParameter
}
type Customer implements Node {
id: ID!
createdAt: DateTime!
@ -1922,6 +2240,13 @@ type HistoryEntryList implements PaginatedList {
totalItems: Int!
}
input HistoryEntryListOptions {
skip: Int
take: Int
sort: HistoryEntrySortParameter
filter: HistoryEntryFilterParameter
}
"""
@description
Languages in the form of a ISO 639-1 language code with optional
@ -2751,12 +3076,7 @@ type Order implements Node {
methods.
"""
surcharges: [Surcharge!]!
"""
Order-level adjustments to the order total, such as discounts from promotions
"""
adjustments: [Adjustment!]! @deprecated(reason: "Use `discounts` instead")
discounts: [Adjustment!]!
discounts: [Discount!]!
"""
An array of all coupon codes applied to the Order
@ -2857,7 +3177,15 @@ type ShippingLine {
priceWithTax: Int!
discountedPrice: Int!
discountedPriceWithTax: Int!
discounts: [Adjustment!]!
discounts: [Discount!]!
}
type Discount {
adjustmentSource: String!
type: AdjustmentType!
description: String!
amount: Int!
amountWithTax: Int!
}
type OrderItem implements Node {
@ -2903,8 +3231,6 @@ type OrderItem implements Node {
"""
proratedUnitPriceWithTax: Int!
unitTax: Int!
unitPriceIncludesTax: Boolean!
@deprecated(reason: "`unitPrice` is now always without tax")
taxRate: Float!
adjustments: [Adjustment!]!
taxLines: [TaxLine!]!
@ -2967,7 +3293,6 @@ type OrderLine implements Node {
proratedUnitPriceWithTax: Int!
quantity: Int!
items: [OrderItem!]!
totalPrice: Int! @deprecated(reason: "Use `linePriceWithTax` instead")
taxRate: Float!
"""
@ -3006,8 +3331,7 @@ type OrderLine implements Node {
The total tax on this line
"""
lineTax: Int!
adjustments: [Adjustment!]! @deprecated(reason: "Use `discounts` instead")
discounts: [Adjustment!]!
discounts: [Discount!]!
taxLines: [TaxLine!]!
order: Order!
customFields: JSON
@ -3137,13 +3461,9 @@ type SearchResult {
slug: String!
productId: ID!
productName: String!
productPreview: String!
@deprecated(reason: "Use `productAsset.preview` instead")
productAsset: SearchResultAsset
productVariantId: ID!
productVariantName: String!
productVariantPreview: String!
@deprecated(reason: "Use `productVariantAsset.preview` instead")
productVariantAsset: SearchResultAsset
price: SearchResultPrice!
priceWithTax: SearchResultPrice!
@ -3229,8 +3549,6 @@ type ProductVariant implements Node {
assets: [Asset!]!
price: Int!
currencyCode: CurrencyCode!
priceIncludesTax: Boolean!
@deprecated(reason: "price now always excludes tax")
priceWithTax: Int!
stockLevel: String!
taxRateApplied: TaxRate!
@ -3238,7 +3556,7 @@ type ProductVariant implements Node {
options: [ProductOption!]!
facetValues: [FacetValue!]!
translations: [ProductVariantTranslation!]!
customFields: JSON
customFields: ProductVariantCustomFields
}
type ProductVariantTranslation {
@ -3550,6 +3868,10 @@ type NoActiveOrderError implements ErrorResult {
message: String!
}
input AuthenticationInput {
native: NativeAuthInput
}
input RegisterCustomerInput {
emailAddress: String!
title: String
@ -3567,6 +3889,10 @@ input UpdateCustomerInput {
customFields: JSON
}
input UpdateOrderInput {
customFields: JSON
}
"""
Passed as input to the `addPaymentToOrder` mutation.
"""
@ -3584,6 +3910,27 @@ input PaymentInput {
metadata: JSON!
}
input CollectionListOptions {
skip: Int
take: Int
sort: CollectionSortParameter
filter: CollectionFilterParameter
}
input OrderListOptions {
skip: Int
take: Int
sort: OrderSortParameter
filter: OrderFilterParameter
}
input ProductListOptions {
skip: Int
take: Int
sort: ProductSortParameter
filter: ProductFilterParameter
}
union UpdateOrderItemsResult =
Order
| OrderModificationError
@ -3675,48 +4022,6 @@ union AuthenticationResult =
union ActiveOrderResult = Order | NoActiveOrderError
input CollectionListOptions {
skip: Int
take: Int
sort: CollectionSortParameter
filter: CollectionFilterParameter
}
input ProductListOptions {
skip: Int
take: Int
sort: ProductSortParameter
filter: ProductFilterParameter
}
input ProductVariantListOptions {
skip: Int
take: Int
sort: ProductVariantSortParameter
filter: ProductVariantFilterParameter
}
input CustomerListOptions {
skip: Int
take: Int
sort: CustomerSortParameter
filter: CustomerFilterParameter
}
input OrderListOptions {
skip: Int
take: Int
sort: OrderSortParameter
filter: OrderFilterParameter
}
input HistoryEntryListOptions {
skip: Int
take: Int
sort: HistoryEntrySortParameter
filter: HistoryEntryFilterParameter
}
input CollectionFilterParameter {
createdAt: DateOperators
updatedAt: DateOperators
@ -3763,9 +4068,9 @@ input ProductVariantFilterParameter {
name: StringOperators
price: NumberOperators
currencyCode: StringOperators
priceIncludesTax: BooleanOperators
priceWithTax: NumberOperators
stockLevel: StringOperators
discountPrice: NumberOperators
}
input ProductVariantSortParameter {
@ -3778,6 +4083,7 @@ input ProductVariantSortParameter {
price: SortOrder
priceWithTax: SortOrder
stockLevel: SortOrder
discountPrice: SortOrder
}
input CustomerFilterParameter {
@ -3846,12 +4152,8 @@ input HistoryEntrySortParameter {
updatedAt: SortOrder
}
input UpdateOrderInput {
customFields: JSON
}
input AuthenticationInput {
native: NativeAuthInput
type ProductVariantCustomFields {
discountPrice: Int
}
input NativeAuthInput {

View File

@ -1,5 +0,0 @@
import * as Core from '@commerce/types'
export interface LineItem extends Core.LineItem {
options?: any[]
}

View File

@ -0,0 +1 @@
export * from '@commerce/types/cart'

View File

@ -0,0 +1 @@
export * from '@commerce/types/checkout'

View File

@ -0,0 +1 @@
export * from '@commerce/types/common'

View File

@ -0,0 +1 @@
export * from '@commerce/types/customer'

View File

@ -0,0 +1,25 @@
import * as Cart from './cart'
import * as Checkout from './checkout'
import * as Common from './common'
import * as Customer from './customer'
import * as Login from './login'
import * as Logout from './logout'
import * as Page from './page'
import * as Product from './product'
import * as Signup from './signup'
import * as Site from './site'
import * as Wishlist from './wishlist'
export type {
Cart,
Checkout,
Common,
Customer,
Login,
Logout,
Page,
Product,
Signup,
Site,
Wishlist,
}

View File

@ -0,0 +1,12 @@
import * as Core from '@commerce/types/login'
import type { LoginMutationVariables } from '../schema'
import { LoginBody, LoginTypes } from '@commerce/types/login'
export * from '@commerce/types/login'
export type LoginHook<T extends LoginTypes = LoginTypes> = {
data: null
actionInput: LoginBody
fetcherInput: LoginBody
body: T['body']
}

View File

@ -0,0 +1 @@
export * from '@commerce/types/logout'

View File

@ -0,0 +1 @@
export * from '@commerce/types/page'

View File

@ -0,0 +1 @@
export * from '@commerce/types/product'

View File

@ -0,0 +1 @@
export * from '@commerce/types/signup'

View File

@ -0,0 +1 @@
export * from '@commerce/types/site'

View File

@ -0,0 +1 @@
export * from '@commerce/types/wishlist'

View File

@ -17,6 +17,8 @@ export const cartFragment = /* GraphQL */ `
quantity
linePriceWithTax
discountedLinePriceWithTax
unitPriceWithTax
discountedUnitPriceWithTax
featuredAsset {
id
preview

View File

@ -1,4 +1,5 @@
import { Cart, Product } from '@commerce/types'
import { Product } from '@commerce/types/product'
import { Cart } from '@commerce/types/cart'
import { CartFragment, SearchResultFragment } from '../schema'
export function normalizeSearchResult(item: SearchResultFragment): Product {
@ -43,8 +44,8 @@ export function normalizeCart(order: CartFragment): Cart {
id: l.productVariant.id,
name: l.productVariant.name,
sku: l.productVariant.sku,
price: l.discountedLinePriceWithTax / 100,
listPrice: l.linePriceWithTax / 100,
price: l.discountedUnitPriceWithTax / 100,
listPrice: l.unitPriceWithTax / 100,
image: {
url: l.featuredAsset?.preview + '?preset=thumb' || '',
},

View File

@ -1,5 +1,5 @@
// TODO: replace this hook and other wishlist hooks with a handler, or remove them if
// Shopify doesn't have a wishlist
// Vendure doesn't have a built-in wishlist
import { HookFetcher } from '@commerce/utils/types'
import { Product } from '../schema'