@h-ai/storage 0.1.0-alpha8 → 1.0.0-beta.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.en.md +287 -0
- package/README.ja.md +287 -0
- package/README.md +235 -59
- package/dist/browser.d.ts +490 -102
- package/dist/browser.js +3 -2
- package/dist/chunk-KVFEQHRX.js +360 -0
- package/dist/chunk-KVFEQHRX.js.map +1 -0
- package/dist/{chunk-KHZOR6CR.js → chunk-P4NA6BCH.js} +37 -12
- package/dist/chunk-P4NA6BCH.js.map +1 -0
- package/dist/chunk-P65WYXJG.js +33 -0
- package/dist/chunk-P65WYXJG.js.map +1 -0
- package/dist/client/index.d.ts +57 -48
- package/dist/client/index.js +1 -1
- package/dist/node.d.ts +15 -11
- package/dist/node.js +582 -178
- package/dist/node.js.map +1 -1
- package/dist/schemas.d.ts +103 -0
- package/dist/schemas.js +3 -0
- package/dist/schemas.js.map +1 -0
- package/package.json +22 -16
- package/dist/api/index.d.ts +0 -167
- package/dist/api/index.js +0 -105
- package/dist/api/index.js.map +0 -1
- package/dist/chunk-KHZOR6CR.js.map +0 -1
- package/dist/chunk-U427BQIQ.js +0 -266
- package/dist/chunk-U427BQIQ.js.map +0 -1
package/dist/browser.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { HaiStorageError, LocalConfigSchema, PresignOptionsSchema, PresignUploadOptionsSchema, S3ConfigSchema, StorageConfigSchema, StorageTypeSchema } from './chunk-
|
|
2
|
-
export { downloadAndSave, downloadWithPresignedUrl, formatFileSize, getFileExtension, getMimeType, uploadWithPresignedUrl } from './chunk-
|
|
1
|
+
export { HaiStorageError, LocalConfigSchema, PresignOptionsSchema, PresignUploadOptionsSchema, S3ConfigSchema, StorageConfigSchema, StorageOperationLogConfigSchema, StorageTypeSchema } from './chunk-P4NA6BCH.js';
|
|
2
|
+
export { downloadAndSave, downloadWithPresignedUrl, formatFileSize, getFileExtension, getMimeType, uploadWithPresignedUrl } from './chunk-KVFEQHRX.js';
|
|
3
|
+
export { STORAGE_DELETE_MAX_KEYS, STORAGE_KEY_MAX_BYTES, StorageDeleteKeysSchema, StorageKeySchema, StoragePrefixSchema, StoragePresignExpiresInSchema, getStorageKeyIssue } from './chunk-P65WYXJG.js';
|
|
3
4
|
//# sourceMappingURL=browser.js.map
|
|
4
5
|
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { core } from '@h-ai/core';
|
|
2
|
+
|
|
3
|
+
// src/storage-i18n.ts
|
|
4
|
+
|
|
5
|
+
// messages/en-US.json
|
|
6
|
+
var en_US_default = {
|
|
7
|
+
$schema: "https://inlang.com/schema/inlang-message-format",
|
|
8
|
+
storage_notInitialized: "Storage not initialized, please call storage.init() first",
|
|
9
|
+
storage_bucketNotExist: "Bucket does not exist",
|
|
10
|
+
storage_networkError: "Network error",
|
|
11
|
+
storage_responseBodyEmpty: "Response body is empty",
|
|
12
|
+
storage_presignUrlFailed: "Failed to generate presigned URL",
|
|
13
|
+
storage_presignUploadUrlFailed: "Failed to generate presigned upload URL",
|
|
14
|
+
storage_localPresignUnsupported: "Local storage does not support presigned URLs; upload or download through an authenticated application file endpoint",
|
|
15
|
+
storage_listOptionsInvalid: "Invalid list options: maxKeys must be an integer between 1 and 1000, and prefix and delimiter must be well-formed Unicode strings",
|
|
16
|
+
storage_listCursorInvalid: "Invalid list cursor or mismatched root, prefix or delimiter",
|
|
17
|
+
storage_s3ConfigTypeError: "Config type error: S3 provider only supports type=s3",
|
|
18
|
+
storage_diskSpaceInsufficient: "Insufficient disk space",
|
|
19
|
+
storage_localConfigTypeError: "Config type error: Local provider only supports type=local",
|
|
20
|
+
storage_operationFailed: "Operation failed: {error}",
|
|
21
|
+
storage_unsupportedType: "Unsupported storage type: {type}",
|
|
22
|
+
storage_config_bucketRequired: "Bucket is required",
|
|
23
|
+
storage_config_publicEndpointInvalid: "The presigned access endpoint must be an HTTP(S) origin without a path, credentials, query, or fragment.",
|
|
24
|
+
storage_config_regionRequired: "Region is required",
|
|
25
|
+
storage_config_accessKeyIdRequired: "Access Key ID is required",
|
|
26
|
+
storage_config_secretAccessKeyRequired: "Secret Access Key is required",
|
|
27
|
+
storage_config_rootRequired: "Root path is required",
|
|
28
|
+
storage_fileNotFound: "File not found: {key}",
|
|
29
|
+
storage_permissionDenied: "Permission denied: {key}",
|
|
30
|
+
storage_pathIsDir: "Path is a directory: {key}",
|
|
31
|
+
storage_ioError: "IO error: {error}",
|
|
32
|
+
storage_deleteManyFailed: "Failed to delete {count} files",
|
|
33
|
+
storage_s3ClientNotInitialized: "S3 client not initialized",
|
|
34
|
+
storage_s3ConfigNotInitialized: "S3 config not initialized",
|
|
35
|
+
storage_uploadCanceled: "Upload canceled",
|
|
36
|
+
storage_downloadCanceled: "Download canceled",
|
|
37
|
+
storage_uploadFailedStatus: "Upload failed (status {status}): {statusText}",
|
|
38
|
+
storage_downloadFailedStatus: "Download failed (status {status}): {statusText}",
|
|
39
|
+
storage_unknownError: "Unknown error",
|
|
40
|
+
storage_saveFileFailed: "Failed to save file",
|
|
41
|
+
storage_downloadDefaultFilename: "download",
|
|
42
|
+
storage_pathTraversal: "Path traversal attack detected",
|
|
43
|
+
storage_localNotInitialized: "Local storage not initialized",
|
|
44
|
+
storage_configError: "Storage config validation failed: {error}",
|
|
45
|
+
storage_metaFileAccess: "Direct access to internal files is not allowed: {key}",
|
|
46
|
+
storage_fileAlreadyExists: "File already exists: {key}",
|
|
47
|
+
storage_checksumFailed: "Failed to calculate checksum",
|
|
48
|
+
storage_checksumInvalid: "Invalid checksum or algorithm",
|
|
49
|
+
storage_streamInvalidChunk: "File stream must contain byte chunks",
|
|
50
|
+
storage_sharedBackendRequired: "Production mode requires a shared backend; local files and memory backends are for development or explicit end-to-end tests."
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// messages/ja-JP.json
|
|
54
|
+
var ja_JP_default = {
|
|
55
|
+
$schema: "https://inlang.com/schema/inlang-message-format",
|
|
56
|
+
storage_notInitialized: "\u30B9\u30C8\u30EC\u30FC\u30B8\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u5148\u306Bstorage.init()\u3092\u547C\u3073\u51FA\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
57
|
+
storage_bucketNotExist: "\u30D0\u30B1\u30C3\u30C8\u304C\u5B58\u5728\u3057\u307E\u305B\u3093",
|
|
58
|
+
storage_networkError: "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC",
|
|
59
|
+
storage_responseBodyEmpty: "\u30EC\u30B9\u30DD\u30F3\u30B9\u672C\u6587\u304C\u7A7A\u3067\u3059",
|
|
60
|
+
storage_presignUrlFailed: "\u7F72\u540D\u4ED8\u304DURL\u306E\u751F\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
61
|
+
storage_presignUploadUrlFailed: "\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u7528\u7F72\u540D\u4ED8\u304DURL\u306E\u751F\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
62
|
+
storage_localPresignUnsupported: "\u30ED\u30FC\u30AB\u30EB\u30B9\u30C8\u30EC\u30FC\u30B8\u306F\u7F72\u540D\u4ED8\u304D URL \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u8A8D\u8A3C\u4ED8\u304D\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\u30D5\u30A1\u30A4\u30EB\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u307E\u305F\u306F\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
63
|
+
storage_listOptionsInvalid: "\u4E00\u89A7\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u3067\u3059\u3002maxKeys \u306F1\u301C1000\u306E\u6574\u6570\u3001prefix \u3068 delimiter \u306F\u6709\u52B9\u306A Unicode \u6587\u5B57\u5217\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
64
|
+
storage_listCursorInvalid: "\u4E00\u89A7\u30AB\u30FC\u30BD\u30EB\u304C\u7121\u52B9\u304B\u3001\u30EB\u30FC\u30C8\u3001\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u3001\u533A\u5207\u308A\u6587\u5B57\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093",
|
|
65
|
+
storage_s3ConfigTypeError: "\u8A2D\u5B9A\u306E\u578B\u304C\u7121\u52B9\u3067\u3059\u3002S3\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u306Ftype=s3\u306E\u307F\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u3059",
|
|
66
|
+
storage_diskSpaceInsufficient: "\u30C7\u30A3\u30B9\u30AF\u306E\u7A7A\u304D\u5BB9\u91CF\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059",
|
|
67
|
+
storage_localConfigTypeError: "\u8A2D\u5B9A\u306E\u578B\u304C\u7121\u52B9\u3067\u3059\u3002\u30ED\u30FC\u30AB\u30EB\u30D7\u30ED\u30D0\u30A4\u30C0\u30FC\u306Ftype=local\u306E\u307F\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u3059",
|
|
68
|
+
storage_operationFailed: "\u64CD\u4F5C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {error}",
|
|
69
|
+
storage_unsupportedType: "\u672A\u5BFE\u5FDC\u306E\u30B9\u30C8\u30EC\u30FC\u30B8\u306E\u7A2E\u985E\u3067\u3059: {type}",
|
|
70
|
+
storage_config_bucketRequired: "\u30D0\u30B1\u30C3\u30C8\u306F\u5FC5\u9808\u3067\u3059",
|
|
71
|
+
storage_config_publicEndpointInvalid: "\u7F72\u540D\u4ED8\u304D\u30A2\u30AF\u30BB\u30B9\u5148\u306B\u306F\u3001\u30D1\u30B9\u3001\u8A8D\u8A3C\u60C5\u5831\u3001\u30AF\u30A8\u30EA\u3001\u30D5\u30E9\u30B0\u30E1\u30F3\u30C8\u3092\u542B\u307E\u306A\u3044 HTTP(S) \u30AA\u30EA\u30B8\u30F3\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
72
|
+
storage_config_regionRequired: "\u30EA\u30FC\u30B8\u30E7\u30F3\u306F\u5FC5\u9808\u3067\u3059",
|
|
73
|
+
storage_config_accessKeyIdRequired: "Access Key ID\u306F\u5FC5\u9808\u3067\u3059",
|
|
74
|
+
storage_config_secretAccessKeyRequired: "Secret Access Key\u306F\u5FC5\u9808\u3067\u3059",
|
|
75
|
+
storage_config_rootRequired: "\u30EB\u30FC\u30C8\u30D1\u30B9\u306F\u5FC5\u9808\u3067\u3059",
|
|
76
|
+
storage_fileNotFound: "\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {key}",
|
|
77
|
+
storage_permissionDenied: "\u30A2\u30AF\u30BB\u30B9\u6A29\u9650\u304C\u3042\u308A\u307E\u305B\u3093: {key}",
|
|
78
|
+
storage_pathIsDir: "\u30D1\u30B9\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u3059: {key}",
|
|
79
|
+
storage_ioError: "\u5165\u51FA\u529B\u30A8\u30E9\u30FC: {error}",
|
|
80
|
+
storage_deleteManyFailed: "{count}\u500B\u306E\u30D5\u30A1\u30A4\u30EB\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
81
|
+
storage_s3ClientNotInitialized: "S3\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
|
|
82
|
+
storage_s3ConfigNotInitialized: "S3\u8A2D\u5B9A\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
|
|
83
|
+
storage_uploadCanceled: "\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F",
|
|
84
|
+
storage_downloadCanceled: "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F",
|
|
85
|
+
storage_uploadFailedStatus: "\u30A2\u30C3\u30D7\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30B9\u30C6\u30FC\u30BF\u30B9{status}\uFF09: {statusText}",
|
|
86
|
+
storage_downloadFailedStatus: "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30B9\u30C6\u30FC\u30BF\u30B9{status}\uFF09: {statusText}",
|
|
87
|
+
storage_unknownError: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC",
|
|
88
|
+
storage_saveFileFailed: "\u30D5\u30A1\u30A4\u30EB\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
89
|
+
storage_downloadDefaultFilename: "\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9",
|
|
90
|
+
storage_pathTraversal: "\u30D1\u30B9\u30C8\u30E9\u30D0\u30FC\u30B5\u30EB\u653B\u6483\u3092\u691C\u51FA\u3057\u307E\u3057\u305F",
|
|
91
|
+
storage_localNotInitialized: "\u30ED\u30FC\u30AB\u30EB\u30B9\u30C8\u30EC\u30FC\u30B8\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
|
|
92
|
+
storage_configError: "\u30B9\u30C8\u30EC\u30FC\u30B8\u8A2D\u5B9A\u306E\u691C\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {error}",
|
|
93
|
+
storage_metaFileAccess: "\u5185\u90E8\u30D5\u30A1\u30A4\u30EB\u3078\u306E\u76F4\u63A5\u30A2\u30AF\u30BB\u30B9\u306F\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {key}",
|
|
94
|
+
storage_fileAlreadyExists: "\u30D5\u30A1\u30A4\u30EB\u306F\u65E2\u306B\u5B58\u5728\u3057\u307E\u3059: {key}",
|
|
95
|
+
storage_checksumFailed: "\u30C1\u30A7\u30C3\u30AF\u30B5\u30E0\u306E\u8A08\u7B97\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
96
|
+
storage_checksumInvalid: "\u30C1\u30A7\u30C3\u30AF\u30B5\u30E0\u307E\u305F\u306F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u304C\u7121\u52B9\u3067\u3059",
|
|
97
|
+
storage_streamInvalidChunk: "\u30D5\u30A1\u30A4\u30EB\u30B9\u30C8\u30EA\u30FC\u30E0\u306B\u306F\u30D0\u30A4\u30C8\u30C1\u30E3\u30F3\u30AF\u304C\u5FC5\u8981\u3067\u3059",
|
|
98
|
+
storage_sharedBackendRequired: "\u672C\u756A\u74B0\u5883\u306B\u306F\u5171\u6709\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u304C\u5FC5\u8981\u3067\u3059\u3002\u30ED\u30FC\u30AB\u30EB\u30D5\u30A1\u30A4\u30EB\u3068\u30E1\u30E2\u30EA\u30FC\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u306F\u958B\u767A\u74B0\u5883\u307E\u305F\u306F\u660E\u793A\u7684\u306A E2E \u30C6\u30B9\u30C8\u3067\u306E\u307F\u4F7F\u7528\u3067\u304D\u307E\u3059\u3002"
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// messages/zh-CN.json
|
|
102
|
+
var zh_CN_default = {
|
|
103
|
+
$schema: "https://inlang.com/schema/inlang-message-format",
|
|
104
|
+
storage_notInitialized: "\u5B58\u50A8\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u8C03\u7528 storage.init()",
|
|
105
|
+
storage_bucketNotExist: "\u5B58\u50A8\u6876\u4E0D\u5B58\u5728",
|
|
106
|
+
storage_networkError: "\u7F51\u7EDC\u9519\u8BEF",
|
|
107
|
+
storage_responseBodyEmpty: "\u54CD\u5E94\u4F53\u4E3A\u7A7A",
|
|
108
|
+
storage_presignUrlFailed: "\u751F\u6210\u7B7E\u540D URL \u5931\u8D25",
|
|
109
|
+
storage_presignUploadUrlFailed: "\u751F\u6210\u4E0A\u4F20\u7B7E\u540D URL \u5931\u8D25",
|
|
110
|
+
storage_localPresignUnsupported: "\u672C\u5730\u5B58\u50A8\u4E0D\u652F\u6301\u9884\u7B7E\u540D URL\uFF0C\u8BF7\u901A\u8FC7\u5E94\u7528\u7684\u9274\u6743\u6587\u4EF6\u63A5\u53E3\u4E0A\u4F20\u6216\u4E0B\u8F7D",
|
|
111
|
+
storage_listOptionsInvalid: "\u5217\u8868\u53C2\u6570\u65E0\u6548\uFF1AmaxKeys \u5FC5\u987B\u4E3A 1 \u5230 1000 \u7684\u6574\u6570\uFF0Cprefix \u548C delimiter \u5FC5\u987B\u4E3A\u6709\u6548\u7684 Unicode \u5B57\u7B26\u4E32",
|
|
112
|
+
storage_listCursorInvalid: "\u5217\u8868\u6E38\u6807\u65E0\u6548\u6216\u4E0E\u5F53\u524D\u6839\u76EE\u5F55\u3001\u524D\u7F00\u3001\u5206\u9694\u7B26\u4E0D\u5339\u914D",
|
|
113
|
+
storage_s3ConfigTypeError: "\u914D\u7F6E\u7C7B\u578B\u9519\u8BEF\uFF1AS3 provider \u4EC5\u652F\u6301 type=s3",
|
|
114
|
+
storage_diskSpaceInsufficient: "\u78C1\u76D8\u7A7A\u95F4\u4E0D\u8DB3",
|
|
115
|
+
storage_localConfigTypeError: "\u914D\u7F6E\u7C7B\u578B\u9519\u8BEF\uFF1ALocal provider \u4EC5\u652F\u6301 type=local",
|
|
116
|
+
storage_operationFailed: "\u64CD\u4F5C\u5931\u8D25: {error}",
|
|
117
|
+
storage_unsupportedType: "\u4E0D\u652F\u6301\u7684\u5B58\u50A8\u7C7B\u578B\uFF1A{type}",
|
|
118
|
+
storage_config_bucketRequired: "\u5B58\u50A8\u6876\u4E0D\u80FD\u4E3A\u7A7A",
|
|
119
|
+
storage_config_publicEndpointInvalid: "\u9884\u7B7E\u540D\u8BBF\u95EE\u5730\u5740\u5FC5\u987B\u662F HTTP(S) \u6E90\u5730\u5740\uFF0C\u4E0D\u80FD\u5305\u542B\u8DEF\u5F84\u3001\u51ED\u636E\u3001\u67E5\u8BE2\u53C2\u6570\u6216\u7247\u6BB5\u3002",
|
|
120
|
+
storage_config_regionRequired: "\u533A\u57DF\u4E0D\u80FD\u4E3A\u7A7A",
|
|
121
|
+
storage_config_accessKeyIdRequired: "Access Key ID \u4E0D\u80FD\u4E3A\u7A7A",
|
|
122
|
+
storage_config_secretAccessKeyRequired: "Secret Access Key \u4E0D\u80FD\u4E3A\u7A7A",
|
|
123
|
+
storage_config_rootRequired: "Root \u4E0D\u80FD\u4E3A\u7A7A",
|
|
124
|
+
storage_fileNotFound: "\u6587\u4EF6\u4E0D\u5B58\u5728: {key}",
|
|
125
|
+
storage_permissionDenied: "\u6743\u9650\u4E0D\u8DB3: {key}",
|
|
126
|
+
storage_pathIsDir: "\u8DEF\u5F84\u662F\u76EE\u5F55: {key}",
|
|
127
|
+
storage_ioError: "IO \u9519\u8BEF: {error}",
|
|
128
|
+
storage_deleteManyFailed: "\u5220\u9664 {count} \u4E2A\u6587\u4EF6\u5931\u8D25",
|
|
129
|
+
storage_s3ClientNotInitialized: "S3 \u5BA2\u6237\u7AEF\u672A\u521D\u59CB\u5316",
|
|
130
|
+
storage_s3ConfigNotInitialized: "S3 \u914D\u7F6E\u672A\u521D\u59CB\u5316",
|
|
131
|
+
storage_uploadCanceled: "\u4E0A\u4F20\u5DF2\u53D6\u6D88",
|
|
132
|
+
storage_downloadCanceled: "\u4E0B\u8F7D\u5DF2\u53D6\u6D88",
|
|
133
|
+
storage_uploadFailedStatus: "\u4E0A\u4F20\u5931\u8D25\uFF08\u72B6\u6001\u7801 {status}\uFF09\uFF1A{statusText}",
|
|
134
|
+
storage_downloadFailedStatus: "\u4E0B\u8F7D\u5931\u8D25\uFF08\u72B6\u6001\u7801 {status}\uFF09\uFF1A{statusText}",
|
|
135
|
+
storage_unknownError: "\u672A\u77E5\u9519\u8BEF",
|
|
136
|
+
storage_saveFileFailed: "\u4FDD\u5B58\u6587\u4EF6\u5931\u8D25",
|
|
137
|
+
storage_downloadDefaultFilename: "\u4E0B\u8F7D",
|
|
138
|
+
storage_pathTraversal: "\u68C0\u6D4B\u5230\u8DEF\u5F84\u7A7F\u8D8A\u653B\u51FB",
|
|
139
|
+
storage_localNotInitialized: "\u672C\u5730\u5B58\u50A8\u672A\u521D\u59CB\u5316",
|
|
140
|
+
storage_configError: "\u5B58\u50A8\u914D\u7F6E\u6821\u9A8C\u5931\u8D25\uFF1A{error}",
|
|
141
|
+
storage_metaFileAccess: "\u4E0D\u5141\u8BB8\u76F4\u63A5\u8BBF\u95EE\u5185\u90E8\u6587\u4EF6\uFF1A{key}",
|
|
142
|
+
storage_fileAlreadyExists: "\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A{key}",
|
|
143
|
+
storage_checksumFailed: "\u8BA1\u7B97\u6821\u9A8C\u548C\u5931\u8D25",
|
|
144
|
+
storage_checksumInvalid: "\u6821\u9A8C\u548C\u6216\u7B97\u6CD5\u4E0D\u5408\u6CD5",
|
|
145
|
+
storage_streamInvalidChunk: "\u6587\u4EF6\u6D41\u5FC5\u987B\u5305\u542B\u5B57\u8282\u5757",
|
|
146
|
+
storage_sharedBackendRequired: "\u751F\u4EA7\u6A21\u5F0F\u9700\u8981\u8DE8\u8282\u70B9\u5171\u4EAB\u540E\u7AEF\uFF1B\u672C\u673A\u6587\u4EF6\u6216\u5185\u5B58\u540E\u7AEF\u4EC5\u7528\u4E8E\u5F00\u53D1\u548C\u663E\u5F0F\u7AEF\u5230\u7AEF\u6D4B\u8BD5\u3002"
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// src/storage-i18n.ts
|
|
150
|
+
var storageM = core.i18n.createMessageGetter({
|
|
151
|
+
"zh-CN": zh_CN_default,
|
|
152
|
+
"en-US": en_US_default,
|
|
153
|
+
"ja-JP": ja_JP_default
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// src/storage-mime.ts
|
|
157
|
+
var MIME_TYPES = {
|
|
158
|
+
// 图片
|
|
159
|
+
"jpg": "image/jpeg",
|
|
160
|
+
"jpeg": "image/jpeg",
|
|
161
|
+
"png": "image/png",
|
|
162
|
+
"gif": "image/gif",
|
|
163
|
+
"webp": "image/webp",
|
|
164
|
+
"svg": "image/svg+xml",
|
|
165
|
+
"ico": "image/x-icon",
|
|
166
|
+
// 文档
|
|
167
|
+
"pdf": "application/pdf",
|
|
168
|
+
"doc": "application/msword",
|
|
169
|
+
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
170
|
+
"xls": "application/vnd.ms-excel",
|
|
171
|
+
"xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
172
|
+
"ppt": "application/vnd.ms-powerpoint",
|
|
173
|
+
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
174
|
+
// 文本
|
|
175
|
+
"txt": "text/plain",
|
|
176
|
+
"html": "text/html",
|
|
177
|
+
"css": "text/css",
|
|
178
|
+
"js": "text/javascript",
|
|
179
|
+
"json": "application/json",
|
|
180
|
+
"xml": "application/xml",
|
|
181
|
+
"csv": "text/csv",
|
|
182
|
+
"md": "text/markdown",
|
|
183
|
+
// 音视频
|
|
184
|
+
"mp3": "audio/mpeg",
|
|
185
|
+
"wav": "audio/wav",
|
|
186
|
+
"mp4": "video/mp4",
|
|
187
|
+
"webm": "video/webm",
|
|
188
|
+
"ogg": "audio/ogg",
|
|
189
|
+
// 压缩包
|
|
190
|
+
"zip": "application/zip",
|
|
191
|
+
"rar": "application/x-rar-compressed",
|
|
192
|
+
"7z": "application/x-7z-compressed",
|
|
193
|
+
"tar": "application/x-tar",
|
|
194
|
+
"gz": "application/gzip",
|
|
195
|
+
// 字体
|
|
196
|
+
"woff": "font/woff",
|
|
197
|
+
"woff2": "font/woff2",
|
|
198
|
+
"ttf": "font/ttf",
|
|
199
|
+
"otf": "font/otf"
|
|
200
|
+
};
|
|
201
|
+
var MIME_TYPE_DEFAULT = "application/octet-stream";
|
|
202
|
+
|
|
203
|
+
// src/client/storage-client.ts
|
|
204
|
+
async function uploadWithPresignedUrl(url, data, options = {}) {
|
|
205
|
+
try {
|
|
206
|
+
const signal = options.abortController?.signal;
|
|
207
|
+
if (signal?.aborted)
|
|
208
|
+
return { success: false, error: storageM("storage_uploadCanceled") };
|
|
209
|
+
const body = data;
|
|
210
|
+
if (options.onProgress) {
|
|
211
|
+
const xhr = new XMLHttpRequest();
|
|
212
|
+
return new Promise((resolve) => {
|
|
213
|
+
let settled = false;
|
|
214
|
+
function finish(result) {
|
|
215
|
+
if (settled)
|
|
216
|
+
return;
|
|
217
|
+
settled = true;
|
|
218
|
+
signal?.removeEventListener("abort", onCancel);
|
|
219
|
+
xhr.upload.removeEventListener("progress", onProgress);
|
|
220
|
+
xhr.removeEventListener("load", onLoad);
|
|
221
|
+
xhr.removeEventListener("error", onError);
|
|
222
|
+
xhr.removeEventListener("abort", onAbort);
|
|
223
|
+
xhr.removeEventListener("timeout", onError);
|
|
224
|
+
resolve(result);
|
|
225
|
+
}
|
|
226
|
+
function onAbort() {
|
|
227
|
+
finish({ success: false, error: storageM("storage_uploadCanceled") });
|
|
228
|
+
}
|
|
229
|
+
function onCancel() {
|
|
230
|
+
onAbort();
|
|
231
|
+
xhr.abort();
|
|
232
|
+
}
|
|
233
|
+
function onError() {
|
|
234
|
+
finish({ success: false, error: storageM("storage_networkError") });
|
|
235
|
+
}
|
|
236
|
+
function onLoad() {
|
|
237
|
+
finish(xhr.status >= 200 && xhr.status < 300 ? { success: true } : { success: false, error: storageM("storage_uploadFailedStatus", { params: { status: xhr.status, statusText: xhr.statusText } }) });
|
|
238
|
+
}
|
|
239
|
+
function onProgress(event) {
|
|
240
|
+
if (settled || !event.lengthComputable)
|
|
241
|
+
return;
|
|
242
|
+
try {
|
|
243
|
+
options.onProgress?.({ loaded: event.loaded, total: event.total, percent: Math.round(event.loaded / event.total * 100) });
|
|
244
|
+
} catch (error) {
|
|
245
|
+
finish({ success: false, error: error instanceof Error ? error.message : storageM("storage_unknownError") });
|
|
246
|
+
xhr.abort();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
try {
|
|
250
|
+
xhr.upload.addEventListener("progress", onProgress);
|
|
251
|
+
xhr.addEventListener("load", onLoad);
|
|
252
|
+
xhr.addEventListener("error", onError);
|
|
253
|
+
xhr.addEventListener("abort", onAbort);
|
|
254
|
+
xhr.addEventListener("timeout", onError);
|
|
255
|
+
signal?.addEventListener("abort", onCancel, { once: true });
|
|
256
|
+
xhr.open("PUT", url);
|
|
257
|
+
if (settled)
|
|
258
|
+
return;
|
|
259
|
+
if (options.contentType)
|
|
260
|
+
xhr.setRequestHeader("Content-Type", options.contentType);
|
|
261
|
+
if (signal?.aborted) {
|
|
262
|
+
onCancel();
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
xhr.send(body);
|
|
266
|
+
} catch (error) {
|
|
267
|
+
finish({ success: false, error: error instanceof Error ? error.message : storageM("storage_unknownError") });
|
|
268
|
+
xhr.abort();
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const response = await fetch(url, {
|
|
273
|
+
method: "PUT",
|
|
274
|
+
body,
|
|
275
|
+
headers: options.contentType ? { "Content-Type": options.contentType } : void 0,
|
|
276
|
+
signal
|
|
277
|
+
});
|
|
278
|
+
if (!response.ok) {
|
|
279
|
+
return {
|
|
280
|
+
success: false,
|
|
281
|
+
error: storageM("storage_uploadFailedStatus", { params: { status: response.status, statusText: response.statusText } })
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return { success: true };
|
|
285
|
+
} catch (error) {
|
|
286
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
287
|
+
return { success: false, error: storageM("storage_uploadCanceled") };
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
success: false,
|
|
291
|
+
error: error instanceof Error ? error.message : storageM("storage_unknownError")
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async function downloadWithPresignedUrl(url, options = {}) {
|
|
296
|
+
try {
|
|
297
|
+
const response = await fetch(url, {
|
|
298
|
+
method: "GET",
|
|
299
|
+
signal: options.abortController?.signal
|
|
300
|
+
});
|
|
301
|
+
if (!response.ok) {
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
error: storageM("storage_downloadFailedStatus", { params: { status: response.status, statusText: response.statusText } })
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const blob = await response.blob();
|
|
308
|
+
return { success: true, data: blob };
|
|
309
|
+
} catch (error) {
|
|
310
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
311
|
+
return { success: false, error: storageM("storage_downloadCanceled") };
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
error: error instanceof Error ? error.message : storageM("storage_unknownError")
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async function downloadAndSave(url, options = {}) {
|
|
320
|
+
const result = await downloadWithPresignedUrl(url, options);
|
|
321
|
+
if (!result.success || !result.data) {
|
|
322
|
+
return { success: false, error: result.error };
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
const blobUrl = URL.createObjectURL(result.data);
|
|
326
|
+
const link = document.createElement("a");
|
|
327
|
+
link.href = blobUrl;
|
|
328
|
+
link.download = options.filename || storageM("storage_downloadDefaultFilename");
|
|
329
|
+
document.body.appendChild(link);
|
|
330
|
+
link.click();
|
|
331
|
+
document.body.removeChild(link);
|
|
332
|
+
URL.revokeObjectURL(blobUrl);
|
|
333
|
+
return { success: true };
|
|
334
|
+
} catch (error) {
|
|
335
|
+
return {
|
|
336
|
+
success: false,
|
|
337
|
+
error: error instanceof Error ? error.message : storageM("storage_saveFileFailed")
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
function getFileExtension(file) {
|
|
342
|
+
const name = file.name;
|
|
343
|
+
const lastDot = name.lastIndexOf(".");
|
|
344
|
+
return lastDot > -1 ? name.slice(lastDot + 1).toLowerCase() : "";
|
|
345
|
+
}
|
|
346
|
+
function getMimeType(extension) {
|
|
347
|
+
return MIME_TYPES[extension.toLowerCase()] || MIME_TYPE_DEFAULT;
|
|
348
|
+
}
|
|
349
|
+
function formatFileSize(bytes) {
|
|
350
|
+
if (bytes === 0)
|
|
351
|
+
return "0 B";
|
|
352
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
353
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
354
|
+
const size = bytes / 1024 ** i;
|
|
355
|
+
return `${size.toFixed(i > 0 ? 2 : 0)} ${units[i]}`;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export { MIME_TYPES, MIME_TYPE_DEFAULT, downloadAndSave, downloadWithPresignedUrl, formatFileSize, getFileExtension, getMimeType, storageM, uploadWithPresignedUrl };
|
|
359
|
+
//# sourceMappingURL=chunk-KVFEQHRX.js.map
|
|
360
|
+
//# sourceMappingURL=chunk-KVFEQHRX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/storage-i18n.ts","../src/storage-mime.ts","../src/client/storage-client.ts"],"names":[],"mappings":"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","file":"chunk-KVFEQHRX.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"storage_notInitialized\": \"Storage not initialized, please call storage.init() first\",\n \"storage_bucketNotExist\": \"Bucket does not exist\",\n \"storage_networkError\": \"Network error\",\n \"storage_responseBodyEmpty\": \"Response body is empty\",\n \"storage_presignUrlFailed\": \"Failed to generate presigned URL\",\n \"storage_presignUploadUrlFailed\": \"Failed to generate presigned upload URL\",\n \"storage_localPresignUnsupported\": \"Local storage does not support presigned URLs; upload or download through an authenticated application file endpoint\",\n \"storage_listOptionsInvalid\": \"Invalid list options: maxKeys must be an integer between 1 and 1000, and prefix and delimiter must be well-formed Unicode strings\",\n \"storage_listCursorInvalid\": \"Invalid list cursor or mismatched root, prefix or delimiter\",\n \"storage_s3ConfigTypeError\": \"Config type error: S3 provider only supports type=s3\",\n \"storage_diskSpaceInsufficient\": \"Insufficient disk space\",\n \"storage_localConfigTypeError\": \"Config type error: Local provider only supports type=local\",\n \"storage_operationFailed\": \"Operation failed: {error}\",\n \"storage_unsupportedType\": \"Unsupported storage type: {type}\",\n \"storage_config_bucketRequired\": \"Bucket is required\",\n \"storage_config_publicEndpointInvalid\": \"The presigned access endpoint must be an HTTP(S) origin without a path, credentials, query, or fragment.\",\n \"storage_config_regionRequired\": \"Region is required\",\n \"storage_config_accessKeyIdRequired\": \"Access Key ID is required\",\n \"storage_config_secretAccessKeyRequired\": \"Secret Access Key is required\",\n \"storage_config_rootRequired\": \"Root path is required\",\n \"storage_fileNotFound\": \"File not found: {key}\",\n \"storage_permissionDenied\": \"Permission denied: {key}\",\n \"storage_pathIsDir\": \"Path is a directory: {key}\",\n \"storage_ioError\": \"IO error: {error}\",\n \"storage_deleteManyFailed\": \"Failed to delete {count} files\",\n \"storage_s3ClientNotInitialized\": \"S3 client not initialized\",\n \"storage_s3ConfigNotInitialized\": \"S3 config not initialized\",\n \"storage_uploadCanceled\": \"Upload canceled\",\n \"storage_downloadCanceled\": \"Download canceled\",\n \"storage_uploadFailedStatus\": \"Upload failed (status {status}): {statusText}\",\n \"storage_downloadFailedStatus\": \"Download failed (status {status}): {statusText}\",\n \"storage_unknownError\": \"Unknown error\",\n \"storage_saveFileFailed\": \"Failed to save file\",\n \"storage_downloadDefaultFilename\": \"download\",\n \"storage_pathTraversal\": \"Path traversal attack detected\",\n \"storage_localNotInitialized\": \"Local storage not initialized\",\n \"storage_configError\": \"Storage config validation failed: {error}\",\n \"storage_metaFileAccess\": \"Direct access to internal files is not allowed: {key}\",\n \"storage_fileAlreadyExists\": \"File already exists: {key}\",\n \"storage_checksumFailed\": \"Failed to calculate checksum\",\n \"storage_checksumInvalid\": \"Invalid checksum or algorithm\",\n \"storage_streamInvalidChunk\": \"File stream must contain byte chunks\",\n \"storage_sharedBackendRequired\": \"Production mode requires a shared backend; local files and memory backends are for development or explicit end-to-end tests.\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"storage_notInitialized\": \"ストレージが初期化されていません。先にstorage.init()を呼び出してください\",\n \"storage_bucketNotExist\": \"バケットが存在しません\",\n \"storage_networkError\": \"ネットワークエラー\",\n \"storage_responseBodyEmpty\": \"レスポンス本文が空です\",\n \"storage_presignUrlFailed\": \"署名付きURLの生成に失敗しました\",\n \"storage_presignUploadUrlFailed\": \"アップロード用署名付きURLの生成に失敗しました\",\n \"storage_localPresignUnsupported\": \"ローカルストレージは署名付き URL に対応していません。認証付きのアプリケーションのファイルエンドポイントでアップロードまたはダウンロードしてください\",\n \"storage_listOptionsInvalid\": \"一覧オプションが無効です。maxKeys は1〜1000の整数、prefix と delimiter は有効な Unicode 文字列で指定してください\",\n \"storage_listCursorInvalid\": \"一覧カーソルが無効か、ルート、プレフィックス、区切り文字が一致しません\",\n \"storage_s3ConfigTypeError\": \"設定の型が無効です。S3プロバイダーはtype=s3のみに対応しています\",\n \"storage_diskSpaceInsufficient\": \"ディスクの空き容量が不足しています\",\n \"storage_localConfigTypeError\": \"設定の型が無効です。ローカルプロバイダーはtype=localのみに対応しています\",\n \"storage_operationFailed\": \"操作に失敗しました: {error}\",\n \"storage_unsupportedType\": \"未対応のストレージの種類です: {type}\",\n \"storage_config_bucketRequired\": \"バケットは必須です\",\n \"storage_config_publicEndpointInvalid\": \"署名付きアクセス先には、パス、認証情報、クエリ、フラグメントを含まない HTTP(S) オリジンを指定してください。\",\n \"storage_config_regionRequired\": \"リージョンは必須です\",\n \"storage_config_accessKeyIdRequired\": \"Access Key IDは必須です\",\n \"storage_config_secretAccessKeyRequired\": \"Secret Access Keyは必須です\",\n \"storage_config_rootRequired\": \"ルートパスは必須です\",\n \"storage_fileNotFound\": \"ファイルが見つかりません: {key}\",\n \"storage_permissionDenied\": \"アクセス権限がありません: {key}\",\n \"storage_pathIsDir\": \"パスはディレクトリです: {key}\",\n \"storage_ioError\": \"入出力エラー: {error}\",\n \"storage_deleteManyFailed\": \"{count}個のファイルの削除に失敗しました\",\n \"storage_s3ClientNotInitialized\": \"S3クライアントが初期化されていません\",\n \"storage_s3ConfigNotInitialized\": \"S3設定が初期化されていません\",\n \"storage_uploadCanceled\": \"アップロードをキャンセルしました\",\n \"storage_downloadCanceled\": \"ダウンロードをキャンセルしました\",\n \"storage_uploadFailedStatus\": \"アップロードに失敗しました(ステータス{status}): {statusText}\",\n \"storage_downloadFailedStatus\": \"ダウンロードに失敗しました(ステータス{status}): {statusText}\",\n \"storage_unknownError\": \"不明なエラー\",\n \"storage_saveFileFailed\": \"ファイルの保存に失敗しました\",\n \"storage_downloadDefaultFilename\": \"ダウンロード\",\n \"storage_pathTraversal\": \"パストラバーサル攻撃を検出しました\",\n \"storage_localNotInitialized\": \"ローカルストレージが初期化されていません\",\n \"storage_configError\": \"ストレージ設定の検証に失敗しました: {error}\",\n \"storage_metaFileAccess\": \"内部ファイルへの直接アクセスは許可されていません: {key}\",\n \"storage_fileAlreadyExists\": \"ファイルは既に存在します: {key}\",\n \"storage_checksumFailed\": \"チェックサムの計算に失敗しました\",\n \"storage_checksumInvalid\": \"チェックサムまたはアルゴリズムが無効です\",\n \"storage_streamInvalidChunk\": \"ファイルストリームにはバイトチャンクが必要です\",\n \"storage_sharedBackendRequired\": \"本番環境には共有バックエンドが必要です。ローカルファイルとメモリーバックエンドは開発環境または明示的な E2E テストでのみ使用できます。\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"storage_notInitialized\": \"存储未初始化,请先调用 storage.init()\",\n \"storage_bucketNotExist\": \"存储桶不存在\",\n \"storage_networkError\": \"网络错误\",\n \"storage_responseBodyEmpty\": \"响应体为空\",\n \"storage_presignUrlFailed\": \"生成签名 URL 失败\",\n \"storage_presignUploadUrlFailed\": \"生成上传签名 URL 失败\",\n \"storage_localPresignUnsupported\": \"本地存储不支持预签名 URL,请通过应用的鉴权文件接口上传或下载\",\n \"storage_listOptionsInvalid\": \"列表参数无效:maxKeys 必须为 1 到 1000 的整数,prefix 和 delimiter 必须为有效的 Unicode 字符串\",\n \"storage_listCursorInvalid\": \"列表游标无效或与当前根目录、前缀、分隔符不匹配\",\n \"storage_s3ConfigTypeError\": \"配置类型错误:S3 provider 仅支持 type=s3\",\n \"storage_diskSpaceInsufficient\": \"磁盘空间不足\",\n \"storage_localConfigTypeError\": \"配置类型错误:Local provider 仅支持 type=local\",\n \"storage_operationFailed\": \"操作失败: {error}\",\n \"storage_unsupportedType\": \"不支持的存储类型:{type}\",\n \"storage_config_bucketRequired\": \"存储桶不能为空\",\n \"storage_config_publicEndpointInvalid\": \"预签名访问地址必须是 HTTP(S) 源地址,不能包含路径、凭据、查询参数或片段。\",\n \"storage_config_regionRequired\": \"区域不能为空\",\n \"storage_config_accessKeyIdRequired\": \"Access Key ID 不能为空\",\n \"storage_config_secretAccessKeyRequired\": \"Secret Access Key 不能为空\",\n \"storage_config_rootRequired\": \"Root 不能为空\",\n \"storage_fileNotFound\": \"文件不存在: {key}\",\n \"storage_permissionDenied\": \"权限不足: {key}\",\n \"storage_pathIsDir\": \"路径是目录: {key}\",\n \"storage_ioError\": \"IO 错误: {error}\",\n \"storage_deleteManyFailed\": \"删除 {count} 个文件失败\",\n \"storage_s3ClientNotInitialized\": \"S3 客户端未初始化\",\n \"storage_s3ConfigNotInitialized\": \"S3 配置未初始化\",\n \"storage_uploadCanceled\": \"上传已取消\",\n \"storage_downloadCanceled\": \"下载已取消\",\n \"storage_uploadFailedStatus\": \"上传失败(状态码 {status}):{statusText}\",\n \"storage_downloadFailedStatus\": \"下载失败(状态码 {status}):{statusText}\",\n \"storage_unknownError\": \"未知错误\",\n \"storage_saveFileFailed\": \"保存文件失败\",\n \"storage_downloadDefaultFilename\": \"下载\",\n \"storage_pathTraversal\": \"检测到路径穿越攻击\",\n \"storage_localNotInitialized\": \"本地存储未初始化\",\n \"storage_configError\": \"存储配置校验失败:{error}\",\n \"storage_metaFileAccess\": \"不允许直接访问内部文件:{key}\",\n \"storage_fileAlreadyExists\": \"文件已存在:{key}\",\n \"storage_checksumFailed\": \"计算校验和失败\",\n \"storage_checksumInvalid\": \"校验和或算法不合法\",\n \"storage_streamInvalidChunk\": \"文件流必须包含字节块\",\n \"storage_sharedBackendRequired\": \"生产模式需要跨节点共享后端;本机文件或内存后端仅用于开发和显式端到端测试。\"\n}\n","/**\n * @h-ai/storage — i18n 消息获取器\n *\n * 加载存储模块的中英文翻译文件,提供统一的文案获取函数。\n * 内部使用,不对外导出。\n * @module storage-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesJaJP from '../messages/ja-JP.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n/**\n * 消息键类型(从 zh-CN 翻译文件自动推断)\n * @example 模块内部上下文\n * ```ts\n * const key: StorageMessageKey = 'storage_notInitialized'\n * void storageM(key)\n * ```\n */\ntype StorageMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取存储模块本地化文案\n *\n * 根据当前 locale 自动选择 zh-CN、en-US 或 ja-JP 的文案,\n * 支持带参数插值(通过 `{ params: { key: value } }`)。\n * @example 模块内部上下文\n * ```ts\n * void storageM('storage_notInitialized', { locale: 'en-US' })\n * ```\n */\nexport const storageM = core.i18n.createMessageGetter<StorageMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n 'ja-JP': messagesJaJP,\n})\n","/**\n * @h-ai/storage — MIME 类型映射\n *\n * 集中维护文件扩展名到 MIME 类型的映射表。 供 local provider 和 client 端共用,避免重复定义。\n * @module storage-mime\n */\n\n/**\n * 文件扩展名 → MIME 类型映射表\n *\n * 键为小写扩展名(不含点号),值为标准 MIME 类型字符串。\n * 未匹配项统一回退到 `application/octet-stream`。\n * @example 模块内部上下文\n * ```ts\n * const mime = MIME_TYPES['pdf'] ?? MIME_TYPE_DEFAULT\n * void mime\n * ```\n */\nexport const MIME_TYPES: Record<string, string> = {\n // 图片\n 'jpg': 'image/jpeg',\n 'jpeg': 'image/jpeg',\n 'png': 'image/png',\n 'gif': 'image/gif',\n 'webp': 'image/webp',\n 'svg': 'image/svg+xml',\n 'ico': 'image/x-icon',\n\n // 文档\n 'pdf': 'application/pdf',\n 'doc': 'application/msword',\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'xls': 'application/vnd.ms-excel',\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'ppt': 'application/vnd.ms-powerpoint',\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\n // 文本\n 'txt': 'text/plain',\n 'html': 'text/html',\n 'css': 'text/css',\n 'js': 'text/javascript',\n 'json': 'application/json',\n 'xml': 'application/xml',\n 'csv': 'text/csv',\n 'md': 'text/markdown',\n\n // 音视频\n 'mp3': 'audio/mpeg',\n 'wav': 'audio/wav',\n 'mp4': 'video/mp4',\n 'webm': 'video/webm',\n 'ogg': 'audio/ogg',\n\n // 压缩包\n 'zip': 'application/zip',\n 'rar': 'application/x-rar-compressed',\n '7z': 'application/x-7z-compressed',\n 'tar': 'application/x-tar',\n 'gz': 'application/gzip',\n\n // 字体\n 'woff': 'font/woff',\n 'woff2': 'font/woff2',\n 'ttf': 'font/ttf',\n 'otf': 'font/otf',\n}\n\n/**\n * MIME 类型默认值(未知扩展名回退)\n * @example 模块内部上下文\n * ```ts\n * void MIME_TYPE_DEFAULT // application/octet-stream\n * ```\n */\nexport const MIME_TYPE_DEFAULT = 'application/octet-stream'\n","/**\n * @h-ai/storage — 前端存储客户端\n *\n * 提供前端通过签名 URL 直接上传下载文件的功能。\n * @module storage-client\n */\n\nimport { storageM } from '../storage-i18n.js'\nimport { MIME_TYPE_DEFAULT, MIME_TYPES } from '../storage-mime.js'\n\n// ─── 客户端类型 ───\n\n/**\n * 上传进度回调数据\n *\n * 由 `uploadWithPresignedUrl` 在上传过程中通过 `onProgress` 回调返回。\n * @example\n * ```ts\n * import type { UploadProgress } from '@h-ai/storage'\n *\n * const value: UploadProgress = { loaded: 50, total: 100, percent: 50 }\n * void value\n * ```\n */\nexport interface UploadProgress {\n /** 已上传字节数 */\n loaded: number\n /** 总字节数(仅在 lengthComputable 时可靠) */\n total: number\n /** 进度百分比 (0–100),四舍五入到整数 */\n percent: number\n}\n\n/**\n * 前端上传选项\n *\n * 控制 `uploadWithPresignedUrl` 的行为,包括内容类型、进度监听和取消。\n * @example\n * ```ts\n * import type { ClientUploadOptions } from '@h-ai/storage'\n *\n * const value: ClientUploadOptions = { contentType: 'text/plain', onProgress: progress => { document.title = `${progress.percent}%` } }\n * void value\n * ```\n */\nexport interface ClientUploadOptions {\n /** 内容类型(设置后会加到请求 Content-Type 头) */\n contentType?: string\n /** 进度回调(设置后会使用 XMLHttpRequest;仅 lengthComputable=true 时回调) */\n onProgress?: (progress: UploadProgress) => void\n /** 取消上传;预取消不发送请求,进行中取消返回失败,完成后移除本次监听。取消不能撤销远端已写入对象。 */\n abortController?: AbortController\n}\n\n/**\n * 前端下载选项\n *\n * 控制 `downloadWithPresignedUrl` / `downloadAndSave` 的行为。\n * @example\n * ```ts\n * import type { ClientDownloadOptions } from '@h-ai/storage'\n *\n * const value: ClientDownloadOptions = { filename: 'report.pdf', abortController: new AbortController() }\n * void value\n * ```\n */\nexport interface ClientDownloadOptions {\n /** 保存的文件名(仅 downloadAndSave 使用,默认为 'download') */\n filename?: string\n /** AbortController 用于取消下载(abort 后返回 {success: false}) */\n abortController?: AbortController\n}\n\n// ─── 上传功能 ───\n\n/**\n * 使用签名 URL 上传文件\n *\n * @param url - 已成功获取的 S3 HTTP(S) 上传签名 URL;本地存储须使用应用的鉴权文件接口。\n * @param data - 要上传的数据(File、Blob、ArrayBuffer 或字符串)\n * @param options - 上传选项\n * @returns 上传结果;预取消不发送,进行中取消/网络失败/初始化异常结算为失败,终态移除本次监听。\n * 取消不代表远端对象已回滚;上传完成后的撤销由应用另行授权删除。\n * @example\n * ```ts\n * import { uploadWithPresignedUrl } from '@h-ai/storage/client'\n *\n * // url 由应用鉴权接口返回,且 S3 签名包含相同 Content-Type。\n * async function upload(url: string, file: File) {\n * const result = await uploadWithPresignedUrl(url, file, { contentType: file.type })\n * if (!result.success) throw new Error(result.error)\n * }\n * ```\n */\nexport async function uploadWithPresignedUrl(\n url: string,\n data: File | Blob | ArrayBuffer | string,\n options: ClientUploadOptions = {},\n): Promise<{ success: boolean, error?: string }> {\n try {\n const signal = options.abortController?.signal\n if (signal?.aborted)\n return { success: false, error: storageM('storage_uploadCanceled') }\n\n // 准备请求体\n const body: BodyInit = data\n\n // 使用 XMLHttpRequest 以支持上传进度\n if (options.onProgress) {\n const xhr = new XMLHttpRequest()\n return new Promise((resolve) => {\n let settled = false\n\n /**\n * 所有终态共用一次结算,先移除XHR/上传/signal监听,迟到事件不能改变结果。\n * 后续调用跳过,完成后取消不会再触碰旧XHR。\n * @param result - 本次最终结果,不推断远端是否已写对象。\n * @param result.success - 是否已成功完成本地请求。\n * @param result.error - 可选失败说明。\n * @example 模块内部上下文\n * ```ts\n * finish({ success: false, error: storageM('storage_networkError') })\n * ```\n */\n function finish(result: { success: boolean, error?: string }): void {\n if (settled)\n return\n settled = true\n signal?.removeEventListener('abort', onCancel)\n xhr.upload.removeEventListener('progress', onProgress)\n xhr.removeEventListener('load', onLoad)\n xhr.removeEventListener('error', onError)\n xhr.removeEventListener('abort', onAbort)\n xhr.removeEventListener('timeout', onError)\n resolve(result)\n }\n\n function onAbort(): void {\n finish({ success: false, error: storageM('storage_uploadCanceled') })\n }\n\n /**\n * signal取消先主动结算再终止XHR,覆盖未send时abort不发事件的原生行为。\n * 调用方在准备流程中检查settled后停止发送。\n * @example 模块内部上下文\n * ```ts\n * onCancel()\n * // 后续准备阶段读取settled,不再执行xhr.send。\n * ```\n */\n function onCancel(): void {\n // 未 send 的 XHR.abort 不一定发 abort 事件,取消方必须主动结算。\n onAbort()\n xhr.abort()\n }\n\n function onError(): void {\n finish({ success: false, error: storageM('storage_networkError') })\n }\n\n function onLoad(): void {\n finish(xhr.status >= 200 && xhr.status < 300\n ? { success: true }\n : { success: false, error: storageM('storage_uploadFailedStatus', { params: { status: xhr.status, statusText: xhr.statusText } }) })\n }\n\n function onProgress(event: ProgressEvent): void {\n if (settled || !event.lengthComputable)\n return\n try {\n options.onProgress?.({ loaded: event.loaded, total: event.total, percent: Math.round((event.loaded / event.total) * 100) })\n }\n catch (error) {\n finish({ success: false, error: error instanceof Error ? error.message : storageM('storage_unknownError') })\n xhr.abort()\n }\n }\n\n try {\n xhr.upload.addEventListener('progress', onProgress)\n xhr.addEventListener('load', onLoad)\n xhr.addEventListener('error', onError)\n xhr.addEventListener('abort', onAbort)\n xhr.addEventListener('timeout', onError)\n signal?.addEventListener('abort', onCancel, { once: true })\n xhr.open('PUT', url)\n if (settled)\n return\n if (options.contentType)\n xhr.setRequestHeader('Content-Type', options.contentType)\n // 覆盖从预检查到监听安装/请求准备之间发生的取消,不再进入 send。\n if (signal?.aborted) {\n onCancel()\n return\n }\n xhr.send(body)\n }\n catch (error) {\n finish({ success: false, error: error instanceof Error ? error.message : storageM('storage_unknownError') })\n xhr.abort()\n }\n })\n }\n\n // 不需要进度时使用 fetch\n const response = await fetch(url, {\n method: 'PUT',\n body,\n headers: options.contentType\n ? { 'Content-Type': options.contentType }\n : undefined,\n signal,\n })\n\n if (!response.ok) {\n return {\n success: false,\n error: storageM('storage_uploadFailedStatus', { params: { status: response.status, statusText: response.statusText } }),\n }\n }\n\n return { success: true }\n }\n catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return { success: false, error: storageM('storage_uploadCanceled') }\n }\n return {\n success: false,\n error: error instanceof Error ? error.message : storageM('storage_unknownError'),\n }\n }\n}\n\n// ─── 下载功能 ───\n\n/**\n * 使用签名 URL 下载文件\n *\n * @param url - 后端生成的下载签名 URL\n * @param options - 下载选项\n * @returns 下载结果(成功时 data 为 Blob)\n * @example\n * ```ts\n * import { downloadWithPresignedUrl } from '@h-ai/storage/client'\n *\n * async function download(url: string) {\n * const result = await downloadWithPresignedUrl(url)\n * if (!result.success || !result.data) throw new Error(result.error ?? 'Empty download')\n * return result.data\n * }\n * ```\n */\nexport async function downloadWithPresignedUrl(\n url: string,\n options: ClientDownloadOptions = {},\n): Promise<{ success: boolean, data?: Blob, error?: string }> {\n try {\n const response = await fetch(url, {\n method: 'GET',\n signal: options.abortController?.signal,\n })\n\n if (!response.ok) {\n return {\n success: false,\n error: storageM('storage_downloadFailedStatus', { params: { status: response.status, statusText: response.statusText } }),\n }\n }\n\n const blob = await response.blob()\n return { success: true, data: blob }\n }\n catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return { success: false, error: storageM('storage_downloadCanceled') }\n }\n return {\n success: false,\n error: error instanceof Error ? error.message : storageM('storage_unknownError'),\n }\n }\n}\n\n/**\n * 下载并保存到本地(浏览器环境)\n *\n * @param url - 下载 URL\n * @param options - 下载选项\n * @returns 声明返回类型对应的操作结果。\n * @example\n * ```ts\n * import { downloadAndSave } from '@h-ai/storage/client'\n *\n * async function save(url: string) {\n * const result = await downloadAndSave(url, { filename: 'report.pdf' })\n * if (!result.success) throw new Error(result.error)\n * }\n * ```\n */\nexport async function downloadAndSave(\n url: string,\n options: ClientDownloadOptions = {},\n): Promise<{ success: boolean, error?: string }> {\n const result = await downloadWithPresignedUrl(url, options)\n\n if (!result.success || !result.data) {\n return { success: false, error: result.error }\n }\n\n try {\n // 创建下载链接\n const blobUrl = URL.createObjectURL(result.data)\n const link = document.createElement('a')\n link.href = blobUrl\n link.download = options.filename || storageM('storage_downloadDefaultFilename')\n\n // 触发下载\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n // 清理 URL\n URL.revokeObjectURL(blobUrl)\n\n return { success: true }\n }\n catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : storageM('storage_saveFileFailed'),\n }\n }\n}\n\n// ─── 辅助功能 ───\n\n/**\n * 从 File 对象获取文件扩展名\n *\n * 取文件名中最后一个 '.' 之后的部分,转为小写。\n * 没有点号或以点号结尾时返回空字符串;仅前导点号的文件名按其后文本返回扩展名。\n *\n * @param file - 浏览器 File 对象\n * @returns 扩展名(不含点),如 'png'、'tar.gz' 返回 'gz'\n * @example\n * ```ts\n * import { getFileExtension } from '@h-ai/storage/client'\n *\n * const extension = getFileExtension(new File(['hello'], 'report.txt'))\n * void extension\n * ```\n */\nexport function getFileExtension(file: File): string {\n const name = file.name\n const lastDot = name.lastIndexOf('.')\n return lastDot > -1 ? name.slice(lastDot + 1).toLowerCase() : ''\n}\n\n/**\n * 根据文件扩展名获取 MIME 类型\n *\n * 内置常见扩展名映射(图片/文档/文本/音视频/压缩包),\n * 未匹配时返回 'application/octet-stream'。\n *\n * @param extension - 文件扩展名(不含点,大小写不敏感)\n * @returns MIME 类型字符串\n * @example\n * ```ts\n * import { getMimeType } from '@h-ai/storage/client'\n *\n * const mime = getMimeType('pdf')\n * void mime\n * ```\n */\nexport function getMimeType(extension: string): string {\n return MIME_TYPES[extension.toLowerCase()] || MIME_TYPE_DEFAULT\n}\n\n/**\n * 格式化文件大小为人类可读字符串\n *\n * 使用 1024 进制,输出单位为 B/KB/MB/GB/TB。\n * 非零值使用对应单位并保留 2 位小数。\n *\n * @param bytes - 字节数(非负整数)\n * @returns 格式化后的字符串,如 '0 B'、'1.50 KB'、'2.30 MB'\n * @example\n * ```ts\n * import { formatFileSize } from '@h-ai/storage/client'\n *\n * void formatFileSize(1536)\n * ```\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0)\n return '0 B'\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n const i = Math.floor(Math.log(bytes) / Math.log(1024))\n const size = bytes / 1024 ** i\n\n return `${size.toFixed(i > 0 ? 2 : 0)} ${units[i]}`\n}\n"]}
|
|
@@ -1,27 +1,49 @@
|
|
|
1
|
-
import { storageM } from './chunk-
|
|
1
|
+
import { storageM } from './chunk-KVFEQHRX.js';
|
|
2
|
+
import { StoragePresignExpiresInSchema } from './chunk-P65WYXJG.js';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
import { core } from '@h-ai/core';
|
|
4
5
|
|
|
5
6
|
var StorageTypeSchema = z.enum(["s3", "local"]);
|
|
7
|
+
var StorageOperationLogConfigSchema = z.object({
|
|
8
|
+
read: z.boolean().default(false),
|
|
9
|
+
write: z.boolean().default(false),
|
|
10
|
+
maxLength: z.number().int().min(0).default(1e3),
|
|
11
|
+
level: z.enum(["info", "debug", "trace"]).default("debug")
|
|
12
|
+
});
|
|
13
|
+
var OperationLogConfigFieldSchema = {
|
|
14
|
+
operationLog: StorageOperationLogConfigSchema.optional()
|
|
15
|
+
};
|
|
6
16
|
var S3ConfigSchema = z.object({
|
|
7
17
|
/** 存储类型 */
|
|
8
18
|
type: z.literal("s3"),
|
|
9
19
|
/** 存储桶名称 */
|
|
10
20
|
bucket: z.string().min(1, storageM("storage_config_bucketRequired")),
|
|
21
|
+
/** 初始化时检查并创建缺失的桶;默认关闭,启用后凭据须有建桶权限。 */
|
|
22
|
+
createBucket: z.boolean().default(false),
|
|
11
23
|
/** 区域 */
|
|
12
24
|
region: z.string().min(1, storageM("storage_config_regionRequired")),
|
|
13
25
|
/** Access Key ID */
|
|
14
26
|
accessKeyId: z.string().min(1, storageM("storage_config_accessKeyIdRequired")),
|
|
15
27
|
/** Secret Access Key */
|
|
16
28
|
secretAccessKey: z.string().min(1, storageM("storage_config_secretAccessKeyRequired")),
|
|
17
|
-
/** 自定义端点(用于 MinIO、阿里云 OSS 等) */
|
|
29
|
+
/** 自定义端点(用于 MinIO、RustFS、阿里云 OSS 等) */
|
|
18
30
|
endpoint: z.string().url().optional(),
|
|
31
|
+
/** 浏览器预签名访问端点;仅 HTTP(S) 源地址,不含桶名、路径、凭据或查询。未配置时使用 endpoint。 */
|
|
32
|
+
publicEndpoint: z.string().url().refine((value) => {
|
|
33
|
+
try {
|
|
34
|
+
const url = new URL(value);
|
|
35
|
+
return ["http:", "https:"].includes(url.protocol) && !url.username && !url.password && url.pathname === "/" && !url.search && !url.hash;
|
|
36
|
+
} catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}, storageM("storage_config_publicEndpointInvalid")).optional(),
|
|
19
40
|
/** 强制使用路径风格 URL(某些 S3 兼容服务需要) */
|
|
20
41
|
forcePathStyle: z.boolean().default(false),
|
|
21
42
|
/** 路径前缀(所有操作都会加上此前缀) */
|
|
22
43
|
prefix: z.string().default(""),
|
|
23
44
|
/** 公开访问基础 URL(用于生成公开 URL) */
|
|
24
|
-
publicUrl: z.string().url().optional()
|
|
45
|
+
publicUrl: z.string().url().optional(),
|
|
46
|
+
...OperationLogConfigFieldSchema
|
|
25
47
|
});
|
|
26
48
|
var LocalConfigSchema = z.object({
|
|
27
49
|
/** 存储类型 */
|
|
@@ -31,7 +53,8 @@ var LocalConfigSchema = z.object({
|
|
|
31
53
|
/** 目录创建权限 */
|
|
32
54
|
directoryMode: z.number().default(493),
|
|
33
55
|
/** 文件创建权限 */
|
|
34
|
-
fileMode: z.number().default(420)
|
|
56
|
+
fileMode: z.number().default(420),
|
|
57
|
+
...OperationLogConfigFieldSchema
|
|
35
58
|
});
|
|
36
59
|
var StorageConfigSchema = z.discriminatedUnion("type", [
|
|
37
60
|
S3ConfigSchema,
|
|
@@ -39,7 +62,7 @@ var StorageConfigSchema = z.discriminatedUnion("type", [
|
|
|
39
62
|
]);
|
|
40
63
|
var PresignOptionsSchema = z.object({
|
|
41
64
|
/** 过期时间(秒),范围 1~604800(7 天),默认 3600(1 小时) */
|
|
42
|
-
expiresIn:
|
|
65
|
+
expiresIn: StoragePresignExpiresInSchema.default(3600),
|
|
43
66
|
// 最长 7 天
|
|
44
67
|
/** 响应内容类型(用于下载时设置 Content-Type) */
|
|
45
68
|
responseContentType: z.string().optional(),
|
|
@@ -48,9 +71,7 @@ var PresignOptionsSchema = z.object({
|
|
|
48
71
|
});
|
|
49
72
|
var PresignUploadOptionsSchema = PresignOptionsSchema.extend({
|
|
50
73
|
/** 上传内容类型(必须与实际上传匹配) */
|
|
51
|
-
contentType: z.string().default("application/octet-stream")
|
|
52
|
-
/** 最大文件大小限制(bytes) */
|
|
53
|
-
maxSize: z.number().optional()
|
|
74
|
+
contentType: z.string().default("application/octet-stream")
|
|
54
75
|
});
|
|
55
76
|
var StorageErrorInfo = {
|
|
56
77
|
CONNECTION_FAILED: "001:500",
|
|
@@ -67,10 +88,14 @@ var StorageErrorInfo = {
|
|
|
67
88
|
CONFIG_ERROR: "012:500",
|
|
68
89
|
PRESIGN_FAILED: "013:500",
|
|
69
90
|
UPLOAD_FAILED: "014:500",
|
|
70
|
-
DOWNLOAD_FAILED: "015:500"
|
|
91
|
+
DOWNLOAD_FAILED: "015:500",
|
|
92
|
+
CHECKSUM_FAILED: "016:500",
|
|
93
|
+
INVALID_CHECKSUM: "017:400",
|
|
94
|
+
UNSUPPORTED_OPERATION: "018:400",
|
|
95
|
+
INVALID_LIST_OPTIONS: "019:400"
|
|
71
96
|
};
|
|
72
97
|
var HaiStorageError = core.error.buildHaiErrorsDef("storage", StorageErrorInfo);
|
|
73
98
|
|
|
74
|
-
export { HaiStorageError, LocalConfigSchema, PresignOptionsSchema, PresignUploadOptionsSchema, S3ConfigSchema, StorageConfigSchema, StorageTypeSchema };
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
99
|
+
export { HaiStorageError, LocalConfigSchema, PresignOptionsSchema, PresignUploadOptionsSchema, S3ConfigSchema, StorageConfigSchema, StorageOperationLogConfigSchema, StorageTypeSchema };
|
|
100
|
+
//# sourceMappingURL=chunk-P4NA6BCH.js.map
|
|
101
|
+
//# sourceMappingURL=chunk-P4NA6BCH.js.map
|