@dscli/request 0.1.0-alpha.0 → 0.1.0-alpha.1
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.
- package/README.md +87 -6
- package/dist/axios/index.d.ts +4 -2
- package/dist/axios/index.d.ts.map +1 -1
- package/dist/axios/index.js +44 -5
- package/dist/axios/index.js.map +1 -1
- package/dist/browser/index.d.ts +38 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +169 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/core/body.d.ts +3 -0
- package/dist/core/body.d.ts.map +1 -0
- package/dist/core/body.js +7 -0
- package/dist/core/body.js.map +1 -0
- package/dist/core/index.d.ts +33 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +76 -6
- package/dist/core/index.js.map +1 -1
- package/dist/core/policies.d.ts +15 -0
- package/dist/core/policies.d.ts.map +1 -0
- package/dist/core/policies.js +171 -0
- package/dist/core/policies.js.map +1 -0
- package/dist/core/types.d.ts +50 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +18 -5
package/README.md
CHANGED
|
@@ -2,17 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
类型安全、可扩展且兼容 SSR 的请求客户端。根入口使用标准 Fetch API;axios 与 Vue 3 通过显式子路径按需导入。
|
|
4
4
|
|
|
5
|
-
>
|
|
5
|
+
> 当前公共版本为 `0.1.0-alpha.0`。这是预发布版本,不应视为稳定版。
|
|
6
6
|
|
|
7
7
|
## 安装
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
推荐显式安装 `alpha` tag,并按使用入口安装可选 peer:
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
pnpm
|
|
12
|
+
pnpm add @dscli/request@alpha
|
|
13
|
+
pnpm add axios # 使用 @dscli/request/axios 时
|
|
14
|
+
pnpm add vue # 使用 @dscli/request/vue 时
|
|
13
15
|
```
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
需要锁定候选时可安装精确版本:`pnpm add @dscli/request@0.1.0-alpha.0`。本仓库内联调仍可使用 `@dscli/request@workspace:*`。
|
|
16
18
|
|
|
17
19
|
## 用法
|
|
18
20
|
|
|
@@ -33,13 +35,78 @@ try {
|
|
|
33
35
|
}
|
|
34
36
|
```
|
|
35
37
|
|
|
38
|
+
单实例应用可在启动时设置默认客户端,业务模块直接导入 HTTP 方法:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import { configureRequest, Get, Post } from '@dscli/request'
|
|
42
|
+
|
|
43
|
+
const client = configureRequest({ baseUrl: runtimeConfig.apiBaseUrl, timeout: 15_000 })
|
|
44
|
+
const profile = await Get(API_PATHS.profile)
|
|
45
|
+
await Post(API_PATHS.events, { type: 'view' })
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`Get/Post/Put/Patch/Delete/Del` 使用当前默认实例,失败时抛出 `RequestError`,不返回旧版
|
|
49
|
+
元组。`configureRequest` 返回同一实例,可继续注入 Vue 或传给 React Context;已有 Axios
|
|
50
|
+
或其他客户端使用 `setDefaultRequestClient(client)` 注册。未初始化时保留原无默认配置行为。
|
|
51
|
+
|
|
52
|
+
`createRequest` 始终只创建独立实例;多实例和默认实例可以并用。配置默认值只影响后续
|
|
53
|
+
便捷调用,不更新进行中请求、旧实例引用或 Vue/React 注入。SSR 用户身份应使用逐请求
|
|
54
|
+
独立实例。
|
|
55
|
+
|
|
56
|
+
- [单实例与多实例](./docs/application.md):配置语义、hooks、URL 规则与隔离边界。
|
|
57
|
+
- [项目级复制模板](./docs/project-template.md):配置、动态 token、API 模块、文件方法与普通 Web 入口。
|
|
58
|
+
- [Vue 3 集成](./docs/vue.md) / [React 集成](./docs/react.md):默认调用与独立实例注入。
|
|
59
|
+
|
|
60
|
+
示例中 `runtimeConfig` 与 `API_PATHS` 由应用提供。Fetch 使用标准 URL 解析;保留 API
|
|
61
|
+
目录时,baseUrl 使用以 `/` 结尾的绝对地址,接口路径使用无前导 `/` 的相对路径。
|
|
62
|
+
|
|
63
|
+
`dsRequest` 仅用于旧代码迁移,已标记为 deprecated。它的 `body` 选项始终按 JSON 处理;新代码
|
|
64
|
+
应使用 `createRequest().request()`,明确选择 `json` 或原始 `body`。
|
|
65
|
+
|
|
66
|
+
## Hooks、retry 与请求去重
|
|
67
|
+
|
|
68
|
+
这些策略配置在客户端实例上,各实例分别维护自己的状态。默认实例同样通过
|
|
69
|
+
`configureRequest({ hooks, retry, dedupe })` 配置:
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
const request = createRequest({
|
|
73
|
+
hooks: {
|
|
74
|
+
onRequest: () => ({ headers: { authorization: runtimeConfig.authorization } }),
|
|
75
|
+
onResponse: ({ url }, response) => logger.info('request completed', url, response.status),
|
|
76
|
+
onError: (_context, error) => {
|
|
77
|
+
logger.warn(error.kind)
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
retry: { retries: 3, delay: 100, factor: 2 },
|
|
81
|
+
dedupe: true
|
|
82
|
+
})
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`onRequest` 在每次尝试前执行,可以返回部分请求选项覆盖;`onResponse` 在响应成功后执行。
|
|
86
|
+
`onError` 会接收每次失败,并可返回 `{ retry: false }` 禁止当前失败继续重试。hook 自身抛出的
|
|
87
|
+
异常会直接传递给调用方。
|
|
88
|
+
|
|
89
|
+
未设置 `retry` 时不会自动重试。启用后默认只对 GET、HEAD、OPTIONS 的网络错误、超时和 HTTP
|
|
90
|
+
5xx 重试;取消、配置错误、解析错误及其他 HTTP 错误默认不重试。写请求需要通过
|
|
91
|
+
`retryable` 明确选择。退避延迟使用指数增长,并遵守请求的 `AbortSignal`。
|
|
92
|
+
|
|
93
|
+
`dedupe: true` 只在同一个客户端实例内去重 `GET` 和 `HEAD`,重复键由方法、URL、query 和
|
|
94
|
+
`responseType` 组成,新请求会取消旧请求。可以通过 `{ methods, key }` 自定义允许的方法和去重键;写请求和文件上传
|
|
95
|
+
默认不会去重。
|
|
96
|
+
|
|
36
97
|
## 入口
|
|
37
98
|
|
|
38
|
-
- `@dscli/request`:`createRequest
|
|
99
|
+
- `@dscli/request`:`createRequest`、`configureRequest`、`setDefaultRequestClient`、HTTP 便捷方法、类型与 `RequestError`;`dsRequest` 为 deprecated 兼容包装。
|
|
39
100
|
- `@dscli/request/axios`:`createAxiosRequest`,调用方传入 axios 兼容实例。
|
|
40
101
|
- `@dscli/request/vue`:`createRequestPlugin`、`requestClientKey`、`useRequest`。
|
|
102
|
+
- `@dscli/request/browser`:`createBrowserRequest`,以及使用默认客户端的 `Upload`、`GetFileBlob`、`Download` 命名导出。
|
|
103
|
+
|
|
104
|
+
axios 和 Vue 都是 optional peer dependency:仅在导入相应子路径时安装并使用它们。根入口
|
|
105
|
+
不包含业务地址或 token,默认配置由应用显式设置;retry 只有在实例显式配置后才启用。
|
|
106
|
+
React 接入不增加本包的框架运行时依赖。
|
|
41
107
|
|
|
42
|
-
|
|
108
|
+
`browser` 子路径只在调用文件方法时访问 `document`、`URL.createObjectURL` 等浏览器 API;导入模块本身不会触发下载或访问网络。`Upload` 不会手动设置
|
|
109
|
+
`multipart/form-data`,以便浏览器或 axios 自动补齐 boundary。
|
|
43
110
|
|
|
44
111
|
## 开发
|
|
45
112
|
|
|
@@ -50,3 +117,17 @@ pnpm --filter @dscli/request test
|
|
|
50
117
|
pnpm --filter @dscli/request build
|
|
51
118
|
pnpm verify:request
|
|
52
119
|
```
|
|
120
|
+
|
|
121
|
+
### 安装包验证范围
|
|
122
|
+
|
|
123
|
+
以下命令从仓库根目录执行,都会构建并安装本地 tarball,在临时消费目录中检查发布内容和 ESM 入口:
|
|
124
|
+
|
|
125
|
+
| 命令 | 依赖与覆盖范围 |
|
|
126
|
+
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
127
|
+
| `pnpm verify:request` | 默认不安装 Axios/Vue 可选 peer;通过结构兼容的 mock 验证 Axios 适配器,不执行真实 Vue 依赖的注入回归。 |
|
|
128
|
+
| `node packages/request/scripts/verify-package.mjs --with-peers` | 显式安装真实 Axios/Vue,验证 Axios 实例适配与 Vue 插件注入;HTTP 响应仍由测试 adapter 模拟。 |
|
|
129
|
+
|
|
130
|
+
两种模式都会检查默认配置、HTTP/browser 入口共享与独立实例隔离。`--with-peers` 用于补充
|
|
131
|
+
真实可选依赖的兼容性检查,不等同于真实后端请求、浏览器交互或文件保存的端到端验证;安装
|
|
132
|
+
依赖时需要可用的 npm 注册表。实际执行结果与未覆盖边界见
|
|
133
|
+
[接入验证记录](../../docs/verification/request-integration.md)。
|
package/dist/axios/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RequestClient, RequestOptions } from '../core/types.js';
|
|
1
|
+
import type { RequestClient, RequestClientOptions, RequestOptions } from '../core/types.js';
|
|
2
2
|
/** axios 实例所需的最小结构,避免将 axios 打入本包。 */
|
|
3
3
|
export interface AxiosLike {
|
|
4
4
|
request<T = unknown>(config: AxiosRequestConfig): Promise<AxiosResponse<T>>;
|
|
@@ -20,8 +20,10 @@ export interface AxiosResponse<T> {
|
|
|
20
20
|
data: T;
|
|
21
21
|
status: number;
|
|
22
22
|
statusText?: string;
|
|
23
|
+
/** axios 原生 headers 版本差异较大,适配器只要求可枚举或提供 toJSON。 */
|
|
24
|
+
headers?: unknown;
|
|
23
25
|
}
|
|
24
|
-
export interface AxiosRequestClientOptions {
|
|
26
|
+
export interface AxiosRequestClientOptions extends Pick<RequestClientOptions, 'hooks' | 'retry' | 'dedupe'> {
|
|
25
27
|
baseUrl?: string;
|
|
26
28
|
headers?: HeadersInit;
|
|
27
29
|
timeout?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/axios/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/axios/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,cAAc,EAGf,MAAM,kBAAkB,CAAA;AAEzB,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;CAC5E;AAED,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AAErF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAA;IACP,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CACrD,oBAAoB,EACpB,OAAO,GAAG,OAAO,GAAG,QAAQ,CAC7B;IACC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA2ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAChB,QAAQ,GAAE,yBAA8B,GACvC,aAAa,CA6Ff"}
|
package/dist/axios/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { RequestError } from '../core/errors.js';
|
|
2
|
+
import { isFormDataBody } from '../core/body.js';
|
|
3
|
+
import { executeRequest as executeWithPolicies } from '../core/policies.js';
|
|
2
4
|
function mergeHeaders(defaultHeaders, headers) {
|
|
3
5
|
const merged = new Headers(defaultHeaders);
|
|
4
6
|
if (headers)
|
|
@@ -6,6 +8,27 @@ function mergeHeaders(defaultHeaders, headers) {
|
|
|
6
8
|
merged.set(key, value);
|
|
7
9
|
return Object.fromEntries(merged.entries());
|
|
8
10
|
}
|
|
11
|
+
/** 兼容 AxiosHeaders 的 toJSON 结构,再统一转为标准 Headers。 */
|
|
12
|
+
function normalizeResponseHeaders(headers) {
|
|
13
|
+
if (!headers)
|
|
14
|
+
return new Headers();
|
|
15
|
+
if (headers instanceof Headers)
|
|
16
|
+
return new Headers(headers);
|
|
17
|
+
const candidate = headers;
|
|
18
|
+
if (typeof candidate.toJSON === 'function') {
|
|
19
|
+
return normalizeResponseHeaders(candidate.toJSON());
|
|
20
|
+
}
|
|
21
|
+
if (typeof headers !== 'object')
|
|
22
|
+
return new Headers();
|
|
23
|
+
const normalized = {};
|
|
24
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
25
|
+
if (typeof value === 'string' || typeof value === 'number')
|
|
26
|
+
normalized[key] = String(value);
|
|
27
|
+
else if (Array.isArray(value))
|
|
28
|
+
normalized[key] = value.map(String).join(', ');
|
|
29
|
+
}
|
|
30
|
+
return new Headers(normalized);
|
|
31
|
+
}
|
|
9
32
|
function normalizeTimeout(timeout) {
|
|
10
33
|
if (timeout === undefined || timeout === 0)
|
|
11
34
|
return undefined;
|
|
@@ -18,8 +41,11 @@ function createData(options, headers) {
|
|
|
18
41
|
if (options.body !== undefined && options.json !== undefined) {
|
|
19
42
|
throw new RequestError('configuration', 'body 与 json 不能同时提供');
|
|
20
43
|
}
|
|
21
|
-
if (options.body !== undefined)
|
|
44
|
+
if (options.body !== undefined) {
|
|
45
|
+
if (isFormDataBody(options.body))
|
|
46
|
+
delete headers['content-type'];
|
|
22
47
|
return options.body;
|
|
48
|
+
}
|
|
23
49
|
if (options.json === undefined)
|
|
24
50
|
return undefined;
|
|
25
51
|
if (!Object.keys(headers).some((key) => key.toLowerCase() === 'content-type')) {
|
|
@@ -51,7 +77,7 @@ function createMethodRequest(request, method) {
|
|
|
51
77
|
*/
|
|
52
78
|
export function createAxiosRequest(axios, defaults = {}) {
|
|
53
79
|
const defaultTimeout = normalizeTimeout(defaults.timeout);
|
|
54
|
-
const
|
|
80
|
+
const executeRequestOnce = async (url, options = {}) => {
|
|
55
81
|
if (url.trim().length === 0)
|
|
56
82
|
throw new RequestError('configuration', '请求 URL 不能为空');
|
|
57
83
|
if (options.signal?.aborted) {
|
|
@@ -79,7 +105,12 @@ export function createAxiosRequest(axios, defaults = {}) {
|
|
|
79
105
|
statusText: response.statusText
|
|
80
106
|
});
|
|
81
107
|
}
|
|
82
|
-
return
|
|
108
|
+
return {
|
|
109
|
+
data: response.data,
|
|
110
|
+
status: response.status,
|
|
111
|
+
statusText: response.statusText ?? '',
|
|
112
|
+
headers: normalizeResponseHeaders(response.headers)
|
|
113
|
+
};
|
|
83
114
|
}
|
|
84
115
|
catch (cause) {
|
|
85
116
|
if (cause instanceof RequestError)
|
|
@@ -93,16 +124,24 @@ export function createAxiosRequest(axios, defaults = {}) {
|
|
|
93
124
|
cause
|
|
94
125
|
});
|
|
95
126
|
}
|
|
96
|
-
if (axiosError.code === 'ECONNABORTED') {
|
|
127
|
+
if (axiosError.code === 'ECONNABORTED' || axiosError.code === 'ETIMEDOUT') {
|
|
97
128
|
throw new RequestError('timeout', `请求超时:${timeout ?? 0}ms`, { url, cause });
|
|
98
129
|
}
|
|
99
|
-
if (options.signal?.aborted)
|
|
130
|
+
if (options.signal?.aborted || axiosError.code === 'ERR_CANCELED') {
|
|
100
131
|
throw new RequestError('abort', '请求已被取消', { url, cause });
|
|
132
|
+
}
|
|
101
133
|
throw new RequestError('network', '请求网络失败', { url, cause });
|
|
102
134
|
}
|
|
103
135
|
};
|
|
136
|
+
const inFlight = new Map();
|
|
137
|
+
const requestResponse = (url, options = {}) => executeWithPolicies(url, options, { hooks: defaults.hooks, retry: defaults.retry, dedupe: defaults.dedupe }, executeRequestOnce, inFlight);
|
|
138
|
+
const request = async (url, options = {}) => {
|
|
139
|
+
const result = await requestResponse(url, options);
|
|
140
|
+
return result.data;
|
|
141
|
+
};
|
|
104
142
|
return {
|
|
105
143
|
request,
|
|
144
|
+
requestResponse,
|
|
106
145
|
get: (url, options = {}) => request(url, { ...options, method: 'GET' }),
|
|
107
146
|
delete: (url, options = {}) => request(url, { ...options, method: 'DELETE' }),
|
|
108
147
|
post: createMethodRequest(request, 'POST'),
|
package/dist/axios/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/axios/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/axios/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RequestClient, RequestOptions } from '../core/types.js';
|
|
2
|
+
/** 上传字段允许的值;null/undefined 字段会被忽略。 */
|
|
3
|
+
export type UploadFieldValue = string | number | boolean | Blob | null | undefined;
|
|
4
|
+
/** Upload 可接收原始 BodyInit,也可接收自动转换为 FormData 的字段对象。 */
|
|
5
|
+
export type UploadData = BodyInit | Record<string, UploadFieldValue>;
|
|
6
|
+
/** 文件响应及其可用于下载的元数据。 */
|
|
7
|
+
export interface FileBlobResult {
|
|
8
|
+
data: Blob;
|
|
9
|
+
fileName?: string;
|
|
10
|
+
headers: Headers;
|
|
11
|
+
status: number;
|
|
12
|
+
statusText: string;
|
|
13
|
+
}
|
|
14
|
+
/** 获取文件时允许覆盖的请求选项;响应类型由方法固定为 blob。 */
|
|
15
|
+
export type GetFileBlobOptions = Omit<RequestOptions, 'method' | 'body' | 'json' | 'responseType'>;
|
|
16
|
+
/** 下载选项在请求配置外增加可选的本地文件名。 */
|
|
17
|
+
export interface DownloadOptions extends GetFileBlobOptions {
|
|
18
|
+
fileName?: string;
|
|
19
|
+
}
|
|
20
|
+
/** 根客户端加上浏览器文件能力后的客户端契约。 */
|
|
21
|
+
export interface BrowserRequestClient extends RequestClient {
|
|
22
|
+
Upload<T = unknown>(url: string, data: UploadData, options?: Omit<RequestOptions, 'method' | 'body' | 'json'>): Promise<T>;
|
|
23
|
+
GetFileBlob(url: string, options?: GetFileBlobOptions): Promise<FileBlobResult>;
|
|
24
|
+
Download(url: string, options?: DownloadOptions): Promise<FileBlobResult>;
|
|
25
|
+
}
|
|
26
|
+
/** 将简单字段对象转换为 FormData;不会设置 multipart Content-Type。 */
|
|
27
|
+
export declare function toFormData(data: Record<string, UploadFieldValue>): FormData;
|
|
28
|
+
/** 从 Content-Disposition 中读取 RFC 5987 或普通 filename。 */
|
|
29
|
+
export declare function getContentDispositionFilename(value: string | null): string | undefined;
|
|
30
|
+
/** 使用当前默认客户端上传;与根入口 Get/Post 共享配置和 hooks。 */
|
|
31
|
+
export declare function Upload<T = unknown>(url: string, data: UploadData, options?: Omit<RequestOptions, 'method' | 'body' | 'json'>): Promise<T>;
|
|
32
|
+
/** 使用当前默认客户端获取 Blob;不会触发浏览器保存。 */
|
|
33
|
+
export declare function GetFileBlob(url: string, options?: GetFileBlobOptions): Promise<FileBlobResult>;
|
|
34
|
+
/** 使用当前默认客户端下载文件;仅在调用时访问浏览器能力。 */
|
|
35
|
+
export declare function Download(url: string, options?: DownloadOptions): Promise<FileBlobResult>;
|
|
36
|
+
/** 将指定核心客户端扩展为浏览器客户端;始终绑定该实例,不跟随默认客户端切换。 */
|
|
37
|
+
export declare function createBrowserRequest(client: RequestClient): BrowserRequestClient;
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAErE,sCAAsC;AACtC,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;AAElF,sDAAsD;AACtD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAEpE,uBAAuB;AACvB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,sCAAsC;AACtC,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC,CAAA;AAElG,4BAA4B;AAC5B,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,4BAA4B;AAC5B,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,MAAM,CAAC,CAAC,GAAG,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,GACzD,OAAO,CAAC,CAAC,CAAC,CAAA;IACb,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC/E,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAC1E;AAaD,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAW3E;AAqCD,uDAAuD;AACvD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAatF;AAsED,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAM,GAC7D,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,kCAAkC;AAClC,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAEzB;AAED,kCAAkC;AAClC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5F;AAED,4CAA4C;AAC5C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,CAoBhF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { RequestError } from '../core/errors.js';
|
|
2
|
+
import { isFormDataBody } from '../core/body.js';
|
|
3
|
+
import { getDefaultRequestClient } from '../core/index.js';
|
|
4
|
+
function isBodyInit(value) {
|
|
5
|
+
if (typeof value === 'string')
|
|
6
|
+
return true;
|
|
7
|
+
if (isFormDataBody(value))
|
|
8
|
+
return true;
|
|
9
|
+
if (typeof Blob !== 'undefined' && value instanceof Blob)
|
|
10
|
+
return true;
|
|
11
|
+
if (typeof URLSearchParams !== 'undefined' && value instanceof URLSearchParams)
|
|
12
|
+
return true;
|
|
13
|
+
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer)
|
|
14
|
+
return true;
|
|
15
|
+
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(value))
|
|
16
|
+
return true;
|
|
17
|
+
if (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream)
|
|
18
|
+
return true;
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
/** 将简单字段对象转换为 FormData;不会设置 multipart Content-Type。 */
|
|
22
|
+
export function toFormData(data) {
|
|
23
|
+
if (typeof FormData === 'undefined') {
|
|
24
|
+
throw new RequestError('configuration', '当前运行时不支持 FormData');
|
|
25
|
+
}
|
|
26
|
+
const formData = new FormData();
|
|
27
|
+
for (const [key, value] of Object.entries(data)) {
|
|
28
|
+
if (value === null || value === undefined)
|
|
29
|
+
continue;
|
|
30
|
+
if (typeof Blob !== 'undefined' && value instanceof Blob)
|
|
31
|
+
formData.append(key, value);
|
|
32
|
+
else
|
|
33
|
+
formData.append(key, String(value));
|
|
34
|
+
}
|
|
35
|
+
return formData;
|
|
36
|
+
}
|
|
37
|
+
function resolveUploadBody(data) {
|
|
38
|
+
return isBodyInit(data) ? data : toFormData(data);
|
|
39
|
+
}
|
|
40
|
+
function decodeFilename(value) {
|
|
41
|
+
try {
|
|
42
|
+
return decodeURIComponent(value);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function decodeExtendedFilename(value, charset) {
|
|
49
|
+
try {
|
|
50
|
+
if (charset.toLowerCase() === 'utf-8')
|
|
51
|
+
return decodeURIComponent(value);
|
|
52
|
+
const bytes = [];
|
|
53
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
54
|
+
if (value[index] === '%') {
|
|
55
|
+
const hex = value.slice(index + 1, index + 3);
|
|
56
|
+
if (!/^[0-9a-f]{2}$/i.test(hex))
|
|
57
|
+
throw new URIError('非法的百分号编码');
|
|
58
|
+
bytes.push(Number.parseInt(hex, 16));
|
|
59
|
+
index += 2;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const code = value.charCodeAt(index);
|
|
63
|
+
if (code > 0x7f)
|
|
64
|
+
throw new URIError('扩展文件名包含非 ASCII 字符');
|
|
65
|
+
bytes.push(code);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return new TextDecoder(charset, { fatal: true }).decode(new Uint8Array(bytes));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return decodeFilename(value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** 从 Content-Disposition 中读取 RFC 5987 或普通 filename。 */
|
|
75
|
+
export function getContentDispositionFilename(value) {
|
|
76
|
+
if (!value)
|
|
77
|
+
return undefined;
|
|
78
|
+
const extended = value.match(/filename\*\s*=\s*([^;]+)/i)?.[1]?.trim();
|
|
79
|
+
if (extended) {
|
|
80
|
+
const firstQuote = extended.indexOf("'");
|
|
81
|
+
const secondQuote = extended.indexOf("'", firstQuote + 1);
|
|
82
|
+
if (firstQuote > 0 && secondQuote > firstQuote) {
|
|
83
|
+
return decodeExtendedFilename(extended.slice(secondQuote + 1), extended.slice(0, firstQuote));
|
|
84
|
+
}
|
|
85
|
+
return decodeFilename(extended);
|
|
86
|
+
}
|
|
87
|
+
const plain = value.match(/filename\s*=\s*(?:"([^"]+)"|'([^']+)'|([^;]+))/i);
|
|
88
|
+
return plain ? (plain[1] ?? plain[2] ?? plain[3])?.trim() : undefined;
|
|
89
|
+
}
|
|
90
|
+
/** 使用当前客户端上传原始 body 或自动生成的 FormData。 */
|
|
91
|
+
function upload(client, url, data, options = {}) {
|
|
92
|
+
return client.request(url, { ...options, method: 'POST', body: resolveUploadBody(data) });
|
|
93
|
+
}
|
|
94
|
+
/** 获取 Blob 及响应头,供下载、预览或自定义文件处理使用。 */
|
|
95
|
+
async function getFileBlob(client, url, options = {}) {
|
|
96
|
+
const response = await client.requestResponse(url, {
|
|
97
|
+
...options,
|
|
98
|
+
method: 'GET',
|
|
99
|
+
responseType: 'blob'
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
data: response.data,
|
|
103
|
+
fileName: getContentDispositionFilename(response.headers.get('content-disposition')),
|
|
104
|
+
headers: response.headers,
|
|
105
|
+
status: response.status,
|
|
106
|
+
statusText: response.statusText
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 下载文件并在浏览器中触发保存;对象 URL 会在点击后异步释放。
|
|
111
|
+
* 缺少服务端文件名时使用调用方提供的 fileName,否则回退为 download。
|
|
112
|
+
*/
|
|
113
|
+
async function download(client, url, options = {}) {
|
|
114
|
+
if (typeof document === 'undefined' || typeof URL === 'undefined') {
|
|
115
|
+
throw new RequestError('configuration', 'download 只能在浏览器环境中调用');
|
|
116
|
+
}
|
|
117
|
+
if (typeof URL.createObjectURL !== 'function') {
|
|
118
|
+
throw new RequestError('configuration', '当前浏览器不支持 URL.createObjectURL');
|
|
119
|
+
}
|
|
120
|
+
const { fileName: requestedFileName, ...requestOptions } = options;
|
|
121
|
+
const result = await getFileBlob(client, url, requestOptions);
|
|
122
|
+
const objectUrl = URL.createObjectURL(result.data);
|
|
123
|
+
const link = document.createElement('a');
|
|
124
|
+
link.href = objectUrl;
|
|
125
|
+
link.download = requestedFileName ?? result.fileName ?? 'download';
|
|
126
|
+
link.rel = 'noopener';
|
|
127
|
+
link.style.display = 'none';
|
|
128
|
+
if (!document.body) {
|
|
129
|
+
URL.revokeObjectURL(objectUrl);
|
|
130
|
+
throw new RequestError('configuration', '当前文档没有可用的 body');
|
|
131
|
+
}
|
|
132
|
+
document.body.appendChild(link);
|
|
133
|
+
link.click();
|
|
134
|
+
setTimeout(() => {
|
|
135
|
+
URL.revokeObjectURL(objectUrl);
|
|
136
|
+
link.remove();
|
|
137
|
+
}, 0);
|
|
138
|
+
return { ...result, fileName: link.download };
|
|
139
|
+
}
|
|
140
|
+
/** 使用当前默认客户端上传;与根入口 Get/Post 共享配置和 hooks。 */
|
|
141
|
+
export function Upload(url, data, options = {}) {
|
|
142
|
+
return upload(getDefaultRequestClient(), url, data, options);
|
|
143
|
+
}
|
|
144
|
+
/** 使用当前默认客户端获取 Blob;不会触发浏览器保存。 */
|
|
145
|
+
export function GetFileBlob(url, options = {}) {
|
|
146
|
+
return getFileBlob(getDefaultRequestClient(), url, options);
|
|
147
|
+
}
|
|
148
|
+
/** 使用当前默认客户端下载文件;仅在调用时访问浏览器能力。 */
|
|
149
|
+
export function Download(url, options = {}) {
|
|
150
|
+
return download(getDefaultRequestClient(), url, options);
|
|
151
|
+
}
|
|
152
|
+
/** 将指定核心客户端扩展为浏览器客户端;始终绑定该实例,不跟随默认客户端切换。 */
|
|
153
|
+
export function createBrowserRequest(client) {
|
|
154
|
+
const browserClient = {
|
|
155
|
+
// 显式绑定基础方法,兼容类实例/原型方法和依赖 this 的自定义客户端。
|
|
156
|
+
request: client.request.bind(client),
|
|
157
|
+
requestResponse: client.requestResponse.bind(client),
|
|
158
|
+
get: client.get.bind(client),
|
|
159
|
+
delete: client.delete.bind(client),
|
|
160
|
+
post: client.post.bind(client),
|
|
161
|
+
put: client.put.bind(client),
|
|
162
|
+
patch: client.patch.bind(client),
|
|
163
|
+
Upload: (url, data, options = {}) => upload(client, url, data, options),
|
|
164
|
+
GetFileBlob: (url, options = {}) => getFileBlob(client, url, options),
|
|
165
|
+
Download: (url, options = {}) => download(client, url, options)
|
|
166
|
+
};
|
|
167
|
+
return browserClient;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../src/core/body.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAGhE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** 判断运行时值是否为 FormData,兼容跨 iframe/realm 的原生实例。 */
|
|
2
|
+
export function isFormDataBody(value) {
|
|
3
|
+
if (typeof FormData !== 'undefined' && value instanceof FormData)
|
|
4
|
+
return true;
|
|
5
|
+
return Object.prototype.toString.call(value) === '[object FormData]';
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/core/body.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,YAAY,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC7E,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,mBAAmB,CAAA;AACtE,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,11 +1,41 @@
|
|
|
1
|
-
import type { DsRequestOptions, RequestClient, RequestClientOptions } from './types.js';
|
|
1
|
+
import type { DsRequestOptions, RequestClient, RequestClientOptions, RequestOptions } from './types.js';
|
|
2
2
|
export { RequestError } from './errors.js';
|
|
3
3
|
export type { RequestErrorKind, RequestErrorOptions } from './errors.js';
|
|
4
|
-
export type { DsRequestOptions, FetchImplementation, RequestClient, RequestClientOptions, RequestMethod, RequestOptions, RequestQuery, RequestQueryValue, RequestResponseType } from './types.js';
|
|
4
|
+
export type { DsRequestOptions, FetchImplementation, RequestClient, RequestClientOptions, RequestDedupeOptions, RequestErrorHookResult, RequestHookContext, RequestHooks, RequestMethod, RequestOptions, RequestQuery, RequestQueryValue, RequestResponse, RequestResponseType, RequestRetryContext, RequestRetryOptions } from './types.js';
|
|
5
5
|
/**
|
|
6
6
|
* 创建 fetch 请求客户端。函数在调用 request 前不会访问网络或浏览器全局。
|
|
7
7
|
*/
|
|
8
8
|
export declare function createRequest(defaults?: RequestClientOptions): RequestClient;
|
|
9
|
-
/**
|
|
9
|
+
/** 内部共享入口;每次便捷调用取得当前默认客户端,浏览器子入口使用同一个引用。 */
|
|
10
|
+
export declare function getDefaultRequestClient(): RequestClient;
|
|
11
|
+
/**
|
|
12
|
+
* 设置当前模块的默认客户端,支持 fetch、axios 或自定义 RequestClient。
|
|
13
|
+
* 只影响此后发起的便捷调用,不修改独立实例、Vue 注入或已经开始的请求。
|
|
14
|
+
* SSR 中携带用户身份的客户端应逐请求创建,不应设置为共享默认值。
|
|
15
|
+
*/
|
|
16
|
+
export declare function setDefaultRequestClient(client: RequestClient): void;
|
|
17
|
+
/**
|
|
18
|
+
* 创建并设置默认 fetch 客户端,返回同一实例以便 Vue 注入或显式调用。
|
|
19
|
+
* 再次调用时完整替换默认实例,不与旧配置合并;配置应在应用启动、业务请求之前执行。
|
|
20
|
+
*/
|
|
21
|
+
export declare function configureRequest(options?: RequestClientOptions): RequestClient;
|
|
22
|
+
/**
|
|
23
|
+
* 便捷 GET 导出;使用 configureRequest 或 setDefaultRequestClient 设置的默认客户端。
|
|
24
|
+
* 失败时抛出 RequestError,不返回旧版的 [data, error] 元组。
|
|
25
|
+
*/
|
|
26
|
+
export declare function Get<T = unknown>(url: string, options?: Omit<RequestOptions, 'method'>): Promise<T>;
|
|
27
|
+
/** 便捷 POST 导出;第二个参数按 JSON 序列化。 */
|
|
28
|
+
export declare function Post<T = unknown>(url: string, json?: unknown, options?: Omit<RequestOptions, 'method' | 'json' | 'body'>): Promise<T>;
|
|
29
|
+
/** 便捷 PUT 导出;第二个参数按 JSON 序列化。 */
|
|
30
|
+
export declare function Put<T = unknown>(url: string, json?: unknown, options?: Omit<RequestOptions, 'method' | 'json' | 'body'>): Promise<T>;
|
|
31
|
+
/** 便捷 PATCH 导出;第二个参数按 JSON 序列化。 */
|
|
32
|
+
export declare function Patch<T = unknown>(url: string, json?: unknown, options?: Omit<RequestOptions, 'method' | 'json' | 'body'>): Promise<T>;
|
|
33
|
+
/** 便捷 DELETE 导出;使用当前默认客户端。 */
|
|
34
|
+
export declare function Delete<T = unknown>(url: string, options?: Omit<RequestOptions, 'method'>): Promise<T>;
|
|
35
|
+
/** `Delete` 的旧命名别名;新代码使用 `Delete` 或客户端的 `delete`。 */
|
|
36
|
+
export declare const Del: typeof Delete;
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated 仅用于旧代码迁移;旧 body 一律按 JSON 序列化,新代码应优先使用 createRequest。
|
|
39
|
+
*/
|
|
10
40
|
export declare function dsRequest<T = unknown>(url: string, options?: DsRequestOptions): Promise<T>;
|
|
11
41
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAEhB,aAAa,EACb,oBAAoB,EACpB,cAAc,EAGf,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACxE,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AA8HnB;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,GAAE,oBAAyB,GAAG,aAAa,CAsFhF;AAID,4CAA4C;AAC5C,wBAAgB,uBAAuB,IAAI,aAAa,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAMnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAIlF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,GAAG,OAAO,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM,GAC3C,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,kCAAkC;AAClC,wBAAgB,IAAI,CAAC,CAAC,GAAG,OAAO,EAC9B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAM,GAC7D,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,iCAAiC;AACjC,wBAAgB,GAAG,CAAC,CAAC,GAAG,OAAO,EAC7B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAM,GAC7D,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,mCAAmC;AACnC,wBAAgB,KAAK,CAAC,CAAC,GAAG,OAAO,EAC/B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAM,GAC7D,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,8BAA8B;AAC9B,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAM,GAC3C,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,qDAAqD;AACrD,eAAO,MAAM,GAAG,eAAS,CAAA;AAEzB;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9F"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { RequestError } from './errors.js';
|
|
2
|
+
import { isFormDataBody } from './body.js';
|
|
3
|
+
import { executeRequest as executeWithPolicies } from './policies.js';
|
|
2
4
|
import { appendQuery, normalizeTimeout, resolveRequestUrl } from './url.js';
|
|
3
5
|
export { RequestError } from './errors.js';
|
|
4
6
|
function createAbortContext(signal, timeout) {
|
|
@@ -48,8 +50,12 @@ function createBody(options, headers) {
|
|
|
48
50
|
if (options.body !== undefined && options.json !== undefined) {
|
|
49
51
|
throw new RequestError('configuration', 'body 与 json 不能同时提供');
|
|
50
52
|
}
|
|
51
|
-
if (options.body !== undefined)
|
|
53
|
+
if (options.body !== undefined) {
|
|
54
|
+
// 显式删除默认或调用方遗留的 Content-Type,让 fetch 自动生成 boundary。
|
|
55
|
+
if (isFormDataBody(options.body))
|
|
56
|
+
headers.delete('content-type');
|
|
52
57
|
return options.body;
|
|
58
|
+
}
|
|
53
59
|
if (options.json === undefined)
|
|
54
60
|
return undefined;
|
|
55
61
|
let serialized;
|
|
@@ -106,7 +112,7 @@ function createMethodRequest(request, method) {
|
|
|
106
112
|
*/
|
|
107
113
|
export function createRequest(defaults = {}) {
|
|
108
114
|
const defaultTimeout = normalizeTimeout(defaults.timeout);
|
|
109
|
-
const
|
|
115
|
+
const executeRequestOnce = async (url, options = {}) => {
|
|
110
116
|
const timeout = normalizeTimeout(options.timeout ?? defaultTimeout);
|
|
111
117
|
const resolvedUrl = appendQuery(resolveRequestUrl(url, defaults.baseUrl), options.query);
|
|
112
118
|
if (options.signal?.aborted) {
|
|
@@ -132,7 +138,12 @@ export function createRequest(defaults = {}) {
|
|
|
132
138
|
statusText: response.statusText
|
|
133
139
|
});
|
|
134
140
|
}
|
|
135
|
-
return
|
|
141
|
+
return {
|
|
142
|
+
data: await parseResponse(response, options.responseType ?? 'json'),
|
|
143
|
+
status: response.status,
|
|
144
|
+
statusText: response.statusText,
|
|
145
|
+
headers: new Headers(response.headers)
|
|
146
|
+
};
|
|
136
147
|
}
|
|
137
148
|
catch (cause) {
|
|
138
149
|
if (cause instanceof RequestError)
|
|
@@ -149,8 +160,15 @@ export function createRequest(defaults = {}) {
|
|
|
149
160
|
abortContext.cleanup();
|
|
150
161
|
}
|
|
151
162
|
};
|
|
163
|
+
const inFlight = new Map();
|
|
164
|
+
const requestResponse = (url, options = {}) => executeWithPolicies(url, options, { hooks: defaults.hooks, retry: defaults.retry, dedupe: defaults.dedupe }, executeRequestOnce, inFlight);
|
|
165
|
+
const request = async (url, options = {}) => {
|
|
166
|
+
const result = await requestResponse(url, options);
|
|
167
|
+
return result.data;
|
|
168
|
+
};
|
|
152
169
|
return {
|
|
153
170
|
request,
|
|
171
|
+
requestResponse,
|
|
154
172
|
get: (url, options = {}) => request(url, { ...options, method: 'GET' }),
|
|
155
173
|
delete: (url, options = {}) => request(url, { ...options, method: 'DELETE' }),
|
|
156
174
|
post: createMethodRequest(request, 'POST'),
|
|
@@ -158,10 +176,62 @@ export function createRequest(defaults = {}) {
|
|
|
158
176
|
patch: createMethodRequest(request, 'PATCH')
|
|
159
177
|
};
|
|
160
178
|
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
179
|
+
let defaultRequestClient = createRequest();
|
|
180
|
+
/** 内部共享入口;每次便捷调用取得当前默认客户端,浏览器子入口使用同一个引用。 */
|
|
181
|
+
export function getDefaultRequestClient() {
|
|
182
|
+
return defaultRequestClient;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 设置当前模块的默认客户端,支持 fetch、axios 或自定义 RequestClient。
|
|
186
|
+
* 只影响此后发起的便捷调用,不修改独立实例、Vue 注入或已经开始的请求。
|
|
187
|
+
* SSR 中携带用户身份的客户端应逐请求创建,不应设置为共享默认值。
|
|
188
|
+
*/
|
|
189
|
+
export function setDefaultRequestClient(client) {
|
|
190
|
+
const methods = ['request', 'requestResponse', 'get', 'post', 'put', 'patch', 'delete'];
|
|
191
|
+
if (!client || methods.some((method) => typeof client[method] !== 'function')) {
|
|
192
|
+
throw new RequestError('configuration', '默认客户端必须实现完整的 RequestClient 接口');
|
|
193
|
+
}
|
|
194
|
+
defaultRequestClient = client;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 创建并设置默认 fetch 客户端,返回同一实例以便 Vue 注入或显式调用。
|
|
198
|
+
* 再次调用时完整替换默认实例,不与旧配置合并;配置应在应用启动、业务请求之前执行。
|
|
199
|
+
*/
|
|
200
|
+
export function configureRequest(options = {}) {
|
|
201
|
+
const client = createRequest(options);
|
|
202
|
+
setDefaultRequestClient(client);
|
|
203
|
+
return client;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 便捷 GET 导出;使用 configureRequest 或 setDefaultRequestClient 设置的默认客户端。
|
|
207
|
+
* 失败时抛出 RequestError,不返回旧版的 [data, error] 元组。
|
|
208
|
+
*/
|
|
209
|
+
export function Get(url, options = {}) {
|
|
210
|
+
return getDefaultRequestClient().get(url, options);
|
|
211
|
+
}
|
|
212
|
+
/** 便捷 POST 导出;第二个参数按 JSON 序列化。 */
|
|
213
|
+
export function Post(url, json, options = {}) {
|
|
214
|
+
return getDefaultRequestClient().post(url, json, options);
|
|
215
|
+
}
|
|
216
|
+
/** 便捷 PUT 导出;第二个参数按 JSON 序列化。 */
|
|
217
|
+
export function Put(url, json, options = {}) {
|
|
218
|
+
return getDefaultRequestClient().put(url, json, options);
|
|
219
|
+
}
|
|
220
|
+
/** 便捷 PATCH 导出;第二个参数按 JSON 序列化。 */
|
|
221
|
+
export function Patch(url, json, options = {}) {
|
|
222
|
+
return getDefaultRequestClient().patch(url, json, options);
|
|
223
|
+
}
|
|
224
|
+
/** 便捷 DELETE 导出;使用当前默认客户端。 */
|
|
225
|
+
export function Delete(url, options = {}) {
|
|
226
|
+
return getDefaultRequestClient().delete(url, options);
|
|
227
|
+
}
|
|
228
|
+
/** `Delete` 的旧命名别名;新代码使用 `Delete` 或客户端的 `delete`。 */
|
|
229
|
+
export const Del = Delete;
|
|
230
|
+
/**
|
|
231
|
+
* @deprecated 仅用于旧代码迁移;旧 body 一律按 JSON 序列化,新代码应优先使用 createRequest。
|
|
232
|
+
*/
|
|
163
233
|
export function dsRequest(url, options = {}) {
|
|
164
234
|
const { body, ...requestOptions } = options;
|
|
165
|
-
return
|
|
235
|
+
return getDefaultRequestClient().request(url, { ...requestOptions, json: body });
|
|
166
236
|
}
|
|
167
237
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RequestDedupeOptions, RequestHooks, RequestOptions, RequestResponse, RequestRetryOptions } from './types.js';
|
|
2
|
+
/** 适配器执行一次请求所需的最小函数。策略层不关心底层是 Fetch 还是 Axios。 */
|
|
3
|
+
export type RequestExecutor = <T>(url: string, options: RequestOptions) => Promise<RequestResponse<T>>;
|
|
4
|
+
export interface RequestPolicyOptions {
|
|
5
|
+
hooks?: RequestHooks;
|
|
6
|
+
retry?: false | RequestRetryOptions;
|
|
7
|
+
dedupe?: boolean | RequestDedupeOptions;
|
|
8
|
+
}
|
|
9
|
+
interface DedupeEntry {
|
|
10
|
+
controller: AbortController;
|
|
11
|
+
}
|
|
12
|
+
/** 执行实例级 hooks、retry 和 dedupe;同一实例不会共享请求状态。 */
|
|
13
|
+
export declare function executeRequest<T>(url: string, options: RequestOptions, policies: RequestPolicyOptions, execute: RequestExecutor, inFlight: Map<string, DedupeEntry>): Promise<RequestResponse<T>>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=policies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../src/core/policies.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EAGpB,YAAY,EAEZ,cAAc,EACd,eAAe,EAEf,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAEnB,iDAAiD;AACjD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;AAEhC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAAA;IACnC,MAAM,CAAC,EAAE,OAAO,GAAG,oBAAoB,CAAA;CACxC;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,eAAe,CAAA;CAC5B;AAiKD,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACjC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CA+B7B"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { RequestError } from './errors.js';
|
|
2
|
+
const defaultDedupeMethods = new Set(['GET', 'HEAD']);
|
|
3
|
+
function mergeOptions(base, patch) {
|
|
4
|
+
const merged = { ...base, ...patch };
|
|
5
|
+
if (base.headers || patch.headers) {
|
|
6
|
+
const headers = new Headers(base.headers);
|
|
7
|
+
for (const [key, value] of new Headers(patch.headers))
|
|
8
|
+
headers.set(key, value);
|
|
9
|
+
merged.headers = headers;
|
|
10
|
+
}
|
|
11
|
+
return merged;
|
|
12
|
+
}
|
|
13
|
+
function stableQuery(options) {
|
|
14
|
+
if (!options.query)
|
|
15
|
+
return '';
|
|
16
|
+
const parameters = [];
|
|
17
|
+
for (const key of Object.keys(options.query).sort()) {
|
|
18
|
+
const value = options.query[key];
|
|
19
|
+
const values = Array.isArray(value) ? value : [value];
|
|
20
|
+
for (const item of values) {
|
|
21
|
+
if (item !== null && item !== undefined) {
|
|
22
|
+
parameters.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(item))}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return parameters.join('&');
|
|
27
|
+
}
|
|
28
|
+
function getDedupeKey(url, options, config) {
|
|
29
|
+
if (config.key)
|
|
30
|
+
return config.key(url, options);
|
|
31
|
+
return `${(options.method ?? 'GET').toUpperCase()} ${url}?${stableQuery(options)}#${options.responseType ?? 'json'}`;
|
|
32
|
+
}
|
|
33
|
+
function getDedupeConfig(dedupe, options) {
|
|
34
|
+
if (!dedupe)
|
|
35
|
+
return undefined;
|
|
36
|
+
const config = dedupe === true ? {} : dedupe;
|
|
37
|
+
const methods = config.methods ?? [...defaultDedupeMethods];
|
|
38
|
+
const method = (options.method ?? 'GET').toUpperCase();
|
|
39
|
+
return methods.some((item) => item.toUpperCase() === method) ? { ...config, methods } : undefined;
|
|
40
|
+
}
|
|
41
|
+
function toRequestError(error, url) {
|
|
42
|
+
if (error instanceof RequestError)
|
|
43
|
+
return error;
|
|
44
|
+
return new RequestError('network', '请求网络失败', { url, cause: error });
|
|
45
|
+
}
|
|
46
|
+
function normalizeRetries(retry) {
|
|
47
|
+
if (!retry)
|
|
48
|
+
return undefined;
|
|
49
|
+
const retries = retry.retries ?? 3;
|
|
50
|
+
if (!Number.isInteger(retries) || retries < 0) {
|
|
51
|
+
throw new RequestError('configuration', 'retry.retries 必须是非负整数');
|
|
52
|
+
}
|
|
53
|
+
const delay = retry.delay ?? 100;
|
|
54
|
+
const factor = retry.factor ?? 2;
|
|
55
|
+
const maxDelay = retry.maxDelay ?? 2_000;
|
|
56
|
+
if (!Number.isFinite(delay) || delay < 0) {
|
|
57
|
+
throw new RequestError('configuration', 'retry.delay 必须是非负有限毫秒数');
|
|
58
|
+
}
|
|
59
|
+
if (!Number.isFinite(factor) || factor < 1) {
|
|
60
|
+
throw new RequestError('configuration', 'retry.factor 必须是不小于 1 的有限数');
|
|
61
|
+
}
|
|
62
|
+
if (!Number.isFinite(maxDelay) || maxDelay < 0) {
|
|
63
|
+
throw new RequestError('configuration', 'retry.maxDelay 必须是非负有限毫秒数');
|
|
64
|
+
}
|
|
65
|
+
return { ...retry, retries, delay, factor, maxDelay };
|
|
66
|
+
}
|
|
67
|
+
function isDefaultRetryable(error) {
|
|
68
|
+
return (error.kind === 'network' ||
|
|
69
|
+
error.kind === 'timeout' ||
|
|
70
|
+
(error.kind === 'http' && (error.status ?? 0) >= 500));
|
|
71
|
+
}
|
|
72
|
+
function isDefaultRetryMethod(method) {
|
|
73
|
+
return ['GET', 'HEAD', 'OPTIONS'].includes((method ?? 'GET').toUpperCase());
|
|
74
|
+
}
|
|
75
|
+
async function waitForRetry(delay, signal, url) {
|
|
76
|
+
if (delay === 0)
|
|
77
|
+
return;
|
|
78
|
+
await new Promise((resolve, reject) => {
|
|
79
|
+
let abort = () => undefined;
|
|
80
|
+
const timer = setTimeout(() => {
|
|
81
|
+
signal?.removeEventListener('abort', abort);
|
|
82
|
+
resolve();
|
|
83
|
+
}, delay);
|
|
84
|
+
abort = () => {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
signal?.removeEventListener('abort', abort);
|
|
87
|
+
reject(new RequestError('abort', '请求已被取消', { url, cause: signal?.reason }));
|
|
88
|
+
};
|
|
89
|
+
if (signal?.aborted)
|
|
90
|
+
abort();
|
|
91
|
+
else
|
|
92
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function createCombinedSignal(signal, controller) {
|
|
96
|
+
const abort = () => controller.abort(signal?.reason);
|
|
97
|
+
if (signal?.aborted)
|
|
98
|
+
abort();
|
|
99
|
+
else
|
|
100
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
101
|
+
return () => signal?.removeEventListener('abort', abort);
|
|
102
|
+
}
|
|
103
|
+
async function executeWithPolicies(url, initialOptions, policies, execute, prepare) {
|
|
104
|
+
const retry = normalizeRetries(policies.retry);
|
|
105
|
+
let attempt = 0;
|
|
106
|
+
while (true) {
|
|
107
|
+
// 每次尝试重新应用 hook,避免沿用上次尝试补充的 token 或其他临时选项。
|
|
108
|
+
let options = initialOptions;
|
|
109
|
+
const hookContext = { url, options, attempt };
|
|
110
|
+
const patch = await policies.hooks?.onRequest?.(hookContext);
|
|
111
|
+
if (patch)
|
|
112
|
+
options = mergeOptions(options, patch);
|
|
113
|
+
if (prepare)
|
|
114
|
+
options = prepare(url, options, { url, options, attempt });
|
|
115
|
+
const context = { url, options, attempt };
|
|
116
|
+
let response;
|
|
117
|
+
try {
|
|
118
|
+
response = await execute(url, options);
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
const error = toRequestError(cause, url);
|
|
122
|
+
const errorHookResult = await policies.hooks?.onError?.(context, error);
|
|
123
|
+
const retryContext = { ...context, error };
|
|
124
|
+
const retryable = errorHookResult && 'retry' in errorHookResult
|
|
125
|
+
? errorHookResult.retry === true
|
|
126
|
+
: retry?.retryable
|
|
127
|
+
? await retry.retryable(error, retryContext)
|
|
128
|
+
: isDefaultRetryMethod(options.method) && isDefaultRetryable(error);
|
|
129
|
+
if (!retry || attempt >= retry.retries || !retryable)
|
|
130
|
+
throw error;
|
|
131
|
+
const delay = Math.min(retry.maxDelay, retry.delay * retry.factor ** attempt);
|
|
132
|
+
await waitForRetry(delay, options.signal, url);
|
|
133
|
+
attempt += 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
await policies.hooks?.onResponse?.(context, response);
|
|
137
|
+
return response;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** 执行实例级 hooks、retry 和 dedupe;同一实例不会共享请求状态。 */
|
|
141
|
+
export function executeRequest(url, options, policies, execute, inFlight) {
|
|
142
|
+
let key;
|
|
143
|
+
let entry;
|
|
144
|
+
let cleanupSignal = () => undefined;
|
|
145
|
+
const prepare = (requestUrl, requestOptions, context) => {
|
|
146
|
+
// 只在首个尝试上建立去重记录;重试沿用同一控制器和 key。
|
|
147
|
+
if (entry || context.attempt > 0) {
|
|
148
|
+
return entry ? { ...requestOptions, signal: entry.controller.signal } : requestOptions;
|
|
149
|
+
}
|
|
150
|
+
const dedupeConfig = getDedupeConfig(policies.dedupe, requestOptions);
|
|
151
|
+
if (!dedupeConfig)
|
|
152
|
+
return requestOptions;
|
|
153
|
+
key = getDedupeKey(requestUrl, requestOptions, dedupeConfig);
|
|
154
|
+
const controller = new AbortController();
|
|
155
|
+
cleanupSignal = createCombinedSignal(requestOptions.signal, controller);
|
|
156
|
+
const previous = inFlight.get(key);
|
|
157
|
+
previous?.controller.abort(new Error('请求被同一实例中的重复请求取消'));
|
|
158
|
+
entry = { controller };
|
|
159
|
+
inFlight.set(key, entry);
|
|
160
|
+
return { ...requestOptions, signal: controller.signal };
|
|
161
|
+
};
|
|
162
|
+
const promise = executeWithPolicies(url, options, policies, execute, prepare);
|
|
163
|
+
const cleanup = () => {
|
|
164
|
+
cleanupSignal();
|
|
165
|
+
if (key && entry && inFlight.get(key) === entry)
|
|
166
|
+
inFlight.delete(key);
|
|
167
|
+
};
|
|
168
|
+
void promise.then(cleanup, cleanup);
|
|
169
|
+
return promise;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=policies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../src/core/policies.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RequestError } from './errors.js';
|
|
1
2
|
/** 支持自定义方法名,同时为常用 HTTP 方法提供自动补全。 */
|
|
2
3
|
export type RequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});
|
|
3
4
|
/** 请求客户端能够读取的响应形式。 */
|
|
@@ -19,6 +20,39 @@ export interface RequestOptions {
|
|
|
19
20
|
timeout?: number;
|
|
20
21
|
responseType?: RequestResponseType;
|
|
21
22
|
}
|
|
23
|
+
/** 每次请求都会传递给实例级 hook 的上下文。 */
|
|
24
|
+
export interface RequestHookContext {
|
|
25
|
+
readonly url: string;
|
|
26
|
+
readonly options: RequestOptions;
|
|
27
|
+
readonly attempt: number;
|
|
28
|
+
}
|
|
29
|
+
/** 请求失败时传递给 retry 判定函数的上下文。 */
|
|
30
|
+
export interface RequestRetryContext extends RequestHookContext {
|
|
31
|
+
readonly error: RequestError;
|
|
32
|
+
}
|
|
33
|
+
/** onError 可用该结果覆盖当前失败是否进入 retry。 */
|
|
34
|
+
export interface RequestErrorHookResult {
|
|
35
|
+
retry?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** 实例级请求生命周期 hook;onRequest 可返回需要覆盖的请求选项。 */
|
|
38
|
+
export interface RequestHooks {
|
|
39
|
+
onRequest?: (context: RequestHookContext) => void | Partial<RequestOptions> | Promise<void | Partial<RequestOptions>>;
|
|
40
|
+
onResponse?: (context: RequestHookContext, response: RequestResponse<unknown>) => void | Promise<void>;
|
|
41
|
+
onError?: (context: RequestHookContext, error: RequestError) => void | RequestErrorHookResult | Promise<void | RequestErrorHookResult>;
|
|
42
|
+
}
|
|
43
|
+
/** 可配置的重试策略;retry 传入对象后默认最多重试 3 次。 */
|
|
44
|
+
export interface RequestRetryOptions {
|
|
45
|
+
retries?: number;
|
|
46
|
+
delay?: number;
|
|
47
|
+
factor?: number;
|
|
48
|
+
maxDelay?: number;
|
|
49
|
+
retryable?: (error: RequestError, context: RequestRetryContext) => boolean | Promise<boolean>;
|
|
50
|
+
}
|
|
51
|
+
/** 请求去重策略;默认只处理 GET 和 HEAD,避免误取消写操作。 */
|
|
52
|
+
export interface RequestDedupeOptions {
|
|
53
|
+
methods?: readonly RequestMethod[];
|
|
54
|
+
key?: (url: string, options: RequestOptions) => string;
|
|
55
|
+
}
|
|
22
56
|
/** 创建 fetch 请求客户端的默认选项。 */
|
|
23
57
|
export interface RequestClientOptions {
|
|
24
58
|
baseUrl?: string;
|
|
@@ -26,10 +60,26 @@ export interface RequestClientOptions {
|
|
|
26
60
|
fetch?: FetchImplementation;
|
|
27
61
|
/** 毫秒;可被单次请求的 timeout 覆盖。 */
|
|
28
62
|
timeout?: number;
|
|
63
|
+
/** 实例级请求生命周期 hook,不产生全局状态。 */
|
|
64
|
+
hooks?: RequestHooks;
|
|
65
|
+
/** 传入对象启用重试;默认仅对 GET/HEAD/OPTIONS 的网络、超时和 5xx 重试。 */
|
|
66
|
+
retry?: false | RequestRetryOptions;
|
|
67
|
+
/** 默认关闭;启用后仅取消同一实例中重复的 GET/HEAD 请求。 */
|
|
68
|
+
dedupe?: boolean | RequestDedupeOptions;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 携带响应元数据的统一结果;文件能力需要通过它读取 headers 和状态。
|
|
72
|
+
*/
|
|
73
|
+
export interface RequestResponse<T = unknown> {
|
|
74
|
+
data: T;
|
|
75
|
+
status: number;
|
|
76
|
+
statusText: string;
|
|
77
|
+
headers: Headers;
|
|
29
78
|
}
|
|
30
79
|
/** 统一的请求客户端契约,供 fetch、axios 和 Vue 注入共用。 */
|
|
31
80
|
export interface RequestClient {
|
|
32
81
|
request<T = unknown>(url: string, options?: RequestOptions): Promise<T>;
|
|
82
|
+
requestResponse<T = unknown>(url: string, options?: RequestOptions): Promise<RequestResponse<T>>;
|
|
33
83
|
get<T = unknown>(url: string, options?: Omit<RequestOptions, 'method'>): Promise<T>;
|
|
34
84
|
delete<T = unknown>(url: string, options?: Omit<RequestOptions, 'method'>): Promise<T>;
|
|
35
85
|
post<T = unknown>(url: string, json?: unknown, options?: Omit<RequestOptions, 'method' | 'json' | 'body'>): Promise<T>;
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { createRequest, dsRequest, RequestError } from './core/index.js';
|
|
2
|
-
export type { DsRequestOptions, FetchImplementation, RequestClient, RequestClientOptions, RequestErrorKind, RequestErrorOptions, RequestMethod, RequestOptions, RequestQuery, RequestQueryValue, RequestResponseType } from './core/index.js';
|
|
1
|
+
export { createRequest, configureRequest, setDefaultRequestClient, dsRequest, Del, Delete, Get, Post, Put, Patch, RequestError } from './core/index.js';
|
|
2
|
+
export type { DsRequestOptions, FetchImplementation, RequestClient, RequestClientOptions, RequestDedupeOptions, RequestErrorHookResult, RequestHookContext, RequestHooks, RequestErrorKind, RequestErrorOptions, RequestMethod, RequestOptions, RequestQuery, RequestQueryValue, RequestResponse, RequestResponseType, RequestRetryContext, RequestRetryOptions } from './core/index.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,SAAS,EACT,GAAG,EACH,MAAM,EACN,GAAG,EACH,IAAI,EACJ,GAAG,EACH,KAAK,EACL,YAAY,EACb,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createRequest, dsRequest, RequestError } from './core/index.js';
|
|
1
|
+
export { createRequest, configureRequest, setDefaultRequestClient, dsRequest, Del, Delete, Get, Post, Put, Patch, RequestError } from './core/index.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,SAAS,EACT,GAAG,EACH,MAAM,EACN,GAAG,EACH,IAAI,EACJ,GAAG,EACH,KAAK,EACL,YAAY,EACb,MAAM,iBAAiB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dscli/request",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.1",
|
|
4
4
|
"description": "类型安全、可扩展且兼容 SSR 的 fetch 请求客户端",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"typings": "./dist/index.d.ts",
|
|
6
10
|
"scripts": {
|
|
7
11
|
"clean": "node ./scripts/clean.mjs",
|
|
8
12
|
"build": "pnpm run clean && tsc -p tsconfig.build.json",
|
|
@@ -15,16 +19,25 @@
|
|
|
15
19
|
"exports": {
|
|
16
20
|
".": {
|
|
17
21
|
"types": "./dist/index.d.ts",
|
|
18
|
-
"import": "./dist/index.js"
|
|
22
|
+
"import": "./dist/index.js",
|
|
23
|
+
"default": "./dist/index.js"
|
|
19
24
|
},
|
|
20
25
|
"./axios": {
|
|
21
26
|
"types": "./dist/axios/index.d.ts",
|
|
22
|
-
"import": "./dist/axios/index.js"
|
|
27
|
+
"import": "./dist/axios/index.js",
|
|
28
|
+
"default": "./dist/axios/index.js"
|
|
23
29
|
},
|
|
24
30
|
"./vue": {
|
|
25
31
|
"types": "./dist/vue/index.d.ts",
|
|
26
|
-
"import": "./dist/vue/index.js"
|
|
27
|
-
|
|
32
|
+
"import": "./dist/vue/index.js",
|
|
33
|
+
"default": "./dist/vue/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./browser": {
|
|
36
|
+
"types": "./dist/browser/index.d.ts",
|
|
37
|
+
"import": "./dist/browser/index.js",
|
|
38
|
+
"default": "./dist/browser/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./package.json": "./package.json"
|
|
28
41
|
},
|
|
29
42
|
"files": [
|
|
30
43
|
"dist",
|