@plolink/sdk 0.0.4

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.
Files changed (76) hide show
  1. package/README.md +259 -0
  2. package/dist/chunk-4H4RACSE.js +335 -0
  3. package/dist/chunk-4H4RACSE.js.map +1 -0
  4. package/dist/chunk-IHAAKFEJ.js +219 -0
  5. package/dist/chunk-IHAAKFEJ.js.map +1 -0
  6. package/dist/chunk-JR4HYYQI.cjs +221 -0
  7. package/dist/chunk-JR4HYYQI.cjs.map +1 -0
  8. package/dist/chunk-MD4O7FWT.js +46 -0
  9. package/dist/chunk-MD4O7FWT.js.map +1 -0
  10. package/dist/chunk-NS3DJP2O.cjs +349 -0
  11. package/dist/chunk-NS3DJP2O.cjs.map +1 -0
  12. package/dist/chunk-Y3UJVC2L.cjs +48 -0
  13. package/dist/chunk-Y3UJVC2L.cjs.map +1 -0
  14. package/dist/client-CAjIQKPm.d.cts +193 -0
  15. package/dist/client-CwNikk7i.d.ts +193 -0
  16. package/dist/common/index.cjs +65 -0
  17. package/dist/common/index.cjs.map +1 -0
  18. package/dist/common/index.d.cts +422 -0
  19. package/dist/common/index.d.ts +422 -0
  20. package/dist/common/index.js +4 -0
  21. package/dist/common/index.js.map +1 -0
  22. package/dist/core-77EbLgbp.d.cts +97 -0
  23. package/dist/core-77EbLgbp.d.ts +97 -0
  24. package/dist/index.cjs +350 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +98 -0
  27. package/dist/index.d.ts +98 -0
  28. package/dist/index.js +306 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/modules/agent/index.cjs +21 -0
  31. package/dist/modules/agent/index.cjs.map +1 -0
  32. package/dist/modules/agent/index.d.cts +71 -0
  33. package/dist/modules/agent/index.d.ts +71 -0
  34. package/dist/modules/agent/index.js +19 -0
  35. package/dist/modules/agent/index.js.map +1 -0
  36. package/dist/modules/billing/index.cjs +413 -0
  37. package/dist/modules/billing/index.cjs.map +1 -0
  38. package/dist/modules/billing/index.d.cts +538 -0
  39. package/dist/modules/billing/index.d.ts +538 -0
  40. package/dist/modules/billing/index.js +411 -0
  41. package/dist/modules/billing/index.js.map +1 -0
  42. package/dist/modules/chat/index.cjs +20 -0
  43. package/dist/modules/chat/index.cjs.map +1 -0
  44. package/dist/modules/chat/index.d.cts +68 -0
  45. package/dist/modules/chat/index.d.ts +68 -0
  46. package/dist/modules/chat/index.js +18 -0
  47. package/dist/modules/chat/index.js.map +1 -0
  48. package/dist/modules/psych/index.cjs +20 -0
  49. package/dist/modules/psych/index.cjs.map +1 -0
  50. package/dist/modules/psych/index.d.cts +69 -0
  51. package/dist/modules/psych/index.d.ts +69 -0
  52. package/dist/modules/psych/index.js +18 -0
  53. package/dist/modules/psych/index.js.map +1 -0
  54. package/dist/modules/rbac/index.cjs +197 -0
  55. package/dist/modules/rbac/index.cjs.map +1 -0
  56. package/dist/modules/rbac/index.d.cts +293 -0
  57. package/dist/modules/rbac/index.d.ts +293 -0
  58. package/dist/modules/rbac/index.js +195 -0
  59. package/dist/modules/rbac/index.js.map +1 -0
  60. package/dist/modules/team/index.cjs +54 -0
  61. package/dist/modules/team/index.cjs.map +1 -0
  62. package/dist/modules/team/index.d.cts +91 -0
  63. package/dist/modules/team/index.d.ts +91 -0
  64. package/dist/modules/team/index.js +52 -0
  65. package/dist/modules/team/index.js.map +1 -0
  66. package/dist/modules/virtual-account/index.cjs +293 -0
  67. package/dist/modules/virtual-account/index.cjs.map +1 -0
  68. package/dist/modules/virtual-account/index.d.cts +366 -0
  69. package/dist/modules/virtual-account/index.d.ts +366 -0
  70. package/dist/modules/virtual-account/index.js +291 -0
  71. package/dist/modules/virtual-account/index.js.map +1 -0
  72. package/dist/poller-BlIRbwL4.d.cts +201 -0
  73. package/dist/poller-DWKZjuSw.d.ts +201 -0
  74. package/dist/shared-6ZepUSPW.d.cts +31 -0
  75. package/dist/shared-6ZepUSPW.d.ts +31 -0
  76. package/package.json +96 -0
@@ -0,0 +1,193 @@
1
+ import { b as LoggerFunction, S as SDKConfig } from './core-77EbLgbp.js';
2
+ import { AxiosInstance, AxiosRequestConfig } from 'axios';
3
+
4
+ /**
5
+ * SDK 内部日志器
6
+ *
7
+ * @description
8
+ * 提供统一的日志接口,支持用户自定义日志钩子。
9
+ * 默认使用 console 输出,用户可以通过配置自定义 logger 函数来集成 Sentry 等监控系统。
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const logger = new InternalLogger((level, message, data) => {
14
+ * // 自定义日志处理,例如发送到 Sentry
15
+ * console.log(`[${level}] ${message}`, data);
16
+ * });
17
+ *
18
+ * logger.info('Operation started', { userId: '123' });
19
+ * logger.error('Operation failed', { error: 'Network timeout' });
20
+ * ```
21
+ */
22
+ declare class InternalLogger {
23
+ /**
24
+ * 用户自定义的日志钩子函数
25
+ */
26
+ private readonly userLogger?;
27
+ /**
28
+ * 是否启用日志输出
29
+ * 可以通过环境变量 PLOLINK_SDK_DEBUG 控制
30
+ */
31
+ private readonly isDebugEnabled;
32
+ /**
33
+ * 创建一个 InternalLogger 实例
34
+ *
35
+ * @param userLogger - 用户自定义的日志钩子函数
36
+ */
37
+ constructor(userLogger?: LoggerFunction);
38
+ /**
39
+ * 记录信息级别日志
40
+ *
41
+ * @param message - 日志消息
42
+ * @param context - 附加上下文数据
43
+ */
44
+ info(message: string, context?: unknown): void;
45
+ /**
46
+ * 记录警告级别日志
47
+ *
48
+ * @param message - 日志消息
49
+ * @param context - 附加上下文数据
50
+ */
51
+ warn(message: string, context?: unknown): void;
52
+ /**
53
+ * 记录错误级别日志
54
+ *
55
+ * @param message - 日志消息
56
+ * @param context - 附加上下文数据
57
+ */
58
+ error(message: string, context?: unknown): void;
59
+ /**
60
+ * 记录调试级别日志
61
+ * 只有在 debug 模式下才会输出
62
+ *
63
+ * @param message - 日志消息
64
+ * @param context - 附加上下文数据
65
+ */
66
+ debug(message: string, context?: unknown): void;
67
+ /**
68
+ * 内部日志记录方法
69
+ *
70
+ * @param level - 日志级别
71
+ * @param message - 日志消息
72
+ * @param context - 附加上下文数据
73
+ */
74
+ private log;
75
+ /**
76
+ * 创建一个带有固定上下文的子 logger
77
+ *
78
+ * @param context - 固定的上下文数据
79
+ * @returns 新的 logger 实例
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * const logger = new InternalLogger();
84
+ * const moduleLogger = logger.withContext({ module: 'billing' });
85
+ * moduleLogger.info('Payment processed'); // 日志会自动带上 module: 'billing'
86
+ * ```
87
+ */
88
+ withContext(context: Record<string, unknown>): InternalLogger;
89
+ }
90
+
91
+ /**
92
+ * 为 Axios 实例添加类型安全的请求方法
93
+ *
94
+ * @description
95
+ * 这些方法封装了 Axios 的原始方法,提供更好的类型推断。
96
+ */
97
+ interface TypedAxiosInstance extends AxiosInstance {
98
+ get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
99
+ post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
100
+ put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
101
+ patch<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
102
+ delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
103
+ }
104
+
105
+ /**
106
+ * Plolink SDK 客户端主类
107
+ *
108
+ * @description
109
+ * PlolinkClient 是 SDK 的核心类,负责:
110
+ * - 管理 SDK 配置(认证 Token、API 地址等)
111
+ * - 初始化 Axios 实例并配置拦截器
112
+ * - 提供统一的日志接口
113
+ * - 作为所有业务模块的基础依赖
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * // 使用 ApiKey
118
+ * const client = new PlolinkClient({
119
+ * token: 'sk-123456789',
120
+ * logger: (level, msg, data) => {
121
+ * console.log(`[${level}] ${msg}`, data);
122
+ * }
123
+ * });
124
+ *
125
+ * // 使用 SessionId (登录后获取)
126
+ * const client = new PlolinkClient({
127
+ * token: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
128
+ * baseUrl: 'https://api.plolink.com'
129
+ * });
130
+ * ```
131
+ */
132
+ declare class PlolinkClient {
133
+ /**
134
+ * SDK 配置对象(已填充默认值)
135
+ */
136
+ readonly config: Required<SDKConfig>;
137
+ /**
138
+ * Axios 实例,用于发起 HTTP 请求
139
+ */
140
+ readonly axiosInstance: TypedAxiosInstance;
141
+ /**
142
+ * 内部日志记录器
143
+ */
144
+ readonly logger: InternalLogger;
145
+ /**
146
+ * 创建一个 PlolinkClient 实例
147
+ *
148
+ * @param config - SDK 配置对象
149
+ * @throws {PlolinkError} 当配置验证失败时抛出
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const client = new PlolinkClient({
154
+ * token: 'sk-your-api-key'
155
+ * });
156
+ * ```
157
+ */
158
+ constructor(config: SDKConfig);
159
+ /**
160
+ * 验证 SDK 配置
161
+ *
162
+ * @param config - SDK 配置对象
163
+ * @throws {PlolinkError} 当配置不合法时抛出
164
+ * @private
165
+ */
166
+ private validateConfig;
167
+ /**
168
+ * 获取当前 SDK 版本
169
+ *
170
+ * @returns SDK 版本号
171
+ */
172
+ getVersion(): string;
173
+ /**
174
+ * 检查客户端健康状态
175
+ *
176
+ * @returns 健康状态信息
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * const health = client.healthCheck();
181
+ * console.log(health);
182
+ * // { status: 'ok', baseUrl: '...', version: '...' }
183
+ * ```
184
+ */
185
+ healthCheck(): {
186
+ status: 'ok';
187
+ baseUrl: string;
188
+ version: string;
189
+ hasToken: boolean;
190
+ };
191
+ }
192
+
193
+ export { InternalLogger as I, PlolinkClient as P };
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ var chunkNS3DJP2O_cjs = require('../chunk-NS3DJP2O.cjs');
4
+ var chunkJR4HYYQI_cjs = require('../chunk-JR4HYYQI.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "EventEmitter", {
9
+ enumerable: true,
10
+ get: function () { return chunkNS3DJP2O_cjs.EventEmitter; }
11
+ });
12
+ Object.defineProperty(exports, "TypedEventEmitter", {
13
+ enumerable: true,
14
+ get: function () { return chunkNS3DJP2O_cjs.TypedEventEmitter; }
15
+ });
16
+ Object.defineProperty(exports, "assertEnvironment", {
17
+ enumerable: true,
18
+ get: function () { return chunkNS3DJP2O_cjs.assertEnvironment; }
19
+ });
20
+ Object.defineProperty(exports, "environmentInfo", {
21
+ enumerable: true,
22
+ get: function () { return chunkNS3DJP2O_cjs.environmentInfo; }
23
+ });
24
+ Object.defineProperty(exports, "features", {
25
+ enumerable: true,
26
+ get: function () { return chunkNS3DJP2O_cjs.features; }
27
+ });
28
+ Object.defineProperty(exports, "getEnvironment", {
29
+ enumerable: true,
30
+ get: function () { return chunkNS3DJP2O_cjs.getEnvironment; }
31
+ });
32
+ Object.defineProperty(exports, "getFileName", {
33
+ enumerable: true,
34
+ get: function () { return chunkNS3DJP2O_cjs.getFileName; }
35
+ });
36
+ Object.defineProperty(exports, "getFileSize", {
37
+ enumerable: true,
38
+ get: function () { return chunkNS3DJP2O_cjs.getFileSize; }
39
+ });
40
+ Object.defineProperty(exports, "isBrowser", {
41
+ enumerable: true,
42
+ get: function () { return chunkNS3DJP2O_cjs.isBrowser; }
43
+ });
44
+ Object.defineProperty(exports, "isNode", {
45
+ enumerable: true,
46
+ get: function () { return chunkNS3DJP2O_cjs.isNode; }
47
+ });
48
+ Object.defineProperty(exports, "isValidFileInput", {
49
+ enumerable: true,
50
+ get: function () { return chunkNS3DJP2O_cjs.isValidFileInput; }
51
+ });
52
+ Object.defineProperty(exports, "isWebWorker", {
53
+ enumerable: true,
54
+ get: function () { return chunkNS3DJP2O_cjs.isWebWorker; }
55
+ });
56
+ Object.defineProperty(exports, "safeDynamicImport", {
57
+ enumerable: true,
58
+ get: function () { return chunkNS3DJP2O_cjs.safeDynamicImport; }
59
+ });
60
+ Object.defineProperty(exports, "Poller", {
61
+ enumerable: true,
62
+ get: function () { return chunkJR4HYYQI_cjs.Poller; }
63
+ });
64
+ //# sourceMappingURL=index.cjs.map
65
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,422 @@
1
+ export { P as Poller } from '../poller-BlIRbwL4.cjs';
2
+ import '../core-77EbLgbp.cjs';
3
+
4
+ /**
5
+ * 事件处理函数类型
6
+ */
7
+ type EventHandler<T = unknown> = (data: T) => void;
8
+ /**
9
+ * 事件发射器基础类
10
+ *
11
+ * @description
12
+ * 提供简单的事件订阅/发布机制,用于业务模块的状态变化通知。
13
+ * 支持类型安全的事件处理,适用于状态变化、进度更新等场景。
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // 创建事件发射器
18
+ * const emitter = new EventEmitter();
19
+ *
20
+ * // 订阅事件
21
+ * const unsubscribe = emitter.on('status-change', (data) => {
22
+ * console.log('Status changed:', data);
23
+ * });
24
+ *
25
+ * // 触发事件
26
+ * emitter.emit('status-change', { status: 'completed' });
27
+ *
28
+ * // 取消订阅
29
+ * unsubscribe();
30
+ *
31
+ * // 一次性事件
32
+ * emitter.once('complete', (data) => {
33
+ * console.log('Completed:', data);
34
+ * });
35
+ * ```
36
+ */
37
+ declare class EventEmitter {
38
+ /**
39
+ * 事件处理器映射表
40
+ */
41
+ private handlers;
42
+ /**
43
+ * 一次性事件处理器集合
44
+ */
45
+ private onceHandlers;
46
+ /**
47
+ * 订阅事件
48
+ *
49
+ * @param event - 事件名称
50
+ * @param handler - 事件处理函数
51
+ * @returns 取消订阅的函数
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const unsubscribe = emitter.on('data', (payload) => {
56
+ * console.log('Received:', payload);
57
+ * });
58
+ *
59
+ * // 不再需要时取消订阅
60
+ * unsubscribe();
61
+ * ```
62
+ */
63
+ on<T = unknown>(event: string, handler: EventHandler<T>): () => void;
64
+ /**
65
+ * 订阅一次性事件
66
+ *
67
+ * @description
68
+ * 事件处理函数只会执行一次,执行后自动取消订阅。
69
+ *
70
+ * @param event - 事件名称
71
+ * @param handler - 事件处理函数
72
+ * @returns 取消订阅的函数
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * emitter.once('complete', (result) => {
77
+ * console.log('Task completed:', result);
78
+ * });
79
+ * ```
80
+ */
81
+ once<T = unknown>(event: string, handler: EventHandler<T>): () => void;
82
+ /**
83
+ * 触发事件
84
+ *
85
+ * @param event - 事件名称
86
+ * @param data - 传递给处理函数的数据
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * emitter.emit('status-change', {
91
+ * from: 'pending',
92
+ * to: 'completed'
93
+ * });
94
+ * ```
95
+ */
96
+ emit<T = unknown>(event: string, data: T): void;
97
+ /**
98
+ * 取消订阅指定事件的处理器
99
+ *
100
+ * @param event - 事件名称
101
+ * @param handler - 可选,要取消的事件处理函数。如果不提供,则取消所有处理器
102
+ *
103
+ * @example
104
+ * ```typescript
105
+ * // 取消所有处理器
106
+ * emitter.off('status-change');
107
+ *
108
+ * // 取消特定处理器
109
+ * const handler = (data) => console.log(data);
110
+ * emitter.on('data', handler);
111
+ * emitter.off('data', handler);
112
+ * ```
113
+ */
114
+ off<T = unknown>(event: string, handler?: EventHandler<T>): void;
115
+ /**
116
+ * 清除所有事件处理器
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * emitter.clear();
121
+ * ```
122
+ */
123
+ clear(): void;
124
+ /**
125
+ * 获取指定事件的处理器数量
126
+ *
127
+ * @param event - 事件名称
128
+ * @returns 处理器数量
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * const count = emitter.listenerCount('status-change');
133
+ * console.log(`${count} listeners registered`);
134
+ * ```
135
+ */
136
+ listenerCount(event: string): number;
137
+ /**
138
+ * 获取所有已注册的事件名称
139
+ *
140
+ * @returns 事件名称数组
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * const events = emitter.eventNames();
145
+ * console.log('Registered events:', events);
146
+ * ```
147
+ */
148
+ eventNames(): string[];
149
+ }
150
+ /**
151
+ * 类型安全的事件发射器
152
+ *
153
+ * @description
154
+ * 提供类型约束的事件发射器,确保事件名称和数据类型的正确性。
155
+ *
156
+ * @template TEvents - 事件映射类型
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * // 定义事件类型
161
+ * interface TaskEvents {
162
+ * 'status-change': { status: string };
163
+ * 'progress': { percent: number };
164
+ * 'error': { message: string };
165
+ * }
166
+ *
167
+ * // 创建类型安全的发射器
168
+ * const emitter = new TypedEventEmitter<TaskEvents>();
169
+ *
170
+ * // TypeScript 会检查事件名称和数据类型
171
+ * emitter.on('status-change', (data) => {
172
+ * console.log(data.status); // TypeScript 知道 data 有 status 属性
173
+ * });
174
+ *
175
+ * emitter.emit('status-change', { status: 'completed' }); // OK
176
+ * emitter.emit('status-change', { wrong: 'data' }); // TypeScript 报错
177
+ * ```
178
+ */
179
+ declare class TypedEventEmitter<TEvents extends Record<string, unknown>> {
180
+ private emitter;
181
+ /**
182
+ * 订阅事件(类型安全)
183
+ */
184
+ on<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void;
185
+ /**
186
+ * 订阅一次性事件(类型安全)
187
+ */
188
+ once<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void;
189
+ /**
190
+ * 触发事件(类型安全)
191
+ */
192
+ emit<K extends keyof TEvents>(event: K, data: TEvents[K]): void;
193
+ /**
194
+ * 取消订阅(类型安全)
195
+ */
196
+ off<K extends keyof TEvents>(event: K, handler?: EventHandler<TEvents[K]>): void;
197
+ /**
198
+ * 清除所有事件处理器
199
+ */
200
+ clear(): void;
201
+ /**
202
+ * 获取指定事件的处理器数量
203
+ */
204
+ listenerCount<K extends keyof TEvents>(event: K): number;
205
+ /**
206
+ * 获取所有已注册的事件名称
207
+ */
208
+ eventNames(): Array<keyof TEvents>;
209
+ }
210
+
211
+ /**
212
+ * 环境适配工具
213
+ *
214
+ * @description
215
+ * 提供跨环境(Node.js / 浏览器)的工具函数和类型检测。
216
+ * 用于处理文件上传、网络请求等在不同环境下有差异的功能。
217
+ */
218
+ /**
219
+ * 检测当前是否运行在 Node.js 环境
220
+ *
221
+ * @returns 如果在 Node.js 环境返回 true,否则返回 false
222
+ *
223
+ * @example
224
+ * ```typescript
225
+ * if (isNode) {
226
+ * // 使用 Node.js 特有的 API
227
+ * const fs = require('fs');
228
+ * }
229
+ * ```
230
+ */
231
+ declare const isNode: boolean;
232
+ /**
233
+ * 检测当前是否运行在浏览器环境
234
+ *
235
+ * @returns 如果在浏览器环境返回 true,否则返回 false
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * if (isBrowser) {
240
+ * // 使用浏览器 API
241
+ * const file = new File(['content'], 'file.txt');
242
+ * }
243
+ * ```
244
+ */
245
+ declare const isBrowser: boolean;
246
+ /**
247
+ * 检测当前是否支持 Web Worker
248
+ *
249
+ * @returns 如果支持 Web Worker 返回 true,否则返回 false
250
+ */
251
+ declare const isWebWorker: boolean;
252
+ /**
253
+ * 获取运行环境类型
254
+ *
255
+ * @returns 环境类型字符串
256
+ *
257
+ * @example
258
+ * ```typescript
259
+ * const env = getEnvironment();
260
+ * console.log(`Running in ${env}`); // "node" 或 "browser" 或 "worker"
261
+ * ```
262
+ */
263
+ declare function getEnvironment(): 'node' | 'browser' | 'worker' | 'unknown';
264
+ /**
265
+ * 文件类型联合类型
266
+ * 在 Node.js 中是 Buffer,在浏览器中是 Blob 或 File
267
+ */
268
+ type FileInput = Buffer | Blob | File;
269
+ /**
270
+ * 检测是否为有效的文件输入
271
+ *
272
+ * @param input - 待检测的输入
273
+ * @returns 如果是有效的文件输入返回 true
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * const file = new File(['content'], 'test.txt');
278
+ * if (isValidFileInput(file)) {
279
+ * // 处理文件
280
+ * }
281
+ * ```
282
+ */
283
+ declare function isValidFileInput(input: unknown): input is FileInput;
284
+ /**
285
+ * 获取文件输入的大小(字节)
286
+ *
287
+ * @param input - 文件输入
288
+ * @returns 文件大小(字节)
289
+ * @throws {Error} 如果输入类型不支持
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * const file = new File(['content'], 'test.txt');
294
+ * const size = getFileSize(file);
295
+ * console.log(`File size: ${size} bytes`);
296
+ * ```
297
+ */
298
+ declare function getFileSize(input: FileInput): number;
299
+ /**
300
+ * 获取文件名(仅适用于 File 对象)
301
+ *
302
+ * @param input - 文件输入
303
+ * @returns 文件名,如果无法获取则返回 undefined
304
+ *
305
+ * @example
306
+ * ```typescript
307
+ * const file = new File(['content'], 'test.txt');
308
+ * const name = getFileName(file);
309
+ * console.log(name); // "test.txt"
310
+ * ```
311
+ */
312
+ declare function getFileName(input: FileInput): string | undefined;
313
+ /**
314
+ * 环境特定功能检测
315
+ */
316
+ declare const features: {
317
+ /**
318
+ * 是否支持 FormData
319
+ */
320
+ readonly hasFormData: boolean;
321
+ /**
322
+ * 是否支持 Blob
323
+ */
324
+ readonly hasBlob: boolean;
325
+ /**
326
+ * 是否支持 File
327
+ */
328
+ readonly hasFile: boolean;
329
+ /**
330
+ * 是否支持 FileReader
331
+ */
332
+ readonly hasFileReader: boolean;
333
+ /**
334
+ * 是否支持 fetch API
335
+ */
336
+ readonly hasFetch: boolean;
337
+ /**
338
+ * 是否支持 Stream API
339
+ */
340
+ readonly hasStream: boolean;
341
+ };
342
+ /**
343
+ * 环境信息对象
344
+ *
345
+ * @example
346
+ * ```typescript
347
+ * console.log(environmentInfo);
348
+ * // {
349
+ * // type: 'browser',
350
+ * // isNode: false,
351
+ * // isBrowser: true,
352
+ * // features: { ... }
353
+ * // }
354
+ * ```
355
+ */
356
+ declare const environmentInfo: {
357
+ readonly type: "node" | "browser" | "worker" | "unknown";
358
+ readonly isNode: boolean;
359
+ readonly isBrowser: boolean;
360
+ readonly isWebWorker: boolean;
361
+ readonly features: {
362
+ /**
363
+ * 是否支持 FormData
364
+ */
365
+ readonly hasFormData: boolean;
366
+ /**
367
+ * 是否支持 Blob
368
+ */
369
+ readonly hasBlob: boolean;
370
+ /**
371
+ * 是否支持 File
372
+ */
373
+ readonly hasFile: boolean;
374
+ /**
375
+ * 是否支持 FileReader
376
+ */
377
+ readonly hasFileReader: boolean;
378
+ /**
379
+ * 是否支持 fetch API
380
+ */
381
+ readonly hasFetch: boolean;
382
+ /**
383
+ * 是否支持 Stream API
384
+ */
385
+ readonly hasStream: boolean;
386
+ };
387
+ };
388
+ /**
389
+ * 断言当前环境
390
+ *
391
+ * @param expectedEnv - 期望的环境类型
392
+ * @param message - 自定义错误消息
393
+ * @throws {Error} 如果当前环境不符合预期
394
+ *
395
+ * @example
396
+ * ```typescript
397
+ * // 确保在 Node.js 环境中运行
398
+ * assertEnvironment('node', 'This feature requires Node.js');
399
+ * ```
400
+ */
401
+ declare function assertEnvironment(expectedEnv: 'node' | 'browser' | 'worker', message?: string): void;
402
+ /**
403
+ * 安全地动态导入模块(仅 Node.js)
404
+ *
405
+ * @description
406
+ * 在 Node.js 环境中动态导入模块,避免在浏览器环境中引起错误。
407
+ *
408
+ * @param moduleName - 模块名称
409
+ * @returns Promise,resolve 为模块对象
410
+ * @throws {Error} 如果不在 Node.js 环境或模块加载失败
411
+ *
412
+ * @example
413
+ * ```typescript
414
+ * if (isNode) {
415
+ * const fs = await safeDynamicImport('fs');
416
+ * const content = fs.readFileSync('file.txt', 'utf-8');
417
+ * }
418
+ * ```
419
+ */
420
+ declare function safeDynamicImport<T = unknown>(moduleName: string): Promise<T>;
421
+
422
+ export { EventEmitter, type FileInput, TypedEventEmitter, assertEnvironment, environmentInfo, features, getEnvironment, getFileName, getFileSize, isBrowser, isNode, isValidFileInput, isWebWorker, safeDynamicImport };