import type { Express, Request, Response } from "express"; import type { LoggerInterface } from "@vue-storefront/logger"; import type { LoggerOptions } from "./config"; import { ApiClientMethod, ContextQuery, CustomQuery, CustomQueryFunction, TObject } from "./base"; import { UploadedFile, WithRequired } from "./index"; import { ApiClient, ApiClientConfig, ApiClientFactory } from "./server"; export type AlokaiResponse = Response any; fnOrigin?: string; [key: string]: any; }>; export type AlokaiRequest = Request & { files?: { [fieldname: string]: UploadedFile[]; } | UploadedFile[] | undefined; }; export type ExtensionEndpointHandler = ApiClientMethod & { _extensionName?: string; }; export type ApiMethods = Record; export type ApiMethodsFactory = (configuration: CONFIG) => API; export type ApiClientMethodWithContext = (context: CONTEXT, ...args: any) => any; export type ExtendApiMethod = { [K in keyof API]?: ApiClientMethodWithContext; } & { [key: string]: ApiClientMethodWithContext; }; export interface HookParams { configuration?: C; logger?: LoggerInterface; } export interface CallHookParams extends HookParams { callName: string; } export type BeforeCallArgs = T; export type AfterCallArgs = T; export interface BeforeCallParams extends CallHookParams { args: BeforeCallArgs; } export interface AfterCallParams extends CallHookParams { args: BeforeCallArgs; response: AfterCallArgs; } export interface ApiClientExtensionHooks { beforeCreate?: (params: HookParams) => C; afterCreate?: (params: HookParams) => C; beforeCall?: (params: BeforeCallParams) => BeforeCallArgs; afterCall?: (params: AfterCallParams) => AfterCallArgs; } export type AlokaiContainer = { logger: LoggerInterface; }; export interface ApiClientExtension { name: string; isNamespaced?: boolean; extendApiMethods?: ExtendApiMethod | ApiMethodsFactory, CONFIG>; extendApp?: ({ app, configuration, }: { app: Express; configuration: any; logger: LoggerInterface; }) => Promise | void; hooks?: (req: AlokaiRequest, res: AlokaiResponse, hooksContext: AlokaiContainer) => ApiClientExtensionHooks; } export type ErrorHandler = (error: unknown, req: AlokaiRequest, res: AlokaiResponse) => void; export interface Integration { location: string; configuration: CONFIG; logger?: LoggerOptions; extensions?: (extensions: ApiClientExtension[]) => ApiClientExtension[]; customQueries?: Record; initConfig?: TObject; /** * Custom error handler for middleware. * * This function is invoked whenever an error occurs during middleware execution. * Alokai provides a default error handler, which will be used if this property is not set. * * @param {unknown} error - The error object or value that triggered the handler. * @param {AlokaiRequest} req - The HTTP request object associated with the error. * @param {AlokaiResponse} res - The HTTP response object for sending a response. * * @example * ```ts * { * errorHandler: (error, req, res) => { * if (typeof error === "object" && error !== null && "message" in error) { * res.status(500).send({ message: (error as any).message }); * } else { * res.status(500).send({ message: "An unknown error occurred" }); * } * } * } * ``` * * @example * Using the default error handler with custom behavior * ```ts * import { defaultErrorHandler } from "@vue-storefront/middleware"; * * { * errorHandler: (error, req, res) => { * // Perform custom actions before delegating to the default error handler * defaultErrorHandler(error, req, res); * } * }; * ``` */ errorHandler?: ErrorHandler; } export interface RequestParams { integrationName: string; functionName: string; } export interface IntegrationLoaded { apiClient: ApiClientFactory; initConfig: TObject; configuration: CONFIG; extensions: ApiClientExtension[]; customQueries?: Record; errorHandler: (error: unknown, req: Request, res: AlokaiResponse) => void; } export interface LoadInitConfigProps { apiClient: ApiClientFactory; integration: Integration; tag: string; alokai: AlokaiContainer; } export type IntegrationsLoaded = Record>; export interface MiddlewareContext { req: AlokaiRequest; res: AlokaiResponse; extensions: ApiClientExtension[]; customQueries: Record; integrations: IntegrationsLoaded; integrationTag: string; getApiClient: (integrationName: string) => ApiClient; } export type ExtendQuery = , Key extends keyof T>(customQuery: CustomQuery | null, defaults: T) => ContextQuery; export interface ApiContext { config: CONFIG; client: CLIENT; req: REQUEST; res: RESPONSE; extensions: any; customQueries: Record; extendQuery: ExtendQuery; } export type CallableContext = { middleware: MiddlewareContext; integrationTag: string; }; export interface ApplyingContextHooks { before: (params: BeforeCallParams) => BeforeCallArgs; after: (params: AfterCallParams) => AfterCallArgs; } export type ExtensionHookWith = WithRequired & { name: string; }; export type ExtensionWith = WithRequired; /** * Removes the `context` from the methods of an API Client. * `context` is an internal parameter added by the Server Middleware to the methods of the API Client. * Removing it allows to define the contract of the endpoints exposed by the Server Middleware. * * @example * * ```ts * type ApiClientMethods = { * getProduct: (context: any, id: string) => Promise; * } * * type Endpoints = WithoutContext; * // { getProduct: (id: string) => Promise } * ``` */ export type WithoutContext = { [T in keyof Methods]: Methods[T] extends (context: any, ...arguments_: infer P) => infer R ? (...arguments_: P) => R : never; }; export type LogScope = { integrationName: string; extensionName?: string; functionName?: string; hookName?: "extendApp" | "hooks" | "onCreate" | "init" | "beforeCall" | "beforeCreate" | "afterCall" | "afterCreate"; type: "endpoint" | "bootstrapHook" | "requestHook"; }; export type AlokaiLocal = { metadata?: { context?: string; scope?: LogScope; errorBoundary?: LogScope; }; }; //# sourceMappingURL=common.d.ts.map