@qhr123/sa2kit 0.6.1 → 0.7.0
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/dist/adapters/index.d.mts +81 -0
- package/dist/adapters/index.d.ts +81 -0
- package/dist/adapters/index.js +122 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +83 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/index.mjs.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export { ElectronStorageAdapter, MiniAppStorageAdapter, ReactNativeStorageAdapter, StorageAdapter, StorageChangeEvent, WebStorageAdapter, useAsyncStorage, useElectronStorage, useLocalStorage, useStorage, useTaroStorage } from '../storage/index.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 请求配置接口
|
|
5
|
+
*/
|
|
6
|
+
interface RequestConfig {
|
|
7
|
+
/** 请求 URL */
|
|
8
|
+
url: string;
|
|
9
|
+
/** HTTP 方法 */
|
|
10
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
11
|
+
/** 请求头 */
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
/** 请求体 */
|
|
14
|
+
body?: any;
|
|
15
|
+
/** 查询参数 */
|
|
16
|
+
params?: Record<string, any>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 请求适配器接口
|
|
20
|
+
* 用于抽象不同平台的网络请求实现
|
|
21
|
+
* - Mobile/Desktop: fetch API
|
|
22
|
+
* - Miniapp: Taro.request
|
|
23
|
+
*/
|
|
24
|
+
interface RequestAdapter {
|
|
25
|
+
/**
|
|
26
|
+
* 发送 HTTP 请求
|
|
27
|
+
* @param config 请求配置
|
|
28
|
+
* @returns 响应数据
|
|
29
|
+
*/
|
|
30
|
+
request<T = any>(config: RequestConfig): Promise<T>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Web 平台请求适配器
|
|
35
|
+
* 基于标准 fetch API
|
|
36
|
+
*
|
|
37
|
+
* 适用平台:
|
|
38
|
+
* - Web (Next.js)
|
|
39
|
+
* - Desktop (Electron)
|
|
40
|
+
* - Mobile (React Native)
|
|
41
|
+
*/
|
|
42
|
+
declare class WebRequestAdapter implements RequestAdapter {
|
|
43
|
+
request<T = any>(config: RequestConfig): Promise<T>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Taro Request 接口定义
|
|
48
|
+
* 兼容 @tarojs/taro request API
|
|
49
|
+
*/
|
|
50
|
+
interface TaroRequestStatic {
|
|
51
|
+
request<T = any>(options: {
|
|
52
|
+
url: string;
|
|
53
|
+
method?: string;
|
|
54
|
+
header?: Record<string, string>;
|
|
55
|
+
data?: any;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
statusCode: number;
|
|
58
|
+
data: T;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Miniapp 平台请求适配器
|
|
63
|
+
* 基于 Taro.request API
|
|
64
|
+
*
|
|
65
|
+
* 使用方式:
|
|
66
|
+
* ```typescript
|
|
67
|
+
* import Taro from '@tarojs/taro'
|
|
68
|
+
* const adapter = new MiniappRequestAdapter(Taro)
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* 适用平台:
|
|
72
|
+
* - WeChat Miniapp
|
|
73
|
+
* - Other Taro-based miniapps
|
|
74
|
+
*/
|
|
75
|
+
declare class MiniappRequestAdapter implements RequestAdapter {
|
|
76
|
+
private taro;
|
|
77
|
+
constructor(taro: TaroRequestStatic);
|
|
78
|
+
request<T = any>(config: RequestConfig): Promise<T>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { MiniappRequestAdapter, type RequestAdapter, type RequestConfig, WebRequestAdapter };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export { ElectronStorageAdapter, MiniAppStorageAdapter, ReactNativeStorageAdapter, StorageAdapter, StorageChangeEvent, WebStorageAdapter, useAsyncStorage, useElectronStorage, useLocalStorage, useStorage, useTaroStorage } from '../storage/index.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 请求配置接口
|
|
5
|
+
*/
|
|
6
|
+
interface RequestConfig {
|
|
7
|
+
/** 请求 URL */
|
|
8
|
+
url: string;
|
|
9
|
+
/** HTTP 方法 */
|
|
10
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
11
|
+
/** 请求头 */
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
/** 请求体 */
|
|
14
|
+
body?: any;
|
|
15
|
+
/** 查询参数 */
|
|
16
|
+
params?: Record<string, any>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 请求适配器接口
|
|
20
|
+
* 用于抽象不同平台的网络请求实现
|
|
21
|
+
* - Mobile/Desktop: fetch API
|
|
22
|
+
* - Miniapp: Taro.request
|
|
23
|
+
*/
|
|
24
|
+
interface RequestAdapter {
|
|
25
|
+
/**
|
|
26
|
+
* 发送 HTTP 请求
|
|
27
|
+
* @param config 请求配置
|
|
28
|
+
* @returns 响应数据
|
|
29
|
+
*/
|
|
30
|
+
request<T = any>(config: RequestConfig): Promise<T>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Web 平台请求适配器
|
|
35
|
+
* 基于标准 fetch API
|
|
36
|
+
*
|
|
37
|
+
* 适用平台:
|
|
38
|
+
* - Web (Next.js)
|
|
39
|
+
* - Desktop (Electron)
|
|
40
|
+
* - Mobile (React Native)
|
|
41
|
+
*/
|
|
42
|
+
declare class WebRequestAdapter implements RequestAdapter {
|
|
43
|
+
request<T = any>(config: RequestConfig): Promise<T>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Taro Request 接口定义
|
|
48
|
+
* 兼容 @tarojs/taro request API
|
|
49
|
+
*/
|
|
50
|
+
interface TaroRequestStatic {
|
|
51
|
+
request<T = any>(options: {
|
|
52
|
+
url: string;
|
|
53
|
+
method?: string;
|
|
54
|
+
header?: Record<string, string>;
|
|
55
|
+
data?: any;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
statusCode: number;
|
|
58
|
+
data: T;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Miniapp 平台请求适配器
|
|
63
|
+
* 基于 Taro.request API
|
|
64
|
+
*
|
|
65
|
+
* 使用方式:
|
|
66
|
+
* ```typescript
|
|
67
|
+
* import Taro from '@tarojs/taro'
|
|
68
|
+
* const adapter = new MiniappRequestAdapter(Taro)
|
|
69
|
+
* ```
|
|
70
|
+
*
|
|
71
|
+
* 适用平台:
|
|
72
|
+
* - WeChat Miniapp
|
|
73
|
+
* - Other Taro-based miniapps
|
|
74
|
+
*/
|
|
75
|
+
declare class MiniappRequestAdapter implements RequestAdapter {
|
|
76
|
+
private taro;
|
|
77
|
+
constructor(taro: TaroRequestStatic);
|
|
78
|
+
request<T = any>(config: RequestConfig): Promise<T>;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { MiniappRequestAdapter, type RequestAdapter, type RequestConfig, WebRequestAdapter };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkTLXAIOXP_js = require('../chunk-TLXAIOXP.js');
|
|
4
|
+
require('../chunk-DGUM43GV.js');
|
|
5
|
+
|
|
6
|
+
// src/adapters/request/web-adapter.ts
|
|
7
|
+
var WebRequestAdapter = class {
|
|
8
|
+
async request(config) {
|
|
9
|
+
const { url, method = "GET", headers = {}, body, params } = config;
|
|
10
|
+
let fullUrl = url;
|
|
11
|
+
if (params) {
|
|
12
|
+
const searchParams = new URLSearchParams();
|
|
13
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
14
|
+
if (value !== void 0 && value !== null) {
|
|
15
|
+
searchParams.append(key, String(value));
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const queryString = searchParams.toString();
|
|
19
|
+
if (queryString) {
|
|
20
|
+
fullUrl += (url.includes("?") ? "&" : "?") + queryString;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const response = await fetch(fullUrl, {
|
|
24
|
+
method,
|
|
25
|
+
headers: {
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
...headers
|
|
28
|
+
},
|
|
29
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
30
|
+
credentials: "include"
|
|
31
|
+
// 🔐 自动发送和接收 Cookie(支持 httpOnly Cookie 认证)
|
|
32
|
+
});
|
|
33
|
+
const data = await response.json();
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: data.error || `\u8BF7\u6C42\u5931\u8D25: ${response.status}`
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// src/adapters/request/miniapp-adapter.ts
|
|
45
|
+
var MiniappRequestAdapter = class {
|
|
46
|
+
constructor(taro) {
|
|
47
|
+
if (!taro) {
|
|
48
|
+
throw new Error("MiniappRequestAdapter requires Taro instance");
|
|
49
|
+
}
|
|
50
|
+
this.taro = taro;
|
|
51
|
+
}
|
|
52
|
+
async request(config) {
|
|
53
|
+
const { url, method = "GET", headers = {}, body, params } = config;
|
|
54
|
+
try {
|
|
55
|
+
const response = await this.taro.request({
|
|
56
|
+
url,
|
|
57
|
+
method,
|
|
58
|
+
header: {
|
|
59
|
+
"Content-Type": "application/json",
|
|
60
|
+
...headers
|
|
61
|
+
},
|
|
62
|
+
data: method === "GET" ? params : body
|
|
63
|
+
});
|
|
64
|
+
const data = response.data;
|
|
65
|
+
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
66
|
+
return data;
|
|
67
|
+
} else {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: data.error || `\u8BF7\u6C42\u5931\u8D25: ${response.statusCode}`
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
console.error("[MiniappRequestAdapter] request error:", error);
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
error: error instanceof Error ? error.message : "\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25"
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
Object.defineProperty(exports, "ElectronStorageAdapter", {
|
|
84
|
+
enumerable: true,
|
|
85
|
+
get: function () { return chunkTLXAIOXP_js.ElectronStorageAdapter; }
|
|
86
|
+
});
|
|
87
|
+
Object.defineProperty(exports, "MiniAppStorageAdapter", {
|
|
88
|
+
enumerable: true,
|
|
89
|
+
get: function () { return chunkTLXAIOXP_js.MiniAppStorageAdapter; }
|
|
90
|
+
});
|
|
91
|
+
Object.defineProperty(exports, "ReactNativeStorageAdapter", {
|
|
92
|
+
enumerable: true,
|
|
93
|
+
get: function () { return chunkTLXAIOXP_js.ReactNativeStorageAdapter; }
|
|
94
|
+
});
|
|
95
|
+
Object.defineProperty(exports, "WebStorageAdapter", {
|
|
96
|
+
enumerable: true,
|
|
97
|
+
get: function () { return chunkTLXAIOXP_js.WebStorageAdapter; }
|
|
98
|
+
});
|
|
99
|
+
Object.defineProperty(exports, "useAsyncStorage", {
|
|
100
|
+
enumerable: true,
|
|
101
|
+
get: function () { return chunkTLXAIOXP_js.useAsyncStorage; }
|
|
102
|
+
});
|
|
103
|
+
Object.defineProperty(exports, "useElectronStorage", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
get: function () { return chunkTLXAIOXP_js.useElectronStorage; }
|
|
106
|
+
});
|
|
107
|
+
Object.defineProperty(exports, "useLocalStorage", {
|
|
108
|
+
enumerable: true,
|
|
109
|
+
get: function () { return chunkTLXAIOXP_js.useLocalStorage; }
|
|
110
|
+
});
|
|
111
|
+
Object.defineProperty(exports, "useStorage", {
|
|
112
|
+
enumerable: true,
|
|
113
|
+
get: function () { return chunkTLXAIOXP_js.useStorage; }
|
|
114
|
+
});
|
|
115
|
+
Object.defineProperty(exports, "useTaroStorage", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
get: function () { return chunkTLXAIOXP_js.useTaroStorage; }
|
|
118
|
+
});
|
|
119
|
+
exports.MiniappRequestAdapter = MiniappRequestAdapter;
|
|
120
|
+
exports.WebRequestAdapter = WebRequestAdapter;
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/request/web-adapter.ts","../../src/adapters/request/miniapp-adapter.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { RequestAdapter, RequestConfig } from './types';\n\n/**\n * Web 平台请求适配器\n * 基于标准 fetch API\n *\n * 适用平台:\n * - Web (Next.js)\n * - Desktop (Electron)\n * - Mobile (React Native)\n */\nexport class WebRequestAdapter implements RequestAdapter {\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n // 构建 URL(如果有查询参数)\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n fullUrl += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n // 发送请求\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include', // 🔐 自动发送和接收 Cookie(支持 httpOnly Cookie 认证)\n });\n\n // 解析响应\n const data = await response.json();\n\n // 如果响应不成功,返回错误格式\n if (!response.ok) {\n return {\n success: false,\n error: data.error || `请求失败: ${response.status}`,\n } as T;\n }\n\n return data;\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from './types';\n\n/**\n * Taro Request 接口定义\n * 兼容 @tarojs/taro request API\n */\ninterface TaroRequestStatic {\n request<T = any>(options: {\n url: string;\n method?: string;\n header?: Record<string, string>;\n data?: any;\n }): Promise<{\n statusCode: number;\n data: T;\n }>;\n}\n\n/**\n * Miniapp 平台请求适配器\n * 基于 Taro.request API\n *\n * 使用方式:\n * ```typescript\n * import Taro from '@tarojs/taro'\n * const adapter = new MiniappRequestAdapter(Taro)\n * ```\n *\n * 适用平台:\n * - WeChat Miniapp\n * - Other Taro-based miniapps\n */\nexport class MiniappRequestAdapter implements RequestAdapter {\n private taro: TaroRequestStatic;\n\n constructor(taro: TaroRequestStatic) {\n if (!taro) {\n throw new Error('MiniappRequestAdapter requires Taro instance');\n }\n this.taro = taro;\n }\n\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n try {\n const response = await this.taro.request({\n url,\n method: method as any,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n data: method === 'GET' ? params : body,\n });\n\n const data = response.data as any;\n\n // 统一返回格式\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return data;\n } else {\n return {\n success: false,\n error: data.error || `请求失败: ${response.statusCode}`,\n } as T;\n }\n } catch (error) {\n console.error('[MiniappRequestAdapter] request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络请求失败',\n } as T;\n }\n }\n}\n\n"]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export { ElectronStorageAdapter, MiniAppStorageAdapter, ReactNativeStorageAdapter, WebStorageAdapter, useAsyncStorage, useElectronStorage, useLocalStorage, useStorage, useTaroStorage } from '../chunk-WUTGV44D.mjs';
|
|
2
|
+
import '../chunk-BJTO5JO5.mjs';
|
|
3
|
+
|
|
4
|
+
// src/adapters/request/web-adapter.ts
|
|
5
|
+
var WebRequestAdapter = class {
|
|
6
|
+
async request(config) {
|
|
7
|
+
const { url, method = "GET", headers = {}, body, params } = config;
|
|
8
|
+
let fullUrl = url;
|
|
9
|
+
if (params) {
|
|
10
|
+
const searchParams = new URLSearchParams();
|
|
11
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
12
|
+
if (value !== void 0 && value !== null) {
|
|
13
|
+
searchParams.append(key, String(value));
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const queryString = searchParams.toString();
|
|
17
|
+
if (queryString) {
|
|
18
|
+
fullUrl += (url.includes("?") ? "&" : "?") + queryString;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const response = await fetch(fullUrl, {
|
|
22
|
+
method,
|
|
23
|
+
headers: {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
...headers
|
|
26
|
+
},
|
|
27
|
+
body: body ? JSON.stringify(body) : void 0,
|
|
28
|
+
credentials: "include"
|
|
29
|
+
// 🔐 自动发送和接收 Cookie(支持 httpOnly Cookie 认证)
|
|
30
|
+
});
|
|
31
|
+
const data = await response.json();
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: data.error || `\u8BF7\u6C42\u5931\u8D25: ${response.status}`
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/adapters/request/miniapp-adapter.ts
|
|
43
|
+
var MiniappRequestAdapter = class {
|
|
44
|
+
constructor(taro) {
|
|
45
|
+
if (!taro) {
|
|
46
|
+
throw new Error("MiniappRequestAdapter requires Taro instance");
|
|
47
|
+
}
|
|
48
|
+
this.taro = taro;
|
|
49
|
+
}
|
|
50
|
+
async request(config) {
|
|
51
|
+
const { url, method = "GET", headers = {}, body, params } = config;
|
|
52
|
+
try {
|
|
53
|
+
const response = await this.taro.request({
|
|
54
|
+
url,
|
|
55
|
+
method,
|
|
56
|
+
header: {
|
|
57
|
+
"Content-Type": "application/json",
|
|
58
|
+
...headers
|
|
59
|
+
},
|
|
60
|
+
data: method === "GET" ? params : body
|
|
61
|
+
});
|
|
62
|
+
const data = response.data;
|
|
63
|
+
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
64
|
+
return data;
|
|
65
|
+
} else {
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
error: data.error || `\u8BF7\u6C42\u5931\u8D25: ${response.statusCode}`
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error("[MiniappRequestAdapter] request error:", error);
|
|
73
|
+
return {
|
|
74
|
+
success: false,
|
|
75
|
+
error: error instanceof Error ? error.message : "\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25"
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { MiniappRequestAdapter, WebRequestAdapter };
|
|
82
|
+
//# sourceMappingURL=index.mjs.map
|
|
83
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/request/web-adapter.ts","../../src/adapters/request/miniapp-adapter.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { RequestAdapter, RequestConfig } from './types';\n\n/**\n * Web 平台请求适配器\n * 基于标准 fetch API\n *\n * 适用平台:\n * - Web (Next.js)\n * - Desktop (Electron)\n * - Mobile (React Native)\n */\nexport class WebRequestAdapter implements RequestAdapter {\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n // 构建 URL(如果有查询参数)\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n fullUrl += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n // 发送请求\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include', // 🔐 自动发送和接收 Cookie(支持 httpOnly Cookie 认证)\n });\n\n // 解析响应\n const data = await response.json();\n\n // 如果响应不成功,返回错误格式\n if (!response.ok) {\n return {\n success: false,\n error: data.error || `请求失败: ${response.status}`,\n } as T;\n }\n\n return data;\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from './types';\n\n/**\n * Taro Request 接口定义\n * 兼容 @tarojs/taro request API\n */\ninterface TaroRequestStatic {\n request<T = any>(options: {\n url: string;\n method?: string;\n header?: Record<string, string>;\n data?: any;\n }): Promise<{\n statusCode: number;\n data: T;\n }>;\n}\n\n/**\n * Miniapp 平台请求适配器\n * 基于 Taro.request API\n *\n * 使用方式:\n * ```typescript\n * import Taro from '@tarojs/taro'\n * const adapter = new MiniappRequestAdapter(Taro)\n * ```\n *\n * 适用平台:\n * - WeChat Miniapp\n * - Other Taro-based miniapps\n */\nexport class MiniappRequestAdapter implements RequestAdapter {\n private taro: TaroRequestStatic;\n\n constructor(taro: TaroRequestStatic) {\n if (!taro) {\n throw new Error('MiniappRequestAdapter requires Taro instance');\n }\n this.taro = taro;\n }\n\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n try {\n const response = await this.taro.request({\n url,\n method: method as any,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n data: method === 'GET' ? params : body,\n });\n\n const data = response.data as any;\n\n // 统一返回格式\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return data;\n } else {\n return {\n success: false,\n error: data.error || `请求失败: ${response.statusCode}`,\n } as T;\n }\n } catch (error) {\n console.error('[MiniappRequestAdapter] request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络请求失败',\n } as T;\n }\n }\n}\n\n"]}
|