@equinor/fusion-framework-vite-plugin-api-service
Version:
Vite plugin for proxying service discovery and mocking
162 lines (143 loc) • 5.81 kB
text/typescript
import type { IncomingMessage, ServerResponse } from 'node:http';
import type { ConfigEnv, Connect, ProxyOptions, UserConfig } from 'vite';
import type ProxyServer from 'http-proxy';
import type { Matcher } from './create-route-matcher.js';
/**
* Represents a subset of the `Console` interface, providing methods for logging at various levels.
*
* This type includes the following methods:
* - `debug`: For detailed debugging information.
* - `log`: For general informational messages.
* - `warn`: For warnings that indicate potential issues.
* - `error`: For error messages indicating failures.
*
* Use this type to define a logger that adheres to these specific logging methods.
*/
export type PluginLogger = Pick<Console, 'debug' | 'info' | 'warn' | 'error'>;
/**
* Represents JSON data which can be of various types including:
*/
export type JsonData = Record<string, unknown> | Array<unknown> | string | number | boolean | null;
/**
* Represents the HTTP methods that can be proxied by the API service.
*
* @remarks
* This type includes the standard HTTP methods commonly used in RESTful APIs:
* - `GET`: Retrieve data from the server.
* - `POST`: Submit data to the server to create a resource.
* - `PUT`: Update an existing resource or create a new one if it does not exist.
* - `DELETE`: Remove a resource from the server.
* - `PATCH`: Apply partial modifications to a resource.
* - `HEAD`: Retrieve metadata about a resource without fetching its body.
* - `OPTIONS`: Describe the communication options for the target resource.
*/
export type ProxyMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
export type NextFunction = Connect.NextFunction;
/**
* Represents a mapping of request parameter names to their corresponding string values.
*
* This type is commonly used to define query parameters or path parameters
* in an API request.
*/
export type RequestParams = Record<string, string | string[]>;
/**
* Represents an incoming HTTP request, extending the `IncomingMessage` interface
* with optional route parameters.
*
* @template IncomingMessage - The base HTTP incoming message.
* @property params - An optional object containing route parameters extracted
* from the request URL.
*/
export type IncomingRequest = Connect.IncomingMessage & { params?: RequestParams };
/**
* Represents a server listener function that handles incoming requests.
*
* @param req - The incoming request object.
* @param res - The server response object.
* @param next - A callback function to pass control to the next middleware.
*/
export type ServerListener = (
req: IncomingRequest,
res: ServerResponse,
next: NextFunction,
) => void;
/**
* A type representing a listener function for proxy events.
*
* This function is invoked when a proxy response is received. It provides
* access to the proxy response, the original request, and the server response.
*
* @param proxyRes - The response received from the proxy server.
* @param req - The original incoming HTTP request from the client.
* @param res - The HTTP response object that will be sent back to the client.
*/
export type ProxyListener = (
proxyRes: IncomingMessage,
req: IncomingRequest,
res: ServerResponse,
) => void;
/**
* Represents a handler for proxying API requests.
*/
export interface ApiProxyHandler {
/**
* The routing path managed by this handler.
*/
readonly route: string;
/**
* The list of API routes managed by this handler.
*/
readonly routes: ApiRoute[];
/**
* Generates the proxy options based on the provided user configuration and environment.
*
* @param config - Vite configuration.
* @param env - Vite environment.
*/
createProxyOptions: (config: UserConfig, env: ConfigEnv) => ProxyOptions;
}
/**
* Options for configuring an API route proxy.
*
* @see ProxyServer.ServerOptions
*
* @property target - The target URL for the proxy server.
* @property configure - A function to configure the proxy server instance.
* It receives the proxy server instance and a record of additional options.
* @property rewrite - A function to rewrite the request path.
* It takes the original path as input and returns the rewritten path.
* @property transformResponse - A function to transform the response data.
* It takes the original response data as input and returns the transformed data.
*/
export type ApiRouteProxyOptions = Omit<ProxyServer.ServerOptions, 'target'> & {
target: string;
configure?: (proxy: ProxyServer, options: Record<string, unknown>) => void;
rewrite?: (path: string) => string;
transformResponse?: (data: JsonData) => JsonData;
};
type RouteMatcher = string | string[] | Matcher;
/**
* Represents a middleware route configuration.
*
* @property match - A function or pattern used to determine if the route matches a request.
* @property middleware - The server listener function to handle requests matching the route.
* @property proxy - An optional property that must always be `never` for middleware routes.
*/
export type MiddlewareRoute = {
match: RouteMatcher;
middleware: ServerListener;
proxy?: never;
};
/**
* Represents a proxy route configuration for an API service.
*
* @property match - A `RouteMatcher` instance used to determine if the route matches a specific request.
* @property middleware - Must always be `never` for this type, indicating that middleware is not allowed.
* @property proxy - Configuration options for the API route proxy, defined by `ApiRouteProxyOptions`.
*/
export type ProxyRoute = {
match: RouteMatcher;
middleware?: never;
proxy: ApiRouteProxyOptions;
};
export type ApiRoute = MiddlewareRoute | ProxyRoute;