From a59f38baa5ae36cfa4f9530220f6403f66247c9c Mon Sep 17 00:00:00 2001 From: goncy Date: Sun, 18 Apr 2021 14:58:48 -0300 Subject: [PATCH] Remove unused utils --- framework/csv/api/cart/index.ts | 1 - framework/csv/api/catalog/index.ts | 1 - framework/csv/api/catalog/products.ts | 1 - framework/csv/api/utils/create-api-handler.ts | 58 ------ framework/csv/api/utils/fetch-all-products.ts | 41 ----- framework/csv/api/utils/fetch-graphql-api.ts | 34 ---- framework/csv/api/utils/fetch.ts | 2 - framework/csv/api/utils/is-allowed-method.ts | 28 --- framework/csv/utils/checkout-create.ts | 5 - framework/csv/utils/checkout-to-cart.ts | 48 ----- framework/csv/utils/customer-token.ts | 2 - framework/csv/utils/get-categories.ts | 29 --- framework/csv/utils/get-checkout-id.ts | 5 - framework/csv/utils/get-search-variables.ts | 27 --- framework/csv/utils/get-sort-variables.ts | 32 ---- framework/csv/utils/get-vendors.ts | 40 ----- .../csv/utils/handle-account-activation.ts | 30 ---- framework/csv/utils/handle-fetch-response.ts | 27 --- framework/csv/utils/handle-login.ts | 36 ---- framework/csv/utils/index.ts | 15 -- framework/csv/utils/normalize.ts | 165 ------------------ framework/csv/utils/throw-user-errors.ts | 38 ---- 22 files changed, 665 deletions(-) delete mode 100644 framework/csv/api/cart/index.ts delete mode 100644 framework/csv/api/catalog/index.ts delete mode 100644 framework/csv/api/catalog/products.ts delete mode 100644 framework/csv/api/utils/create-api-handler.ts delete mode 100644 framework/csv/api/utils/fetch-all-products.ts delete mode 100644 framework/csv/api/utils/fetch-graphql-api.ts delete mode 100644 framework/csv/api/utils/fetch.ts delete mode 100644 framework/csv/api/utils/is-allowed-method.ts delete mode 100644 framework/csv/utils/checkout-create.ts delete mode 100644 framework/csv/utils/checkout-to-cart.ts delete mode 100644 framework/csv/utils/customer-token.ts delete mode 100644 framework/csv/utils/get-categories.ts delete mode 100644 framework/csv/utils/get-checkout-id.ts delete mode 100644 framework/csv/utils/get-search-variables.ts delete mode 100644 framework/csv/utils/get-sort-variables.ts delete mode 100644 framework/csv/utils/get-vendors.ts delete mode 100644 framework/csv/utils/handle-account-activation.ts delete mode 100644 framework/csv/utils/handle-fetch-response.ts delete mode 100644 framework/csv/utils/handle-login.ts delete mode 100644 framework/csv/utils/index.ts delete mode 100644 framework/csv/utils/normalize.ts delete mode 100644 framework/csv/utils/throw-user-errors.ts diff --git a/framework/csv/api/cart/index.ts b/framework/csv/api/cart/index.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/csv/api/cart/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/csv/api/catalog/index.ts b/framework/csv/api/catalog/index.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/csv/api/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/csv/api/catalog/products.ts b/framework/csv/api/catalog/products.ts deleted file mode 100644 index ea9b101e1..000000000 --- a/framework/csv/api/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function () {} diff --git a/framework/csv/api/utils/create-api-handler.ts b/framework/csv/api/utils/create-api-handler.ts deleted file mode 100644 index 8820aeabc..000000000 --- a/framework/csv/api/utils/create-api-handler.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next' -import { ShopifyConfig, getConfig } from '..' - -export type ShopifyApiHandler< - T = any, - H extends ShopifyHandlers = {}, - Options extends {} = {} -> = ( - req: NextApiRequest, - res: NextApiResponse>, - config: ShopifyConfig, - handlers: H, - // Custom configs that may be used by a particular handler - options: Options -) => void | Promise - -export type ShopifyHandler = (options: { - req: NextApiRequest - res: NextApiResponse> - config: ShopifyConfig - body: Body -}) => void | Promise - -export type ShopifyHandlers = { - [k: string]: ShopifyHandler -} - -export type ShopifyApiResponse = { - data: T | null - errors?: { message: string; code?: string }[] -} - -export default function createApiHandler< - T = any, - H extends ShopifyHandlers = {}, - Options extends {} = {} ->( - handler: ShopifyApiHandler, - handlers: H, - defaultOptions: Options -) { - return function getApiHandler({ - config, - operations, - options, - }: { - config?: ShopifyConfig - operations?: Partial - options?: Options extends {} ? Partial : never - } = {}): NextApiHandler { - const ops = { ...operations, ...handlers } - const opts = { ...defaultOptions, ...options } - - return function apiHandler(req, res) { - return handler(req, res, getConfig(config), ops, opts) - } - } -} diff --git a/framework/csv/api/utils/fetch-all-products.ts b/framework/csv/api/utils/fetch-all-products.ts deleted file mode 100644 index 9fa70a5ee..000000000 --- a/framework/csv/api/utils/fetch-all-products.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ProductEdge } from '../../schema' -import { ShopifyConfig } from '..' - -const fetchAllProducts = async ({ - config, - query, - variables, - acc = [], - cursor, -}: { - config: ShopifyConfig - query: string - acc?: ProductEdge[] - variables?: any - cursor?: string -}): Promise => { - const { data } = await config.fetch(query, { - variables: { ...variables, cursor }, - }) - - const edges: ProductEdge[] = data.products?.edges ?? [] - const hasNextPage = data.products?.pageInfo?.hasNextPage - acc = acc.concat(edges) - - if (hasNextPage) { - const cursor = edges.pop()?.cursor - if (cursor) { - return fetchAllProducts({ - config, - query, - variables, - acc, - cursor, - }) - } - } - - return acc -} - -export default fetchAllProducts diff --git a/framework/csv/api/utils/fetch-graphql-api.ts b/framework/csv/api/utils/fetch-graphql-api.ts deleted file mode 100644 index 321cba2aa..000000000 --- a/framework/csv/api/utils/fetch-graphql-api.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { GraphQLFetcher } from '@commerce/api' -import fetch from './fetch' - -import { API_URL, API_TOKEN } from '../../const' -import { getError } from '../../utils/handle-fetch-response' - -const fetchGraphqlApi: GraphQLFetcher = async ( - query: string, - { variables } = {}, - fetchOptions -) => { - const res = await fetch(API_URL, { - ...fetchOptions, - method: 'POST', - headers: { - 'X-Shopify-Storefront-Access-Token': API_TOKEN!, - ...fetchOptions?.headers, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - query, - variables, - }), - }) - - const { data, errors, status } = await res.json() - - if (errors) { - throw getError(errors, status) - } - - return { data, res } -} -export default fetchGraphqlApi diff --git a/framework/csv/api/utils/fetch.ts b/framework/csv/api/utils/fetch.ts deleted file mode 100644 index 0b8367102..000000000 --- a/framework/csv/api/utils/fetch.ts +++ /dev/null @@ -1,2 +0,0 @@ -import zeitFetch from '@vercel/fetch' -export default zeitFetch() diff --git a/framework/csv/api/utils/is-allowed-method.ts b/framework/csv/api/utils/is-allowed-method.ts deleted file mode 100644 index 78bbba568..000000000 --- a/framework/csv/api/utils/is-allowed-method.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from 'next' - -export default function isAllowedMethod( - req: NextApiRequest, - res: NextApiResponse, - allowedMethods: string[] -) { - const methods = allowedMethods.includes('OPTIONS') - ? allowedMethods - : [...allowedMethods, 'OPTIONS'] - - if (!req.method || !methods.includes(req.method)) { - res.status(405) - res.setHeader('Allow', methods.join(', ')) - res.end() - return false - } - - if (req.method === 'OPTIONS') { - res.status(200) - res.setHeader('Allow', methods.join(', ')) - res.setHeader('Content-Length', '0') - res.end() - return false - } - - return true -} diff --git a/framework/csv/utils/checkout-create.ts b/framework/csv/utils/checkout-create.ts deleted file mode 100644 index 091ea8d51..000000000 --- a/framework/csv/utils/checkout-create.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const checkoutCreate = async (): Promise => { - return Promise.resolve() -} - -export default checkoutCreate diff --git a/framework/csv/utils/checkout-to-cart.ts b/framework/csv/utils/checkout-to-cart.ts deleted file mode 100644 index 034ff11d7..000000000 --- a/framework/csv/utils/checkout-to-cart.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Cart } from '../types' -import { CommerceError } from '@commerce/utils/errors' - -import { - CheckoutLineItemsAddPayload, - CheckoutLineItemsRemovePayload, - CheckoutLineItemsUpdatePayload, - CheckoutCreatePayload, - CheckoutUserError, - Checkout, - Maybe, -} from '../schema' - -import { normalizeCart } from './normalize' -import throwUserErrors from './throw-user-errors' - -export type CheckoutQuery = { - checkout: Checkout - checkoutUserErrors?: Array -} - -export type CheckoutPayload = - | CheckoutLineItemsAddPayload - | CheckoutLineItemsUpdatePayload - | CheckoutLineItemsRemovePayload - | CheckoutCreatePayload - | CheckoutQuery - -const checkoutToCart = (checkoutPayload?: Maybe): Cart => { - if (!checkoutPayload) { - throw new CommerceError({ - message: 'Missing checkout payload from response', - }) - } - - const checkout = checkoutPayload?.checkout - throwUserErrors(checkoutPayload?.checkoutUserErrors) - - if (!checkout) { - throw new CommerceError({ - message: 'Missing checkout object from response', - }) - } - - return normalizeCart(checkout) -} - -export default checkoutToCart diff --git a/framework/csv/utils/customer-token.ts b/framework/csv/utils/customer-token.ts deleted file mode 100644 index a5a860038..000000000 --- a/framework/csv/utils/customer-token.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const getCustomerToken = () => null -export const setCustomerToken = () => null diff --git a/framework/csv/utils/get-categories.ts b/framework/csv/utils/get-categories.ts deleted file mode 100644 index cce4b2ad7..000000000 --- a/framework/csv/utils/get-categories.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ShopifyConfig } from '../api' -import { CollectionEdge } from '../schema' -import getSiteCollectionsQuery from './queries/get-all-collections-query' - -export type Category = { - entityId: string - name: string - path: string -} - -const getCategories = async (config: ShopifyConfig): Promise => { - const { data } = await config.fetch(getSiteCollectionsQuery, { - variables: { - first: 250, - }, - }) - - return ( - data.collections?.edges?.map( - ({ node: { id: entityId, title: name, handle } }: CollectionEdge) => ({ - entityId, - name, - path: `/${handle}`, - }) - ) ?? [] - ) -} - -export default getCategories diff --git a/framework/csv/utils/get-checkout-id.ts b/framework/csv/utils/get-checkout-id.ts deleted file mode 100644 index 05452c948..000000000 --- a/framework/csv/utils/get-checkout-id.ts +++ /dev/null @@ -1,5 +0,0 @@ -const getCheckoutId = (id?: string) => { - return id -} - -export default getCheckoutId diff --git a/framework/csv/utils/get-search-variables.ts b/framework/csv/utils/get-search-variables.ts deleted file mode 100644 index c1b40ae5d..000000000 --- a/framework/csv/utils/get-search-variables.ts +++ /dev/null @@ -1,27 +0,0 @@ -import getSortVariables from './get-sort-variables' -import type { SearchProductsInput } from '../product/use-search' - -export const getSearchVariables = ({ - brandId, - search, - categoryId, - sort, -}: SearchProductsInput) => { - let query = '' - - if (search) { - query += `product_type:${search} OR title:${search} OR tag:${search}` - } - - if (brandId) { - query += `${search ? ' AND ' : ''}vendor:${brandId}` - } - - return { - categoryId, - query, - ...getSortVariables(sort, !!categoryId), - } -} - -export default getSearchVariables diff --git a/framework/csv/utils/get-sort-variables.ts b/framework/csv/utils/get-sort-variables.ts deleted file mode 100644 index 141d9a180..000000000 --- a/framework/csv/utils/get-sort-variables.ts +++ /dev/null @@ -1,32 +0,0 @@ -const getSortVariables = (sort?: string, isCategory: boolean = false) => { - let output = {} - switch (sort) { - case 'price-asc': - output = { - sortKey: 'PRICE', - reverse: false, - } - break - case 'price-desc': - output = { - sortKey: 'PRICE', - reverse: true, - } - break - case 'trending-desc': - output = { - sortKey: 'BEST_SELLING', - reverse: false, - } - break - case 'latest-desc': - output = { - sortKey: isCategory ? 'CREATED' : 'CREATED_AT', - reverse: true, - } - break - } - return output -} - -export default getSortVariables diff --git a/framework/csv/utils/get-vendors.ts b/framework/csv/utils/get-vendors.ts deleted file mode 100644 index 24843f177..000000000 --- a/framework/csv/utils/get-vendors.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ShopifyConfig } from '../api' -import fetchAllProducts from '../api/utils/fetch-all-products' -import getAllProductVendors from './queries/get-all-product-vendors-query' - -export type Brand = { - entityId: string - name: string - path: string -} - -export type BrandEdge = { - node: Brand -} - -export type Brands = BrandEdge[] - -const getVendors = async (config: ShopifyConfig): Promise => { - const vendors = await fetchAllProducts({ - config, - query: getAllProductVendors, - variables: { - first: 250, - }, - }) - - let vendorsStrings = vendors.map(({ node: { vendor } }) => vendor) - - return [...new Set(vendorsStrings)].map((v) => { - const id = v.replace(/\s+/g, '-').toLowerCase() - return { - node: { - entityId: id, - name: v, - path: `brands/${id}`, - }, - } - }) -} - -export default getVendors diff --git a/framework/csv/utils/handle-account-activation.ts b/framework/csv/utils/handle-account-activation.ts deleted file mode 100644 index d11f80ba1..000000000 --- a/framework/csv/utils/handle-account-activation.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { FetcherOptions } from '@commerce/utils/types' -import throwUserErrors from './throw-user-errors' - -import { - MutationCustomerActivateArgs, - MutationCustomerActivateByUrlArgs, -} from '../schema' -import { Mutation } from '../schema' -import { customerActivateByUrlMutation } from './mutations' - -const handleAccountActivation = async ( - fetch: (options: FetcherOptions) => Promise, - input: MutationCustomerActivateByUrlArgs -) => { - try { - const { customerActivateByUrl } = await fetch< - Mutation, - MutationCustomerActivateArgs - >({ - query: customerActivateByUrlMutation, - variables: { - input, - }, - }) - - throwUserErrors(customerActivateByUrl?.customerUserErrors) - } catch (error) {} -} - -export default handleAccountActivation diff --git a/framework/csv/utils/handle-fetch-response.ts b/framework/csv/utils/handle-fetch-response.ts deleted file mode 100644 index 8d7427d91..000000000 --- a/framework/csv/utils/handle-fetch-response.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { FetcherError } from '@commerce/utils/errors' - -export function getError(errors: any[], status: number) { - errors = errors ?? [{ message: 'Failed to fetch Shopify API' }] - return new FetcherError({ errors, status }) -} - -export async function getAsyncError(res: Response) { - const data = await res.json() - return getError(data.errors, res.status) -} - -const handleFetchResponse = async (res: Response) => { - if (res.ok) { - const { data, errors } = await res.json() - - if (errors && errors.length) { - throw getError(errors, res.status) - } - - return data - } - - throw await getAsyncError(res) -} - -export default handleFetchResponse diff --git a/framework/csv/utils/handle-login.ts b/framework/csv/utils/handle-login.ts deleted file mode 100644 index de86fa1d2..000000000 --- a/framework/csv/utils/handle-login.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { FetcherOptions } from '@commerce/utils/types' -import { CustomerAccessTokenCreateInput } from '../schema' -import { setCustomerToken } from './customer-token' -import { customerAccessTokenCreateMutation } from './mutations' -import throwUserErrors from './throw-user-errors' - -const handleLogin = (data: any) => { - const response = data.customerAccessTokenCreate - throwUserErrors(response?.customerUserErrors) - - const customerAccessToken = response?.customerAccessToken - const accessToken = customerAccessToken?.accessToken - - if (accessToken) { - setCustomerToken(accessToken) - } - - return customerAccessToken -} - -export const handleAutomaticLogin = async ( - fetch: (options: FetcherOptions) => Promise, - input: CustomerAccessTokenCreateInput -) => { - try { - const loginData = await fetch({ - query: customerAccessTokenCreateMutation, - variables: { - input, - }, - }) - handleLogin(loginData) - } catch (error) {} -} - -export default handleLogin diff --git a/framework/csv/utils/index.ts b/framework/csv/utils/index.ts deleted file mode 100644 index 61e5975d7..000000000 --- a/framework/csv/utils/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export { default as handleFetchResponse } from './handle-fetch-response' -export { default as getSearchVariables } from './get-search-variables' -export { default as getSortVariables } from './get-sort-variables' -export { default as getVendors } from './get-vendors' -export { default as getCategories } from './get-categories' -export { default as getCheckoutId } from './get-checkout-id' -export { default as checkoutCreate } from './checkout-create' -export { default as checkoutToCart } from './checkout-to-cart' -export { default as handleLogin, handleAutomaticLogin } from './handle-login' -export { default as handleAccountActivation } from './handle-account-activation' -export { default as throwUserErrors } from './throw-user-errors' -export * from './queries' -export * from './mutations' -export * from './normalize' -export * from './customer-token' diff --git a/framework/csv/utils/normalize.ts b/framework/csv/utils/normalize.ts deleted file mode 100644 index 4ebc3a1ae..000000000 --- a/framework/csv/utils/normalize.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { Product } from '@commerce/types' - -import { - Product as ShopifyProduct, - Checkout, - CheckoutLineItemEdge, - SelectedOption, - ImageConnection, - ProductVariantConnection, - MoneyV2, - ProductOption, -} from '../schema' - -import type { Cart, LineItem } from '../types' - -const money = ({ amount, currencyCode }: MoneyV2) => { - return { - value: +amount, - currencyCode, - } -} - -const normalizeProductOption = ({ - id, - name: displayName, - values, -}: ProductOption) => { - return { - __typename: 'MultipleChoiceOption', - id, - displayName, - values: values.map((value) => { - let output: any = { - label: value, - } - if (displayName.match(/colou?r/gi)) { - output = { - ...output, - hexColors: [value], - } - } - return output - }), - } -} - -const normalizeProductImages = ({ edges }: ImageConnection) => - edges?.map(({ node: { originalSrc: url, ...rest } }) => ({ - url, - ...rest, - })) - -const normalizeProductVariants = ({ edges }: ProductVariantConnection) => { - return edges?.map( - ({ - node: { id, selectedOptions, sku, title, priceV2, compareAtPriceV2 }, - }) => { - return { - id, - name: title, - sku: sku ?? id, - price: +priceV2.amount, - listPrice: +compareAtPriceV2?.amount, - requiresShipping: true, - options: selectedOptions.map(({ name, value }: SelectedOption) => { - const options = normalizeProductOption({ - id, - name, - values: [value], - }) - return options - }), - } - } - ) -} - -export function normalizeProduct(productNode: ShopifyProduct): Product { - const { - id, - title: name, - vendor, - images, - variants, - description, - descriptionHtml, - handle, - priceRange, - options, - ...rest - } = productNode - - const product = { - id, - name, - vendor, - path: `/${handle}`, - slug: handle?.replace(/^\/+|\/+$/g, ''), - price: money(priceRange?.minVariantPrice), - images: normalizeProductImages(images), - variants: variants ? normalizeProductVariants(variants) : [], - options: options - ? options - .filter((o) => o.name !== 'Title') // By default Shopify adds a 'Title' name when there's only one option. We don't need it. https://community.shopify.com/c/Shopify-APIs-SDKs/Adding-new-product-variant-is-automatically-adding-quot-Default/td-p/358095 - .map((o) => normalizeProductOption(o)) - : [], - ...(description && { description }), - ...(descriptionHtml && { descriptionHtml }), - ...rest, - } - - return product -} - -export function normalizeCart(checkout: Checkout): Cart { - return { - id: checkout.id, - customerId: '', - email: '', - createdAt: checkout.createdAt, - currency: { - code: checkout.totalPriceV2?.currencyCode, - }, - taxesIncluded: checkout.taxesIncluded, - lineItems: checkout.lineItems?.edges.map(normalizeLineItem), - lineItemsSubtotalPrice: +checkout.subtotalPriceV2?.amount, - subtotalPrice: +checkout.subtotalPriceV2?.amount, - totalPrice: checkout.totalPriceV2?.amount, - discounts: [], - } -} - -function normalizeLineItem({ - node: { id, title, variant, quantity, ...rest }, -}: CheckoutLineItemEdge): LineItem { - return { - id, - variantId: String(variant?.id), - productId: String(variant?.id), - name: `${title}`, - quantity, - variant: { - id: String(variant?.id), - sku: variant?.sku ?? '', - name: variant?.title!, - image: { - url: variant?.image?.originalSrc ?? '/product-img-placeholder.svg', - }, - requiresShipping: variant?.requiresShipping ?? false, - price: variant?.priceV2?.amount, - listPrice: variant?.compareAtPriceV2?.amount, - }, - path: String(variant?.product?.handle), - discounts: [], - options: - // By default Shopify adds a default variant with default names, we're removing it. https://community.shopify.com/c/Shopify-APIs-SDKs/Adding-new-product-variant-is-automatically-adding-quot-Default/td-p/358095 - variant?.title == 'Default Title' - ? [] - : [ - { - value: variant?.title, - }, - ], - } -} diff --git a/framework/csv/utils/throw-user-errors.ts b/framework/csv/utils/throw-user-errors.ts deleted file mode 100644 index 5488ba282..000000000 --- a/framework/csv/utils/throw-user-errors.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ValidationError } from '@commerce/utils/errors' - -import { - CheckoutErrorCode, - CheckoutUserError, - CustomerErrorCode, - CustomerUserError, -} from '../schema' - -export type UserErrors = Array - -export type UserErrorCode = - | CustomerErrorCode - | CheckoutErrorCode - | null - | undefined - -const getCustomMessage = (code: UserErrorCode, message: string) => { - switch (code) { - case 'UNIDENTIFIED_CUSTOMER': - message = 'Cannot find an account that matches the provided credentials' - break - } - return message -} - -export const throwUserErrors = (errors?: UserErrors) => { - if (errors && errors.length) { - throw new ValidationError({ - errors: errors.map(({ code, message }) => ({ - code: code ?? 'validation_error', - message: getCustomMessage(code, message), - })), - }) - } -} - -export default throwUserErrors