@velajs/storage 0.3.1 → 0.3.2

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 (99) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/dist/body-BMUcBeQ0.js +93 -0
  3. package/dist/body-BMUcBeQ0.js.map +1 -0
  4. package/dist/client/index.d.ts +49 -46
  5. package/dist/client/index.js +207 -228
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/drivers/memory/index.d.ts +17 -13
  8. package/dist/drivers/memory/index.js +190 -197
  9. package/dist/drivers/memory/index.js.map +1 -0
  10. package/dist/drivers/r2/index.d.ts +7 -4
  11. package/dist/drivers/r2/index.js +162 -160
  12. package/dist/drivers/r2/index.js.map +1 -0
  13. package/dist/drivers/r2-http/index.d.ts +23 -19
  14. package/dist/drivers/r2-http/index.js +52 -45
  15. package/dist/drivers/r2-http/index.js.map +1 -0
  16. package/dist/drivers/s3/index.d.ts +79 -5
  17. package/dist/drivers/s3/index.js +2 -3
  18. package/dist/index.d.ts +271 -17
  19. package/dist/index.js +1078 -16
  20. package/dist/index.js.map +1 -0
  21. package/dist/middleware/index.d.ts +177 -15
  22. package/dist/middleware/index.js +553 -8
  23. package/dist/middleware/index.js.map +1 -0
  24. package/dist/protocol.types-C5PPBD12.d.ts +80 -0
  25. package/dist/r2.types-Bw4Ft83t.d.ts +71 -0
  26. package/dist/retry-DXtO6R9D.js +119 -0
  27. package/dist/retry-DXtO6R9D.js.map +1 -0
  28. package/dist/s3-DrE9NrnD.js +557 -0
  29. package/dist/s3-DrE9NrnD.js.map +1 -0
  30. package/dist/storage.error-DVCOkJhc.js +49 -0
  31. package/dist/storage.error-DVCOkJhc.js.map +1 -0
  32. package/dist/storage.types-BJN7Yp1J.d.ts +288 -0
  33. package/dist/storagesdk/index.d.ts +73 -69
  34. package/dist/storagesdk/index.js +117 -130
  35. package/dist/storagesdk/index.js.map +1 -0
  36. package/dist/stored-file-2Yl07eRc.js +105 -0
  37. package/dist/stored-file-2Yl07eRc.js.map +1 -0
  38. package/dist/testing/index.d.ts +12 -8
  39. package/dist/testing/index.js +36 -53
  40. package/dist/testing/index.js.map +1 -0
  41. package/package.json +62 -48
  42. package/dist/base64.d.ts +0 -8
  43. package/dist/base64.js +0 -25
  44. package/dist/decorators/inject-storage.decorator.d.ts +0 -17
  45. package/dist/decorators/inject-storage.decorator.js +0 -21
  46. package/dist/drivers/r2/r2.types.d.ts +0 -67
  47. package/dist/drivers/r2/r2.types.js +0 -5
  48. package/dist/drivers/s3/s3-client.d.ts +0 -33
  49. package/dist/drivers/s3/s3-client.js +0 -154
  50. package/dist/drivers/s3/s3.driver.d.ts +0 -4
  51. package/dist/drivers/s3/s3.driver.js +0 -407
  52. package/dist/drivers/s3/s3.types.d.ts +0 -28
  53. package/dist/drivers/s3/s3.types.js +0 -1
  54. package/dist/drivers/s3/xml.d.ts +0 -6
  55. package/dist/drivers/s3/xml.js +0 -52
  56. package/dist/http/authorizer.types.d.ts +0 -59
  57. package/dist/http/authorizer.types.js +0 -1
  58. package/dist/http/http-helpers.d.ts +0 -22
  59. package/dist/http/http-helpers.js +0 -80
  60. package/dist/http/protocol.types.d.ts +0 -76
  61. package/dist/http/protocol.types.js +0 -1
  62. package/dist/internal/body.d.ts +0 -18
  63. package/dist/internal/body.js +0 -90
  64. package/dist/internal/retry.d.ts +0 -41
  65. package/dist/internal/retry.js +0 -127
  66. package/dist/internal/stored-file.d.ts +0 -27
  67. package/dist/internal/stored-file.js +0 -114
  68. package/dist/middleware/cache.d.ts +0 -50
  69. package/dist/middleware/cache.js +0 -101
  70. package/dist/middleware/compose.d.ts +0 -12
  71. package/dist/middleware/compose.js +0 -11
  72. package/dist/middleware/compression.d.ts +0 -16
  73. package/dist/middleware/compression.js +0 -101
  74. package/dist/middleware/encryption.d.ts +0 -14
  75. package/dist/middleware/encryption.js +0 -134
  76. package/dist/middleware/failover.d.ts +0 -18
  77. package/dist/middleware/failover.js +0 -52
  78. package/dist/middleware/retry.d.ts +0 -14
  79. package/dist/middleware/retry.js +0 -47
  80. package/dist/middleware/versioning.d.ts +0 -36
  81. package/dist/middleware/versioning.js +0 -89
  82. package/dist/middleware/wrap.d.ts +0 -11
  83. package/dist/middleware/wrap.js +0 -46
  84. package/dist/object-key.d.ts +0 -17
  85. package/dist/object-key.js +0 -42
  86. package/dist/storage.controller.d.ts +0 -21
  87. package/dist/storage.controller.js +0 -386
  88. package/dist/storage.error.d.ts +0 -38
  89. package/dist/storage.error.js +0 -52
  90. package/dist/storage.facade.d.ts +0 -47
  91. package/dist/storage.facade.js +0 -443
  92. package/dist/storage.module.d.ts +0 -46
  93. package/dist/storage.module.js +0 -113
  94. package/dist/storage.service.d.ts +0 -42
  95. package/dist/storage.service.js +0 -86
  96. package/dist/storage.tokens.d.ts +0 -13
  97. package/dist/storage.tokens.js +0 -26
  98. package/dist/storage.types.d.ts +0 -245
  99. package/dist/storage.types.js +0 -1
@@ -1,166 +1,168 @@
1
- import { createStoredFile } from "../../internal/stored-file.js";
2
- import { StorageError } from "../../storage.error.js";
1
+ import { t as StorageError } from "../../storage.error-DVCOkJhc.js";
2
+ import { t as createStoredFile } from "../../stored-file-2Yl07eRc.js";
3
+ //#region src/drivers/r2/index.ts
3
4
  function joinPublic(base, key) {
4
- const enc = key.split('/').map(encodeURIComponent).join('/');
5
- return `${base.replace(/\/$/, '')}/${enc}`;
5
+ const enc = key.split("/").map(encodeURIComponent).join("/");
6
+ return `${base.replace(/\/$/, "")}/${enc}`;
6
7
  }
7
8
  function metaOf(obj) {
8
- return {
9
- key: obj.key,
10
- size: obj.size,
11
- type: obj.httpMetadata?.contentType ?? 'application/octet-stream',
12
- etag: obj.etag,
13
- lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : undefined,
14
- metadata: obj.customMetadata
15
- };
9
+ return {
10
+ key: obj.key,
11
+ size: obj.size,
12
+ type: obj.httpMetadata?.contentType ?? "application/octet-stream",
13
+ etag: obj.etag,
14
+ lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : void 0,
15
+ metadata: obj.customMetadata
16
+ };
16
17
  }
17
18
  /**
18
- * Cloudflare R2 driver — native binding mode only. Zero third-party deps
19
- * (no aws4fetch), fully edge-native I/O with no egress fees.
20
- *
21
- * It cannot presign (`signedUploadUrl` throws; `url()` needs `publicBaseUrl`).
22
- * For presigned URLs use `@velajs/storage/drivers/r2-http` (HTTP or hybrid mode).
23
- */ export function r2Driver(options) {
24
- const bucket = options.bucket;
25
- const mustGet = async (key)=>{
26
- const obj = await bucket.get(key);
27
- if (!obj) throw new StorageError('NotFound', `not found: ${key}`);
28
- return obj;
29
- };
30
- return {
31
- name: options.name ?? 'r2',
32
- raw: bucket,
33
- supportsRange: true,
34
- supportsDelimiter: true,
35
- supportsMetadata: true,
36
- supportsCacheControl: true,
37
- supportsServerSideCopy: false,
38
- reportsUploadProgress: false,
39
- signedUrl: {
40
- supported: !!options.publicBaseUrl,
41
- upload: false
42
- },
43
- async upload (key, body, opts) {
44
- const obj = await bucket.put(key, body, {
45
- httpMetadata: {
46
- contentType: opts?.contentType,
47
- cacheControl: opts?.cacheControl
48
- },
49
- customMetadata: opts?.metadata
50
- });
51
- if (!obj) throw new StorageError('Provider', `put failed: ${key}`);
52
- return {
53
- key,
54
- size: obj.size,
55
- contentType: opts?.contentType ?? 'application/octet-stream',
56
- etag: obj.etag,
57
- lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : undefined
58
- };
59
- },
60
- async download (key, opts) {
61
- const range = opts?.range ? {
62
- offset: opts.range.start,
63
- length: opts.range.end != null ? opts.range.end - opts.range.start + 1 : undefined
64
- } : undefined;
65
- const obj = await bucket.get(key, range ? {
66
- range
67
- } : undefined);
68
- if (!obj) throw new StorageError('NotFound', `not found: ${key}`);
69
- const meta = metaOf(obj);
70
- const size = range ? range.length ?? obj.size - range.offset : obj.size;
71
- return createStoredFile({
72
- ...meta,
73
- size
74
- }, {
75
- kind: 'stream',
76
- stream: obj.body
77
- });
78
- },
79
- async head (key) {
80
- const obj = await bucket.head(key);
81
- if (!obj) throw new StorageError('NotFound', `not found: ${key}`);
82
- return createStoredFile(metaOf(obj), {
83
- kind: 'lazy',
84
- fetch: async ()=>new Response((await mustGet(key)).body)
85
- });
86
- },
87
- async exists (key) {
88
- return await bucket.head(key) != null;
89
- },
90
- async delete (key) {
91
- await bucket.delete(key);
92
- },
93
- async deleteMany (keys) {
94
- await bucket.delete(keys);
95
- return {
96
- deleted: keys
97
- };
98
- },
99
- async copy (from, to) {
100
- const src = await bucket.get(from);
101
- if (!src) throw new StorageError('NotFound', `not found: ${from}`);
102
- await bucket.put(to, src.body, {
103
- httpMetadata: src.httpMetadata,
104
- customMetadata: src.customMetadata
105
- });
106
- },
107
- async list (opts) {
108
- const res = await bucket.list({
109
- prefix: opts?.prefix,
110
- cursor: opts?.cursor,
111
- limit: opts?.limit,
112
- delimiter: opts?.delimiter
113
- });
114
- return {
115
- items: res.objects.map((obj)=>createStoredFile(metaOf(obj), {
116
- kind: 'lazy',
117
- fetch: async ()=>new Response((await mustGet(obj.key)).body)
118
- })),
119
- prefixes: res.delimitedPrefixes.length ? res.delimitedPrefixes : undefined,
120
- cursor: res.truncated ? res.cursor : undefined
121
- };
122
- },
123
- async url (key, _opts) {
124
- if (options.publicBaseUrl) return joinPublic(options.publicBaseUrl, key);
125
- throw new StorageError('Unsupported', 'r2 binding: url() needs publicBaseUrl (or use the r2-http/hybrid driver to presign)');
126
- },
127
- async signedUploadUrl () {
128
- throw new StorageError('Unsupported', 'r2 binding cannot presign uploads; use the r2-http or r2-hybrid driver');
129
- },
130
- async createMultipartUpload (key, opts) {
131
- const mpu = await bucket.createMultipartUpload(key, {
132
- httpMetadata: {
133
- contentType: opts?.contentType,
134
- cacheControl: opts?.cacheControl
135
- },
136
- customMetadata: opts?.metadata
137
- });
138
- return {
139
- key,
140
- uploadId: mpu.uploadId,
141
- async uploadPart (partNumber, part, _o) {
142
- const up = await mpu.uploadPart(partNumber, part);
143
- return {
144
- partNumber: up.partNumber,
145
- etag: up.etag
146
- };
147
- },
148
- async complete (parts) {
149
- const obj = await mpu.complete(parts.map((p)=>({
150
- partNumber: p.partNumber,
151
- etag: p.etag
152
- })));
153
- return {
154
- key,
155
- size: obj.size,
156
- contentType: opts?.contentType ?? 'application/octet-stream',
157
- etag: obj.etag
158
- };
159
- },
160
- async abort () {
161
- await mpu.abort();
162
- }
163
- };
164
- }
165
- };
19
+ * Cloudflare R2 driver — native binding mode only. Zero third-party deps
20
+ * (no aws4fetch), fully edge-native I/O with no egress fees.
21
+ *
22
+ * It cannot presign (`signedUploadUrl` throws; `url()` needs `publicBaseUrl`).
23
+ * For presigned URLs use `@velajs/storage/drivers/r2-http` (HTTP or hybrid mode).
24
+ */
25
+ function r2Driver(options) {
26
+ const bucket = options.bucket;
27
+ const mustGet = async (key) => {
28
+ const obj = await bucket.get(key);
29
+ if (!obj) throw new StorageError("NotFound", `not found: ${key}`);
30
+ return obj;
31
+ };
32
+ return {
33
+ name: options.name ?? "r2",
34
+ raw: bucket,
35
+ supportsRange: true,
36
+ supportsDelimiter: true,
37
+ supportsMetadata: true,
38
+ supportsCacheControl: true,
39
+ supportsServerSideCopy: false,
40
+ reportsUploadProgress: false,
41
+ signedUrl: {
42
+ supported: !!options.publicBaseUrl,
43
+ upload: false
44
+ },
45
+ async upload(key, body, opts) {
46
+ const obj = await bucket.put(key, body, {
47
+ httpMetadata: {
48
+ contentType: opts?.contentType,
49
+ cacheControl: opts?.cacheControl
50
+ },
51
+ customMetadata: opts?.metadata
52
+ });
53
+ if (!obj) throw new StorageError("Provider", `put failed: ${key}`);
54
+ return {
55
+ key,
56
+ size: obj.size,
57
+ contentType: opts?.contentType ?? "application/octet-stream",
58
+ etag: obj.etag,
59
+ lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : void 0
60
+ };
61
+ },
62
+ async download(key, opts) {
63
+ const range = opts?.range ? {
64
+ offset: opts.range.start,
65
+ length: opts.range.end != null ? opts.range.end - opts.range.start + 1 : void 0
66
+ } : void 0;
67
+ const obj = await bucket.get(key, range ? { range } : void 0);
68
+ if (!obj) throw new StorageError("NotFound", `not found: ${key}`);
69
+ const meta = metaOf(obj);
70
+ const size = range ? range.length ?? obj.size - range.offset : obj.size;
71
+ return createStoredFile({
72
+ ...meta,
73
+ size
74
+ }, {
75
+ kind: "stream",
76
+ stream: obj.body
77
+ });
78
+ },
79
+ async head(key) {
80
+ const obj = await bucket.head(key);
81
+ if (!obj) throw new StorageError("NotFound", `not found: ${key}`);
82
+ return createStoredFile(metaOf(obj), {
83
+ kind: "lazy",
84
+ fetch: async () => new Response((await mustGet(key)).body)
85
+ });
86
+ },
87
+ async exists(key) {
88
+ return await bucket.head(key) != null;
89
+ },
90
+ async delete(key) {
91
+ await bucket.delete(key);
92
+ },
93
+ async deleteMany(keys) {
94
+ await bucket.delete(keys);
95
+ return { deleted: keys };
96
+ },
97
+ async copy(from, to) {
98
+ const src = await bucket.get(from);
99
+ if (!src) throw new StorageError("NotFound", `not found: ${from}`);
100
+ await bucket.put(to, src.body, {
101
+ httpMetadata: src.httpMetadata,
102
+ customMetadata: src.customMetadata
103
+ });
104
+ },
105
+ async list(opts) {
106
+ const res = await bucket.list({
107
+ prefix: opts?.prefix,
108
+ cursor: opts?.cursor,
109
+ limit: opts?.limit,
110
+ delimiter: opts?.delimiter
111
+ });
112
+ return {
113
+ items: res.objects.map((obj) => createStoredFile(metaOf(obj), {
114
+ kind: "lazy",
115
+ fetch: async () => new Response((await mustGet(obj.key)).body)
116
+ })),
117
+ prefixes: res.delimitedPrefixes.length ? res.delimitedPrefixes : void 0,
118
+ cursor: res.truncated ? res.cursor : void 0
119
+ };
120
+ },
121
+ async url(key, _opts) {
122
+ if (options.publicBaseUrl) return joinPublic(options.publicBaseUrl, key);
123
+ throw new StorageError("Unsupported", "r2 binding: url() needs publicBaseUrl (or use the r2-http/hybrid driver to presign)");
124
+ },
125
+ async signedUploadUrl() {
126
+ throw new StorageError("Unsupported", "r2 binding cannot presign uploads; use the r2-http or r2-hybrid driver");
127
+ },
128
+ async createMultipartUpload(key, opts) {
129
+ const mpu = await bucket.createMultipartUpload(key, {
130
+ httpMetadata: {
131
+ contentType: opts?.contentType,
132
+ cacheControl: opts?.cacheControl
133
+ },
134
+ customMetadata: opts?.metadata
135
+ });
136
+ return {
137
+ key,
138
+ uploadId: mpu.uploadId,
139
+ async uploadPart(partNumber, part, _o) {
140
+ const up = await mpu.uploadPart(partNumber, part);
141
+ return {
142
+ partNumber: up.partNumber,
143
+ etag: up.etag
144
+ };
145
+ },
146
+ async complete(parts) {
147
+ const obj = await mpu.complete(parts.map((p) => ({
148
+ partNumber: p.partNumber,
149
+ etag: p.etag
150
+ })));
151
+ return {
152
+ key,
153
+ size: obj.size,
154
+ contentType: opts?.contentType ?? "application/octet-stream",
155
+ etag: obj.etag
156
+ };
157
+ },
158
+ async abort() {
159
+ await mpu.abort();
160
+ }
161
+ };
162
+ }
163
+ };
166
164
  }
165
+ //#endregion
166
+ export { r2Driver };
167
+
168
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/drivers/r2/index.ts"],"sourcesContent":["import { createStoredFile } from '../../internal/stored-file';\nimport { StorageError } from '../../storage.error';\nimport type {\n Body,\n CreateMultipartOptions,\n DownloadOptions,\n ListOptions,\n ListResult,\n MultipartUpload,\n OperationOptions,\n PartBody,\n StorageDriver,\n StoredFile,\n UploadOptions,\n UploadResult,\n UrlOptions,\n} from '../../storage.types';\nimport type { R2BucketLike, R2DriverOptions, R2ObjectLike, R2PutValue } from './r2.types';\n\nexport type {\n R2BucketLike,\n R2DriverOptions,\n R2ObjectLike,\n R2ObjectBodyLike,\n R2MultipartUploadLike,\n} from './r2.types';\n\nfunction joinPublic(base: string, key: string): string {\n const enc = key.split('/').map(encodeURIComponent).join('/');\n return `${base.replace(/\\/$/, '')}/${enc}`;\n}\n\nfunction metaOf(obj: R2ObjectLike) {\n return {\n key: obj.key,\n size: obj.size,\n type: obj.httpMetadata?.contentType ?? 'application/octet-stream',\n etag: obj.etag,\n lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : undefined,\n metadata: obj.customMetadata,\n };\n}\n\n/**\n * Cloudflare R2 driver — native binding mode only. Zero third-party deps\n * (no aws4fetch), fully edge-native I/O with no egress fees.\n *\n * It cannot presign (`signedUploadUrl` throws; `url()` needs `publicBaseUrl`).\n * For presigned URLs use `@velajs/storage/drivers/r2-http` (HTTP or hybrid mode).\n */\nexport function r2Driver(options: R2DriverOptions): StorageDriver<R2BucketLike> {\n const bucket = options.bucket;\n\n const mustGet = async (key: string) => {\n const obj = await bucket.get(key);\n if (!obj) throw new StorageError('NotFound', `not found: ${key}`);\n return obj;\n };\n\n return {\n name: options.name ?? 'r2',\n raw: bucket,\n supportsRange: true,\n supportsDelimiter: true,\n supportsMetadata: true,\n supportsCacheControl: true,\n supportsServerSideCopy: false,\n reportsUploadProgress: false,\n signedUrl: { supported: !!options.publicBaseUrl, upload: false },\n\n async upload(key: string, body: Body, opts?: UploadOptions): Promise<UploadResult> {\n const obj = await bucket.put(key, body as R2PutValue, {\n httpMetadata: { contentType: opts?.contentType, cacheControl: opts?.cacheControl },\n customMetadata: opts?.metadata,\n });\n if (!obj) throw new StorageError('Provider', `put failed: ${key}`);\n return {\n key,\n size: obj.size,\n contentType: opts?.contentType ?? 'application/octet-stream',\n etag: obj.etag,\n lastModified: obj.uploaded instanceof Date ? obj.uploaded.getTime() : undefined,\n };\n },\n\n async download(key: string, opts?: DownloadOptions): Promise<StoredFile> {\n const range = opts?.range\n ? {\n offset: opts.range.start,\n length: opts.range.end != null ? opts.range.end - opts.range.start + 1 : undefined,\n }\n : undefined;\n const obj = await bucket.get(key, range ? { range } : undefined);\n if (!obj) throw new StorageError('NotFound', `not found: ${key}`);\n const meta = metaOf(obj);\n const size = range ? (range.length ?? obj.size - range.offset) : obj.size;\n return createStoredFile({ ...meta, size }, { kind: 'stream', stream: obj.body });\n },\n\n async head(key: string): Promise<StoredFile> {\n const obj = await bucket.head(key);\n if (!obj) throw new StorageError('NotFound', `not found: ${key}`);\n return createStoredFile(metaOf(obj), {\n kind: 'lazy',\n fetch: async () => new Response((await mustGet(key)).body),\n });\n },\n\n async exists(key: string): Promise<boolean> {\n return (await bucket.head(key)) != null;\n },\n\n async delete(key: string): Promise<void> {\n await bucket.delete(key);\n },\n\n async deleteMany(keys: string[]) {\n await bucket.delete(keys);\n return { deleted: keys };\n },\n\n async copy(from: string, to: string): Promise<void> {\n const src = await bucket.get(from);\n if (!src) throw new StorageError('NotFound', `not found: ${from}`);\n await bucket.put(to, src.body, {\n httpMetadata: src.httpMetadata,\n customMetadata: src.customMetadata,\n });\n },\n\n async list(opts?: ListOptions): Promise<ListResult> {\n const res = await bucket.list({\n prefix: opts?.prefix,\n cursor: opts?.cursor,\n limit: opts?.limit,\n delimiter: opts?.delimiter,\n });\n return {\n items: res.objects.map((obj) =>\n createStoredFile(metaOf(obj), {\n kind: 'lazy',\n fetch: async () => new Response((await mustGet(obj.key)).body),\n }),\n ),\n prefixes: res.delimitedPrefixes.length ? res.delimitedPrefixes : undefined,\n cursor: res.truncated ? res.cursor : undefined,\n };\n },\n\n async url(key: string, _opts?: UrlOptions): Promise<string> {\n if (options.publicBaseUrl) return joinPublic(options.publicBaseUrl, key);\n throw new StorageError(\n 'Unsupported',\n 'r2 binding: url() needs publicBaseUrl (or use the r2-http/hybrid driver to presign)',\n );\n },\n\n async signedUploadUrl(): Promise<never> {\n throw new StorageError(\n 'Unsupported',\n 'r2 binding cannot presign uploads; use the r2-http or r2-hybrid driver',\n );\n },\n\n async createMultipartUpload(\n key: string,\n opts?: CreateMultipartOptions,\n ): Promise<MultipartUpload> {\n const mpu = await bucket.createMultipartUpload(key, {\n httpMetadata: { contentType: opts?.contentType, cacheControl: opts?.cacheControl },\n customMetadata: opts?.metadata,\n });\n return {\n key,\n uploadId: mpu.uploadId,\n async uploadPart(partNumber: number, part: PartBody, _o?: OperationOptions) {\n const up = await mpu.uploadPart(partNumber, part as R2PutValue);\n return { partNumber: up.partNumber, etag: up.etag };\n },\n async complete(parts) {\n const obj = await mpu.complete(\n parts.map((p) => ({ partNumber: p.partNumber, etag: p.etag })),\n );\n return {\n key,\n size: obj.size,\n contentType: opts?.contentType ?? 'application/octet-stream',\n etag: obj.etag,\n };\n },\n async abort() {\n await mpu.abort();\n },\n };\n },\n };\n}\n"],"mappings":";;;AA2BA,SAAS,WAAW,MAAc,KAAqB;CACrD,MAAM,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,KAAK,GAAG;CAC3D,OAAO,GAAG,KAAK,QAAQ,OAAO,EAAE,EAAE,GAAG;AACvC;AAEA,SAAS,OAAO,KAAmB;CACjC,OAAO;EACL,KAAK,IAAI;EACT,MAAM,IAAI;EACV,MAAM,IAAI,cAAc,eAAe;EACvC,MAAM,IAAI;EACV,cAAc,IAAI,oBAAoB,OAAO,IAAI,SAAS,QAAQ,IAAI,KAAA;EACtE,UAAU,IAAI;CAChB;AACF;;;;;;;;AASA,SAAgB,SAAS,SAAuD;CAC9E,MAAM,SAAS,QAAQ;CAEvB,MAAM,UAAU,OAAO,QAAgB;EACrC,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG;EAChC,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,YAAY,cAAc,KAAK;EAChE,OAAO;CACT;CAEA,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,KAAK;EACL,eAAe;EACf,mBAAmB;EACnB,kBAAkB;EAClB,sBAAsB;EACtB,wBAAwB;EACxB,uBAAuB;EACvB,WAAW;GAAE,WAAW,CAAC,CAAC,QAAQ;GAAe,QAAQ;EAAM;EAE/D,MAAM,OAAO,KAAa,MAAY,MAA6C;GACjF,MAAM,MAAM,MAAM,OAAO,IAAI,KAAK,MAAoB;IACpD,cAAc;KAAE,aAAa,MAAM;KAAa,cAAc,MAAM;IAAa;IACjF,gBAAgB,MAAM;GACxB,CAAC;GACD,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,YAAY,eAAe,KAAK;GACjE,OAAO;IACL;IACA,MAAM,IAAI;IACV,aAAa,MAAM,eAAe;IAClC,MAAM,IAAI;IACV,cAAc,IAAI,oBAAoB,OAAO,IAAI,SAAS,QAAQ,IAAI,KAAA;GACxE;EACF;EAEA,MAAM,SAAS,KAAa,MAA6C;GACvE,MAAM,QAAQ,MAAM,QAChB;IACE,QAAQ,KAAK,MAAM;IACnB,QAAQ,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,MAAM,KAAK,MAAM,QAAQ,IAAI,KAAA;GAC3E,IACA,KAAA;GACJ,MAAM,MAAM,MAAM,OAAO,IAAI,KAAK,QAAQ,EAAE,MAAM,IAAI,KAAA,CAAS;GAC/D,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,YAAY,cAAc,KAAK;GAChE,MAAM,OAAO,OAAO,GAAG;GACvB,MAAM,OAAO,QAAS,MAAM,UAAU,IAAI,OAAO,MAAM,SAAU,IAAI;GACrE,OAAO,iBAAiB;IAAE,GAAG;IAAM;GAAK,GAAG;IAAE,MAAM;IAAU,QAAQ,IAAI;GAAK,CAAC;EACjF;EAEA,MAAM,KAAK,KAAkC;GAC3C,MAAM,MAAM,MAAM,OAAO,KAAK,GAAG;GACjC,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,YAAY,cAAc,KAAK;GAChE,OAAO,iBAAiB,OAAO,GAAG,GAAG;IACnC,MAAM;IACN,OAAO,YAAY,IAAI,UAAU,MAAM,QAAQ,GAAG,EAAA,CAAG,IAAI;GAC3D,CAAC;EACH;EAEA,MAAM,OAAO,KAA+B;GAC1C,OAAQ,MAAM,OAAO,KAAK,GAAG,KAAM;EACrC;EAEA,MAAM,OAAO,KAA4B;GACvC,MAAM,OAAO,OAAO,GAAG;EACzB;EAEA,MAAM,WAAW,MAAgB;GAC/B,MAAM,OAAO,OAAO,IAAI;GACxB,OAAO,EAAE,SAAS,KAAK;EACzB;EAEA,MAAM,KAAK,MAAc,IAA2B;GAClD,MAAM,MAAM,MAAM,OAAO,IAAI,IAAI;GACjC,IAAI,CAAC,KAAK,MAAM,IAAI,aAAa,YAAY,cAAc,MAAM;GACjE,MAAM,OAAO,IAAI,IAAI,IAAI,MAAM;IAC7B,cAAc,IAAI;IAClB,gBAAgB,IAAI;GACtB,CAAC;EACH;EAEA,MAAM,KAAK,MAAyC;GAClD,MAAM,MAAM,MAAM,OAAO,KAAK;IAC5B,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd,OAAO,MAAM;IACb,WAAW,MAAM;GACnB,CAAC;GACD,OAAO;IACL,OAAO,IAAI,QAAQ,KAAK,QACtB,iBAAiB,OAAO,GAAG,GAAG;KAC5B,MAAM;KACN,OAAO,YAAY,IAAI,UAAU,MAAM,QAAQ,IAAI,GAAG,EAAA,CAAG,IAAI;IAC/D,CAAC,CACH;IACA,UAAU,IAAI,kBAAkB,SAAS,IAAI,oBAAoB,KAAA;IACjE,QAAQ,IAAI,YAAY,IAAI,SAAS,KAAA;GACvC;EACF;EAEA,MAAM,IAAI,KAAa,OAAqC;GAC1D,IAAI,QAAQ,eAAe,OAAO,WAAW,QAAQ,eAAe,GAAG;GACvE,MAAM,IAAI,aACR,eACA,qFACF;EACF;EAEA,MAAM,kBAAkC;GACtC,MAAM,IAAI,aACR,eACA,wEACF;EACF;EAEA,MAAM,sBACJ,KACA,MAC0B;GAC1B,MAAM,MAAM,MAAM,OAAO,sBAAsB,KAAK;IAClD,cAAc;KAAE,aAAa,MAAM;KAAa,cAAc,MAAM;IAAa;IACjF,gBAAgB,MAAM;GACxB,CAAC;GACD,OAAO;IACL;IACA,UAAU,IAAI;IACd,MAAM,WAAW,YAAoB,MAAgB,IAAuB;KAC1E,MAAM,KAAK,MAAM,IAAI,WAAW,YAAY,IAAkB;KAC9D,OAAO;MAAE,YAAY,GAAG;MAAY,MAAM,GAAG;KAAK;IACpD;IACA,MAAM,SAAS,OAAO;KACpB,MAAM,MAAM,MAAM,IAAI,SACpB,MAAM,KAAK,OAAO;MAAE,YAAY,EAAE;MAAY,MAAM,EAAE;KAAK,EAAE,CAC/D;KACA,OAAO;MACL;MACA,MAAM,IAAI;MACV,aAAa,MAAM,eAAe;MAClC,MAAM,IAAI;KACZ;IACF;IACA,MAAM,QAAQ;KACZ,MAAM,IAAI,MAAM;IAClB;GACF;EACF;CACF;AACF"}
@@ -1,17 +1,18 @@
1
- import type { StorageDriver } from '../../storage.types';
2
- import type { R2BucketLike } from '../r2/r2.types';
3
- export interface R2HttpOptions {
4
- /** Cloudflare account ID — the default endpoint is derived from it. */
5
- accountId: string;
6
- accessKeyId: string;
7
- secretAccessKey: string;
8
- bucket: string;
9
- /** Override the endpoint (jurisdiction-specific R2 URLs). */
10
- endpoint?: string;
11
- region?: string;
12
- publicBaseUrl?: string;
13
- defaultUrlExpiresIn?: number;
14
- fetch?: typeof fetch;
1
+ import { C as StorageDriver } from "../../storage.types-BJN7Yp1J.js";
2
+ import { t as R2BucketLike } from "../../r2.types-Bw4Ft83t.js";
3
+ //#region src/drivers/r2-http/index.d.ts
4
+ interface R2HttpOptions {
5
+ /** Cloudflare account ID — the default endpoint is derived from it. */
6
+ accountId: string;
7
+ accessKeyId: string;
8
+ secretAccessKey: string;
9
+ bucket: string;
10
+ /** Override the endpoint (jurisdiction-specific R2 URLs). */
11
+ endpoint?: string;
12
+ region?: string;
13
+ publicBaseUrl?: string;
14
+ defaultUrlExpiresIn?: number;
15
+ fetch?: typeof fetch;
15
16
  }
16
17
  /**
17
18
  * R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and
@@ -19,10 +20,10 @@ export interface R2HttpOptions {
19
20
  * running inside a Worker; use this from Node/other runtimes, or use
20
21
  * {@link r2HybridDriver} to combine binding I/O with HTTP presigning.
21
22
  */
22
- export declare function r2HttpDriver(o: R2HttpOptions): StorageDriver;
23
- export interface R2HybridOptions extends R2HttpOptions {
24
- /** The Workers `R2Bucket` binding used for reads/writes (no egress). */
25
- binding: R2BucketLike;
23
+ declare function r2HttpDriver(o: R2HttpOptions): StorageDriver;
24
+ interface R2HybridOptions extends R2HttpOptions {
25
+ /** The Workers `R2Bucket` binding used for reads/writes (no egress). */
26
+ binding: R2BucketLike;
26
27
  }
27
28
  /**
28
29
  * Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,
@@ -30,4 +31,7 @@ export interface R2HybridOptions extends R2HttpOptions {
30
31
  * server-side `copy()` use the S3 HTTP signer. The best of both for Workers
31
32
  * that need browser-facing presigned URLs.
32
33
  */
33
- export declare function r2HybridDriver(o: R2HybridOptions): StorageDriver;
34
+ declare function r2HybridDriver(o: R2HybridOptions): StorageDriver;
35
+ //#endregion
36
+ export { R2HttpOptions, R2HybridOptions, r2HttpDriver, r2HybridDriver };
37
+ //# sourceMappingURL=index.d.ts.map
@@ -1,52 +1,59 @@
1
+ import { t as s3Driver } from "../../s3-DrE9NrnD.js";
1
2
  import { r2Driver } from "../r2/index.js";
2
- import { s3Driver } from "../s3/index.js";
3
+ //#region src/drivers/r2-http/index.ts
3
4
  function endpointFor(o) {
4
- return o.endpoint ?? `https://${o.accountId}.r2.cloudflarestorage.com`;
5
+ return o.endpoint ?? `https://${o.accountId}.r2.cloudflarestorage.com`;
5
6
  }
6
7
  /**
7
- * R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and
8
- * presigning works. Prefer the native binding driver (`../r2`) for I/O when
9
- * running inside a Worker; use this from Node/other runtimes, or use
10
- * {@link r2HybridDriver} to combine binding I/O with HTTP presigning.
11
- */ export function r2HttpDriver(o) {
12
- return s3Driver({
13
- endpoint: endpointFor(o),
14
- region: o.region ?? 'auto',
15
- bucket: o.bucket,
16
- forcePathStyle: true,
17
- credentials: {
18
- accessKeyId: o.accessKeyId,
19
- secretAccessKey: o.secretAccessKey
20
- },
21
- publicBaseUrl: o.publicBaseUrl,
22
- defaultUrlExpiresIn: o.defaultUrlExpiresIn,
23
- fetch: o.fetch,
24
- name: 'r2-http'
25
- });
8
+ * R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and
9
+ * presigning works. Prefer the native binding driver (`../r2`) for I/O when
10
+ * running inside a Worker; use this from Node/other runtimes, or use
11
+ * {@link r2HybridDriver} to combine binding I/O with HTTP presigning.
12
+ */
13
+ function r2HttpDriver(o) {
14
+ return s3Driver({
15
+ endpoint: endpointFor(o),
16
+ region: o.region ?? "auto",
17
+ bucket: o.bucket,
18
+ forcePathStyle: true,
19
+ credentials: {
20
+ accessKeyId: o.accessKeyId,
21
+ secretAccessKey: o.secretAccessKey
22
+ },
23
+ publicBaseUrl: o.publicBaseUrl,
24
+ defaultUrlExpiresIn: o.defaultUrlExpiresIn,
25
+ fetch: o.fetch,
26
+ name: "r2-http"
27
+ });
26
28
  }
27
29
  /**
28
- * Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,
29
- * no egress), while `url()` / `signedUploadUrl()` / `signedMultipart` /
30
- * server-side `copy()` use the S3 HTTP signer. The best of both for Workers
31
- * that need browser-facing presigned URLs.
32
- */ export function r2HybridDriver(o) {
33
- const binding = r2Driver({
34
- bucket: o.binding,
35
- publicBaseUrl: o.publicBaseUrl,
36
- name: 'r2-hybrid'
37
- });
38
- const http = r2HttpDriver(o);
39
- return {
40
- ...binding,
41
- name: 'r2-hybrid',
42
- supportsServerSideCopy: true,
43
- signedUrl: {
44
- supported: true,
45
- upload: true
46
- },
47
- url: (key, opts)=>http.url(key, opts),
48
- signedUploadUrl: (key, opts)=>http.signedUploadUrl(key, opts),
49
- signedMultipart: http.signedMultipart,
50
- copy: (from, to, opts)=>http.copy(from, to, opts)
51
- };
30
+ * Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,
31
+ * no egress), while `url()` / `signedUploadUrl()` / `signedMultipart` /
32
+ * server-side `copy()` use the S3 HTTP signer. The best of both for Workers
33
+ * that need browser-facing presigned URLs.
34
+ */
35
+ function r2HybridDriver(o) {
36
+ const binding = r2Driver({
37
+ bucket: o.binding,
38
+ publicBaseUrl: o.publicBaseUrl,
39
+ name: "r2-hybrid"
40
+ });
41
+ const http = r2HttpDriver(o);
42
+ return {
43
+ ...binding,
44
+ name: "r2-hybrid",
45
+ supportsServerSideCopy: true,
46
+ signedUrl: {
47
+ supported: true,
48
+ upload: true
49
+ },
50
+ url: (key, opts) => http.url(key, opts),
51
+ signedUploadUrl: (key, opts) => http.signedUploadUrl(key, opts),
52
+ signedMultipart: http.signedMultipart,
53
+ copy: (from, to, opts) => http.copy(from, to, opts)
54
+ };
52
55
  }
56
+ //#endregion
57
+ export { r2HttpDriver, r2HybridDriver };
58
+
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/drivers/r2-http/index.ts"],"sourcesContent":["import type { StorageDriver } from '../../storage.types';\nimport { r2Driver } from '../r2';\nimport type { R2BucketLike } from '../r2/r2.types';\nimport { s3Driver } from '../s3';\n\nexport interface R2HttpOptions {\n /** Cloudflare account ID — the default endpoint is derived from it. */\n accountId: string;\n accessKeyId: string;\n secretAccessKey: string;\n bucket: string;\n /** Override the endpoint (jurisdiction-specific R2 URLs). */\n endpoint?: string;\n region?: string;\n publicBaseUrl?: string;\n defaultUrlExpiresIn?: number;\n fetch?: typeof fetch;\n}\n\nfunction endpointFor(o: R2HttpOptions): string {\n return o.endpoint ?? `https://${o.accountId}.r2.cloudflarestorage.com`;\n}\n\n/**\n * R2 over the S3-compatible HTTP API (aws4fetch). All I/O goes over HTTP and\n * presigning works. Prefer the native binding driver (`../r2`) for I/O when\n * running inside a Worker; use this from Node/other runtimes, or use\n * {@link r2HybridDriver} to combine binding I/O with HTTP presigning.\n */\nexport function r2HttpDriver(o: R2HttpOptions): StorageDriver {\n return s3Driver({\n endpoint: endpointFor(o),\n region: o.region ?? 'auto',\n bucket: o.bucket,\n forcePathStyle: true,\n credentials: { accessKeyId: o.accessKeyId, secretAccessKey: o.secretAccessKey },\n publicBaseUrl: o.publicBaseUrl,\n defaultUrlExpiresIn: o.defaultUrlExpiresIn,\n fetch: o.fetch,\n name: 'r2-http',\n });\n}\n\nexport interface R2HybridOptions extends R2HttpOptions {\n /** The Workers `R2Bucket` binding used for reads/writes (no egress). */\n binding: R2BucketLike;\n}\n\n/**\n * Hybrid R2 driver: reads/writes go through the native binding (intra-Worker,\n * no egress), while `url()` / `signedUploadUrl()` / `signedMultipart` /\n * server-side `copy()` use the S3 HTTP signer. The best of both for Workers\n * that need browser-facing presigned URLs.\n */\nexport function r2HybridDriver(o: R2HybridOptions): StorageDriver {\n const binding = r2Driver({\n bucket: o.binding,\n publicBaseUrl: o.publicBaseUrl,\n name: 'r2-hybrid',\n });\n const http = r2HttpDriver(o);\n return {\n ...binding,\n name: 'r2-hybrid',\n supportsServerSideCopy: true,\n signedUrl: { supported: true, upload: true },\n url: (key, opts) => http.url(key, opts),\n signedUploadUrl: (key, opts) => http.signedUploadUrl(key, opts),\n signedMultipart: http.signedMultipart,\n copy: (from, to, opts) => http.copy(from, to, opts),\n };\n}\n"],"mappings":";;;AAmBA,SAAS,YAAY,GAA0B;CAC7C,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AAC9C;;;;;;;AAQA,SAAgB,aAAa,GAAiC;CAC5D,OAAO,SAAS;EACd,UAAU,YAAY,CAAC;EACvB,QAAQ,EAAE,UAAU;EACpB,QAAQ,EAAE;EACV,gBAAgB;EAChB,aAAa;GAAE,aAAa,EAAE;GAAa,iBAAiB,EAAE;EAAgB;EAC9E,eAAe,EAAE;EACjB,qBAAqB,EAAE;EACvB,OAAO,EAAE;EACT,MAAM;CACR,CAAC;AACH;;;;;;;AAaA,SAAgB,eAAe,GAAmC;CAChE,MAAM,UAAU,SAAS;EACvB,QAAQ,EAAE;EACV,eAAe,EAAE;EACjB,MAAM;CACR,CAAC;CACD,MAAM,OAAO,aAAa,CAAC;CAC3B,OAAO;EACL,GAAG;EACH,MAAM;EACN,wBAAwB;EACxB,WAAW;GAAE,WAAW;GAAM,QAAQ;EAAK;EAC3C,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI;EACtC,kBAAkB,KAAK,SAAS,KAAK,gBAAgB,KAAK,IAAI;EAC9D,iBAAiB,KAAK;EACtB,OAAO,MAAM,IAAI,SAAS,KAAK,KAAK,MAAM,IAAI,IAAI;CACpD;AACF"}
@@ -1,5 +1,79 @@
1
- export { s3Driver } from './s3.driver';
2
- export { S3Client } from './s3-client';
3
- export type { PostPolicyOptions } from './s3-client';
4
- export type { S3DriverOptions, S3Credentials } from './s3.types';
5
- export { escapeXml, unescapeXml, tagText, tagBlocks } from './xml';
1
+ import { C as StorageDriver } from "../../storage.types-BJN7Yp1J.js";
2
+ //#region src/drivers/s3/s3.types.d.ts
3
+ interface S3Credentials {
4
+ accessKeyId: string;
5
+ secretAccessKey: string;
6
+ sessionToken?: string;
7
+ }
8
+ interface S3DriverOptions {
9
+ /**
10
+ * Service endpoint. Examples:
11
+ * - AWS: `https://s3.us-east-1.amazonaws.com`
12
+ * - R2: `https://<accountId>.r2.cloudflarestorage.com`
13
+ * - MinIO: `http://localhost:9000`
14
+ */
15
+ endpoint: string;
16
+ /** AWS region (`auto` for R2). */
17
+ region: string;
18
+ bucket: string;
19
+ credentials: S3Credentials;
20
+ /** Path-style addressing (`endpoint/bucket/key`). Required by MinIO/R2/most non-AWS. */
21
+ forcePathStyle?: boolean;
22
+ /** CDN/public origin; when set, `url()` returns a permanent link unless signing is forced. */
23
+ publicBaseUrl?: string;
24
+ /** Default `expiresIn` (seconds) for presigned URLs. Default 3600. */
25
+ defaultUrlExpiresIn?: number;
26
+ /** Override the fetch implementation (tests). */
27
+ fetch?: typeof fetch;
28
+ /** Friendly driver name (defaults to `s3`). */
29
+ name?: string;
30
+ }
31
+ //#endregion
32
+ //#region src/drivers/s3/s3.driver.d.ts
33
+ /** S3 / S3-compatible driver signed with aws4fetch (edge-safe). */
34
+ declare function s3Driver(options: S3DriverOptions): StorageDriver;
35
+ //#endregion
36
+ //#region src/drivers/s3/s3-client.d.ts
37
+ interface PostPolicyOptions {
38
+ expiresIn: number;
39
+ contentType?: string;
40
+ maxSize?: number;
41
+ minSize?: number;
42
+ }
43
+ /**
44
+ * Thin wrapper over aws4fetch: builds addressed URLs, sends SigV4-signed
45
+ * requests, and mints presigned GET/PUT URLs + presigned-POST policies.
46
+ * The single place S3 signing happens.
47
+ */
48
+ declare class S3Client {
49
+ #private;
50
+ constructor(cfg: S3DriverOptions);
51
+ get bucket(): string;
52
+ objectUrl(key: string, query?: Record<string, string>): URL;
53
+ /** The bucket-root URL used as the presigned-POST target. */
54
+ postUrl(): string;
55
+ /** Send a SigV4-signed request. */
56
+ send(url: URL, init: RequestInit): Promise<Response>;
57
+ /** Presign a GET or PUT URL via query signing (unsigned payload). */
58
+ presign(key: string, method: 'GET' | 'PUT', expiresIn: number, query?: Record<string, string>): Promise<string>;
59
+ /**
60
+ * Presigned POST policy — enforces `content-length-range` server-side.
61
+ * aws4fetch only signs requests, so the policy HMAC chain is hand-rolled
62
+ * on Web Crypto (edge-safe).
63
+ */
64
+ signPostPolicy(key: string, opts: PostPolicyOptions): Promise<{
65
+ url: string;
66
+ fields: Record<string, string>;
67
+ }>;
68
+ }
69
+ //#endregion
70
+ //#region src/drivers/s3/xml.d.ts
71
+ declare function unescapeXml(s: string): string;
72
+ declare function escapeXml(s: string): string;
73
+ /** First `<tag>…</tag>` inner text (entity-decoded), or `undefined`. */
74
+ declare function tagText(xml: string, tag: string): string | undefined;
75
+ /** All `<tag>…</tag>` inner blocks (raw, not decoded — for nested extraction). */
76
+ declare function tagBlocks(xml: string, tag: string): string[];
77
+ //#endregion
78
+ export { type PostPolicyOptions, S3Client, type S3Credentials, type S3DriverOptions, escapeXml, s3Driver, tagBlocks, tagText, unescapeXml };
79
+ //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,2 @@
1
- export { s3Driver } from "./s3.driver.js";
2
- export { S3Client } from "./s3-client.js";
3
- export { escapeXml, unescapeXml, tagText, tagBlocks } from "./xml.js";
1
+ import { a as unescapeXml, i as tagText, n as escapeXml, o as S3Client, r as tagBlocks, t as s3Driver } from "../../s3-DrE9NrnD.js";
2
+ export { S3Client, escapeXml, s3Driver, tagBlocks, tagText, unescapeXml };