- Vue 3 + TypeScript + Element Plus 前端界面 - Pinia 状态管理 - Vue Router 4 路由管理 - Axios HTTP 客户端 - MSW (Mock Service Worker) 开发环境模拟 - 账户管理界面 (列表、详情、三科目余额展示) - 交易管理界面 (列表、详情) - 对账管理界面 (三账校验) - 完善的 API 客户端封装 - Docker 容器化配置 - Nginx 配置用于生产环境
137 lines
4.8 KiB
TypeScript
137 lines
4.8 KiB
TypeScript
import { Logger } from '@open-draft/logger';
|
|
import { Emitter, Listener } from 'strict-event-emitter';
|
|
|
|
interface RequestControllerSource {
|
|
passthrough(): void;
|
|
respondWith(response: Response): void;
|
|
errorWith(reason?: unknown): void;
|
|
}
|
|
declare class RequestController {
|
|
#private;
|
|
protected readonly request: Request;
|
|
protected readonly source: RequestControllerSource;
|
|
static PENDING: 0;
|
|
static PASSTHROUGH: 1;
|
|
static RESPONSE: 2;
|
|
static ERROR: 3;
|
|
readyState: number;
|
|
/**
|
|
* A Promise that resolves when this controller handles a request.
|
|
* See `controller.readyState` for more information on the handling result.
|
|
*/
|
|
handled: Promise<void>;
|
|
constructor(request: Request, source: RequestControllerSource);
|
|
/**
|
|
* Perform this request as-is.
|
|
*/
|
|
passthrough(): Promise<void>;
|
|
/**
|
|
* Respond to this request with the given `Response` instance.
|
|
*
|
|
* @example
|
|
* controller.respondWith(new Response())
|
|
* controller.respondWith(Response.json({ id }))
|
|
* controller.respondWith(Response.error())
|
|
*/
|
|
respondWith(response: Response): void;
|
|
/**
|
|
* Error this request with the given reason.
|
|
*
|
|
* @example
|
|
* controller.errorWith()
|
|
* controller.errorWith(new Error('Oops!'))
|
|
* controller.errorWith({ message: 'Oops!'})
|
|
*/
|
|
errorWith(reason?: unknown): void;
|
|
}
|
|
|
|
declare const IS_PATCHED_MODULE: unique symbol;
|
|
|
|
type RequestCredentials = 'omit' | 'include' | 'same-origin';
|
|
type HttpRequestEventMap = {
|
|
request: [
|
|
args: {
|
|
request: Request;
|
|
requestId: string;
|
|
controller: RequestController;
|
|
}
|
|
];
|
|
response: [
|
|
args: {
|
|
response: Response;
|
|
isMockedResponse: boolean;
|
|
request: Request;
|
|
requestId: string;
|
|
}
|
|
];
|
|
unhandledException: [
|
|
args: {
|
|
error: unknown;
|
|
request: Request;
|
|
requestId: string;
|
|
controller: RequestController;
|
|
}
|
|
];
|
|
};
|
|
|
|
type InterceptorEventMap = Record<string, any>;
|
|
type InterceptorSubscription = () => void;
|
|
/**
|
|
* Request header name to detect when a single request
|
|
* is being handled by nested interceptors (XHR -> ClientRequest).
|
|
* Obscure by design to prevent collisions with user-defined headers.
|
|
* Ideally, come up with the Interceptor-level mechanism for this.
|
|
* @see https://github.com/mswjs/interceptors/issues/378
|
|
*/
|
|
declare const INTERNAL_REQUEST_ID_HEADER_NAME = "x-interceptors-internal-request-id";
|
|
declare function getGlobalSymbol<V>(symbol: Symbol): V | undefined;
|
|
declare function deleteGlobalSymbol(symbol: Symbol): void;
|
|
declare enum InterceptorReadyState {
|
|
INACTIVE = "INACTIVE",
|
|
APPLYING = "APPLYING",
|
|
APPLIED = "APPLIED",
|
|
DISPOSING = "DISPOSING",
|
|
DISPOSED = "DISPOSED"
|
|
}
|
|
type ExtractEventNames<Events extends Record<string, any>> = Events extends Record<infer EventName, any> ? EventName : never;
|
|
declare class Interceptor<Events extends InterceptorEventMap> {
|
|
private readonly symbol;
|
|
protected emitter: Emitter<Events>;
|
|
protected subscriptions: Array<InterceptorSubscription>;
|
|
protected logger: Logger;
|
|
readyState: InterceptorReadyState;
|
|
constructor(symbol: symbol);
|
|
/**
|
|
* Determine if this interceptor can be applied
|
|
* in the current environment.
|
|
*/
|
|
protected checkEnvironment(): boolean;
|
|
/**
|
|
* Apply this interceptor to the current process.
|
|
* Returns an already running interceptor instance if it's present.
|
|
*/
|
|
apply(): void;
|
|
/**
|
|
* Setup the module augments and stubs necessary for this interceptor.
|
|
* This method is not run if there's a running interceptor instance
|
|
* to prevent instantiating an interceptor multiple times.
|
|
*/
|
|
protected setup(): void;
|
|
/**
|
|
* Listen to the interceptor's public events.
|
|
*/
|
|
on<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
|
|
once<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
|
|
off<EventName extends ExtractEventNames<Events>>(event: EventName, listener: Listener<Events[EventName]>): this;
|
|
removeAllListeners<EventName extends ExtractEventNames<Events>>(event?: EventName): this;
|
|
/**
|
|
* Disposes of any side-effects this interceptor has introduced.
|
|
*/
|
|
dispose(): void;
|
|
private getInstance;
|
|
private setInstance;
|
|
private clearInstance;
|
|
}
|
|
|
|
export { ExtractEventNames as E, HttpRequestEventMap as H, IS_PATCHED_MODULE as I, RequestController as R, RequestControllerSource as a, RequestCredentials as b, InterceptorEventMap as c, InterceptorSubscription as d, INTERNAL_REQUEST_ID_HEADER_NAME as e, deleteGlobalSymbol as f, getGlobalSymbol as g, InterceptorReadyState as h, Interceptor as i };
|