@data-loom/storage-js 0.4.3 → 0.4.4-alpha.10

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 (112) hide show
  1. package/README.md +398 -156
  2. package/dist/main/StorageClient.d.ts +2 -2
  3. package/dist/main/StorageClient.d.ts.map +1 -1
  4. package/dist/main/index.d.ts +2 -2
  5. package/dist/main/index.d.ts.map +1 -1
  6. package/dist/main/index.js +2 -2
  7. package/dist/main/index.js.map +1 -1
  8. package/dist/main/libs/constants.d.ts.map +1 -0
  9. package/dist/main/libs/constants.js.map +1 -0
  10. package/dist/main/libs/errors.d.ts.map +1 -0
  11. package/dist/main/libs/errors.js.map +1 -0
  12. package/dist/main/libs/fetch.d.ts.map +1 -0
  13. package/dist/main/libs/fetch.js.map +1 -0
  14. package/dist/main/libs/helpers.d.ts.map +1 -0
  15. package/dist/main/libs/helpers.js.map +1 -0
  16. package/dist/main/libs/index.d.ts.map +1 -0
  17. package/dist/main/libs/index.js.map +1 -0
  18. package/dist/main/libs/types.d.ts.map +1 -0
  19. package/dist/main/{lib → libs}/types.js.map +1 -1
  20. package/dist/main/libs/version.d.ts.map +1 -0
  21. package/dist/main/libs/version.js.map +1 -0
  22. package/dist/main/packages/StorageBucketApi.d.ts +3 -3
  23. package/dist/main/packages/StorageBucketApi.d.ts.map +1 -1
  24. package/dist/main/packages/StorageBucketApi.js +4 -4
  25. package/dist/main/packages/StorageBucketApi.js.map +1 -1
  26. package/dist/main/packages/StorageFileApi.d.ts +3 -3
  27. package/dist/main/packages/StorageFileApi.d.ts.map +1 -1
  28. package/dist/main/packages/StorageFileApi.js +3 -3
  29. package/dist/main/packages/StorageFileApi.js.map +1 -1
  30. package/dist/module/StorageClient.d.ts +2 -2
  31. package/dist/module/StorageClient.d.ts.map +1 -1
  32. package/dist/module/index.d.ts +2 -2
  33. package/dist/module/index.d.ts.map +1 -1
  34. package/dist/module/index.js +2 -2
  35. package/dist/module/index.js.map +1 -1
  36. package/dist/module/libs/constants.d.ts.map +1 -0
  37. package/dist/module/libs/constants.js.map +1 -0
  38. package/dist/module/libs/errors.d.ts.map +1 -0
  39. package/dist/module/libs/errors.js.map +1 -0
  40. package/dist/module/libs/fetch.d.ts.map +1 -0
  41. package/dist/module/libs/fetch.js.map +1 -0
  42. package/dist/module/libs/helpers.d.ts.map +1 -0
  43. package/dist/module/libs/helpers.js.map +1 -0
  44. package/dist/module/libs/index.d.ts.map +1 -0
  45. package/dist/module/libs/index.js.map +1 -0
  46. package/dist/module/libs/types.d.ts.map +1 -0
  47. package/dist/module/{lib → libs}/types.js.map +1 -1
  48. package/dist/module/libs/version.d.ts.map +1 -0
  49. package/dist/module/libs/version.js.map +1 -0
  50. package/dist/module/packages/StorageBucketApi.d.ts +3 -3
  51. package/dist/module/packages/StorageBucketApi.d.ts.map +1 -1
  52. package/dist/module/packages/StorageBucketApi.js +4 -4
  53. package/dist/module/packages/StorageBucketApi.js.map +1 -1
  54. package/dist/module/packages/StorageFileApi.d.ts +3 -3
  55. package/dist/module/packages/StorageFileApi.d.ts.map +1 -1
  56. package/dist/module/packages/StorageFileApi.js +3 -3
  57. package/dist/module/packages/StorageFileApi.js.map +1 -1
  58. package/package.json +8 -2
  59. package/dist/main/lib/constants.d.ts.map +0 -1
  60. package/dist/main/lib/constants.js.map +0 -1
  61. package/dist/main/lib/errors.d.ts.map +0 -1
  62. package/dist/main/lib/errors.js.map +0 -1
  63. package/dist/main/lib/fetch.d.ts.map +0 -1
  64. package/dist/main/lib/fetch.js.map +0 -1
  65. package/dist/main/lib/helpers.d.ts.map +0 -1
  66. package/dist/main/lib/helpers.js.map +0 -1
  67. package/dist/main/lib/index.d.ts.map +0 -1
  68. package/dist/main/lib/index.js.map +0 -1
  69. package/dist/main/lib/types.d.ts.map +0 -1
  70. package/dist/main/lib/version.d.ts.map +0 -1
  71. package/dist/main/lib/version.js.map +0 -1
  72. package/dist/module/lib/constants.d.ts.map +0 -1
  73. package/dist/module/lib/constants.js.map +0 -1
  74. package/dist/module/lib/errors.d.ts.map +0 -1
  75. package/dist/module/lib/errors.js.map +0 -1
  76. package/dist/module/lib/fetch.d.ts.map +0 -1
  77. package/dist/module/lib/fetch.js.map +0 -1
  78. package/dist/module/lib/helpers.d.ts.map +0 -1
  79. package/dist/module/lib/helpers.js.map +0 -1
  80. package/dist/module/lib/index.d.ts.map +0 -1
  81. package/dist/module/lib/index.js.map +0 -1
  82. package/dist/module/lib/types.d.ts.map +0 -1
  83. package/dist/module/lib/version.d.ts.map +0 -1
  84. package/dist/module/lib/version.js.map +0 -1
  85. /package/dist/main/{lib → libs}/constants.d.ts +0 -0
  86. /package/dist/main/{lib → libs}/constants.js +0 -0
  87. /package/dist/main/{lib → libs}/errors.d.ts +0 -0
  88. /package/dist/main/{lib → libs}/errors.js +0 -0
  89. /package/dist/main/{lib → libs}/fetch.d.ts +0 -0
  90. /package/dist/main/{lib → libs}/fetch.js +0 -0
  91. /package/dist/main/{lib → libs}/helpers.d.ts +0 -0
  92. /package/dist/main/{lib → libs}/helpers.js +0 -0
  93. /package/dist/main/{lib → libs}/index.d.ts +0 -0
  94. /package/dist/main/{lib → libs}/index.js +0 -0
  95. /package/dist/main/{lib → libs}/types.d.ts +0 -0
  96. /package/dist/main/{lib → libs}/types.js +0 -0
  97. /package/dist/main/{lib → libs}/version.d.ts +0 -0
  98. /package/dist/main/{lib → libs}/version.js +0 -0
  99. /package/dist/module/{lib → libs}/constants.d.ts +0 -0
  100. /package/dist/module/{lib → libs}/constants.js +0 -0
  101. /package/dist/module/{lib → libs}/errors.d.ts +0 -0
  102. /package/dist/module/{lib → libs}/errors.js +0 -0
  103. /package/dist/module/{lib → libs}/fetch.d.ts +0 -0
  104. /package/dist/module/{lib → libs}/fetch.js +0 -0
  105. /package/dist/module/{lib → libs}/helpers.d.ts +0 -0
  106. /package/dist/module/{lib → libs}/helpers.js +0 -0
  107. /package/dist/module/{lib → libs}/index.d.ts +0 -0
  108. /package/dist/module/{lib → libs}/index.js +0 -0
  109. /package/dist/module/{lib → libs}/types.d.ts +0 -0
  110. /package/dist/module/{lib → libs}/types.js +0 -0
  111. /package/dist/module/{lib → libs}/version.d.ts +0 -0
  112. /package/dist/module/{lib → libs}/version.js +0 -0
package/README.md CHANGED
@@ -7,7 +7,7 @@ Dataloom 存储服务 JavaScript SDK,基于 Supabase Storage 修改而来,
7
7
  - 📁 **文件上传和下载** - 支持多种文件格式的上传和下载
8
8
  - 🔗 **签名URL** - 创建具有时效性的安全文件访问链接
9
9
  - 🗑️ **文件管理** - 删除、列表等文件操作
10
- - 🖼️ **图片转换** - 支持图片尺寸调整、质量优化等转换功能
10
+ - 🌐 **URL上传** - 从公共URL下载文件并上传到存储桶
11
11
  - 📊 **批量操作** - 支持批量创建签名URL等批量操作
12
12
  - 🔍 **文件搜索** - 支持文件搜索和分页
13
13
  - 🛡️ **错误处理** - 完善的错误处理机制
@@ -77,69 +77,179 @@ constructor(
77
77
  )
78
78
  ```
79
79
 
80
+ ---
81
+
80
82
  ### 文件上传
81
83
 
82
- #### `uploadFile(fileBody, fileOptions?)` **(推荐)**
84
+ #### `upload(path, fileBody, fileOptions?)` - 重载1
83
85
 
84
- 使用文件选项上传文件(推荐, 无需关注filePath)。
86
+ 上传文件到指定的存储桶路径。
85
87
 
86
- **参数:**
87
- - `fileBody` (FileBody): 文件内容
88
- - `fileOptions` (FileOptionsV2, 可选): 文件选项,可指定 filePath 等
88
+ **入参:**
89
+ ```typescript
90
+ function upload(
91
+ path: string, // 文件路径,格式为 `folder/subfolder/filename.png`
92
+ fileBody: FileBody, // 文件内容
93
+ fileOptions?: FileOptions // 上传选项
94
+ ): Promise<UploadResult>
95
+ ```
89
96
 
90
- **返回:** 同 `upload` 方法
97
+ **出参:**
98
+ ```typescript
99
+ type UploadResult =
100
+ | { data: UploadFileData; error: null }
101
+ | { data: null; error: StorageError }
102
+ ```
91
103
 
92
104
  **示例:**
93
105
  ```javascript
94
- const { data, error } = await storage.uploadFile(file, {
95
- filePath: 'documents/report.pdf',
106
+ const { data, error } = await storage.upload('avatars/user-123.jpg', file, {
96
107
  cacheControl: 3600,
108
+ contentType: 'image/jpeg',
109
+ upsert: false
110
+ });
111
+ ```
112
+
113
+ ---
114
+
115
+ #### `upload(fileBody, fileOptions?)` - 重载2
116
+
117
+ 使用 FileOptionsV2 上传文件,路径通过 options.filePath 指定。
118
+
119
+ **入参:**
120
+ ```typescript
121
+ function upload(
122
+ fileBody: FileBody, // 文件内容
123
+ fileOptions?: FileOptionsV2 // 上传选项(包含 filePath)
124
+ ): Promise<UploadResult>
125
+ ```
126
+
127
+ **出参:**
128
+ ```typescript
129
+ type UploadResult =
130
+ | { data: UploadFileData; error: null }
131
+ | { data: null; error: StorageError }
132
+ ```
133
+
134
+ **示例:**
135
+ ```javascript
136
+ const { data, error } = await storage.upload(file, {
137
+ filePath: 'documents/report.pdf',
97
138
  contentType: 'application/pdf',
98
139
  contentDisposition: 'attachment; filename="report.pdf"'
99
140
  });
100
141
  ```
101
142
 
102
- #### `upload(path, fileBody, fileOptions?)`
143
+ ---
103
144
 
104
- 上传文件到指定的存储桶路径。
145
+ #### `uploadFile(fileBody, fileOptions?)`
105
146
 
106
- **参数:**
107
- - `path` (string): 文件路径,格式为 `folder/subfolder/filename.png`
108
- - `fileBody` (FileBody): 文件内容,支持多种格式
109
- - `fileOptions` (FileOptions, 可选): 文件选项
147
+ 使用文件选项上传文件(推荐,与 upload 重载2 功能相同)。
110
148
 
111
- **返回:**
149
+ **入参:**
112
150
  ```typescript
113
- {
114
- data: UploadFileData; // 包含文件ID、路径、存储桶ID和下载URL
115
- error: null;
116
- } | {
117
- data: null;
118
- error: StorageError;
119
- }
151
+ function uploadFile(
152
+ fileBody: FileBody, // 文件内容
153
+ fileOptions?: FileOptionsV2 // 上传选项
154
+ ): Promise<UploadResult>
155
+ ```
156
+
157
+ **出参:**
158
+ ```typescript
159
+ type UploadResult =
160
+ | { data: UploadFileData; error: null }
161
+ | { data: null; error: StorageError }
120
162
  ```
121
163
 
122
164
  **示例:**
123
165
  ```javascript
124
- const fileInput = document.getElementById('fileInput');
125
- const file = fileInput.files[0];
126
-
127
- const { data, error } = await storage.upload('avatars/user-123.jpg', file, {
128
- cacheControl: '3600',
129
- contentType: 'image/jpeg',
130
- upsert: false
166
+ const { data, error } = await storage.uploadFile(file, {
167
+ filePath: 'documents/report.pdf',
168
+ cacheControl: 3600,
169
+ contentType: 'application/pdf',
170
+ contentDisposition: 'attachment; filename="report.pdf"'
131
171
  });
132
172
  ```
133
173
 
174
+ ---
175
+
134
176
  ### 文件更新
135
177
 
136
178
  #### `update(path, fileBody, fileOptions?)`
137
179
 
138
180
  替换指定路径的现有文件。
139
181
 
140
- **参数:** 同 `upload` 方法
182
+ **入参:**
183
+ ```typescript
184
+ function update(
185
+ path: string, // 文件路径
186
+ fileBody: FileBody, // 文件内容
187
+ fileOptions?: FileOptions // 上传选项
188
+ ): Promise<UploadResult>
189
+ ```
190
+
191
+ **出参:**
192
+ ```typescript
193
+ type UploadResult =
194
+ | { data: UploadFileData; error: null }
195
+ | { data: null; error: StorageError }
196
+ ```
197
+
198
+ ---
199
+
200
+ ### 从URL上传文件
141
201
 
142
- **返回:** `upload` 方法
202
+ #### `uploadFromUrl(url)`
203
+
204
+ 从公共URL上传文件到存储桶。自动透传响应头(content-type、content-disposition、cache-control)到上传请求。对于火山引擎北京区域的 TOS URL,会使用服务端复制优化性能。
205
+
206
+ **入参:**
207
+ ```typescript
208
+ function uploadFromUrl(
209
+ url: string // 公共文件URL(如 CDN 链接)
210
+ ): Promise<UploadFromUrlResult>
211
+ ```
212
+
213
+ **出参:**
214
+ ```typescript
215
+ type UploadFromUrlResult =
216
+ | { data: UploadFileData; error: null }
217
+ | { data: null; error: StorageError }
218
+ ```
219
+
220
+ **功能特性:**
221
+ - ✅ 只允许 `http://` 和 `https://` 协议
222
+ - ✅ 自动透传响应头到上传请求(contentType、contentDisposition、cacheControl)
223
+ - ✅ 检测并拒绝空文件
224
+ - ✅ 火山引擎北京区域 TOS URL 使用服务端复制优化
225
+
226
+ **示例:**
227
+ ```javascript
228
+ // 基本用法
229
+ const { data, error } = await storage.uploadFromUrl(
230
+ 'https://cdn.example.com/images/photo.jpg'
231
+ );
232
+
233
+ if (data) {
234
+ console.log('文件上传成功:', data.download_url);
235
+ }
236
+ ```
237
+
238
+ **错误处理:**
239
+ ```javascript
240
+ const { data, error } = await storage.uploadFromUrl('https://example.com/file.pdf');
241
+
242
+ if (error) {
243
+ // 可能的错误类型:
244
+ // - 'Invalid URL provided' - URL格式无效
245
+ // - 'Only http and https protocols are supported' - 协议不支持
246
+ // - 'Failed to download file from URL: 404 Not Found' - 下载失败
247
+ // - 'Downloaded file is empty' - 下载的文件为空
248
+ console.error(error.message);
249
+ }
250
+ ```
251
+
252
+ ---
143
253
 
144
254
  ### 创建签名URL
145
255
 
@@ -147,22 +257,23 @@ const { data, error } = await storage.upload('avatars/user-123.jpg', file, {
147
257
 
148
258
  创建具有时效性的安全文件访问链接。
149
259
 
150
- **参数:**
151
- - `path` (string): 文件路径或上传接口返回的download_url
152
- - `expiresIn` (number): 过期时间(秒)
153
- - `options` (object, 可选): 选项
154
- - `download` (string | boolean): 是否触发下载,可指定文件名
155
- - `transform` (TransformOptions): 图片转换选项
156
-
157
- **返回:**
158
- ```typescript
159
- {
160
- data: { signedUrl: string };
161
- error: null;
162
- } | {
163
- data: null;
164
- error: StorageError;
165
- }
260
+ **入参:**
261
+ ```typescript
262
+ function createSignedUrl(
263
+ path: string, // 文件路径或 download_url
264
+ expiresIn: number, // 过期时间(秒)
265
+ options?: {
266
+ download?: string | boolean; // 是否触发下载
267
+ transform?: TransformOptions; // 图片转换选项
268
+ }
269
+ ): Promise<SignedUrlResult>
270
+ ```
271
+
272
+ **出参:**
273
+ ```typescript
274
+ type SignedUrlResult =
275
+ | { data: { signedUrl: string }; error: null }
276
+ | { data: null; error: StorageError }
166
277
  ```
167
278
 
168
279
  **示例:**
@@ -181,80 +292,99 @@ const { data, error } = await storage.createSignedUrl('images/photo.jpg', 3600,
181
292
  });
182
293
  ```
183
294
 
295
+ ---
296
+
184
297
  #### `createSignedUrls(paths, expiresIn, options?)`
185
298
 
186
299
  批量创建签名URL。
187
300
 
188
- **参数:**
189
- - `paths` (string[]): 文件路径或上传接口返回的download_url数组
190
- - `expiresIn` (number): 过期时间(秒)
191
- - `options` (object, 可选): 选项
192
-
193
- **返回:**
194
- ```typescript
195
- {
196
- data: Array<{
197
- error: string | null;
198
- path: string | null;
199
- signedUrl: string;
200
- }>;
201
- error: null;
202
- } | {
203
- data: null;
204
- error: StorageError;
205
- }
301
+ **入参:**
302
+ ```typescript
303
+ function createSignedUrls(
304
+ paths: string[], // 文件路径或 download_url 数组
305
+ expiresIn: number, // 过期时间(秒)
306
+ options?: {
307
+ download?: string | boolean;
308
+ }
309
+ ): Promise<SignedUrlsResult>
206
310
  ```
207
311
 
312
+ **出参:**
313
+ ```typescript
314
+ type SignedUrlsResult =
315
+ | {
316
+ data: Array<{
317
+ error: string | null;
318
+ path: string | null;
319
+ signedUrl: string;
320
+ }>;
321
+ error: null
322
+ }
323
+ | { data: null; error: StorageError }
324
+ ```
325
+
326
+ **示例:**
327
+ ```javascript
328
+ const { data, error } = await storage.createSignedUrls(
329
+ ['file1.pdf', 'file2.pdf', 'file3.pdf'],
330
+ 3600
331
+ );
332
+ ```
333
+
334
+ ---
335
+
208
336
  ### 文件下载
209
337
 
210
338
  #### `download(path, options?)`
211
339
 
212
340
  从私有存储桶下载文件。
213
341
 
214
- **参数:**
215
- - `path` (string): 文件路径
216
- - `options` (object, 可选): 选项
217
- - `transform` (TransformOptions): 图片转换选项
342
+ **入参:**
343
+ ```typescript
344
+ function download(
345
+ path: string, // 文件路径
346
+ options?: {
347
+ transform?: TransformOptions; // 图片转换选项
348
+ }
349
+ ): Promise<DownloadResult>
350
+ ```
218
351
 
219
- **返回:**
352
+ **出参:**
220
353
  ```typescript
221
- {
222
- data: Blob;
223
- error: null;
224
- } | {
225
- data: null;
226
- error: StorageError;
227
- }
354
+ type DownloadResult =
355
+ | { data: Blob; error: null }
356
+ | { data: null; error: StorageError }
228
357
  ```
229
358
 
230
359
  **示例:**
231
360
  ```javascript
232
361
  const { data, error } = await storage.download('documents/report.pdf');
233
362
  if (data) {
234
- // 处理下载的文件数据
235
363
  const url = URL.createObjectURL(data);
236
364
  window.open(url);
237
365
  }
238
366
  ```
239
367
 
368
+ ---
369
+
240
370
  ### 文件删除
241
371
 
242
372
  #### `remove(paths)`
243
373
 
244
374
  删除指定路径的文件。
245
375
 
246
- **参数:**
247
- - `paths` (string[]): 要删除的文件路径或上传接口返回的download_url数组
376
+ **入参:**
377
+ ```typescript
378
+ function remove(
379
+ paths: string[] // 文件路径或 download_url 数组
380
+ ): Promise<RemoveResult>
381
+ ```
248
382
 
249
- **返回:**
383
+ **出参:**
250
384
  ```typescript
251
- {
252
- data: FileObject[]; // 被删除的文件信息
253
- error: null;
254
- } | {
255
- data: null;
256
- error: StorageError;
257
- }
385
+ type RemoveResult =
386
+ | { data: FileObject[]; error: null }
387
+ | { data: null; error: StorageError }
258
388
  ```
259
389
 
260
390
  **示例:**
@@ -265,26 +395,28 @@ const { data, error } = await storage.remove([
265
395
  ]);
266
396
  ```
267
397
 
398
+ ---
399
+
268
400
  ### 文件列表
269
401
 
270
402
  #### `list(path?, options?, parameters?)`
271
403
 
272
404
  列出存储桶中的文件。
273
405
 
274
- **参数:**
275
- - `path` (string, 可选): 文件夹路径
276
- - `options` (SearchOptions, 可选): 搜索选项
277
- - `parameters` (FetchParameters, 可选): 请求参数
406
+ **入参:**
407
+ ```typescript
408
+ function list(
409
+ path?: string, // 文件夹路径
410
+ options?: SearchOptions, // 搜索选项
411
+ parameters?: FetchParameters // 请求参数
412
+ ): Promise<ListResult>
413
+ ```
278
414
 
279
- **返回:**
415
+ **出参:**
280
416
  ```typescript
281
- {
282
- data: FileObject[]; // 文件列表
283
- error: null;
284
- } | {
285
- data: null;
286
- error: StorageError;
287
- }
417
+ type ListResult =
418
+ | { data: FileObject[]; error: null }
419
+ | { data: null; error: StorageError }
288
420
  ```
289
421
 
290
422
  **示例:**
@@ -304,99 +436,208 @@ const { data, error } = await storage.list('documents', {
304
436
  });
305
437
  ```
306
438
 
439
+ ---
440
+
307
441
  ## 类型定义
308
442
 
309
443
  ### FileBody
444
+
310
445
  支持以下文件格式:
311
- - `ArrayBuffer`
312
- - `ArrayBufferView`
313
- - `Blob`
314
- - `Buffer`
315
- - `File`
316
- - `FormData`
317
- - `NodeJS.ReadableStream`
318
- - `ReadableStream<Uint8Array>`
319
- - `URLSearchParams`
320
- - `string`
446
+
447
+ ```typescript
448
+ type FileBody =
449
+ | ArrayBuffer
450
+ | ArrayBufferView
451
+ | Blob
452
+ | Buffer
453
+ | File
454
+ | FormData
455
+ | NodeJS.ReadableStream
456
+ | ReadableStream<Uint8Array>
457
+ | URLSearchParams
458
+ | string;
459
+ ```
321
460
 
322
461
  ### FileOptions
462
+
323
463
  ```typescript
324
464
  interface FileOptions {
325
- cacheControl?: string | number; // 缓存控制(秒)
326
- contentType?: string; // 内容类型
327
- upsert?: boolean; // 是否覆盖已存在文件
328
- duplex?: string; // 双工流选项
329
- metadata?: Record<string, any>; // 元数据
330
- headers?: Record<string, string>; // 额外请求头
465
+ /** 缓存控制时间(秒),设置 Cache-Control: max-age=<seconds> 头 */
466
+ cacheControl?: string | number;
467
+ /** Content-Type 头值 */
468
+ contentType?: string;
469
+ /** 是否覆盖已存在文件,默认 false */
470
+ upsert?: boolean;
471
+ /** 双工流选项 */
472
+ duplex?: string;
473
+ /** 文件元数据 */
474
+ metadata?: Record<string, any>;
475
+ /** 额外请求头 */
476
+ headers?: Record<string, string>;
331
477
  }
332
478
  ```
333
479
 
334
480
  ### FileOptionsV2
335
- ```typescript
336
- interface FileOptionsV2 {
337
- filePath?: string; // 文件路径(用于 uploadFile)
338
- cacheControl?: string | number; // 缓存控制(秒)
339
- contentType?: string; // 内容类型
340
- upsert?: boolean; // 是否覆盖已存在文件
341
- contentDisposition?: string; // 内容处置
342
- }
343
- ```
344
481
 
345
- ### TransformOptions
346
482
  ```typescript
347
- interface TransformOptions {
348
- width?: number; // 宽度(像素)
349
- height?: number; // 高度(像素)
350
- resize?: 'cover' | 'contain' | 'fill'; // 调整大小模式
351
- quality?: number; // 质量(20-100)
352
- format?: 'origin'; // 格式
483
+ interface FileOptionsV2 {
484
+ /** 文件上传路径 */
485
+ filePath?: string;
486
+ /** 缓存控制时间(秒) */
487
+ cacheControl?: string | number;
488
+ /** Content-Type 头值 */
489
+ contentType?: string;
490
+ /** 是否覆盖已存在文件,默认 false */
491
+ upsert?: boolean;
492
+ /** Content-Disposition 响应头值 */
493
+ contentDisposition?: string;
353
494
  }
354
495
  ```
355
496
 
356
497
  ### UploadFileData
498
+
357
499
  ```typescript
358
500
  interface UploadFileData {
359
- id: string; // 文件ID
360
- file_path: string; // 文件路径
361
- bucket_id: string; // 存储桶ID
362
- download_url: string; // 下载URL
501
+ /** 文件ID */
502
+ id: string;
503
+ /** 文件路径 */
504
+ file_path: string;
505
+ /** 存储桶ID */
506
+ bucket_id: string;
507
+ /** 下载URL */
508
+ download_url: string;
363
509
  }
364
510
  ```
365
511
 
366
512
  ### FileObject
513
+
367
514
  ```typescript
368
515
  interface FileObject {
369
- name: string; // 文件名
370
- bucket_id: string; // 存储桶ID
371
- owner: string; // 所有者
372
- id: string; // 文件ID
373
- updated_at: string; // 更新时间
374
- created_at: string; // 创建时间
375
- created_by: string; // 创建者
376
- updated_by: string; // 更新者
377
- last_accessed_at?: string; // 最后访问时间
378
- metadata: Record<string, any>; // 元数据
379
- buckets: Bucket; // 存储桶信息
516
+ /** 文件名 */
517
+ name: string;
518
+ /** 存储桶ID */
519
+ bucket_id: string;
520
+ /** 所有者 */
521
+ owner: string;
522
+ /** 文件ID */
523
+ id: string;
524
+ /** 更新时间 */
525
+ updated_at: string;
526
+ /** 创建时间 */
527
+ created_at: string;
528
+ /** 创建者 */
529
+ created_by: string;
530
+ /** 更新者 */
531
+ updated_by: string;
532
+ /** 最后访问时间 */
533
+ last_accessed_at?: string;
534
+ /** 元数据 */
535
+ metadata: Record<string, any>;
536
+ /** 存储桶信息 */
537
+ buckets: Bucket;
538
+ }
539
+ ```
540
+
541
+ ### Bucket
542
+
543
+ ```typescript
544
+ interface Bucket {
545
+ /** 存储桶ID */
546
+ id: string;
547
+ /** 存储桶类型 */
548
+ type?: 'STANDARD' | 'ANALYTICS';
549
+ /** 存储桶名称 */
550
+ name: string;
551
+ /** 所有者 */
552
+ owner: string;
553
+ /** 文件大小限制 */
554
+ file_size_limit?: number;
555
+ /** 允许的MIME类型 */
556
+ allowed_mime_types?: string[];
557
+ /** 创建时间 */
558
+ created_at: string;
559
+ /** 更新时间 */
560
+ updated_at: string;
561
+ /** 是否公开 */
562
+ public: boolean;
380
563
  }
381
564
  ```
382
565
 
383
566
  ### SearchOptions
567
+
384
568
  ```typescript
385
569
  interface SearchOptions {
386
- limit?: number; // 返回文件数量(默认100
387
- offset?: number; // 起始位置
388
- sortBy?: SortBy; // 排序选项
389
- search?: string; // 搜索字符串
570
+ /** 返回文件数量,默认 100 */
571
+ limit?: number;
572
+ /** 起始位置 */
573
+ offset?: number;
574
+ /** 排序选项 */
575
+ sortBy?: SortBy;
576
+ /** 搜索字符串 */
577
+ search?: string;
578
+ }
579
+ ```
580
+
581
+ ### SortBy
582
+
583
+ ```typescript
584
+ interface SortBy {
585
+ /** 排序列名 */
586
+ column?: string;
587
+ /** 排序顺序:'asc' | 'desc' */
588
+ order?: string;
589
+ }
590
+ ```
591
+
592
+ ### TransformOptions
593
+
594
+ ```typescript
595
+ interface TransformOptions {
596
+ /** 宽度(像素) */
597
+ width?: number;
598
+ /** 高度(像素) */
599
+ height?: number;
600
+ /** 调整大小模式 */
601
+ resize?: 'cover' | 'contain' | 'fill';
602
+ /** 质量(20-100) */
603
+ quality?: number;
604
+ /** 格式 */
605
+ format?: 'origin';
390
606
  }
391
607
  ```
392
608
 
393
609
  ### FetchParameters
610
+
394
611
  ```typescript
395
612
  interface FetchParameters {
396
- signal?: AbortSignal; // AbortController 信号
613
+ /** AbortController 信号,用于取消请求 */
614
+ signal?: AbortSignal;
615
+ }
616
+ ```
617
+
618
+ ### StorageError
619
+
620
+ ```typescript
621
+ class StorageError extends Error {
622
+ message: string;
397
623
  }
398
624
  ```
399
625
 
626
+ ### OnRequestErrorType
627
+
628
+ ```typescript
629
+ interface OnRequestErrorType {
630
+ code: number;
631
+ details: string;
632
+ hint: string | null;
633
+ message: string;
634
+ status: number;
635
+ statusText: string;
636
+ }
637
+ ```
638
+
639
+ ---
640
+
400
641
  ## 错误处理
401
642
 
402
643
  所有API方法都返回包含 `data` 和 `error` 的对象。当操作成功时,`error` 为 `null`,`data` 包含返回数据;当操作失败时,`data` 为 `null`,`error` 包含错误信息。
@@ -406,13 +647,13 @@ const { data, error } = await storage.upload('test.jpg', file);
406
647
 
407
648
  if (error) {
408
649
  console.error('操作失败:', error.message);
409
- // 错误处理
410
650
  } else {
411
651
  console.log('操作成功:', data);
412
- // 处理返回数据
413
652
  }
414
653
  ```
415
654
 
655
+ ---
656
+
416
657
  ## 高级用法
417
658
 
418
659
  ### 日志记录
@@ -444,7 +685,6 @@ const storage = new StorageFileApi(
444
685
  false,
445
686
  (error) => {
446
687
  console.error('请求错误:', error);
447
- // 自定义错误处理
448
688
  }
449
689
  );
450
690
  ```
@@ -468,6 +708,8 @@ const storage = new StorageFileApi(
468
708
  );
469
709
  ```
470
710
 
711
+ ---
712
+
471
713
  ## 许可证
472
714
 
473
715
  MIT License