Moved method

This commit is contained in:
Luis Alvarez 2021-05-04 14:42:25 -05:00
parent beccca8eaf
commit 722f4cee23
2 changed files with 37 additions and 32 deletions

View File

@ -1,19 +1,15 @@
import type { NextApiHandler } from 'next' import type { NextApiHandler } from 'next'
import type { RequestInit } from '@vercel/fetch' import type { RequestInit } from '@vercel/fetch'
import { CommerceAPI, CommerceAPIConfig } from '@commerce/api' import {
CommerceAPIConfig,
getCommerceApi as commerceApi,
getEndpoint,
} from '@commerce/api'
import fetchGraphqlApi from './utils/fetch-graphql-api' import fetchGraphqlApi from './utils/fetch-graphql-api'
import fetchStoreApi from './utils/fetch-store-api' import fetchStoreApi from './utils/fetch-store-api'
import type { CartAPI } from './cart' import type { CartAPI } from './cart'
import login from './operations/login' import login from './operations/login'
import {
Operations,
defaultOperations,
AllowedOperations,
OPERATIONS,
getOperations,
APIOperations,
} from '@commerce/api/operations'
export interface BigcommerceConfig extends CommerceAPIConfig { export interface BigcommerceConfig extends CommerceAPIConfig {
// Indicates if the returned metadata with translations should be applied to the // Indicates if the returned metadata with translations should be applied to the
@ -119,17 +115,16 @@ export type APIs = CartAPI
export function getCommerceApi<P extends Provider>( export function getCommerceApi<P extends Provider>(
customProvider: P = provider as any customProvider: P = provider as any
) { ) {
const commerce = new CommerceAPI(customProvider) const api = commerceApi(customProvider)
const operations = getOperations(customProvider.operations, { commerce })
return Object.assign(commerce, operations, { return Object.assign(api, {
endpoint<E extends APIs>( endpoint<E extends APIs>(
context: E['endpoint'] & { context: E['endpoint'] & {
config?: P['config'] config?: P['config']
options?: E['schema']['endpoint']['options'] options?: E['schema']['endpoint']['options']
} }
): NextApiHandler { ): NextApiHandler {
return super.endpoint(context) return getEndpoint(api, context)
}, },
}) })
} }

View File

@ -2,7 +2,7 @@ import type { NextApiHandler } from 'next'
import type { RequestInit, Response } from '@vercel/fetch' import type { RequestInit, Response } from '@vercel/fetch'
import type { APIEndpoint, APIHandler } from './utils/types' import type { APIEndpoint, APIHandler } from './utils/types'
import type { CartSchema } from '../types/cart' import type { CartSchema } from '../types/cart'
import { APIOperations } from './operations' import { APIOperations, getOperations } from './operations'
export type APISchemas = CartSchema export type APISchemas = CartSchema
@ -65,15 +65,26 @@ export class CommerceAPI<P extends APIProvider = APIProvider> {
setConfig(newConfig: Partial<P['config']>) { setConfig(newConfig: Partial<P['config']>) {
Object.assign(this.provider.config, newConfig) Object.assign(this.provider.config, newConfig)
} }
}
endpoint<T extends GetAPISchema<any, any>>( export function getCommerceApi<P extends APIProvider>(customProvider: P) {
const commerce = new CommerceAPI(customProvider)
const operations = getOperations(customProvider.operations, { commerce })
return Object.assign(commerce, operations)
}
export function getEndpoint<
P extends APIProvider,
T extends GetAPISchema<any, any>
>(
commerce: CommerceAPI<P>,
context: T['endpoint'] & { context: T['endpoint'] & {
config?: P['config'] config?: P['config']
options?: T['schema']['endpoint']['options'] options?: T['schema']['endpoint']['options']
} }
): NextApiHandler { ): NextApiHandler {
const commerce = this const cfg = commerce.getConfig(context.config)
const cfg = this.getConfig(context.config)
return function apiHandler(req, res) { return function apiHandler(req, res) {
return context.handler({ return context.handler({
@ -85,7 +96,6 @@ export class CommerceAPI<P extends APIProvider = APIProvider> {
options: context.options ?? {}, options: context.options ?? {},
}) })
} }
}
} }
export interface CommerceAPIConfig { export interface CommerceAPIConfig {