From 17788b1eb0f5bf03b255e3e6582654fc4103b746 Mon Sep 17 00:00:00 2001 From: Catalin Pinte <1243434+cond0r@users.noreply.github.com> Date: Wed, 28 Sep 2022 15:40:22 +0300 Subject: [PATCH] Add dynamic API endpoints --- .../src/api/endpoints/cart/add-item.ts | 8 +- .../src/api/endpoints/cart/index.ts | 1 + .../src/api/endpoints/cart/remove-item.ts | 10 +- .../src/api/endpoints/cart/update-item.ts | 9 +- .../src/api/endpoints/customer/address.ts | 1 - .../src/api/endpoints/customer/card.ts | 1 - .../bigcommerce/src/api/endpoints/index.ts | 27 ++++++ packages/bigcommerce/src/auth/use-login.tsx | 2 +- packages/bigcommerce/src/auth/use-logout.tsx | 2 +- packages/bigcommerce/src/auth/use-signup.tsx | 2 +- .../bigcommerce/src/cart/use-add-item.tsx | 2 +- packages/bigcommerce/src/cart/use-cart.tsx | 2 +- .../bigcommerce/src/cart/use-remove-item.tsx | 12 ++- .../bigcommerce/src/cart/use-update-item.tsx | 6 +- .../bigcommerce/src/customer/use-customer.tsx | 2 +- .../bigcommerce/src/product/use-search.tsx | 2 +- .../bigcommerce/src/wishlist/use-add-item.tsx | 2 +- .../src/wishlist/use-remove-item.tsx | 2 +- .../bigcommerce/src/wishlist/use-wishlist.tsx | 2 +- packages/commerce/new-provider.md | 46 ++++----- packages/commerce/src/api/endpoints/cart.ts | 94 +++++++++---------- .../src/api/endpoints/catalog/products.ts | 33 +++---- .../commerce/src/api/endpoints/checkout.ts | 48 ++++------ .../src/api/endpoints/customer/address.ts | 71 ++++++-------- .../src/api/endpoints/customer/card.ts | 71 ++++++-------- .../src/api/endpoints/customer/index.ts | 32 ++----- packages/commerce/src/api/endpoints/index.ts | 72 ++++++++++++++ packages/commerce/src/api/endpoints/login.ts | 40 +++----- packages/commerce/src/api/endpoints/logout.ts | 41 +++----- packages/commerce/src/api/endpoints/signup.ts | 43 +++------ .../commerce/src/api/endpoints/wishlist.ts | 67 +++++-------- packages/commerce/src/api/utils/errors.ts | 51 ++++++++++ ...owed-operation.ts => validate-handlers.ts} | 10 +- packages/commerce/src/schemas/cart.ts | 27 ++++++ packages/commerce/src/schemas/page.ts | 18 ++++ packages/commerce/src/schemas/product.ts | 60 ++++++++++++ packages/commerce/src/schemas/site.ts | 18 ++++ packages/commerce/src/types/cart.ts | 4 +- .../src/api/endpoints/cart/index.ts | 1 - .../src/api/endpoints/catalog/index.ts | 1 - .../api/endpoints/catalog/products/index.ts | 1 - .../api/endpoints/customer/address/index.ts | 1 - .../src/api/endpoints/customer/card/index.ts | 1 - .../src/api/endpoints/customer/index.ts | 1 - .../commercejs/src/api/endpoints/index.ts | 16 ++++ .../src/api/endpoints/logout/index.ts | 1 - .../src/api/endpoints/signup/index.ts | 1 - .../src/api/endpoints/wishlist/index.tsx | 1 - .../src/checkout/use-submit-checkout.tsx | 2 +- .../src/api/endpoints/checkout/index.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../src/api/endpoints/customer/card.ts | 1 - .../kibocommerce/src/api/endpoints/index.ts | 26 +++++ packages/kibocommerce/src/auth/use-login.tsx | 2 +- packages/kibocommerce/src/auth/use-logout.tsx | 2 +- packages/kibocommerce/src/auth/use-signup.tsx | 2 +- .../kibocommerce/src/cart/use-add-item.tsx | 26 ++--- packages/kibocommerce/src/cart/use-cart.tsx | 36 +++---- .../kibocommerce/src/cart/use-remove-item.tsx | 50 +++++----- .../kibocommerce/src/cart/use-update-item.tsx | 70 +++++++------- .../src/customer/use-customer.tsx | 2 +- .../kibocommerce/src/product/use-search.tsx | 26 ++--- .../src/wishlist/use-add-item.tsx | 2 +- .../src/wishlist/use-remove-item.tsx | 2 +- .../src/wishlist/use-wishlist.tsx | 60 ++++++------ .../local/src/api/endpoints/cart/index.ts | 1 - .../local/src/api/endpoints/catalog/index.ts | 1 - .../src/api/endpoints/catalog/products.ts | 1 - .../local/src/api/endpoints/checkout/index.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../local/src/api/endpoints/customer/card.ts | 1 - .../local/src/api/endpoints/customer/index.ts | 1 - .../local/src/api/endpoints/login/index.ts | 1 - .../local/src/api/endpoints/logout/index.ts | 1 - .../local/src/api/endpoints/signup/index.ts | 1 - .../src/api/endpoints/wishlist/index.tsx | 1 - .../src/api/endpoints/cart/add-item.ts | 10 +- .../src/api/endpoints/cart/index.ts | 5 +- .../src/api/endpoints/customer/index.ts | 1 - .../ordercloud/src/api/endpoints/index.ts | 22 +++++ .../src/api/endpoints/login/index.ts | 1 - .../src/api/endpoints/logout/index.ts | 1 - .../src/api/endpoints/signup/index.ts | 1 - .../src/api/endpoints/wishlist/index.tsx | 1 - packages/ordercloud/src/cart/use-add-item.tsx | 2 +- packages/ordercloud/src/cart/use-cart.tsx | 2 +- .../ordercloud/src/cart/use-remove-item.tsx | 12 ++- .../ordercloud/src/cart/use-update-item.tsx | 6 +- .../ordercloud/src/checkout/use-checkout.tsx | 2 +- .../src/checkout/use-submit-checkout.tsx | 2 +- .../src/customer/address/use-add-item.tsx | 6 +- .../src/customer/address/use-addresses.tsx | 2 +- .../src/customer/address/use-remove-item.tsx | 7 +- .../src/customer/address/use-update-item.tsx | 7 +- .../src/customer/card/use-add-item.tsx | 6 +- .../src/customer/card/use-cards.tsx | 2 +- .../src/customer/card/use-remove-item.tsx | 2 +- .../src/customer/card/use-update-item.tsx | 2 +- .../ordercloud/src/product/use-search.tsx | 2 +- packages/saleor/src/api/endpoints/cart.ts | 1 - .../src/api/endpoints/catalog/products.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../saleor/src/api/endpoints/customer/card.ts | 1 - .../src/api/endpoints/customer/index.ts | 1 - packages/saleor/src/api/endpoints/index.ts | 14 +++ packages/saleor/src/api/endpoints/login.ts | 1 - packages/saleor/src/api/endpoints/logout.ts | 1 - packages/saleor/src/api/endpoints/signup.ts | 1 - packages/saleor/src/api/endpoints/wishlist.ts | 1 - packages/saleor/src/fetcher.ts | 7 +- packages/sfcc/src/api/endpoints/cart/index.ts | 1 - .../sfcc/src/api/endpoints/checkout/index.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../sfcc/src/api/endpoints/customer/card.ts | 1 - .../sfcc/src/api/endpoints/customer/index.ts | 1 - packages/sfcc/src/api/endpoints/index.ts | 14 +++ .../sfcc/src/api/endpoints/login/index.ts | 1 - .../sfcc/src/api/endpoints/logout/index.ts | 1 - .../sfcc/src/api/endpoints/signup/index.ts | 1 - .../sfcc/src/api/endpoints/wishlist/index.tsx | 1 - packages/sfcc/src/product/use-search.tsx | 2 +- packages/shopify/src/api/endpoints/cart.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../src/api/endpoints/customer/card.ts | 1 - .../src/api/endpoints/customer/index.ts | 1 - packages/shopify/src/api/endpoints/index.ts | 12 +++ packages/shopify/src/api/endpoints/login.ts | 1 - packages/shopify/src/api/endpoints/logout.ts | 1 - packages/shopify/src/api/endpoints/signup.ts | 1 - .../shopify/src/api/endpoints/wishlist.ts | 1 - .../spree/src/api/endpoints/cart/index.ts | 1 - .../spree/src/api/endpoints/catalog/index.ts | 1 - .../src/api/endpoints/catalog/products.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../spree/src/api/endpoints/customer/card.ts | 1 - .../spree/src/api/endpoints/customer/index.ts | 1 - packages/spree/src/api/endpoints/index.ts | 12 +++ .../spree/src/api/endpoints/login/index.ts | 1 - .../spree/src/api/endpoints/logout/index.ts | 1 - .../spree/src/api/endpoints/signup/index.ts | 1 - .../src/api/endpoints/wishlist/index.tsx | 1 - packages/swell/src/api/endpoints/cart.ts | 1 - .../src/api/endpoints/catalog/products.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../swell/src/api/endpoints/customer/card.ts | 1 - .../swell/src/api/endpoints/customer/index.ts | 1 - packages/swell/src/api/endpoints/index.ts | 12 +++ packages/swell/src/api/endpoints/login.ts | 1 - packages/swell/src/api/endpoints/logout.ts | 1 - packages/swell/src/api/endpoints/signup.ts | 1 - packages/swell/src/api/endpoints/wishlist.ts | 1 - packages/swell/src/api/index.ts | 2 + .../vendure/src/api/endpoints/cart/index.ts | 1 - .../src/api/endpoints/catalog/index.ts | 1 - .../src/api/endpoints/catalog/products.ts | 1 - .../src/api/endpoints/customer/address.ts | 1 - .../src/api/endpoints/customer/card.ts | 1 - .../src/api/endpoints/customer/index.ts | 1 - packages/vendure/src/api/endpoints/index.ts | 12 +++ .../vendure/src/api/endpoints/login/index.ts | 1 - .../vendure/src/api/endpoints/logout/index.ts | 1 - .../vendure/src/api/endpoints/signup/index.ts | 1 - .../src/api/endpoints/wishlist/index.tsx | 1 - packages/vendure/src/api/index.ts | 2 + site/lib/api/commerce.ts | 1 - site/pages/api/cart.ts | 4 - site/pages/api/catalog/products.ts | 4 - site/pages/api/checkout.ts | 4 - site/pages/api/commerce/[[...commerce]].ts | 4 + site/pages/api/customer/address.ts | 4 - site/pages/api/customer/card.ts | 4 - site/pages/api/customer/index.ts | 4 - site/pages/api/login.ts | 4 - site/pages/api/logout.ts | 4 - site/pages/api/signup.ts | 4 - site/pages/api/wishlist.ts | 4 - 176 files changed, 884 insertions(+), 697 deletions(-) delete mode 100644 packages/bigcommerce/src/api/endpoints/customer/address.ts delete mode 100644 packages/bigcommerce/src/api/endpoints/customer/card.ts create mode 100644 packages/bigcommerce/src/api/endpoints/index.ts create mode 100644 packages/commerce/src/api/endpoints/index.ts rename packages/commerce/src/api/utils/{is-allowed-operation.ts => validate-handlers.ts} (65%) create mode 100644 packages/commerce/src/schemas/cart.ts create mode 100644 packages/commerce/src/schemas/page.ts create mode 100644 packages/commerce/src/schemas/product.ts create mode 100644 packages/commerce/src/schemas/site.ts delete mode 100644 packages/commercejs/src/api/endpoints/cart/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/catalog/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/catalog/products/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/customer/address/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/customer/card/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/customer/index.ts create mode 100644 packages/commercejs/src/api/endpoints/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/logout/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/signup/index.ts delete mode 100644 packages/commercejs/src/api/endpoints/wishlist/index.tsx delete mode 100644 packages/kibocommerce/src/api/endpoints/checkout/index.ts delete mode 100644 packages/kibocommerce/src/api/endpoints/customer/address.ts delete mode 100644 packages/kibocommerce/src/api/endpoints/customer/card.ts create mode 100644 packages/kibocommerce/src/api/endpoints/index.ts delete mode 100644 packages/local/src/api/endpoints/cart/index.ts delete mode 100644 packages/local/src/api/endpoints/catalog/index.ts delete mode 100644 packages/local/src/api/endpoints/catalog/products.ts delete mode 100644 packages/local/src/api/endpoints/checkout/index.ts delete mode 100644 packages/local/src/api/endpoints/customer/address.ts delete mode 100644 packages/local/src/api/endpoints/customer/card.ts delete mode 100644 packages/local/src/api/endpoints/customer/index.ts delete mode 100644 packages/local/src/api/endpoints/login/index.ts delete mode 100644 packages/local/src/api/endpoints/logout/index.ts delete mode 100644 packages/local/src/api/endpoints/signup/index.ts delete mode 100644 packages/local/src/api/endpoints/wishlist/index.tsx delete mode 100644 packages/ordercloud/src/api/endpoints/customer/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/index.ts delete mode 100644 packages/ordercloud/src/api/endpoints/login/index.ts delete mode 100644 packages/ordercloud/src/api/endpoints/logout/index.ts delete mode 100644 packages/ordercloud/src/api/endpoints/signup/index.ts delete mode 100644 packages/ordercloud/src/api/endpoints/wishlist/index.tsx delete mode 100644 packages/saleor/src/api/endpoints/cart.ts delete mode 100644 packages/saleor/src/api/endpoints/catalog/products.ts delete mode 100644 packages/saleor/src/api/endpoints/customer/address.ts delete mode 100644 packages/saleor/src/api/endpoints/customer/card.ts delete mode 100644 packages/saleor/src/api/endpoints/customer/index.ts create mode 100644 packages/saleor/src/api/endpoints/index.ts delete mode 100644 packages/saleor/src/api/endpoints/login.ts delete mode 100644 packages/saleor/src/api/endpoints/logout.ts delete mode 100644 packages/saleor/src/api/endpoints/signup.ts delete mode 100644 packages/saleor/src/api/endpoints/wishlist.ts delete mode 100644 packages/sfcc/src/api/endpoints/cart/index.ts delete mode 100644 packages/sfcc/src/api/endpoints/checkout/index.ts delete mode 100644 packages/sfcc/src/api/endpoints/customer/address.ts delete mode 100644 packages/sfcc/src/api/endpoints/customer/card.ts delete mode 100644 packages/sfcc/src/api/endpoints/customer/index.ts create mode 100644 packages/sfcc/src/api/endpoints/index.ts delete mode 100644 packages/sfcc/src/api/endpoints/login/index.ts delete mode 100644 packages/sfcc/src/api/endpoints/logout/index.ts delete mode 100644 packages/sfcc/src/api/endpoints/signup/index.ts delete mode 100644 packages/sfcc/src/api/endpoints/wishlist/index.tsx delete mode 100644 packages/shopify/src/api/endpoints/cart.ts delete mode 100644 packages/shopify/src/api/endpoints/customer/address.ts delete mode 100644 packages/shopify/src/api/endpoints/customer/card.ts delete mode 100644 packages/shopify/src/api/endpoints/customer/index.ts create mode 100644 packages/shopify/src/api/endpoints/index.ts delete mode 100644 packages/shopify/src/api/endpoints/login.ts delete mode 100644 packages/shopify/src/api/endpoints/logout.ts delete mode 100644 packages/shopify/src/api/endpoints/signup.ts delete mode 100644 packages/shopify/src/api/endpoints/wishlist.ts delete mode 100644 packages/spree/src/api/endpoints/cart/index.ts delete mode 100644 packages/spree/src/api/endpoints/catalog/index.ts delete mode 100644 packages/spree/src/api/endpoints/catalog/products.ts delete mode 100644 packages/spree/src/api/endpoints/customer/address.ts delete mode 100644 packages/spree/src/api/endpoints/customer/card.ts delete mode 100644 packages/spree/src/api/endpoints/customer/index.ts create mode 100644 packages/spree/src/api/endpoints/index.ts delete mode 100644 packages/spree/src/api/endpoints/login/index.ts delete mode 100644 packages/spree/src/api/endpoints/logout/index.ts delete mode 100644 packages/spree/src/api/endpoints/signup/index.ts delete mode 100644 packages/spree/src/api/endpoints/wishlist/index.tsx delete mode 100644 packages/swell/src/api/endpoints/cart.ts delete mode 100644 packages/swell/src/api/endpoints/catalog/products.ts delete mode 100644 packages/swell/src/api/endpoints/customer/address.ts delete mode 100644 packages/swell/src/api/endpoints/customer/card.ts delete mode 100644 packages/swell/src/api/endpoints/customer/index.ts create mode 100644 packages/swell/src/api/endpoints/index.ts delete mode 100644 packages/swell/src/api/endpoints/login.ts delete mode 100644 packages/swell/src/api/endpoints/logout.ts delete mode 100644 packages/swell/src/api/endpoints/signup.ts delete mode 100644 packages/swell/src/api/endpoints/wishlist.ts delete mode 100644 packages/vendure/src/api/endpoints/cart/index.ts delete mode 100644 packages/vendure/src/api/endpoints/catalog/index.ts delete mode 100644 packages/vendure/src/api/endpoints/catalog/products.ts delete mode 100644 packages/vendure/src/api/endpoints/customer/address.ts delete mode 100644 packages/vendure/src/api/endpoints/customer/card.ts delete mode 100644 packages/vendure/src/api/endpoints/customer/index.ts create mode 100644 packages/vendure/src/api/endpoints/index.ts delete mode 100644 packages/vendure/src/api/endpoints/login/index.ts delete mode 100644 packages/vendure/src/api/endpoints/logout/index.ts delete mode 100644 packages/vendure/src/api/endpoints/signup/index.ts delete mode 100644 packages/vendure/src/api/endpoints/wishlist/index.tsx delete mode 100644 site/pages/api/cart.ts delete mode 100644 site/pages/api/catalog/products.ts delete mode 100644 site/pages/api/checkout.ts create mode 100644 site/pages/api/commerce/[[...commerce]].ts delete mode 100644 site/pages/api/customer/address.ts delete mode 100644 site/pages/api/customer/card.ts delete mode 100644 site/pages/api/customer/index.ts delete mode 100644 site/pages/api/login.ts delete mode 100644 site/pages/api/logout.ts delete mode 100644 site/pages/api/signup.ts delete mode 100644 site/pages/api/wishlist.ts diff --git a/packages/bigcommerce/src/api/endpoints/cart/add-item.ts b/packages/bigcommerce/src/api/endpoints/cart/add-item.ts index acd656a77..96fe2be62 100644 --- a/packages/bigcommerce/src/api/endpoints/cart/add-item.ts +++ b/packages/bigcommerce/src/api/endpoints/cart/add-item.ts @@ -9,12 +9,6 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({ body: { cartId, item }, config, }) => { - if (!item) { - return res.status(400).json({ - data: null, - errors: [{ message: 'Missing item' }], - }) - } if (!item.quantity) item.quantity = 1 const options = { @@ -41,7 +35,7 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({ 'Set-Cookie', getCartCookie(config.cartCookie, data.id, config.cartCookieMaxAge) ) - res.status(200).json({ data: normalizeCart(data) }) + res.status(200).json({ data: data ? normalizeCart(data) : null }) } export default addItem diff --git a/packages/bigcommerce/src/api/endpoints/cart/index.ts b/packages/bigcommerce/src/api/endpoints/cart/index.ts index 376651178..57830bb9a 100644 --- a/packages/bigcommerce/src/api/endpoints/cart/index.ts +++ b/packages/bigcommerce/src/api/endpoints/cart/index.ts @@ -19,6 +19,7 @@ export const handlers: CartEndpoint['handlers'] = { } const cartApi = createEndpoint({ + /* @ts-ignore */ handler: cartEndpoint, handlers, }) diff --git a/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts b/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts index baf10c80f..2779acd21 100644 --- a/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts +++ b/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts @@ -7,13 +7,6 @@ const removeItem: CartEndpoint['handlers']['removeItem'] = async ({ body: { cartId, itemId }, config, }) => { - if (!cartId || !itemId) { - return res.status(400).json({ - data: null, - errors: [{ message: 'Invalid request' }], - }) - } - const result = await config.storeApiFetch<{ data: any } | null>( `/v3/carts/${cartId}/items/${itemId}?include=line_items.physical_items.options`, { method: 'DELETE' } @@ -28,7 +21,8 @@ const removeItem: CartEndpoint['handlers']['removeItem'] = async ({ : // Remove the cart cookie if the cart was removed (empty items) getCartCookie(config.cartCookie) ) - res.status(200).json({ data: data && normalizeCart(data) }) + + res.status(200).json({ data: data ? normalizeCart(data) : null }) } export default removeItem diff --git a/packages/bigcommerce/src/api/endpoints/cart/update-item.ts b/packages/bigcommerce/src/api/endpoints/cart/update-item.ts index 113553fad..3c6a80079 100644 --- a/packages/bigcommerce/src/api/endpoints/cart/update-item.ts +++ b/packages/bigcommerce/src/api/endpoints/cart/update-item.ts @@ -8,14 +8,7 @@ const updateItem: CartEndpoint['handlers']['updateItem'] = async ({ body: { cartId, itemId, item }, config, }) => { - if (!cartId || !itemId || !item) { - return res.status(400).json({ - data: null, - errors: [{ message: 'Invalid request' }], - }) - } - - const { data } = await config.storeApiFetch( + const { data } = await config.storeApiFetch<{ data?: any }>( `/v3/carts/${cartId}/items/${itemId}?include=line_items.physical_items.options`, { method: 'PUT', diff --git a/packages/bigcommerce/src/api/endpoints/customer/address.ts b/packages/bigcommerce/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/bigcommerce/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/bigcommerce/src/api/endpoints/customer/card.ts b/packages/bigcommerce/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/bigcommerce/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/bigcommerce/src/api/endpoints/index.ts b/packages/bigcommerce/src/api/endpoints/index.ts new file mode 100644 index 000000000..32f142a9b --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/index.ts @@ -0,0 +1,27 @@ +import type { BigcommerceAPI, Provider } from '..' + +import createEndpoints from '@vercel/commerce/api/endpoints' + +import cart from './cart' +import login from './login' +import logout from './logout' +import signup from './signup' +import checkout from './checkout' +import customer from './customer' +import wishlist from './wishlist' +import products from './catalog/products' + +const endpoints = { + cart, + login, + logout, + signup, + checkout, + wishlist, + customer, + 'catalog/products': products, +} + +export default function bigcommerceAPI(commerce: BigcommerceAPI) { + return createEndpoints(commerce, endpoints) +} diff --git a/packages/bigcommerce/src/auth/use-login.tsx b/packages/bigcommerce/src/auth/use-login.tsx index a71f15983..df4a9a41a 100644 --- a/packages/bigcommerce/src/auth/use-login.tsx +++ b/packages/bigcommerce/src/auth/use-login.tsx @@ -9,7 +9,7 @@ export default useLogin as UseLogin export const handler: MutationHook = { fetchOptions: { - url: '/api/login', + url: '/api/commerce/login', method: 'POST', }, async fetcher({ input: { email, password }, options, fetch }) { diff --git a/packages/bigcommerce/src/auth/use-logout.tsx b/packages/bigcommerce/src/auth/use-logout.tsx index bc5c3a4c0..4e0adb9e0 100644 --- a/packages/bigcommerce/src/auth/use-logout.tsx +++ b/packages/bigcommerce/src/auth/use-logout.tsx @@ -8,7 +8,7 @@ export default useLogout as UseLogout export const handler: MutationHook = { fetchOptions: { - url: '/api/logout', + url: '/api/commerce/logout', method: 'GET', }, useHook: diff --git a/packages/bigcommerce/src/auth/use-signup.tsx b/packages/bigcommerce/src/auth/use-signup.tsx index b06126df6..8ad1cfd5a 100644 --- a/packages/bigcommerce/src/auth/use-signup.tsx +++ b/packages/bigcommerce/src/auth/use-signup.tsx @@ -9,7 +9,7 @@ export default useSignup as UseSignup export const handler: MutationHook = { fetchOptions: { - url: '/api/signup', + url: '/api/commerce/signup', method: 'POST', }, async fetcher({ diff --git a/packages/bigcommerce/src/cart/use-add-item.tsx b/packages/bigcommerce/src/cart/use-add-item.tsx index f65e82bc7..11189ffeb 100644 --- a/packages/bigcommerce/src/cart/use-add-item.tsx +++ b/packages/bigcommerce/src/cart/use-add-item.tsx @@ -9,7 +9,7 @@ export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'POST', }, async fetcher({ input: item, options, fetch }) { diff --git a/packages/bigcommerce/src/cart/use-cart.tsx b/packages/bigcommerce/src/cart/use-cart.tsx index f8c4691bf..24c0a0764 100644 --- a/packages/bigcommerce/src/cart/use-cart.tsx +++ b/packages/bigcommerce/src/cart/use-cart.tsx @@ -7,7 +7,7 @@ export default useCart as UseCart export const handler: SWRHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'GET', }, useHook: diff --git a/packages/bigcommerce/src/cart/use-remove-item.tsx b/packages/bigcommerce/src/cart/use-remove-item.tsx index 8bea34f41..74f893ccb 100644 --- a/packages/bigcommerce/src/cart/use-remove-item.tsx +++ b/packages/bigcommerce/src/cart/use-remove-item.tsx @@ -4,8 +4,14 @@ import type { HookFetcherContext, } from '@vercel/commerce/utils/types' import { ValidationError } from '@vercel/commerce/utils/errors' -import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' -import type { Cart, LineItem, RemoveItemHook } from '@vercel/commerce/types/cart' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' +import type { + Cart, + LineItem, + RemoveItemHook, +} from '@vercel/commerce/types/cart' import useCart from './use-cart' export type RemoveItemFn = T extends LineItem @@ -20,7 +26,7 @@ export default useRemoveItem as UseRemoveItem export const handler = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'DELETE', }, async fetcher({ diff --git a/packages/bigcommerce/src/cart/use-update-item.tsx b/packages/bigcommerce/src/cart/use-update-item.tsx index b15690ed7..f5bfbc410 100644 --- a/packages/bigcommerce/src/cart/use-update-item.tsx +++ b/packages/bigcommerce/src/cart/use-update-item.tsx @@ -5,7 +5,9 @@ import type { HookFetcherContext, } from '@vercel/commerce/utils/types' import { ValidationError } from '@vercel/commerce/utils/errors' -import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' import type { LineItem, UpdateItemHook } from '@vercel/commerce/types/cart' import { handler as removeItemHandler } from './use-remove-item' import useCart from './use-cart' @@ -18,7 +20,7 @@ export default useUpdateItem as UseUpdateItem export const handler = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'PUT', }, async fetcher({ diff --git a/packages/bigcommerce/src/customer/use-customer.tsx b/packages/bigcommerce/src/customer/use-customer.tsx index 36bf88617..a11bc13e0 100644 --- a/packages/bigcommerce/src/customer/use-customer.tsx +++ b/packages/bigcommerce/src/customer/use-customer.tsx @@ -6,7 +6,7 @@ export default useCustomer as UseCustomer export const handler: SWRHook = { fetchOptions: { - url: '/api/customer', + url: '/api/commerce/customer', method: 'GET', }, async fetcher({ options, fetch }) { diff --git a/packages/bigcommerce/src/product/use-search.tsx b/packages/bigcommerce/src/product/use-search.tsx index fd918e341..97ed9b3d9 100644 --- a/packages/bigcommerce/src/product/use-search.tsx +++ b/packages/bigcommerce/src/product/use-search.tsx @@ -14,7 +14,7 @@ export type SearchProductsInput = { export const handler: SWRHook = { fetchOptions: { - url: '/api/catalog/products', + url: '/api/commerce/catalog/products', method: 'GET', }, fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { diff --git a/packages/bigcommerce/src/wishlist/use-add-item.tsx b/packages/bigcommerce/src/wishlist/use-add-item.tsx index c9e237b0b..54784478a 100644 --- a/packages/bigcommerce/src/wishlist/use-add-item.tsx +++ b/packages/bigcommerce/src/wishlist/use-add-item.tsx @@ -10,7 +10,7 @@ export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/wishlist', + url: '/api/commerce/wishlist', method: 'POST', }, useHook: diff --git a/packages/bigcommerce/src/wishlist/use-remove-item.tsx b/packages/bigcommerce/src/wishlist/use-remove-item.tsx index 40ca0da04..5a58b5bd8 100644 --- a/packages/bigcommerce/src/wishlist/use-remove-item.tsx +++ b/packages/bigcommerce/src/wishlist/use-remove-item.tsx @@ -12,7 +12,7 @@ export default useRemoveItem as UseRemoveItem export const handler: MutationHook = { fetchOptions: { - url: '/api/wishlist', + url: '/api/commerce/wishlist', method: 'DELETE', }, useHook: diff --git a/packages/bigcommerce/src/wishlist/use-wishlist.tsx b/packages/bigcommerce/src/wishlist/use-wishlist.tsx index 7882233f5..73061ab31 100644 --- a/packages/bigcommerce/src/wishlist/use-wishlist.tsx +++ b/packages/bigcommerce/src/wishlist/use-wishlist.tsx @@ -10,7 +10,7 @@ import type { GetWishlistHook } from '../types/wishlist' export default useWishlist as UseWishlist export const handler: SWRHook = { fetchOptions: { - url: '/api/wishlist', + url: '/api/commerce/wishlist', method: 'GET', }, async fetcher({ input: { customerId, includeProducts }, options, fetch }) { diff --git a/packages/commerce/new-provider.md b/packages/commerce/new-provider.md index c75076175..bd51f1461 100644 --- a/packages/commerce/new-provider.md +++ b/packages/commerce/new-provider.md @@ -69,7 +69,10 @@ Then, open [/site/.env.template](/site/.env.template) and add the provider name Using BigCommerce as an example. The first thing to do is export a `CommerceProvider` component that includes a `provider` object with all the handlers that can be used for hooks: ```tsx -import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' +import { + getCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' import { bigcommerceProvider, BigcommerceProvider } from './provider' export { bigcommerceProvider } @@ -135,7 +138,7 @@ export default useCart as UseCart export const handler: SWRHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'GET', }, useHook: @@ -175,7 +178,7 @@ export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'POST', }, async fetcher({ input: item, options, fetch }) { @@ -213,25 +216,26 @@ export const handler: MutationHook = { ``` ## Showing progress and features + When creating a PR for a new provider, include this list in the PR description and mark the progress as you push so we can organize the code review. Not all points are required (but advised) so make sure to keep the list up to date. **Status** -* [ ] CommerceProvider -* [ ] Schema & TS types -* [ ] API Operations - Get all collections -* [ ] API Operations - Get all pages -* [ ] API Operations - Get all products -* [ ] API Operations - Get page -* [ ] API Operations - Get product -* [ ] API Operations - Get Shop Info (categories and vendors working — `vendors` query still a WIP PR on Reaction) -* [ ] Hook - Add Item -* [ ] Hook - Remove Item -* [ ] Hook - Update Item -* [ ] Hook - Get Cart (account-tied carts working, anonymous carts working, cart reconciliation working) -* [ ] Auth (based on a WIP PR on Reaction - still need to implement refresh tokens) -* [ ] Customer information -* [ ] Product attributes - Size, Colors -* [ ] Custom checkout -* [ ] Typing (in progress) -* [ ] Tests +- [ ] CommerceProvider +- [ ] Schema & TS types +- [ ] API Operations - Get all collections +- [ ] API Operations - Get all pages +- [ ] API Operations - Get all products +- [ ] API Operations - Get page +- [ ] API Operations - Get product +- [ ] API Operations - Get Shop Info (categories and vendors working — `vendors` query still a WIP PR on Reaction) +- [ ] Hook - Add Item +- [ ] Hook - Remove Item +- [ ] Hook - Update Item +- [ ] Hook - Get Cart (account-tied carts working, anonymous carts working, cart reconciliation working) +- [ ] Auth (based on a WIP PR on Reaction - still need to implement refresh tokens) +- [ ] Customer information +- [ ] Product attributes - Size, Colors +- [ ] Custom checkout +- [ ] Typing (in progress) +- [ ] Tests diff --git a/packages/commerce/src/api/endpoints/cart.ts b/packages/commerce/src/api/endpoints/cart.ts index abd5df492..7240d28c9 100644 --- a/packages/commerce/src/api/endpoints/cart.ts +++ b/packages/commerce/src/api/endpoints/cart.ts @@ -1,60 +1,54 @@ -import type { CartSchema } from '../../types/cart' -import { CommerceAPIError } from '../utils/errors' -import isAllowedOperation from '../utils/is-allowed-operation' import type { GetAPISchema } from '..' +import type { CartSchema } from '../../types/cart' -const cartEndpoint: GetAPISchema>['endpoint']['handler'] = - async (ctx) => { - const { req, res, handlers, config } = ctx +import validateHandlers from '../utils/validate-handlers' - if ( - !isAllowedOperation(req, res, { - GET: handlers['getCart'], - POST: handlers['addItem'], - PUT: handlers['updateItem'], - DELETE: handlers['removeItem'], - }) - ) { - return - } +import { + getCartBodySchema, + addItemBodySchema, + updateItemBodySchema, + removeItemBodySchema, +} from '../../schemas/cart' - const { cookies } = req - const cartId = cookies[config.cartCookie] +const cartEndpoint: GetAPISchema< + any, + CartSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers, config } = ctx - try { - // Return current cart info - if (req.method === 'GET') { - const body = { cartId } - return await handlers['getCart']({ ...ctx, body }) - } + validateHandlers(req, res, { + GET: handlers['getCart'], + POST: handlers['addItem'], + PUT: handlers['updateItem'], + DELETE: handlers['removeItem'], + }) - // Create or add an item to the cart - if (req.method === 'POST') { - const body = { ...req.body, cartId } - return await handlers['addItem']({ ...ctx, body }) - } + const { cookies } = req + const cartId = cookies[config.cartCookie] - // Update item in cart - if (req.method === 'PUT') { - const body = { ...req.body, cartId } - return await handlers['updateItem']({ ...ctx, body }) - } - - // Remove an item from the cart - if (req.method === 'DELETE') { - const body = { ...req.body, cartId } - return await handlers['removeItem']({ ...ctx, body }) - } - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } + // Return current cart info + if (req.method === 'GET') { + const body = getCartBodySchema.parse({ cartId }) + return handlers['getCart']({ ...ctx, body }) } + // Create or add an item to the cart + if (req.method === 'POST') { + const body = addItemBodySchema.parse({ ...req.body, cartId }) + return handlers['addItem']({ ...ctx, body }) + } + + // Update item in cart + if (req.method === 'PUT') { + const body = updateItemBodySchema.parse({ ...req.body, cartId }) + return handlers['updateItem']({ ...ctx, body }) + } + + // Remove an item from the cart + if (req.method === 'DELETE') { + const body = removeItemBodySchema.parse({ ...req.body, cartId }) + return handlers['removeItem']({ ...ctx, body }) + } +} + export default cartEndpoint diff --git a/packages/commerce/src/api/endpoints/catalog/products.ts b/packages/commerce/src/api/endpoints/catalog/products.ts index d2a4794be..660b31ccd 100644 --- a/packages/commerce/src/api/endpoints/catalog/products.ts +++ b/packages/commerce/src/api/endpoints/catalog/products.ts @@ -1,31 +1,26 @@ -import type { ProductsSchema } from '../../../types/product' -import { CommerceAPIError } from '../../utils/errors' -import isAllowedOperation from '../../utils/is-allowed-operation' +import { searchProductBodySchema } from '../../../schemas/product' import type { GetAPISchema } from '../..' +import type { ProductsSchema } from '../../../types/product' + +import validateHandlers from '../../utils/validate-handlers' const productsEndpoint: GetAPISchema< any, ProductsSchema ->['endpoint']['handler'] = async (ctx) => { +>['endpoint']['handler'] = (ctx) => { const { req, res, handlers } = ctx - if (!isAllowedOperation(req, res, { GET: handlers['getProducts'] })) { - return - } + validateHandlers(req, res, { GET: handlers['getProducts'] }) - try { - const body = req.query - return await handlers['getProducts']({ ...ctx, body }) - } catch (error) { - console.error(error) + const body = searchProductBodySchema.parse({ + search: req.query.search, + categoryId: req.query.categoryId, + brandId: req.query.brandId, + sort: req.query.sort, + locale: req.query.locale, + }) - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } + return handlers['getProducts']({ ...ctx, body }) } export default productsEndpoint diff --git a/packages/commerce/src/api/endpoints/checkout.ts b/packages/commerce/src/api/endpoints/checkout.ts index 0168e7065..8fb8a71cf 100644 --- a/packages/commerce/src/api/endpoints/checkout.ts +++ b/packages/commerce/src/api/endpoints/checkout.ts @@ -1,48 +1,32 @@ -import type { CheckoutSchema } from '../../types/checkout' import type { GetAPISchema } from '..' +import type { CheckoutSchema } from '../../types/checkout' -import { CommerceAPIError } from '../utils/errors' -import isAllowedOperation from '../utils/is-allowed-operation' +import validateHandlers from '../utils/validate-handlers' const checkoutEndpoint: GetAPISchema< any, CheckoutSchema ->['endpoint']['handler'] = async (ctx) => { +>['endpoint']['handler'] = (ctx) => { const { req, res, handlers, config } = ctx - if ( - !isAllowedOperation(req, res, { - GET: handlers['getCheckout'], - POST: handlers['submitCheckout'], - }) - ) { - return - } + validateHandlers(req, res, { + GET: handlers['getCheckout'], + POST: handlers['submitCheckout'], + }) const { cookies } = req const cartId = cookies[config.cartCookie] - try { - // Create checkout - if (req.method === 'GET') { - const body = { ...req.body, cartId } - return await handlers['getCheckout']({ ...ctx, body }) - } + // Create checkout + if (req.method === 'GET') { + const body = { ...req.body, cartId } + return handlers['getCheckout']({ ...ctx, body }) + } - // Create checkout - if (req.method === 'POST' && handlers['submitCheckout']) { - const body = { ...req.body, cartId } - return await handlers['submitCheckout']({ ...ctx, body }) - } - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) + // Create checkout + if (req.method === 'POST' && handlers['submitCheckout']) { + const body = { ...req.body, cartId } + return handlers['submitCheckout']({ ...ctx, body }) } } diff --git a/packages/commerce/src/api/endpoints/customer/address.ts b/packages/commerce/src/api/endpoints/customer/address.ts index d5ede697a..9cbfeadbc 100644 --- a/packages/commerce/src/api/endpoints/customer/address.ts +++ b/packages/commerce/src/api/endpoints/customer/address.ts @@ -1,64 +1,47 @@ import type { CustomerAddressSchema } from '../../../types/customer/address' import type { GetAPISchema } from '../..' -import { CommerceAPIError } from '../../utils/errors' -import isAllowedOperation from '../../utils/is-allowed-operation' +import validateHandlers from '../../utils/validate-handlers' const customerShippingEndpoint: GetAPISchema< any, CustomerAddressSchema ->['endpoint']['handler'] = async (ctx) => { +>['endpoint']['handler'] = (ctx) => { const { req, res, handlers, config } = ctx - if ( - !isAllowedOperation(req, res, { - GET: handlers['getAddresses'], - POST: handlers['addItem'], - PUT: handlers['updateItem'], - DELETE: handlers['removeItem'], - }) - ) { - return - } - + validateHandlers(req, res, { + GET: handlers['getAddresses'], + POST: handlers['addItem'], + PUT: handlers['updateItem'], + DELETE: handlers['removeItem'], + }) const { cookies } = req // Cart id might be usefull for anonymous shopping const cartId = cookies[config.cartCookie] - try { - // Return customer addresses - if (req.method === 'GET') { - const body = { cartId } - return await handlers['getAddresses']({ ...ctx, body }) - } + // Return customer addresses + if (req.method === 'GET') { + const body = { cartId } + return handlers['getAddresses']({ ...ctx, body }) + } - // Create or add an item to customer addresses list - if (req.method === 'POST') { - const body = { ...req.body, cartId } - return await handlers['addItem']({ ...ctx, body }) - } + // Create or add an item to customer addresses list + if (req.method === 'POST') { + const body = { ...req.body, cartId } + return handlers['addItem']({ ...ctx, body }) + } - // Update item in customer addresses list - if (req.method === 'PUT') { - const body = { ...req.body, cartId } - return await handlers['updateItem']({ ...ctx, body }) - } + // Update item in customer addresses list + if (req.method === 'PUT') { + const body = { ...req.body, cartId } + return handlers['updateItem']({ ...ctx, body }) + } - // Remove an item from customer addresses list - if (req.method === 'DELETE') { - const body = { ...req.body, cartId } - return await handlers['removeItem']({ ...ctx, body }) - } - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) + // Remove an item from customer addresses list + if (req.method === 'DELETE') { + const body = { ...req.body, cartId } + return handlers['removeItem']({ ...ctx, body }) } } diff --git a/packages/commerce/src/api/endpoints/customer/card.ts b/packages/commerce/src/api/endpoints/customer/card.ts index ad268cbb9..39272f373 100644 --- a/packages/commerce/src/api/endpoints/customer/card.ts +++ b/packages/commerce/src/api/endpoints/customer/card.ts @@ -1,64 +1,47 @@ import type { CustomerCardSchema } from '../../../types/customer/card' import type { GetAPISchema } from '../..' -import { CommerceAPIError } from '../../utils/errors' -import isAllowedOperation from '../../utils/is-allowed-operation' +import validateHandlers from '../../utils/validate-handlers' const customerCardEndpoint: GetAPISchema< any, CustomerCardSchema ->['endpoint']['handler'] = async (ctx) => { +>['endpoint']['handler'] = (ctx) => { const { req, res, handlers, config } = ctx - if ( - !isAllowedOperation(req, res, { - GET: handlers['getCards'], - POST: handlers['addItem'], - PUT: handlers['updateItem'], - DELETE: handlers['removeItem'], - }) - ) { - return - } - + validateHandlers(req, res, { + GET: handlers['getCards'], + POST: handlers['addItem'], + PUT: handlers['updateItem'], + DELETE: handlers['removeItem'], + }) const { cookies } = req // Cart id might be usefull for anonymous shopping const cartId = cookies[config.cartCookie] - try { - // Create or add a card - if (req.method === 'GET') { - const body = { ...req.body } - return await handlers['getCards']({ ...ctx, body }) - } + // Create or add a card + if (req.method === 'GET') { + const body = { ...req.body } + return handlers['getCards']({ ...ctx, body }) + } - // Create or add an item to customer cards - if (req.method === 'POST') { - const body = { ...req.body, cartId } - return await handlers['addItem']({ ...ctx, body }) - } + // Create or add an item to customer cards + if (req.method === 'POST') { + const body = { ...req.body, cartId } + return handlers['addItem']({ ...ctx, body }) + } - // Update item in customer cards - if (req.method === 'PUT') { - const body = { ...req.body, cartId } - return await handlers['updateItem']({ ...ctx, body }) - } + // Update item in customer cards + if (req.method === 'PUT') { + const body = { ...req.body, cartId } + return handlers['updateItem']({ ...ctx, body }) + } - // Remove an item from customer cards - if (req.method === 'DELETE') { - const body = { ...req.body, cartId } - return await handlers['removeItem']({ ...ctx, body }) - } - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) + // Remove an item from customer cards + if (req.method === 'DELETE') { + const body = { ...req.body, cartId } + return handlers['removeItem']({ ...ctx, body }) } } diff --git a/packages/commerce/src/api/endpoints/customer/index.ts b/packages/commerce/src/api/endpoints/customer/index.ts index eb2a048b7..674e44417 100644 --- a/packages/commerce/src/api/endpoints/customer/index.ts +++ b/packages/commerce/src/api/endpoints/customer/index.ts @@ -1,36 +1,20 @@ import type { CustomerSchema } from '../../../types/customer' import type { GetAPISchema } from '../..' -import { CommerceAPIError } from '../../utils/errors' -import isAllowedOperation from '../../utils/is-allowed-operation' +import validateHandlers from '../../utils/validate-handlers' const customerEndpoint: GetAPISchema< any, - CustomerSchema ->['endpoint']['handler'] = async (ctx) => { + CustomerSchema +>['endpoint']['handler'] = (ctx) => { const { req, res, handlers } = ctx - if ( - !isAllowedOperation(req, res, { - GET: handlers['getLoggedInCustomer'], - }) - ) { - return - } + validateHandlers(req, res, { + GET: handlers['getLoggedInCustomer'], + }) - try { - const body = null - return await handlers['getLoggedInCustomer']({ ...ctx, body }) - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } + const body = null + return handlers['getLoggedInCustomer']({ ...ctx, body }) } export default customerEndpoint diff --git a/packages/commerce/src/api/endpoints/index.ts b/packages/commerce/src/api/endpoints/index.ts new file mode 100644 index 000000000..e5972aed0 --- /dev/null +++ b/packages/commerce/src/api/endpoints/index.ts @@ -0,0 +1,72 @@ +import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next' +import type { APIProvider, CommerceAPI } from '..' + +import { getErrorResponse } from '../utils/errors' + +/** + * Handles the catch-all api endpoint for the Commerce API. + * @param {CommerceAPI} commerce The Commerce API instance. + * @param endpoints An object containing the handlers for each endpoint. + */ +export default function createEndpoints

( + commerce: CommerceAPI

, + endpoints: { + [key: string]: (commerce: CommerceAPI

) => NextApiHandler + } +) { + const paths = Object.keys(endpoints) + + const handlers = paths.reduce>( + (acc, path) => + Object.assign(acc, { + [path]: endpoints[path](commerce), + }), + {} + ) + + return async (req: NextApiRequest, res: NextApiResponse) => { + try { + if (!req.query.commerce) { + throw new Error( + 'Invalid configuration. Please make sure that the /pages/api/commerce/[[...commerce]].ts route is configured correctly, and it passes the commerce instance.' + ) + } + + /** + * Get the url path + */ + const path = Array.isArray(req.query.commerce) + ? req.query.commerce.join('/') + : req.query.commerce + + /** + * Check if the handler for this path exists and return a 404 if it doesn't + */ + if (!paths.includes(path)) { + throw new Error( + `Endpoint handler not implemented. Please use one of the available api endpoints: ${paths.join( + ', ' + )}` + ) + } + + const data = await handlers[path](req, res) + + /** + * If the handler returns a value but the response hasn't been sent yet, send it + */ + if (!res.headersSent) { + res.status(200).json({ + data, + }) + } + } catch (error) { + console.error(error) + const { status, data, errors } = getErrorResponse(error) + res.status(status).json({ + data, + errors, + }) + } + } +} diff --git a/packages/commerce/src/api/endpoints/login.ts b/packages/commerce/src/api/endpoints/login.ts index 6f69629b1..1fe9756fc 100644 --- a/packages/commerce/src/api/endpoints/login.ts +++ b/packages/commerce/src/api/endpoints/login.ts @@ -1,36 +1,20 @@ -import type { LoginSchema } from '../../types/login' -import { CommerceAPIError } from '../utils/errors' -import isAllowedOperation from '../utils/is-allowed-operation' import type { GetAPISchema } from '..' +import type { LoginSchema } from '../../types/login' -const loginEndpoint: GetAPISchema< - any, - LoginSchema ->['endpoint']['handler'] = async (ctx) => { +import validateHandlers from '../utils/validate-handlers' + +const loginEndpoint: GetAPISchema['endpoint']['handler'] = ( + ctx +) => { const { req, res, handlers } = ctx - if ( - !isAllowedOperation(req, res, { - POST: handlers['login'], - GET: handlers['login'], - }) - ) { - return - } + validateHandlers(req, res, { + POST: handlers['login'], + GET: handlers['login'], + }) - try { - const body = req.body ?? {} - return await handlers['login']({ ...ctx, body }) - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } + const body = req.body ?? {} + return handlers['login']({ ...ctx, body }) } export default loginEndpoint diff --git a/packages/commerce/src/api/endpoints/logout.ts b/packages/commerce/src/api/endpoints/logout.ts index c2640eac3..cc36c82b2 100644 --- a/packages/commerce/src/api/endpoints/logout.ts +++ b/packages/commerce/src/api/endpoints/logout.ts @@ -1,35 +1,20 @@ -import type { LogoutSchema } from '../../types/logout' -import { CommerceAPIError } from '../utils/errors' -import isAllowedOperation from '../utils/is-allowed-operation' import type { GetAPISchema } from '..' +import type { LogoutSchema } from '../../types/logout' -const logoutEndpoint: GetAPISchema['endpoint']['handler'] = - async (ctx) => { - const { req, res, handlers } = ctx +import validateHandlers from '../utils/validate-handlers' - if ( - !isAllowedOperation(req, res, { - GET: handlers['logout'], - }) - ) { - return - } +const logoutEndpoint: GetAPISchema['endpoint']['handler'] = ( + ctx +) => { + const { req, res, handlers } = ctx - try { - const redirectTo = req.query.redirect_to - const body = typeof redirectTo === 'string' ? { redirectTo } : {} + validateHandlers(req, res, { + GET: handlers['logout'], + }) + const redirectTo = req.query.redirect_to + const body = typeof redirectTo === 'string' ? { redirectTo } : {} - return await handlers['logout']({ ...ctx, body }) - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } - } + return handlers['logout']({ ...ctx, body }) +} export default logoutEndpoint diff --git a/packages/commerce/src/api/endpoints/signup.ts b/packages/commerce/src/api/endpoints/signup.ts index 78c4cf588..e0c743fc4 100644 --- a/packages/commerce/src/api/endpoints/signup.ts +++ b/packages/commerce/src/api/endpoints/signup.ts @@ -1,36 +1,21 @@ -import type { SignupSchema } from '../../types/signup' -import { CommerceAPIError } from '../utils/errors' -import isAllowedOperation from '../utils/is-allowed-operation' import type { GetAPISchema } from '..' +import type { SignupSchema } from '../../types/signup' -const signupEndpoint: GetAPISchema['endpoint']['handler'] = - async (ctx) => { - const { req, res, handlers, config } = ctx +import validateHandlers from '../utils/validate-handlers' - if ( - !isAllowedOperation(req, res, { - POST: handlers['signup'], - }) - ) { - return - } +const signupEndpoint: GetAPISchema['endpoint']['handler'] = ( + ctx +) => { + const { req, res, handlers, config } = ctx - const { cookies } = req - const cartId = cookies[config.cartCookie] + validateHandlers(req, res, { + POST: handlers['signup'], + }) + const { cookies } = req + const cartId = cookies[config.cartCookie] - try { - const body = { ...req.body, cartId } - return await handlers['signup']({ ...ctx, body }) - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } - } + const body = { ...req.body, cartId } + return handlers['signup']({ ...ctx, body }) +} export default signupEndpoint diff --git a/packages/commerce/src/api/endpoints/wishlist.ts b/packages/commerce/src/api/endpoints/wishlist.ts index 233ac5294..d7ae48f62 100644 --- a/packages/commerce/src/api/endpoints/wishlist.ts +++ b/packages/commerce/src/api/endpoints/wishlist.ts @@ -1,57 +1,42 @@ -import type { WishlistSchema } from '../../types/wishlist' -import { CommerceAPIError } from '../utils/errors' -import isAllowedOperation from '../utils/is-allowed-operation' import type { GetAPISchema } from '..' +import type { WishlistSchema } from '../../types/wishlist' + +import validateHandlers from '../utils/validate-handlers' const wishlistEndpoint: GetAPISchema< any, - WishlistSchema ->['endpoint']['handler'] = async (ctx) => { + WishlistSchema +>['endpoint']['handler'] = (ctx) => { const { req, res, handlers, config } = ctx - if ( - !isAllowedOperation(req, res, { - GET: handlers['getWishlist'], - POST: handlers['addItem'], - DELETE: handlers['removeItem'], - }) - ) { - return - } + validateHandlers(req, res, { + GET: handlers['getWishlist'], + POST: handlers['addItem'], + DELETE: handlers['removeItem'], + }) const { cookies } = req const customerToken = cookies[config.customerCookie] - try { - // Return current wishlist info - if (req.method === 'GET') { - const body = { - customerToken, - includeProducts: req.query.products === '1', - } - return await handlers['getWishlist']({ ...ctx, body }) + // Return current wishlist info + if (req.method === 'GET') { + const body = { + customerToken, + includeProducts: !!req.query.products, } + return handlers['getWishlist']({ ...ctx, body }) + } - // Add an item to the wishlist - if (req.method === 'POST') { - const body = { ...req.body, customerToken } - return await handlers['addItem']({ ...ctx, body }) - } + // Add an item to the wishlist + if (req.method === 'POST') { + const body = { ...req.body, customerToken } + return handlers['addItem']({ ...ctx, body }) + } - // Remove an item from the wishlist - if (req.method === 'DELETE') { - const body = { ...req.body, customerToken } - return await handlers['removeItem']({ ...ctx, body }) - } - } catch (error) { - console.error(error) - - const message = - error instanceof CommerceAPIError - ? 'An unexpected error ocurred with the Commerce API' - : 'An unexpected error ocurred' - - res.status(500).json({ data: null, errors: [{ message }] }) + // Remove an item from the wishlist + if (req.method === 'DELETE') { + const body = { ...req.body, customerToken } + return handlers['removeItem']({ ...ctx, body }) } } diff --git a/packages/commerce/src/api/utils/errors.ts b/packages/commerce/src/api/utils/errors.ts index 6f9ecce0c..0ac588fee 100644 --- a/packages/commerce/src/api/utils/errors.ts +++ b/packages/commerce/src/api/utils/errors.ts @@ -1,4 +1,7 @@ +import { ZodError } from 'zod' + import type { Response } from '@vercel/fetch' +import { CommerceError } from '../../utils/errors' export class CommerceAPIError extends Error { status: number @@ -20,3 +23,51 @@ export class CommerceNetworkError extends Error { this.name = 'CommerceNetworkError' } } + +export const getErrorResponse = (error: unknown) => { + if (error instanceof CommerceAPIError) { + return { + status: error.status || 500, + data: error.data || null, + errors: [ + { message: 'An unexpected error ocurred with the Commerce API' }, + ], + } + } + + if (error instanceof ZodError) { + return { + status: 400, + data: null, + errors: error.issues, + } + } + + return { + status: 500, + data: null, + errors: [{ message: 'An unexpected error ocurred' }], + } +} + +export const getOperationError = (operation: string, error: unknown) => { + if (error instanceof ZodError) { + return new CommerceError({ + code: 'SCHEMA_VALIDATION_ERROR', + message: + `The ${operation} operation returned invalid data and has ${ + error.issues.length + } parse ${error.issues.length === 1 ? 'error' : 'errors'}: \n` + + error.issues + .map( + (e, index) => + `Error #${index + 1} ${ + e.path.length > 0 ? `Path: ${e.path.join('.')}, ` : '' + }Code: ${e.code}, Message: ${e.message}` + ) + .join('\n'), + }) + } + + return error +} diff --git a/packages/commerce/src/api/utils/is-allowed-operation.ts b/packages/commerce/src/api/utils/validate-handlers.ts similarity index 65% rename from packages/commerce/src/api/utils/is-allowed-operation.ts rename to packages/commerce/src/api/utils/validate-handlers.ts index f507781bf..90aa24402 100644 --- a/packages/commerce/src/api/utils/is-allowed-operation.ts +++ b/packages/commerce/src/api/utils/validate-handlers.ts @@ -2,7 +2,11 @@ import type { NextApiRequest, NextApiResponse } from 'next' import isAllowedMethod, { HTTP_METHODS } from './is-allowed-method' import { APIHandler } from './types' -export default function isAllowedOperation( +/** + * Checks if the request method is allowed + * @throws Error if the method is not allowed + */ +export default function validateHandlers( req: NextApiRequest, res: NextApiResponse, allowedOperations: { [k in HTTP_METHODS]?: APIHandler } @@ -15,5 +19,7 @@ export default function isAllowedOperation( return arr }, []) - return isAllowedMethod(req, res, allowedMethods) + if (!isAllowedMethod(req, res, allowedMethods)) { + throw new Error(`Method ${req.method} Not Allowed for this url: ${req.url}`) + } } diff --git a/packages/commerce/src/schemas/cart.ts b/packages/commerce/src/schemas/cart.ts new file mode 100644 index 000000000..8194bc613 --- /dev/null +++ b/packages/commerce/src/schemas/cart.ts @@ -0,0 +1,27 @@ +import { z } from 'zod' + +export const getCartBodySchema = z.object({ + cartId: z.string(), +}) + +export const cartItemBodySchema = z.object({ + variantId: z.string(), + productId: z.string().optional(), + quantity: z.number().min(1).optional(), +}) + +export const addItemBodySchema = z.object({ + cartId: z.string().optional(), + item: cartItemBodySchema, +}) + +export const updateItemBodySchema = z.object({ + cartId: z.string(), + itemId: z.string(), + item: cartItemBodySchema, +}) + +export const removeItemBodySchema = z.object({ + cartId: z.string(), + itemId: z.string(), +}) diff --git a/packages/commerce/src/schemas/page.ts b/packages/commerce/src/schemas/page.ts new file mode 100644 index 000000000..5dfd175e1 --- /dev/null +++ b/packages/commerce/src/schemas/page.ts @@ -0,0 +1,18 @@ +import { z } from 'zod' + +export const pageSchema = z.object({ + id: z.string(), + name: z.string(), + url: z.string().startsWith('/').optional(), + body: z.string(), + is_visible: z.boolean().optional(), + sort_order: z.number().optional(), +}) + +export const pagesPathsSchema = z.array( + z.object({ + page: z.object({ + path: z.string().startsWith('/'), + }), + }) +) diff --git a/packages/commerce/src/schemas/product.ts b/packages/commerce/src/schemas/product.ts new file mode 100644 index 000000000..70048c696 --- /dev/null +++ b/packages/commerce/src/schemas/product.ts @@ -0,0 +1,60 @@ +import { z } from 'zod' + +export const productPriceSchema = z.object({ + value: z.number(), + currencyCode: z.string().max(3).optional(), + retailPrice: z.number().optional(), +}) + +export const productOptionSchema = z.object({ + id: z.string(), + displayName: z.string(), + values: z.array( + z.object({ + label: z.string(), + hexColors: z.array(z.string()).optional(), + }) + ), +}) + +export const productImageSchema = z.object({ + url: z.string().url().or(z.string().startsWith('/')), + alt: z.string().optional(), + width: z.number().optional(), + height: z.number().optional(), +}) + +export const productVariantSchema = z.object({ + id: z.string(), + sku: z.string().nullish(), + name: z.string().optional(), + options: z.array(productOptionSchema), + image: productImageSchema.optional(), +}) + +export const productSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string(), + descriptionHtml: z.string().optional(), + sku: z.string().nullish(), + slug: z.string(), + path: z.string().startsWith('/'), + images: z.array(productImageSchema), + variants: z.array(productVariantSchema), + price: productPriceSchema, + options: z.array(productOptionSchema), + vendor: z.string().optional(), +}) + +export const productsPathsSchema = z.array( + z.object({ path: z.string().startsWith('/') }) +) + +export const searchProductBodySchema = z.object({ + search: z.string().optional(), + categoryId: z.string().optional(), + brandId: z.string().optional(), + sort: z.string().optional(), + locale: z.string().optional(), +}) diff --git a/packages/commerce/src/schemas/site.ts b/packages/commerce/src/schemas/site.ts new file mode 100644 index 000000000..f6c101e7f --- /dev/null +++ b/packages/commerce/src/schemas/site.ts @@ -0,0 +1,18 @@ +import { z } from 'zod' + +export const siteInfoSchema = z.object({ + categories: z.array( + z.object({ + id: z.string(), + name: z.string(), + path: z.string().startsWith('/'), + }) + ), + brands: z.array( + z.object({ + id: z.string(), + name: z.string(), + path: z.string().startsWith('/'), + }) + ), +}) diff --git a/packages/commerce/src/types/cart.ts b/packages/commerce/src/types/cart.ts index e4af878de..d3a739db3 100644 --- a/packages/commerce/src/types/cart.ts +++ b/packages/commerce/src/types/cart.ts @@ -158,11 +158,11 @@ export type CartHandlers = { } export type GetCartHandler = GetCartHook & { - body: { cartId?: string } + body: { cartId: string } } export type AddItemHandler = AddItemHook & { - body: { cartId: string } + body: { cartId?: string } } export type UpdateItemHandler = diff --git a/packages/commercejs/src/api/endpoints/cart/index.ts b/packages/commercejs/src/api/endpoints/cart/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/cart/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/catalog/index.ts b/packages/commercejs/src/api/endpoints/catalog/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/catalog/products/index.ts b/packages/commercejs/src/api/endpoints/catalog/products/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/catalog/products/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/customer/address/index.ts b/packages/commercejs/src/api/endpoints/customer/address/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/customer/address/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/customer/card/index.ts b/packages/commercejs/src/api/endpoints/customer/card/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/customer/card/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/customer/index.ts b/packages/commercejs/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/index.ts b/packages/commercejs/src/api/endpoints/index.ts new file mode 100644 index 000000000..46a83f579 --- /dev/null +++ b/packages/commercejs/src/api/endpoints/index.ts @@ -0,0 +1,16 @@ +import type { CommercejsAPI } from '..' + +import handleEndpoints from '@vercel/commerce/api/endpoints' + +import login from './login' +import checkout from './checkout' + +const endpoints = { + login, + checkout, +} + +const handler = (commerce: CommercejsAPI) => + handleEndpoints(commerce, endpoints) + +export default handler diff --git a/packages/commercejs/src/api/endpoints/logout/index.ts b/packages/commercejs/src/api/endpoints/logout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/logout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/signup/index.ts b/packages/commercejs/src/api/endpoints/signup/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/signup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/wishlist/index.tsx b/packages/commercejs/src/api/endpoints/wishlist/index.tsx deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/commercejs/src/api/endpoints/wishlist/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/checkout/use-submit-checkout.tsx b/packages/commercejs/src/checkout/use-submit-checkout.tsx index 2cb723281..3a2b2c6fe 100644 --- a/packages/commercejs/src/checkout/use-submit-checkout.tsx +++ b/packages/commercejs/src/checkout/use-submit-checkout.tsx @@ -11,7 +11,7 @@ export default useSubmitCheckout as UseSubmitCheckout export const handler: MutationHook = { fetchOptions: { - url: '/api/checkout', + url: '/api/commerce/checkout', method: 'POST', }, async fetcher({ input: item, options, fetch }) { diff --git a/packages/kibocommerce/src/api/endpoints/checkout/index.ts b/packages/kibocommerce/src/api/endpoints/checkout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/kibocommerce/src/api/endpoints/checkout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/kibocommerce/src/api/endpoints/customer/address.ts b/packages/kibocommerce/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/kibocommerce/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/kibocommerce/src/api/endpoints/customer/card.ts b/packages/kibocommerce/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/kibocommerce/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/kibocommerce/src/api/endpoints/index.ts b/packages/kibocommerce/src/api/endpoints/index.ts new file mode 100644 index 000000000..c64e9b19a --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/index.ts @@ -0,0 +1,26 @@ +import type { KiboCommerceAPI } from '..' + +import handleEndpoints from '@vercel/commerce/api/endpoints' + +import cart from './cart' +import login from './login' +import logout from './logout' +import signup from './signup' +import customer from './customer' +import wishlist from './wishlist' +import products from './catalog/products' + +const endpoints = { + cart, + login, + logout, + signup, + wishlist, + customer, + 'catalog/products': products, +} + +const handler = (commerce: KiboCommerceAPI) => + handleEndpoints(commerce, endpoints) + +export default handler diff --git a/packages/kibocommerce/src/auth/use-login.tsx b/packages/kibocommerce/src/auth/use-login.tsx index c9d1fac17..dc1a61d70 100644 --- a/packages/kibocommerce/src/auth/use-login.tsx +++ b/packages/kibocommerce/src/auth/use-login.tsx @@ -10,7 +10,7 @@ export default useLogin as UseLogin export const handler: MutationHook = { fetchOptions: { - url: '/api/login', + url: '/api/commerce/login', method: 'POST', }, async fetcher({ input: { email, password }, options, fetch }) { diff --git a/packages/kibocommerce/src/auth/use-logout.tsx b/packages/kibocommerce/src/auth/use-logout.tsx index 83e5a4b0c..3c843938b 100644 --- a/packages/kibocommerce/src/auth/use-logout.tsx +++ b/packages/kibocommerce/src/auth/use-logout.tsx @@ -9,7 +9,7 @@ export default useLogout as UseLogout export const handler: MutationHook = { fetchOptions: { - url: '/api/logout', + url: '/api/commerce/logout', method: 'GET', }, useHook: ({ fetch }) => () => { diff --git a/packages/kibocommerce/src/auth/use-signup.tsx b/packages/kibocommerce/src/auth/use-signup.tsx index b06126df6..8ad1cfd5a 100644 --- a/packages/kibocommerce/src/auth/use-signup.tsx +++ b/packages/kibocommerce/src/auth/use-signup.tsx @@ -9,7 +9,7 @@ export default useSignup as UseSignup export const handler: MutationHook = { fetchOptions: { - url: '/api/signup', + url: '/api/commerce/signup', method: 'POST', }, async fetcher({ diff --git a/packages/kibocommerce/src/cart/use-add-item.tsx b/packages/kibocommerce/src/cart/use-add-item.tsx index bb7b8befc..11189ffeb 100644 --- a/packages/kibocommerce/src/cart/use-add-item.tsx +++ b/packages/kibocommerce/src/cart/use-add-item.tsx @@ -9,7 +9,7 @@ export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'POST', }, async fetcher({ input: item, options, fetch }) { @@ -29,16 +29,18 @@ export const handler: MutationHook = { return data }, - useHook: ({ fetch }) => () => { - const { mutate } = useCart() + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() - return useCallback( - async function addItem(input) { - const data = await fetch({ input }) - await mutate(data, false) - return data - }, - [fetch, mutate] - ) - }, + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, } diff --git a/packages/kibocommerce/src/cart/use-cart.tsx b/packages/kibocommerce/src/cart/use-cart.tsx index 0af0738ec..b8fbede57 100644 --- a/packages/kibocommerce/src/cart/use-cart.tsx +++ b/packages/kibocommerce/src/cart/use-cart.tsx @@ -7,27 +7,29 @@ export default useCart as UseCart export const handler: SWRHook = { fetchOptions: { method: 'GET', - url: '/api/cart', + url: '/api/commerce/cart', }, async fetcher({ options, fetch }) { return await fetch({ ...options }) }, - useHook: ({ useData }) => (input) => { - const response = useData({ - swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, - }) + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) - return useMemo( - () => - Object.create(response, { - isEmpty: { - get() { - return (response.data?.lineItems.length ?? 0) <= 0 + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, }, - enumerable: true, - }, - }), - [response] - ) - }, + }), + [response] + ) + }, } diff --git a/packages/kibocommerce/src/cart/use-remove-item.tsx b/packages/kibocommerce/src/cart/use-remove-item.tsx index 3fa883c2f..74f893ccb 100644 --- a/packages/kibocommerce/src/cart/use-remove-item.tsx +++ b/packages/kibocommerce/src/cart/use-remove-item.tsx @@ -4,8 +4,14 @@ import type { HookFetcherContext, } from '@vercel/commerce/utils/types' import { ValidationError } from '@vercel/commerce/utils/errors' -import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' -import type { Cart, LineItem, RemoveItemHook } from '@vercel/commerce/types/cart' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' +import type { + Cart, + LineItem, + RemoveItemHook, +} from '@vercel/commerce/types/cart' import useCart from './use-cart' export type RemoveItemFn = T extends LineItem @@ -20,7 +26,7 @@ export default useRemoveItem as UseRemoveItem export const handler = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'DELETE', }, async fetcher({ @@ -30,27 +36,25 @@ export const handler = { }: HookFetcherContext) { return await fetch({ ...options, body: { itemId } }) }, - useHook: ({ fetch }: MutationHookContext) => < - T extends LineItem | undefined = undefined - >( - ctx: { item?: T } = {} - ) => { - const { item } = ctx - const { mutate } = useCart() - const removeItem: RemoveItemFn = async (input) => { - const itemId = input?.id ?? item?.id + useHook: + ({ fetch }: MutationHookContext) => + (ctx: { item?: T } = {}) => { + const { item } = ctx + const { mutate } = useCart() + const removeItem: RemoveItemFn = async (input) => { + const itemId = input?.id ?? item?.id - if (!itemId) { - throw new ValidationError({ - message: 'Invalid input used for this operation', - }) + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + await mutate(data, false) + return data } - const data = await fetch({ input: { itemId } }) - await mutate(data, false) - return data - } - - return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) - }, + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, } diff --git a/packages/kibocommerce/src/cart/use-update-item.tsx b/packages/kibocommerce/src/cart/use-update-item.tsx index 931782c4f..f5bfbc410 100644 --- a/packages/kibocommerce/src/cart/use-update-item.tsx +++ b/packages/kibocommerce/src/cart/use-update-item.tsx @@ -5,7 +5,9 @@ import type { HookFetcherContext, } from '@vercel/commerce/utils/types' import { ValidationError } from '@vercel/commerce/utils/errors' -import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' import type { LineItem, UpdateItemHook } from '@vercel/commerce/types/cart' import { handler as removeItemHandler } from './use-remove-item' import useCart from './use-cart' @@ -18,7 +20,7 @@ export default useUpdateItem as UseUpdateItem export const handler = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'PUT', }, async fetcher({ @@ -46,39 +48,39 @@ export const handler = { body: { itemId, item }, }) }, - useHook: ({ fetch }: MutationHookContext) => < - T extends LineItem | undefined = undefined - >( - ctx: { - item?: T - wait?: number - } = {} - ) => { - const { item } = ctx - const { mutate } = useCart() as any + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: T + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() as any - return useCallback( - debounce(async (input: UpdateItemActionInput) => { - const itemId = input.id ?? item?.id - const productId = input.productId ?? item?.productId - const variantId = input.productId ?? item?.variantId + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId - if (!itemId || !productId || !variantId) { - throw new ValidationError({ - message: 'Invalid input used for this operation', + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + itemId, + item: { productId, variantId, quantity: input.quantity }, + }, }) - } - - const data = await fetch({ - input: { - itemId, - item: { productId, variantId, quantity: input.quantity }, - }, - }) - await mutate(data, false) - return data - }, ctx.wait ?? 500), - [fetch, mutate] - ) - }, + await mutate(data, false) + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, } diff --git a/packages/kibocommerce/src/customer/use-customer.tsx b/packages/kibocommerce/src/customer/use-customer.tsx index 73e804a4b..f0e000ef4 100644 --- a/packages/kibocommerce/src/customer/use-customer.tsx +++ b/packages/kibocommerce/src/customer/use-customer.tsx @@ -6,7 +6,7 @@ export default useCustomer as UseCustomer export const handler: SWRHook = { fetchOptions: { - url: '/api/customer', + url: '/api/commerce/customer', method: 'GET', }, async fetcher({ options, fetch }) { diff --git a/packages/kibocommerce/src/product/use-search.tsx b/packages/kibocommerce/src/product/use-search.tsx index 4a9107b4a..ba1ebcf72 100644 --- a/packages/kibocommerce/src/product/use-search.tsx +++ b/packages/kibocommerce/src/product/use-search.tsx @@ -5,7 +5,7 @@ export default useSearch as UseSearch export const handler: SWRHook = { fetchOptions: { method: 'GET', - url: '/api/catalog/products', + url: '/api/commerce/catalog/products', }, fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { // Use a dummy base as we only care about the relative path @@ -23,15 +23,17 @@ export const handler: SWRHook = { method: options.method, }) }, - useHook: ({ useData }) => (input) => { - return useData({ - input: [ - ['search', input.search], - ['categoryId', input.categoryId], - ['brandId', input.brandId], - ['sort', input.sort], - ], - swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, - }) - }, + useHook: + ({ useData }) => + (input) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + }, } diff --git a/packages/kibocommerce/src/wishlist/use-add-item.tsx b/packages/kibocommerce/src/wishlist/use-add-item.tsx index 3f634e31e..6955778e5 100644 --- a/packages/kibocommerce/src/wishlist/use-add-item.tsx +++ b/packages/kibocommerce/src/wishlist/use-add-item.tsx @@ -10,7 +10,7 @@ export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/wishlist', + url: '/api/commerce/wishlist', method: 'POST', }, useHook: diff --git a/packages/kibocommerce/src/wishlist/use-remove-item.tsx b/packages/kibocommerce/src/wishlist/use-remove-item.tsx index 490154a45..e61328769 100644 --- a/packages/kibocommerce/src/wishlist/use-remove-item.tsx +++ b/packages/kibocommerce/src/wishlist/use-remove-item.tsx @@ -12,7 +12,7 @@ export default useRemoveItem as UseRemoveItem export const handler: MutationHook = { fetchOptions: { - url: '/api/wishlist', + url: '/api/commerce/wishlist', method: 'DELETE', }, useHook: diff --git a/packages/kibocommerce/src/wishlist/use-wishlist.tsx b/packages/kibocommerce/src/wishlist/use-wishlist.tsx index a91eb419b..83d3fadfc 100644 --- a/packages/kibocommerce/src/wishlist/use-wishlist.tsx +++ b/packages/kibocommerce/src/wishlist/use-wishlist.tsx @@ -1,6 +1,8 @@ import { useMemo } from 'react' import { SWRHook } from '@vercel/commerce/utils/types' -import useWishlist, { UseWishlist } from '@vercel/commerce/wishlist/use-wishlist' +import useWishlist, { + UseWishlist, +} from '@vercel/commerce/wishlist/use-wishlist' import type { GetWishlistHook } from '@vercel/commerce/types/wishlist' import useCustomer from '../customer/use-customer' @@ -8,45 +10,47 @@ export default useWishlist as UseWishlist export const handler: SWRHook = { fetchOptions: { - url: '/api/wishlist', + url: '/api/commerce/wishlist', method: 'GET', }, - fetcher({ input: { customerId, includeProducts}, options, fetch }) { + fetcher({ input: { customerId, includeProducts }, options, fetch }) { if (!customerId) return null // Use a dummy base as we only care about the relative path const url = new URL(options.url!, 'http://a') if (includeProducts) url.searchParams.set('products', '1') - if(customerId) url.searchParams.set('customerId', customerId) + if (customerId) url.searchParams.set('customerId', customerId) return fetch({ url: url.pathname + url.search, method: options.method, }) }, - useHook: ({ useData }) => (input) => { - const { data: customer } = useCustomer() - const response = useData({ - input: [ - ['customerId', customer?.id], - ['includeProducts', input?.includeProducts], - ], - swrOptions: { - revalidateOnFocus: false, - ...input?.swrOptions, - }, - }) - return useMemo( - () => - Object.create(response, { - isEmpty: { - get() { - return (response.data?.items?.length || 0) <= 0 + useHook: + ({ useData }) => + (input) => { + const { data: customer } = useCustomer() + const response = useData({ + input: [ + ['customerId', customer?.id], + ['includeProducts', input?.includeProducts], + ], + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.items?.length || 0) <= 0 + }, + enumerable: true, }, - enumerable: true, - }, - }), - [response] - ) - }, + }), + [response] + ) + }, } diff --git a/packages/local/src/api/endpoints/cart/index.ts b/packages/local/src/api/endpoints/cart/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/cart/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/catalog/index.ts b/packages/local/src/api/endpoints/catalog/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/catalog/products.ts b/packages/local/src/api/endpoints/catalog/products.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/checkout/index.ts b/packages/local/src/api/endpoints/checkout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/checkout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/customer/address.ts b/packages/local/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/customer/card.ts b/packages/local/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/customer/index.ts b/packages/local/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/login/index.ts b/packages/local/src/api/endpoints/login/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/login/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/logout/index.ts b/packages/local/src/api/endpoints/logout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/logout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/signup/index.ts b/packages/local/src/api/endpoints/signup/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/signup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/wishlist/index.tsx b/packages/local/src/api/endpoints/wishlist/index.tsx deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/local/src/api/endpoints/wishlist/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/cart/add-item.ts b/packages/ordercloud/src/api/endpoints/cart/add-item.ts index 28d372bd0..9adb1a6b1 100644 --- a/packages/ordercloud/src/api/endpoints/cart/add-item.ts +++ b/packages/ordercloud/src/api/endpoints/cart/add-item.ts @@ -11,14 +11,6 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({ body: { cartId, item }, config: { restBuyerFetch, cartCookie, tokenCookie }, }) => { - // Return an error if no item is present - if (!item) { - return res.status(400).json({ - data: null, - errors: [{ message: 'Missing item' }], - }) - } - // Store token let token @@ -46,7 +38,7 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({ path: '/', sameSite: 'lax', }), - serialize(cartCookie, cartId, { + serialize(cartCookie, cartId!, { maxAge: 60 * 60 * 24 * 30, expires: new Date(Date.now() + 60 * 60 * 24 * 30 * 1000), secure: process.env.NODE_ENV === 'production', diff --git a/packages/ordercloud/src/api/endpoints/cart/index.ts b/packages/ordercloud/src/api/endpoints/cart/index.ts index f36364c46..ad1c40495 100644 --- a/packages/ordercloud/src/api/endpoints/cart/index.ts +++ b/packages/ordercloud/src/api/endpoints/cart/index.ts @@ -1,5 +1,5 @@ -import type { CartSchema } from '../../../types/cart' import type { OrdercloudAPI } from '../..' +import type { CartSchema } from '@vercel/commerce/types/cart' import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' import cartEndpoint from '@vercel/commerce/api/endpoints/cart' @@ -9,9 +9,8 @@ import addItem from './add-item' import updateItem from './update-item' import removeItem from './remove-item' -export type CartAPI = GetAPISchema - export type CartEndpoint = CartAPI['endpoint'] +export type CartAPI = GetAPISchema export const handlers: CartEndpoint['handlers'] = { getCart, diff --git a/packages/ordercloud/src/api/endpoints/customer/index.ts b/packages/ordercloud/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/ordercloud/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/index.ts b/packages/ordercloud/src/api/endpoints/index.ts new file mode 100644 index 000000000..ed521835e --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/index.ts @@ -0,0 +1,22 @@ +import type { OrdercloudAPI } from '..' + +import handleEndpoints from '@vercel/commerce/api/endpoints' + +import cart from './cart' +import checkout from './checkout' +import products from './catalog/products' +import customerCard from './customer/card' +import customerAddress from './customer/address' + +const endpoints = { + cart, + checkout, + 'customer/card': customerCard, + 'customer/address': customerAddress, + 'catalog/products': products, +} + +const handler = (commerce: OrdercloudAPI) => + handleEndpoints(commerce, endpoints) + +export default handler diff --git a/packages/ordercloud/src/api/endpoints/login/index.ts b/packages/ordercloud/src/api/endpoints/login/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/ordercloud/src/api/endpoints/login/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/logout/index.ts b/packages/ordercloud/src/api/endpoints/logout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/ordercloud/src/api/endpoints/logout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/signup/index.ts b/packages/ordercloud/src/api/endpoints/signup/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/ordercloud/src/api/endpoints/signup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/wishlist/index.tsx b/packages/ordercloud/src/api/endpoints/wishlist/index.tsx deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/ordercloud/src/api/endpoints/wishlist/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/cart/use-add-item.tsx b/packages/ordercloud/src/cart/use-add-item.tsx index c9d315301..44852390b 100644 --- a/packages/ordercloud/src/cart/use-add-item.tsx +++ b/packages/ordercloud/src/cart/use-add-item.tsx @@ -10,7 +10,7 @@ export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'POST', }, async fetcher({ input: item, options, fetch }) { diff --git a/packages/ordercloud/src/cart/use-cart.tsx b/packages/ordercloud/src/cart/use-cart.tsx index 01c3a1cab..58f49b142 100644 --- a/packages/ordercloud/src/cart/use-cart.tsx +++ b/packages/ordercloud/src/cart/use-cart.tsx @@ -8,7 +8,7 @@ export default useCart as UseCart export const handler: SWRHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'GET', }, useHook: ({ useData }) => diff --git a/packages/ordercloud/src/cart/use-remove-item.tsx b/packages/ordercloud/src/cart/use-remove-item.tsx index fba15f8d5..b9e43cf52 100644 --- a/packages/ordercloud/src/cart/use-remove-item.tsx +++ b/packages/ordercloud/src/cart/use-remove-item.tsx @@ -2,12 +2,18 @@ import type { MutationHookContext, HookFetcherContext, } from '@vercel/commerce/utils/types' -import type { Cart, LineItem, RemoveItemHook } from '@vercel/commerce/types/cart' +import type { + Cart, + LineItem, + RemoveItemHook, +} from '@vercel/commerce/types/cart' import { useCallback } from 'react' import { ValidationError } from '@vercel/commerce/utils/errors' -import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' import useCart from './use-cart' @@ -23,7 +29,7 @@ export default useRemoveItem as UseRemoveItem export const handler = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'DELETE', }, async fetcher({ diff --git a/packages/ordercloud/src/cart/use-update-item.tsx b/packages/ordercloud/src/cart/use-update-item.tsx index 7a5f6fcf7..bfbf2902c 100644 --- a/packages/ordercloud/src/cart/use-update-item.tsx +++ b/packages/ordercloud/src/cart/use-update-item.tsx @@ -9,7 +9,9 @@ import debounce from 'lodash.debounce' import { MutationHook } from '@vercel/commerce/utils/types' import { ValidationError } from '@vercel/commerce/utils/errors' -import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' import { handler as removeItemHandler } from './use-remove-item' import useCart from './use-cart' @@ -22,7 +24,7 @@ export default useUpdateItem as UseUpdateItem export const handler: MutationHook = { fetchOptions: { - url: '/api/cart', + url: '/api/commerce/cart', method: 'PUT', }, async fetcher({ diff --git a/packages/ordercloud/src/checkout/use-checkout.tsx b/packages/ordercloud/src/checkout/use-checkout.tsx index f60ebfdd9..1c2694f9e 100644 --- a/packages/ordercloud/src/checkout/use-checkout.tsx +++ b/packages/ordercloud/src/checkout/use-checkout.tsx @@ -9,7 +9,7 @@ export default useCheckout as UseCheckout export const handler: SWRHook = { fetchOptions: { - url: '/api/checkout', + url: '/api/commerce/checkout', method: 'GET', }, useHook: ({ useData }) => diff --git a/packages/ordercloud/src/checkout/use-submit-checkout.tsx b/packages/ordercloud/src/checkout/use-submit-checkout.tsx index 79c438499..d8d78ef8b 100644 --- a/packages/ordercloud/src/checkout/use-submit-checkout.tsx +++ b/packages/ordercloud/src/checkout/use-submit-checkout.tsx @@ -10,7 +10,7 @@ export default useSubmitCheckout as UseSubmitCheckout export const handler: MutationHook = { fetchOptions: { - url: '/api/checkout', + url: '/api/commerce/checkout', method: 'POST', }, async fetcher({ input: item, options, fetch }) { diff --git a/packages/ordercloud/src/customer/address/use-add-item.tsx b/packages/ordercloud/src/customer/address/use-add-item.tsx index 798f5fe22..65d315bd4 100644 --- a/packages/ordercloud/src/customer/address/use-add-item.tsx +++ b/packages/ordercloud/src/customer/address/use-add-item.tsx @@ -2,14 +2,16 @@ import type { AddItemHook } from '@vercel/commerce/types/customer/address' import type { MutationHook } from '@vercel/commerce/utils/types' import { useCallback } from 'react' -import useAddItem, { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/address/use-add-item' import useAddresses from './use-addresses' export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/customer/address', + url: '/api/commerce/customer/address', method: 'POST', }, async fetcher({ input: item, options, fetch }) { diff --git a/packages/ordercloud/src/customer/address/use-addresses.tsx b/packages/ordercloud/src/customer/address/use-addresses.tsx index fd6807a25..704b02c2f 100644 --- a/packages/ordercloud/src/customer/address/use-addresses.tsx +++ b/packages/ordercloud/src/customer/address/use-addresses.tsx @@ -10,7 +10,7 @@ export default useAddresses as UseAddresses export const handler: SWRHook = { fetchOptions: { - url: '/api/customer/address', + url: '/api/commerce/customer/address', method: 'GET', }, useHook: ({ useData }) => diff --git a/packages/ordercloud/src/customer/address/use-remove-item.tsx b/packages/ordercloud/src/customer/address/use-remove-item.tsx index ac805dbc5..27d79441c 100644 --- a/packages/ordercloud/src/customer/address/use-remove-item.tsx +++ b/packages/ordercloud/src/customer/address/use-remove-item.tsx @@ -2,7 +2,10 @@ import type { MutationHookContext, HookFetcherContext, } from '@vercel/commerce/utils/types' -import type { Address, RemoveItemHook } from '@vercel/commerce/types/customer/address' +import type { + Address, + RemoveItemHook, +} from '@vercel/commerce/types/customer/address' import { useCallback } from 'react' @@ -25,7 +28,7 @@ export default useRemoveItem as UseRemoveItem export const handler = { fetchOptions: { - url: '/api/customer/address', + url: '/api/commerce/customer/address', method: 'DELETE', }, async fetcher({ diff --git a/packages/ordercloud/src/customer/address/use-update-item.tsx b/packages/ordercloud/src/customer/address/use-update-item.tsx index d65956b7b..a657c4293 100644 --- a/packages/ordercloud/src/customer/address/use-update-item.tsx +++ b/packages/ordercloud/src/customer/address/use-update-item.tsx @@ -2,7 +2,10 @@ import type { HookFetcherContext, MutationHookContext, } from '@vercel/commerce/utils/types' -import type { UpdateItemHook, Address } from '@vercel/commerce/types/customer/address' +import type { + UpdateItemHook, + Address, +} from '@vercel/commerce/types/customer/address' import { useCallback } from 'react' @@ -21,7 +24,7 @@ export default useUpdateItem as UseUpdateItem export const handler: MutationHook = { fetchOptions: { - url: '/api/customer/address', + url: '/api/commerce/customer/address', method: 'PUT', }, async fetcher({ diff --git a/packages/ordercloud/src/customer/card/use-add-item.tsx b/packages/ordercloud/src/customer/card/use-add-item.tsx index 8e7d27885..3cfc1eebe 100644 --- a/packages/ordercloud/src/customer/card/use-add-item.tsx +++ b/packages/ordercloud/src/customer/card/use-add-item.tsx @@ -2,14 +2,16 @@ import type { AddItemHook } from '@vercel/commerce/types/customer/card' import type { MutationHook } from '@vercel/commerce/utils/types' import { useCallback } from 'react' -import useAddItem, { UseAddItem } from '@vercel/commerce/customer/card/use-add-item' +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/card/use-add-item' import useCards from './use-cards' export default useAddItem as UseAddItem export const handler: MutationHook = { fetchOptions: { - url: '/api/customer/card', + url: '/api/commerce/customer/card', method: 'POST', }, async fetcher({ input: item, options, fetch }) { diff --git a/packages/ordercloud/src/customer/card/use-cards.tsx b/packages/ordercloud/src/customer/card/use-cards.tsx index 6438543e1..ef5fc5282 100644 --- a/packages/ordercloud/src/customer/card/use-cards.tsx +++ b/packages/ordercloud/src/customer/card/use-cards.tsx @@ -8,7 +8,7 @@ export default useCard as UseCards export const handler: SWRHook = { fetchOptions: { - url: '/api/customer/card', + url: '/api/commerce/customer/card', method: 'GET', }, useHook: ({ useData }) => diff --git a/packages/ordercloud/src/customer/card/use-remove-item.tsx b/packages/ordercloud/src/customer/card/use-remove-item.tsx index 23979bf3f..dec68c91c 100644 --- a/packages/ordercloud/src/customer/card/use-remove-item.tsx +++ b/packages/ordercloud/src/customer/card/use-remove-item.tsx @@ -25,7 +25,7 @@ export default useRemoveItem as UseRemoveItem export const handler = { fetchOptions: { - url: '/api/customer/card', + url: '/api/commerce/customer/card', method: 'DELETE', }, async fetcher({ diff --git a/packages/ordercloud/src/customer/card/use-update-item.tsx b/packages/ordercloud/src/customer/card/use-update-item.tsx index faa900744..73d792af0 100644 --- a/packages/ordercloud/src/customer/card/use-update-item.tsx +++ b/packages/ordercloud/src/customer/card/use-update-item.tsx @@ -21,7 +21,7 @@ export default useUpdateItem as UseUpdateItem export const handler: MutationHook = { fetchOptions: { - url: '/api/customer/card', + url: '/api/commerce/customer/card', method: 'PUT', }, async fetcher({ diff --git a/packages/ordercloud/src/product/use-search.tsx b/packages/ordercloud/src/product/use-search.tsx index 0cb54e92c..83d5373c1 100644 --- a/packages/ordercloud/src/product/use-search.tsx +++ b/packages/ordercloud/src/product/use-search.tsx @@ -5,7 +5,7 @@ export default useSearch as UseSearch export const handler: SWRHook = { fetchOptions: { - url: '/api/catalog/products', + url: '/api/commerce/catalog/products', method: 'GET', }, fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { diff --git a/packages/saleor/src/api/endpoints/cart.ts b/packages/saleor/src/api/endpoints/cart.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/saleor/src/api/endpoints/cart.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/catalog/products.ts b/packages/saleor/src/api/endpoints/catalog/products.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/saleor/src/api/endpoints/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/customer/address.ts b/packages/saleor/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/saleor/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/saleor/src/api/endpoints/customer/card.ts b/packages/saleor/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/saleor/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/saleor/src/api/endpoints/customer/index.ts b/packages/saleor/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/saleor/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/saleor/src/api/endpoints/index.ts b/packages/saleor/src/api/endpoints/index.ts new file mode 100644 index 000000000..16d8705a3 --- /dev/null +++ b/packages/saleor/src/api/endpoints/index.ts @@ -0,0 +1,14 @@ +import type { Provider, SaleorAPI } from '..' + +import handleEndpoints from '@vercel/commerce/api/endpoints' + +import checkout from './checkout' + +const endpoints = { + checkout, +} + +const handler = (commerce: SaleorAPI) => + handleEndpoints(commerce, endpoints) + +export default handler diff --git a/packages/saleor/src/api/endpoints/login.ts b/packages/saleor/src/api/endpoints/login.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/saleor/src/api/endpoints/login.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/logout.ts b/packages/saleor/src/api/endpoints/logout.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/saleor/src/api/endpoints/logout.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/signup.ts b/packages/saleor/src/api/endpoints/signup.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/saleor/src/api/endpoints/signup.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/wishlist.ts b/packages/saleor/src/api/endpoints/wishlist.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/saleor/src/api/endpoints/wishlist.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/saleor/src/fetcher.ts b/packages/saleor/src/fetcher.ts index c1be921c5..4e7c5f194 100644 --- a/packages/saleor/src/fetcher.ts +++ b/packages/saleor/src/fetcher.ts @@ -2,7 +2,12 @@ import { Fetcher } from '@vercel/commerce/utils/types' import { API_URL } from './const' import { getToken, handleFetchResponse } from './utils' -const fetcher: Fetcher = async ({ url = API_URL, method = 'POST', variables, query }) => { +const fetcher: Fetcher = async ({ + url = API_URL, + method = 'POST', + variables, + query, +}) => { const token = getToken() return handleFetchResponse( diff --git a/packages/sfcc/src/api/endpoints/cart/index.ts b/packages/sfcc/src/api/endpoints/cart/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/cart/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/checkout/index.ts b/packages/sfcc/src/api/endpoints/checkout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/checkout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/customer/address.ts b/packages/sfcc/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/customer/card.ts b/packages/sfcc/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/customer/index.ts b/packages/sfcc/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/index.ts b/packages/sfcc/src/api/endpoints/index.ts new file mode 100644 index 000000000..55466ced4 --- /dev/null +++ b/packages/sfcc/src/api/endpoints/index.ts @@ -0,0 +1,14 @@ +import type { Provider, SFCCProviderAPI } from '..' + +import handleEndpoints from '@vercel/commerce/api/endpoints' + +import products from './catalog/products' + +const endpoints = { + 'catalog/products': products, +} + +const handler = (commerce: SFCCProviderAPI) => + handleEndpoints(commerce, endpoints) + +export default handler diff --git a/packages/sfcc/src/api/endpoints/login/index.ts b/packages/sfcc/src/api/endpoints/login/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/login/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/logout/index.ts b/packages/sfcc/src/api/endpoints/logout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/logout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/signup/index.ts b/packages/sfcc/src/api/endpoints/signup/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/signup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/wishlist/index.tsx b/packages/sfcc/src/api/endpoints/wishlist/index.tsx deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/sfcc/src/api/endpoints/wishlist/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/product/use-search.tsx b/packages/sfcc/src/product/use-search.tsx index bb5e97160..65d0d8742 100644 --- a/packages/sfcc/src/product/use-search.tsx +++ b/packages/sfcc/src/product/use-search.tsx @@ -5,7 +5,7 @@ export default useSearch as UseSearch export const handler: SWRHook = { fetchOptions: { - url: '/api/catalog/products', + url: '/api/commerce/catalog/products', method: 'GET', }, fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { diff --git a/packages/shopify/src/api/endpoints/cart.ts b/packages/shopify/src/api/endpoints/cart.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/shopify/src/api/endpoints/cart.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/customer/address.ts b/packages/shopify/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/shopify/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/shopify/src/api/endpoints/customer/card.ts b/packages/shopify/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/shopify/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/shopify/src/api/endpoints/customer/index.ts b/packages/shopify/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/shopify/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/shopify/src/api/endpoints/index.ts b/packages/shopify/src/api/endpoints/index.ts new file mode 100644 index 000000000..e844f8e31 --- /dev/null +++ b/packages/shopify/src/api/endpoints/index.ts @@ -0,0 +1,12 @@ +import type { Provider, ShopifyAPI } from '..' +import handleEndopints from '@vercel/commerce/api/endpoints' +import checkout from './checkout' + +const endpoints = { + checkout, +} + +const handler = (commerce: ShopifyAPI) => + handleEndopints(commerce, endpoints) + +export default handler diff --git a/packages/shopify/src/api/endpoints/login.ts b/packages/shopify/src/api/endpoints/login.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/shopify/src/api/endpoints/login.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/logout.ts b/packages/shopify/src/api/endpoints/logout.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/shopify/src/api/endpoints/logout.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/signup.ts b/packages/shopify/src/api/endpoints/signup.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/shopify/src/api/endpoints/signup.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/wishlist.ts b/packages/shopify/src/api/endpoints/wishlist.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/shopify/src/api/endpoints/wishlist.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/spree/src/api/endpoints/cart/index.ts b/packages/spree/src/api/endpoints/cart/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/cart/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/catalog/index.ts b/packages/spree/src/api/endpoints/catalog/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/catalog/products.ts b/packages/spree/src/api/endpoints/catalog/products.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/customer/address.ts b/packages/spree/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/customer/card.ts b/packages/spree/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/customer/index.ts b/packages/spree/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/index.ts b/packages/spree/src/api/endpoints/index.ts new file mode 100644 index 000000000..943a17c93 --- /dev/null +++ b/packages/spree/src/api/endpoints/index.ts @@ -0,0 +1,12 @@ +import type { SpreeApiProvider, SpreeApi } from '..' +import handleEndopints from '@vercel/commerce/api/endpoints' +import checkout from './checkout' + +const endpoints = { + checkout, +} + +const handler = (commerce: SpreeApi) => + handleEndopints(commerce, endpoints) + +export default handler diff --git a/packages/spree/src/api/endpoints/login/index.ts b/packages/spree/src/api/endpoints/login/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/login/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/logout/index.ts b/packages/spree/src/api/endpoints/logout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/logout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/signup/index.ts b/packages/spree/src/api/endpoints/signup/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/signup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/wishlist/index.tsx b/packages/spree/src/api/endpoints/wishlist/index.tsx deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/spree/src/api/endpoints/wishlist/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/cart.ts b/packages/swell/src/api/endpoints/cart.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/swell/src/api/endpoints/cart.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/catalog/products.ts b/packages/swell/src/api/endpoints/catalog/products.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/swell/src/api/endpoints/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/customer/address.ts b/packages/swell/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/swell/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/customer/card.ts b/packages/swell/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/swell/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/customer/index.ts b/packages/swell/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/swell/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/index.ts b/packages/swell/src/api/endpoints/index.ts new file mode 100644 index 000000000..ef5718827 --- /dev/null +++ b/packages/swell/src/api/endpoints/index.ts @@ -0,0 +1,12 @@ +import type { Provider, SwellAPI } from '..' +import handleEndopints from '@vercel/commerce/api/endpoints' +import checkout from './checkout' + +const endpoints = { + checkout, +} + +const handler = (commerce: SwellAPI) => + handleEndopints(commerce, endpoints) + +export default handler diff --git a/packages/swell/src/api/endpoints/login.ts b/packages/swell/src/api/endpoints/login.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/swell/src/api/endpoints/login.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/logout.ts b/packages/swell/src/api/endpoints/logout.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/swell/src/api/endpoints/logout.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/signup.ts b/packages/swell/src/api/endpoints/signup.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/swell/src/api/endpoints/signup.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/wishlist.ts b/packages/swell/src/api/endpoints/wishlist.ts deleted file mode 100644 index d09c976c3..000000000 --- a/packages/swell/src/api/endpoints/wishlist.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (_commerce: any) {} diff --git a/packages/swell/src/api/index.ts b/packages/swell/src/api/index.ts index 589acae4e..5cdbbaaf3 100644 --- a/packages/swell/src/api/index.ts +++ b/packages/swell/src/api/index.ts @@ -46,6 +46,8 @@ export const provider = { config, operations } export type Provider = typeof provider +export type SwellAPI

= CommerceAPI

+ export function getCommerceApi

( customProvider: P = provider as any ): CommerceAPI

{ diff --git a/packages/vendure/src/api/endpoints/cart/index.ts b/packages/vendure/src/api/endpoints/cart/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/cart/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/catalog/index.ts b/packages/vendure/src/api/endpoints/catalog/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/catalog/products.ts b/packages/vendure/src/api/endpoints/catalog/products.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/customer/address.ts b/packages/vendure/src/api/endpoints/customer/address.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/customer/address.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/customer/card.ts b/packages/vendure/src/api/endpoints/customer/card.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/customer/card.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/customer/index.ts b/packages/vendure/src/api/endpoints/customer/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/customer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/index.ts b/packages/vendure/src/api/endpoints/index.ts new file mode 100644 index 000000000..0d9bee9aa --- /dev/null +++ b/packages/vendure/src/api/endpoints/index.ts @@ -0,0 +1,12 @@ +import type { Provider, VendureAPI } from '..' +import handleEndopints from '@vercel/commerce/api/endpoints' +import checkout from './checkout' + +const endpoints = { + checkout, +} + +const handler = (commerce: VendureAPI) => + handleEndopints(commerce, endpoints) + +export default handler diff --git a/packages/vendure/src/api/endpoints/login/index.ts b/packages/vendure/src/api/endpoints/login/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/login/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/logout/index.ts b/packages/vendure/src/api/endpoints/logout/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/logout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/signup/index.ts b/packages/vendure/src/api/endpoints/signup/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/signup/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/wishlist/index.tsx b/packages/vendure/src/api/endpoints/wishlist/index.tsx deleted file mode 100644 index 491bf0ac9..000000000 --- a/packages/vendure/src/api/endpoints/wishlist/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/index.ts b/packages/vendure/src/api/index.ts index cbe56be56..41c0189be 100644 --- a/packages/vendure/src/api/index.ts +++ b/packages/vendure/src/api/index.ts @@ -49,6 +49,8 @@ export const provider = { config, operations } export type Provider = typeof provider +export type VendureAPI

= CommerceAPI

+ export function getCommerceApi

( customProvider: P = provider as any ): CommerceAPI

{ diff --git a/site/lib/api/commerce.ts b/site/lib/api/commerce.ts index 499137004..db81f6543 100644 --- a/site/lib/api/commerce.ts +++ b/site/lib/api/commerce.ts @@ -1,3 +1,2 @@ import { getCommerceApi } from '@framework/api' - export default getCommerceApi() diff --git a/site/pages/api/cart.ts b/site/pages/api/cart.ts deleted file mode 100644 index 642891107..000000000 --- a/site/pages/api/cart.ts +++ /dev/null @@ -1,4 +0,0 @@ -import cartApi from '@framework/api/endpoints/cart' -import commerce from '@lib/api/commerce' - -export default cartApi(commerce) diff --git a/site/pages/api/catalog/products.ts b/site/pages/api/catalog/products.ts deleted file mode 100644 index 631bfd516..000000000 --- a/site/pages/api/catalog/products.ts +++ /dev/null @@ -1,4 +0,0 @@ -import productsApi from '@framework/api/endpoints/catalog/products' -import commerce from '@lib/api/commerce' - -export default productsApi(commerce) diff --git a/site/pages/api/checkout.ts b/site/pages/api/checkout.ts deleted file mode 100644 index 7bf0fd9aa..000000000 --- a/site/pages/api/checkout.ts +++ /dev/null @@ -1,4 +0,0 @@ -import checkoutApi from '@framework/api/endpoints/checkout' -import commerce from '@lib/api/commerce' - -export default checkoutApi(commerce) diff --git a/site/pages/api/commerce/[[...commerce]].ts b/site/pages/api/commerce/[[...commerce]].ts new file mode 100644 index 000000000..b096ad1c9 --- /dev/null +++ b/site/pages/api/commerce/[[...commerce]].ts @@ -0,0 +1,4 @@ +import commerce from '@lib/api/commerce' +import endpoints from '@framework/api/endpoints' + +export default endpoints(commerce) diff --git a/site/pages/api/customer/address.ts b/site/pages/api/customer/address.ts deleted file mode 100644 index 5815ea462..000000000 --- a/site/pages/api/customer/address.ts +++ /dev/null @@ -1,4 +0,0 @@ -import customerAddressApi from '@framework/api/endpoints/customer/address' -import commerce from '@lib/api/commerce' - -export default customerAddressApi(commerce) diff --git a/site/pages/api/customer/card.ts b/site/pages/api/customer/card.ts deleted file mode 100644 index 6f88b8c74..000000000 --- a/site/pages/api/customer/card.ts +++ /dev/null @@ -1,4 +0,0 @@ -import customerCardApi from '@framework/api/endpoints/customer/card' -import commerce from '@lib/api/commerce' - -export default customerCardApi(commerce) diff --git a/site/pages/api/customer/index.ts b/site/pages/api/customer/index.ts deleted file mode 100644 index 0c86e76e5..000000000 --- a/site/pages/api/customer/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import customerApi from '@framework/api/endpoints/customer' -import commerce from '@lib/api/commerce' - -export default customerApi(commerce) diff --git a/site/pages/api/login.ts b/site/pages/api/login.ts deleted file mode 100644 index 9d0b6ae57..000000000 --- a/site/pages/api/login.ts +++ /dev/null @@ -1,4 +0,0 @@ -import loginApi from '@framework/api/endpoints/login' -import commerce from '@lib/api/commerce' - -export default loginApi(commerce) diff --git a/site/pages/api/logout.ts b/site/pages/api/logout.ts deleted file mode 100644 index 0cf0fc4d2..000000000 --- a/site/pages/api/logout.ts +++ /dev/null @@ -1,4 +0,0 @@ -import logoutApi from '@framework/api/endpoints/logout' -import commerce from '@lib/api/commerce' - -export default logoutApi(commerce) diff --git a/site/pages/api/signup.ts b/site/pages/api/signup.ts deleted file mode 100644 index e19d67ee8..000000000 --- a/site/pages/api/signup.ts +++ /dev/null @@ -1,4 +0,0 @@ -import singupApi from '@framework/api/endpoints/signup' -import commerce from '@lib/api/commerce' - -export default singupApi(commerce) diff --git a/site/pages/api/wishlist.ts b/site/pages/api/wishlist.ts deleted file mode 100644 index 3b9681209..000000000 --- a/site/pages/api/wishlist.ts +++ /dev/null @@ -1,4 +0,0 @@ -import wishlistApi from '@framework/api/endpoints/wishlist' -import commerce from '@lib/api/commerce' - -export default wishlistApi(commerce)