hook-fetch 0.0.1-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ import { sseTextDecoderPlugin } from "./sse.js";
2
+ export {
3
+ sseTextDecoderPlugin
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,16 @@
1
+ const decoder = new TextDecoder("utf-8");
2
+ const sseTextDecoderPlugin = () => {
3
+ return {
4
+ name: "sse",
5
+ async transformStreamChunk(chunk) {
6
+ if (!chunk.error) {
7
+ chunk.result = decoder.decode(chunk.result, { stream: true });
8
+ }
9
+ return chunk;
10
+ }
11
+ };
12
+ };
13
+ export {
14
+ sseTextDecoderPlugin
15
+ };
16
+ //# sourceMappingURL=sse.js.map
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "hook-fetch",
3
+ "description": "A lightweight and modern HTTP request library developed based on the native Fetch API of the browser, providing a user-friendly interface similar to Axios and powerful extensibility.",
4
+ "version": "0.0.1-beta",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "types",
9
+ "!dist/**/*.map",
10
+ "README.md",
11
+ "LICENSE",
12
+ "README.en.md"
13
+ ],
14
+ "main": "./dist/cjs/index.js",
15
+ "module": "./dist/es/index.js",
16
+ "types": "./types/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "require": "./cjs/index.js",
20
+ "import": "./es/index.js",
21
+ "types": "./es/index.d.ts"
22
+ },
23
+ "./plugins": {
24
+ "require": "./cjs/plugins/index.js",
25
+ "import": "./es/plugins/index.js",
26
+ "types": "./types/plugins/index.d.ts"
27
+ }
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": ""
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/JsonLee12138/hook-fetch/issues",
35
+ "email": "lijunsong2@gmail.com"
36
+ },
37
+ "license": "MIT",
38
+ "scripts": {
39
+ "dev": "vite",
40
+ "build": "tsc && vite build",
41
+ "ci:publish": "pnpm changeset publish -r",
42
+ "test": "vitest"
43
+ },
44
+ "devDependencies": {
45
+ "@changesets/cli": "^2.28.1",
46
+ "@types/qs": "^6.9.18",
47
+ "terser": "^5.39.0",
48
+ "typescript": "^5.7.3",
49
+ "typescript-api-pro": "workspace:^",
50
+ "vite": "^6.1.1",
51
+ "vite-plugin-dts": "^4.5.3",
52
+ "vitest": "^3.0.8"
53
+ },
54
+ "dependencies": {
55
+ "qs": "^6.14.0",
56
+ "radash": "^12.1.0"
57
+ }
58
+ }
@@ -0,0 +1,23 @@
1
+ import { AnyObject } from 'typescript-api-pro';
2
+ import { BaseOptions, HookFetchPlugin, RequestUseOptions } from './types';
3
+ import { HookFetch } from './utils';
4
+ declare class Base {
5
+ #private;
6
+ constructor({ timeout, baseURL, headers, plugins, withCredentials }: BaseOptions);
7
+ use(plugin: HookFetchPlugin<any, any, any, any>): this;
8
+ request<R = AnyObject, P = AnyObject, D = AnyObject, E = AnyObject>(url: string, { timeout, headers, method, params, data, qsArrayFormat, withCredentials, extra }?: RequestUseOptions<P, D, E>): HookFetch<R, E>;
9
+ get<R = AnyObject, P = AnyObject, E = AnyObject>(url: string, params?: P, options?: Omit<RequestUseOptions<P, never, E>, 'params'>): HookFetch<R, E>;
10
+ head<R = AnyObject, P = AnyObject, E = AnyObject>(url: string, params?: P, options?: Omit<RequestUseOptions<P, never, E>, 'params'>): HookFetch<R, E>;
11
+ options<R = AnyObject, P = AnyObject, E = AnyObject>(url: string, params?: P, options?: Omit<RequestUseOptions<P, never, E>, 'params'>): HookFetch<R, E>;
12
+ delete<R = AnyObject, P = AnyObject, E = AnyObject>(url: string, options?: RequestUseOptions<P, never, E>): HookFetch<R, E>;
13
+ post<R = AnyObject, D = AnyObject, P = AnyObject, E = AnyObject>(url: string, data?: D, options?: Omit<RequestUseOptions<P, D, E>, 'data'>): HookFetch<R, E>;
14
+ put<R = AnyObject, D = AnyObject, P = AnyObject, E = AnyObject>(url: string, data?: D, options?: Omit<RequestUseOptions<P, D, E>, 'data'>): HookFetch<R, E>;
15
+ patch<R = AnyObject, D = AnyObject, P = AnyObject, E = AnyObject>(url: string, data?: D, options?: Omit<RequestUseOptions<P, D, E>, 'data'>): HookFetch<R, E>;
16
+ abortAll(): void;
17
+ }
18
+ declare const useRequest: <R = AnyObject, P = AnyObject, D = AnyObject, E = AnyObject>(url: string, options?: RequestUseOptions<P, D, E>) => HookFetch<R, E>;
19
+ type ExportDefault = typeof useRequest & {
20
+ create: (options: BaseOptions) => Base;
21
+ };
22
+ declare const _default: ExportDefault;
23
+ export default _default;
@@ -0,0 +1 @@
1
+ export * from './sse';
@@ -0,0 +1,2 @@
1
+ import { HookFetchPlugin } from '../types';
2
+ export declare const sseTextDecoderPlugin: () => HookFetchPlugin;
@@ -0,0 +1,100 @@
1
+ import { default as QueryString } from 'qs';
2
+ import { AnyObject } from 'typescript-api-pro';
3
+ import { ResponseError } from './utils';
4
+ export interface RequestConfig<P, D, E = AnyObject> extends Omit<RequestInit, 'body' | 'signal' | 'credentials' | 'method'> {
5
+ url: string;
6
+ baseURL: string;
7
+ params?: P;
8
+ data?: D;
9
+ withCredentials?: boolean;
10
+ extra?: E;
11
+ method: RequestMethod;
12
+ qsArrayFormat?: QueryString.IStringifyOptions['arrayFormat'];
13
+ }
14
+ export interface FetchPluginContext<T = unknown, E = unknown, P = unknown, D = unknown> {
15
+ config: RequestConfig<P, D, E>;
16
+ response: Response;
17
+ result?: T;
18
+ controller: AbortController;
19
+ }
20
+ export interface StreamContext<T = unknown> {
21
+ result: T;
22
+ source: Uint8Array<ArrayBufferLike>;
23
+ error: unknown | null;
24
+ }
25
+ type BeforeRequestHandler<E = unknown, P = unknown, D = unknown> = (config: RequestConfig<E, P, D>) => Promise<RequestConfig<E, P, D>>;
26
+ type AfterResponseHandler<T = unknown> = (context: FetchPluginContext<T>) => Promise<FetchPluginContext<any>>;
27
+ type TransformStreamChunkHandler = (chunk: StreamContext<any>) => Promise<StreamContext>;
28
+ export type OnFinallyHandler<E = unknown, P = unknown, D = unknown> = (res: Pick<FetchPluginContext<unknown, E, P, D>, 'config' | 'response'>) => Promise<void>;
29
+ export type HookFetchPlugin<T = unknown, E = unknown, P = unknown, D = unknown> = {
30
+ /** 插件名称 */
31
+ name: string;
32
+ /** 优先级 */
33
+ priority?: number;
34
+ beforeRequest?: BeforeRequestHandler<E, P, D>;
35
+ afterResponse?: AfterResponseHandler<T>;
36
+ transformStreamChunk?: TransformStreamChunkHandler;
37
+ onError?: (error: Error) => Promise<Error | void | ResponseError<E>>;
38
+ onFinally?: OnFinallyHandler<E, P, D>;
39
+ };
40
+ export interface OptionProps {
41
+ baseURL: string;
42
+ timeout: number;
43
+ headers: HeadersInit;
44
+ plugins: Array<HookFetchPlugin>;
45
+ withCredentials: boolean;
46
+ }
47
+ export type BaseOptions = Partial<OptionProps>;
48
+ export type BaseRequestOptions<P, D, E = AnyObject> = Partial<{
49
+ plugins: Array<HookFetchPlugin>;
50
+ timeout: number;
51
+ params: P;
52
+ data: D;
53
+ controller: AbortController;
54
+ extra: E;
55
+ qsArrayFormat: QueryString.IStringifyOptions['arrayFormat'];
56
+ withCredentials: boolean;
57
+ method: RequestMethod;
58
+ }> & Omit<RequestInit, 'body' | 'method'> & {
59
+ url: string;
60
+ baseURL: string;
61
+ };
62
+ export type RequestMethodWithParams = 'GET' | 'DELETE' | 'OPTIONS' | 'HEAD';
63
+ export type RequestMethodWithBody = 'PUT' | 'PATCH' | 'POST';
64
+ export type RequestMethod = RequestMethodWithParams | RequestMethodWithBody;
65
+ export declare enum Method {
66
+ GET = "GET",
67
+ POST = "POST",
68
+ PUT = "PUT",
69
+ DELETE = "DELETE",
70
+ PATCH = "PATCH",
71
+ HEAD = "HEAD",
72
+ OPTIONS = "OPTIONS"
73
+ }
74
+ export declare enum ContentType {
75
+ JSON = "application/json",
76
+ FORM_URLENCODED = "application/x-www-form-urlencoded",
77
+ FORM_DATA = "multipart/form-data",
78
+ TEXT = "text/plain",
79
+ HTML = "text/html",
80
+ XML = "text/xml",
81
+ CSV = "text/csv",
82
+ STREAM = "application/octet-stream"
83
+ }
84
+ export declare enum StatusCode {
85
+ TIME_OUT = 408,
86
+ ABORTED = 499,
87
+ NETWORK_ERROR = 599,
88
+ BODY_NULL = 502,
89
+ UNKNOWN = 601
90
+ }
91
+ export type RequestUseOptions<P, D, E> = Omit<BaseRequestOptions<P, D, E>, 'url' | 'plugins' | 'baseURL' | 'controller'>;
92
+ export interface ResponseErrorOptions<E = unknown> {
93
+ name?: string;
94
+ message: string;
95
+ status?: number;
96
+ statusText?: string;
97
+ response?: Response;
98
+ config?: RequestConfig<unknown, unknown, E>;
99
+ }
100
+ export {};
@@ -0,0 +1,39 @@
1
+ import { default as QueryString } from 'qs';
2
+ import { AnyObject } from 'typescript-api-pro';
3
+ import { HookFetchPlugin, BaseRequestOptions, OnFinallyHandler, RequestConfig, RequestMethod, ResponseErrorOptions, StreamContext } from './types';
4
+ export declare const delay: (ms: number) => Promise<unknown>;
5
+ export declare const timeoutCallback: (controller: AbortController) => void;
6
+ export declare class ResponseError<E = unknown> extends Error {
7
+ #private;
8
+ constructor({ message, status, statusText, response, config, name }: ResponseErrorOptions<E>);
9
+ get message(): string;
10
+ get status(): number | undefined;
11
+ get statusText(): string | undefined;
12
+ get response(): Response | undefined;
13
+ get config(): RequestConfig<unknown, unknown, E> | undefined;
14
+ get name(): string;
15
+ }
16
+ export declare const parsePlugins: (plugins: HookFetchPlugin[]) => {
17
+ beforeRequestPlugins: ((config: RequestConfig<unknown, unknown, unknown>) => Promise<RequestConfig<unknown, unknown, unknown>>)[];
18
+ afterResponsePlugins: ((context: import('./types').FetchPluginContext<unknown, unknown, unknown, unknown>) => Promise<import('./types').FetchPluginContext<any>>)[];
19
+ errorPlugins: ((error: Error) => Promise<void | Error | ResponseError<unknown>>)[];
20
+ finallyPlugins: OnFinallyHandler<unknown, unknown, unknown>[];
21
+ transformStreamChunkPlugins: ((chunk: StreamContext<any>) => Promise<StreamContext>)[];
22
+ };
23
+ export declare const buildUrl: (url: string, params?: AnyObject, qsArrayFormat?: QueryString.IStringifyOptions["arrayFormat"]) => string;
24
+ export declare const mergeHeaders: (_baseHeaders?: HeadersInit | Headers, _newHeaders?: HeadersInit | Headers) => Headers;
25
+ export declare const getBody: (body: AnyObject, method: RequestMethod, headers?: HeadersInit, qsArrayFormat?: QueryString.IStringifyOptions["arrayFormat"]) => BodyInit | null;
26
+ export declare class HookFetch<T, E> implements PromiseLike<T> {
27
+ #private;
28
+ constructor(options: BaseRequestOptions<unknown, unknown, E>);
29
+ then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null | undefined): PromiseLike<TResult1 | TResult2>;
30
+ catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null | undefined): Promise<T | TResult>;
31
+ finally(onfinally?: (() => void) | null | undefined): Promise<T>;
32
+ abort(): void;
33
+ blob(): Promise<Blob>;
34
+ text(): Promise<string>;
35
+ arrayBuffer(): Promise<ArrayBuffer>;
36
+ formData(): Promise<FormData>;
37
+ bytes(): Promise<Uint8Array<ArrayBufferLike>>;
38
+ stream<T>(): AsyncGenerator<StreamContext<T> | StreamContext<null>, void, unknown>;
39
+ }