diff --git a/framework/reactioncommerce/api/cart/index.ts b/framework/reactioncommerce/api/cart/index.ts deleted file mode 100644 index 0e8e02507..000000000 --- a/framework/reactioncommerce/api/cart/index.ts +++ /dev/null @@ -1,60 +0,0 @@ -import isAllowedMethod from '../utils/is-allowed-method' -import createApiHandler, { - ReactionCommerceApiHandler, - ReactionCommerceHandler, -} from '../utils/create-api-handler' -import { ReactionCommerceApiError } from '../utils/errors' -import getCart from './handlers/get-cart' -import addItem from './handlers/add-item' -import type { - Cart, - GetCartHandlerBody, - AddCartItemHandlerBody, -} from '../../types' - -export type CartHandlers = { - getCart: ReactionCommerceHandler - addItem: ReactionCommerceHandler -} - -const METHODS = ['GET', 'POST'] - -// TODO: a complete implementation should have schema validation for `req.body` -const cartApi: ReactionCommerceApiHandler = async ( - req, - res, - config, - handlers -) => { - if (!isAllowedMethod(req, res, METHODS)) return - - const { cookies } = req - const cartId = cookies[config.anonymousCartTokenCookie] - - try { - // Return current cart info - if (req.method === 'GET') { - const body = { cartId } - return await handlers['getCart']({ req, res, config, body }) - } - - // Create or add an item to the cart - if (req.method === 'POST') { - const body = { ...req.body, cartId } - return await handlers['addItem']({ req, res, config, body }) - } - } catch (error) { - console.error(error) - - const message = - error instanceof ReactionCommerceApiError - ? 'An unexpected error occurred with the Reaction Commerce API' - : 'An unexpected error occurred' - - res.status(500).json({ data: null, errors: [{ message }] }) - } -} - -export const handlers = { getCart, addItem } - -export default createApiHandler(cartApi, handlers, {}) diff --git a/framework/reactioncommerce/api/catalog/index.ts b/framework/reactioncommerce/api/catalog/index.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/catalog/products.ts b/framework/reactioncommerce/api/catalog/products.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/checkout/index.ts b/framework/reactioncommerce/api/checkout/index.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/checkout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/customers/index.ts b/framework/reactioncommerce/api/customers/index.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/customers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/customers/login.ts b/framework/reactioncommerce/api/customers/login.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/customers/login.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/customers/logout.ts b/framework/reactioncommerce/api/customers/logout.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/customers/logout.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/customers/signup.ts b/framework/reactioncommerce/api/customers/signup.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/reactioncommerce/api/customers/signup.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/reactioncommerce/api/cart/handlers/add-item.ts b/framework/reactioncommerce/api/endpoints/cart/add-item.ts similarity index 97% rename from framework/reactioncommerce/api/cart/handlers/add-item.ts rename to framework/reactioncommerce/api/endpoints/cart/add-item.ts index 8d17b8458..d80e777a1 100644 --- a/framework/reactioncommerce/api/cart/handlers/add-item.ts +++ b/framework/reactioncommerce/api/endpoints/cart/add-item.ts @@ -1,4 +1,3 @@ -import type { CartHandlers } from '..' import { addCartItemsMutation, createCartMutation, @@ -10,8 +9,9 @@ import { REACTION_CART_ID_COOKIE, REACTION_CUSTOMER_TOKEN_COOKIE, } from '@framework/const' +import type { CartEndpoint } from '.' -const addItem: CartHandlers['addItem'] = async ({ +const addItem: CartEndpoint['handlers']['addItem'] = async ({ req: { cookies }, res, body: { item }, diff --git a/framework/reactioncommerce/api/cart/handlers/get-cart.ts b/framework/reactioncommerce/api/endpoints/cart/get-cart.ts similarity index 94% rename from framework/reactioncommerce/api/cart/handlers/get-cart.ts rename to framework/reactioncommerce/api/endpoints/cart/get-cart.ts index f322bb669..932bdf700 100644 --- a/framework/reactioncommerce/api/cart/handlers/get-cart.ts +++ b/framework/reactioncommerce/api/endpoints/cart/get-cart.ts @@ -1,4 +1,3 @@ -import type { CartHandlers } from '../' import getAnonymousCartQuery from '@framework/utils/queries/get-anonymous-cart' import accountCartByAccountIdQuery from '@framework/utils/queries/account-cart-by-account-id' import getCartCookie from '@framework/api/utils/get-cart-cookie' @@ -10,9 +9,13 @@ import { REACTION_CUSTOMER_TOKEN_COOKIE, } from '@framework/const' import { normalizeCart } from '@framework/utils' +import type { CartEndpoint } from '.' -// Return current cart info -const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => { +const getCart: CartEndpoint['handlers']['getCart'] = async ({ + req, + res, + config, +}) => { const { cookies: { [REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken, diff --git a/framework/reactioncommerce/api/endpoints/cart/index.ts b/framework/reactioncommerce/api/endpoints/cart/index.ts new file mode 100644 index 000000000..15b28ba01 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/cart/index.ts @@ -0,0 +1,21 @@ +import { CommerceAPI, createEndpoint, GetAPISchema } from '@commerce/api' +import cartEndpoint from '@commerce/api/endpoints/cart' +import type { CartSchema } from '@commerce/types/cart' +import getCart from './get-cart' +import addItem from './add-item' + +export type CartAPI = GetAPISchema + +export type CartEndpoint = CartAPI['endpoint'] + +export const handlers: CartEndpoint['handlers'] = { + getCart, + addItem, +} + +const cartApi = createEndpoint({ + handler: cartEndpoint, + handlers, +}) + +export default cartApi diff --git a/framework/reactioncommerce/api/endpoints/catalog/index.ts b/framework/reactioncommerce/api/endpoints/catalog/index.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/catalog/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/endpoints/catalog/products.ts b/framework/reactioncommerce/api/endpoints/catalog/products.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/catalog/products.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/endpoints/checkout/index.ts b/framework/reactioncommerce/api/endpoints/checkout/index.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/checkout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/endpoints/customers/index.ts b/framework/reactioncommerce/api/endpoints/customers/index.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/customers/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/endpoints/customers/login.ts b/framework/reactioncommerce/api/endpoints/customers/login.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/customers/login.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/endpoints/customers/logout.ts b/framework/reactioncommerce/api/endpoints/customers/logout.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/customers/logout.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/endpoints/customers/signup.ts b/framework/reactioncommerce/api/endpoints/customers/signup.ts new file mode 100644 index 000000000..491bf0ac9 --- /dev/null +++ b/framework/reactioncommerce/api/endpoints/customers/signup.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/framework/reactioncommerce/api/index.ts b/framework/reactioncommerce/api/index.ts index 0ec59fe67..2d9d4ba6d 100644 --- a/framework/reactioncommerce/api/index.ts +++ b/framework/reactioncommerce/api/index.ts @@ -1,5 +1,8 @@ -import type { CommerceAPIConfig } from '@commerce/api' - +import { + CommerceAPI, + CommerceAPIConfig, + getCommerceApi as commerceApi, +} from '@commerce/api' import { API_URL, REACTION_ANONYMOUS_CART_TOKEN_COOKIE, @@ -17,6 +20,15 @@ if (!API_URL) { } import fetchGraphqlApi from './utils/fetch-graphql-api' +import login from './operations/login' +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' +import type { CartAPI } from './endpoints/cart' export interface ReactionCommerceConfig extends Omit { @@ -27,26 +39,7 @@ export interface ReactionCommerceConfig anonymousCartTokenCookieMaxAge?: number } -export class Config { - private config: ReactionCommerceConfig - - constructor(config: ReactionCommerceConfig) { - this.config = config - } - - getConfig(userConfig: Partial = {}) { - return Object.entries(userConfig).reduce( - (cfg, [key, value]) => Object.assign(cfg, { [key]: value }), - { ...this.config } - ) - } - - setConfig(newConfig: Partial) { - Object.assign(this.config, newConfig) - } -} - -const config = new Config({ +const config: ReactionCommerceConfig = { locale: 'en-US', commerceUrl: API_URL, cartCookie: REACTION_ANONYMOUS_CART_TOKEN_COOKIE, @@ -58,12 +51,29 @@ const config = new Config({ fetch: fetchGraphqlApi, customerCookie: REACTION_CUSTOMER_TOKEN_COOKIE, shopId: SHOP_ID, -}) - -export function getConfig(userConfig?: Partial) { - return config.getConfig(userConfig) } -export function setConfig(newConfig: Partial) { - return config.setConfig(newConfig) +const operations = { + login, + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider + +export type APIs = CartAPI + +export type ReactionCommerceAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): ReactionCommerceAPI

{ + return commerceApi(customProvider) } diff --git a/framework/reactioncommerce/api/operations/get-all-pages.ts b/framework/reactioncommerce/api/operations/get-all-pages.ts new file mode 100644 index 000000000..9be281413 --- /dev/null +++ b/framework/reactioncommerce/api/operations/get-all-pages.ts @@ -0,0 +1,40 @@ +import { ReactionCommerceConfig } from '../' +import { OperationContext } from '@commerce/api/operations' +import { Provider } from '@commerce' + +export type Page = any + +export type GetAllPagesResult = + T + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + async function getAllPages(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getAllPages(opts: { + url: string + config?: Partial + preview?: boolean + }): Promise> + + async function getAllPages({ + config: cfg, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + + return { + pages: [], + } + } + + return getAllPages +} diff --git a/framework/reactioncommerce/api/operations/get-all-product-paths.ts b/framework/reactioncommerce/api/operations/get-all-product-paths.ts new file mode 100644 index 000000000..556d9e5c5 --- /dev/null +++ b/framework/reactioncommerce/api/operations/get-all-product-paths.ts @@ -0,0 +1,52 @@ +import { OperationContext, OperationOptions } from '@commerce/api/operations' +import type { CatalogItem } from '../../schema' +import { Provider } from '../index' +import getAllProductsPathsQuery from '../../utils/queries/get-all-products-paths-query' +import { GetAllProductPathsOperation } from '@commerce/types/product' +import { ReactionCommerceConfig } from '..' + +export type GetAllProductPathsResult = { + products: Array<{ node: { path: string } }> +} + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths< + T extends GetAllProductPathsOperation + >(opts?: { + variables?: T['variables'] + config?: ReactionCommerceConfig + }): Promise + + async function getAllProductPaths( + opts: { + variables?: T['variables'] + config?: ReactionCommerceConfig + } & OperationOptions + ): Promise + + async function getAllProductPaths({ + query = getAllProductsPathsQuery, + variables, + config: cfg, + }: { + query?: string + variables?: T['variables'] + config?: ReactionCommerceConfig + } = {}): Promise { + const config = commerce.getConfig(cfg) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `query` + const { data } = await config.fetch(query, { + variables, + }) + const products = data.products.items + + return { + products: products.map((p) => ({ path: `/${p.slug}` })), + } + } + + return getAllProductPaths +} diff --git a/framework/reactioncommerce/api/operations/get-all-products.ts b/framework/reactioncommerce/api/operations/get-all-products.ts new file mode 100644 index 000000000..3dadf8e88 --- /dev/null +++ b/framework/reactioncommerce/api/operations/get-all-products.ts @@ -0,0 +1,48 @@ +import { Product } from '@commerce/types/product' +import { OperationContext } from '@commerce/api/operations' +import { normalizeProduct } from '@framework/utils' +import catalogItemsQuery from '../../utils/queries/catalog-items-query' +import { CatalogItemConnection } from '../../schema' +import { Provider, ReactionCommerceConfig } from '..' + +export type ProductVariables = { + first?: number + shopIds?: string[] +} + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts(opts?: { + variables?: ProductVariables + config?: Partial + preview?: boolean + }): Promise<{ products: Product[] }> + + async function getAllProducts({ + query = catalogItemsQuery, + variables: { ...vars } = { first: 250 }, + config: cfg, + }: { + query?: string + variables?: ProductVariables + config?: Partial + preview?: boolean + } = {}): Promise<{ products: Product[] | any[] }> { + const config = commerce.getConfig(cfg) + const { data } = await config.fetch(query, { + variables: { + ...vars, + shopIds: [config.shopId], + }, + }) + + return { + products: + data.catalogItems?.edges?.map((item) => normalizeProduct(item?.node)) || + [], + } + } + + return getAllProducts +} diff --git a/framework/reactioncommerce/api/operations/get-customer-wishlist.ts b/framework/reactioncommerce/api/operations/get-customer-wishlist.ts new file mode 100644 index 000000000..0040ef36d --- /dev/null +++ b/framework/reactioncommerce/api/operations/get-customer-wishlist.ts @@ -0,0 +1,23 @@ +import { OperationContext } from '@commerce/api/operations' +import { Provider, VendureConfig } from '../' + +export default function getCustomerWishlistOperation({ + commerce, +}: OperationContext) { + async function getCustomerWishlist({ + config: cfg, + variables, + includeProducts, + }: { + url?: string + variables: any + config?: Partial + includeProducts?: boolean + }): Promise { + // Not implemented as Vendure does not ship with wishlist functionality at present + const config = commerce.getConfig(cfg) + return { wishlist: {} } + } + + return getCustomerWishlist +} diff --git a/framework/reactioncommerce/api/operations/get-page.ts b/framework/reactioncommerce/api/operations/get-page.ts index 7fd1ddb7f..8c098517b 100644 --- a/framework/reactioncommerce/api/operations/get-page.ts +++ b/framework/reactioncommerce/api/operations/get-page.ts @@ -1,5 +1,6 @@ -import { Page } from '../../schema' -import { ReactionCommerceConfig, getConfig } from '..' +import { OperationContext } from '@commerce/api/operations' +import { Page } from '../../common/get-all-pages' +import { ReactionCommerceConfig, Provider } from '..' export type GetPageResult = T @@ -7,19 +8,37 @@ export type PageVariables = { id: string } -async function getPage({ - url, - variables, - config, - preview, -}: { - url?: string - variables: PageVariables - config?: ReactionCommerceConfig - preview?: boolean -}): Promise { - config = getConfig(config) - return {} -} +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage(opts: { + url?: string + variables: PageVariables + config?: ReactionCommerceConfig + preview?: boolean + }): Promise -export default getPage + async function getPage(opts: { + url: string + variables: V + config?: Partial + preview?: boolean + }): Promise> + + async function getPage({ + url, + variables, + config: cfg, + preview, + }: { + url?: string + variables: PageVariables + config?: Partial + preview?: boolean + }): Promise { + const config = commerce.getConfig(cfg) + return {} + } + + return getPage +} diff --git a/framework/reactioncommerce/api/operations/get-product.ts b/framework/reactioncommerce/api/operations/get-product.ts new file mode 100644 index 000000000..4ab9ed2d9 --- /dev/null +++ b/framework/reactioncommerce/api/operations/get-product.ts @@ -0,0 +1,69 @@ +import { Product } from '@commerce/types/product' +import { OperationContext } from '@commerce/api/operations' +import { Provider, VendureConfig } from '../' +import { GetProductQuery } from '../../schema' +import { getProductQuery } from '../../utils/queries/get-product-query' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + query = getProductQuery, + variables, + config: cfg, + }: { + query?: string + variables: { slug: string } + config?: Partial + preview?: boolean + }): Promise { + const config = commerce.getConfig(cfg) + + const locale = config.locale + const { data } = await config.fetch(query, { variables }) + const product = data.product + + if (product) { + const getOptionGroupName = (id: string): string => { + return product.optionGroups.find((og) => og.id === id)!.name + } + return { + product: { + id: product.id, + name: product.name, + description: product.description, + slug: product.slug, + images: product.assets.map((a) => ({ + url: a.preview, + alt: a.name, + })), + variants: product.variants.map((v) => ({ + id: v.id, + options: v.options.map((o) => ({ + // This __typename property is required in order for the correct + // variant selection to work, see `components/product/helpers.ts` + // `getVariant()` function. + __typename: 'MultipleChoiceOption', + id: o.id, + displayName: getOptionGroupName(o.groupId), + values: [{ label: o.name }], + })), + })), + price: { + value: product.variants[0].priceWithTax / 100, + currencyCode: product.variants[0].currencyCode, + }, + options: product.optionGroups.map((og) => ({ + id: og.id, + displayName: og.name, + values: og.options.map((o) => ({ label: o.name })), + })), + } as Product, + } + } + + return {} + } + + return getProduct +} diff --git a/framework/reactioncommerce/api/operations/get-site-info.ts b/framework/reactioncommerce/api/operations/get-site-info.ts new file mode 100644 index 000000000..d09965dc8 --- /dev/null +++ b/framework/reactioncommerce/api/operations/get-site-info.ts @@ -0,0 +1,41 @@ +import { Provider, ReactionCommerceConfig } from '../' +import { GetCollectionsQuery } from '../../schema' +import getCollectionsQuery from '../../utils/queries/get-all-collections-query' +import { OperationContext } from '@commerce/api/operations' +import { Category } from '@commerce/types/site' +import getCategories from '../../utils/get-categories' +import getVendors from '../../utils/get-vendors' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo({ + query = getCollectionsQuery, + variables, + config: cfg, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + + const categories = await getCategories(config) + const brands = await getVendors(config) + + return { + categories: categories ?? [], + brands, + } + } + + return getSiteInfo +} diff --git a/framework/reactioncommerce/api/operations/login.ts b/framework/reactioncommerce/api/operations/login.ts new file mode 100644 index 000000000..5557235dd --- /dev/null +++ b/framework/reactioncommerce/api/operations/login.ts @@ -0,0 +1,52 @@ +import type { ServerResponse } from 'http' +import type { + OperationContext, + OperationOptions, +} from '@commerce/api/operations' +import { ValidationError } from '@commerce/utils/errors' +import type { LoginOperation } from '../../types/login' +import type { MutationAuthenticateArgs } from '../../schema' +import { Provider, ReactionCommerceConfig } from '..' +import loginMutation from '../../utils/mutations/authenticate' + +export default function loginOperation({ + commerce, +}: OperationContext) { + async function login(opts: { + variables: T['variables'] + config?: Partial + res: ServerResponse + }): Promise + + async function login( + opts: { + variables: T['variables'] + config?: Partial + res: ServerResponse + } & OperationOptions + ): Promise + + async function login({ + query = loginMutation, + variables, + res: response, + config: cfg, + }: { + query?: string + variables: T['variables'] + res: ServerResponse + config?: Partial + }): Promise { + const config = commerce.getConfig(cfg) + + const { data, res } = await config.fetch(query, { + variables, + }) + + return { + result: data.authenticate?.tokens?.accessToken, + } + } + + return login +} diff --git a/framework/reactioncommerce/cart/use-cart.tsx b/framework/reactioncommerce/cart/use-cart.tsx index b2bb66fec..89ce14c70 100644 --- a/framework/reactioncommerce/cart/use-cart.tsx +++ b/framework/reactioncommerce/cart/use-cart.tsx @@ -13,29 +13,31 @@ export const handler: SWRHook< > = { fetchOptions: { method: 'GET', - url: '/api/reactioncommerce/cart', + url: '/api/cart', }, async fetcher({ input: { cartId }, options, fetch }) { console.log('cart API fetcher', options) const data = await fetch(options) return data }, - 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/framework/reactioncommerce/common/get-site-info.ts b/framework/reactioncommerce/common/get-site-info.ts index 4fcf8868f..15bf6551d 100644 --- a/framework/reactioncommerce/common/get-site-info.ts +++ b/framework/reactioncommerce/common/get-site-info.ts @@ -1,7 +1,7 @@ +import commerce from '@lib/api/commerce' import getCategories, { Category } from '../utils/get-categories' import getVendors, { Brands } from '../utils/get-vendors' - -import { getConfig, ReactionCommerceConfig } from '../api' +import { ReactionCommerceConfig } from '../api' export type GetSiteInfoResult< T extends { categories: any[]; brands: any[] } = { @@ -17,7 +17,7 @@ const getSiteInfo = async (options?: { }): Promise => { let { config } = options ?? {} - config = getConfig(config) + config = commerce.getConfig(config) const categories = await getCategories(config) const brands = await getVendors(config) diff --git a/framework/reactioncommerce/utils/get-categories.ts b/framework/reactioncommerce/utils/get-categories.ts index 170e5cb2f..fe1c685a7 100644 --- a/framework/reactioncommerce/utils/get-categories.ts +++ b/framework/reactioncommerce/utils/get-categories.ts @@ -26,6 +26,7 @@ const getCategories = async ( entityId, name, path: `/${handle}`, + slug: handle, }) ) ?? [] ) diff --git a/package.json b/package.json index 706d9a5b2..cec0addce 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "nextjs-commerce", "version": "1.0.0", "scripts": { - "dev": "NODE_OPTIONS='--inspect' next dev", + "dev": "NODE_OPTIONS='--inspect' next dev -p 4000", "build": "next build", "start": "next start", "analyze": "BUNDLE_ANALYZE=both yarn build", diff --git a/pages/api/reactioncommerce/cart.ts b/pages/api/reactioncommerce/cart.ts deleted file mode 100644 index 68ffc3b15..000000000 --- a/pages/api/reactioncommerce/cart.ts +++ /dev/null @@ -1,3 +0,0 @@ -import cartApi from '@framework/api/cart' - -export default cartApi()