@cloud-cli/s3mini 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -0
  3. package/dist/auth/sigv4.d.ts +16 -0
  4. package/dist/auth/sigv4.js +97 -0
  5. package/dist/auth/sigv4.js.map +1 -0
  6. package/dist/handlers/router.d.ts +4 -0
  7. package/dist/handlers/router.js +898 -0
  8. package/dist/handlers/router.js.map +1 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.js +29 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/replication/worker.d.ts +30 -0
  13. package/dist/replication/worker.js +122 -0
  14. package/dist/replication/worker.js.map +1 -0
  15. package/dist/storage/s3mini.d.ts +157 -0
  16. package/dist/storage/s3mini.js +960 -0
  17. package/dist/storage/s3mini.js.map +1 -0
  18. package/dist/test/aws-sdk.test.d.ts +1 -0
  19. package/dist/test/aws-sdk.test.js +115 -0
  20. package/dist/test/aws-sdk.test.js.map +1 -0
  21. package/dist/test/models.test.d.ts +1 -0
  22. package/dist/test/models.test.js +27 -0
  23. package/dist/test/models.test.js.map +1 -0
  24. package/dist/test/router.test.d.ts +1 -0
  25. package/dist/test/router.test.js +380 -0
  26. package/dist/test/router.test.js.map +1 -0
  27. package/dist/test/storage.test.d.ts +1 -0
  28. package/dist/test/storage.test.js +214 -0
  29. package/dist/test/storage.test.js.map +1 -0
  30. package/dist/test/worker.test.d.ts +1 -0
  31. package/dist/test/worker.test.js +65 -0
  32. package/dist/test/worker.test.js.map +1 -0
  33. package/dist/types/aws-s3.d.ts +4 -0
  34. package/dist/types/aws-s3.js +4 -0
  35. package/dist/types/aws-s3.js.map +1 -0
  36. package/dist/types/contracts.d.ts +396 -0
  37. package/dist/types/contracts.js +4 -0
  38. package/dist/types/contracts.js.map +1 -0
  39. package/dist/types/models.d.ts +118 -0
  40. package/dist/types/models.js +40 -0
  41. package/dist/types/models.js.map +1 -0
  42. package/package.json +56 -0
@@ -0,0 +1,396 @@
1
+ export type StorageClass = 'STANDARD' | 'STANDARD_IA' | 'ONEZONE_IA' | 'INTELLIGENT_TIERING' | 'GLACIER' | 'DEEP_ARCHIVE' | 'GLACIER_IR';
2
+ export type LocationConstraint = 'us-east-1' | 'us-west-1' | 'us-west-2' | 'eu-west-1' | 'eu-central-1' | 'ap-southeast-1' | 'ap-northeast-1' | 'sa-east-1';
3
+ export type VersioningStatus = 'Enabled' | 'Suspended';
4
+ export type EncryptionAlgorithm = 'AES256' | 'aws:kms';
5
+ export type ObjectLockMode = 'GOVERNANCE' | 'COMPLIANCE';
6
+ export type CannedACL = 'private' | 'public-read' | 'public-read-write' | 'authenticated-read' | 'bucket-owner-read' | 'bucket-owner-full-control';
7
+ export type ACLPermission = 'FULL_CONTROL' | 'READ' | 'WRITE' | 'READ_ACP' | 'WRITE_ACP';
8
+ export interface Owner {
9
+ id: string;
10
+ displayName?: string;
11
+ }
12
+ export interface Bucket {
13
+ name: string;
14
+ locationConstraint: string;
15
+ creationDate: Date;
16
+ }
17
+ export interface ObjectMetadata {
18
+ bucket: string;
19
+ key: string;
20
+ versionId?: string;
21
+ etag: string;
22
+ size: number;
23
+ lastModified: Date;
24
+ storageClass: StorageClass;
25
+ contentType?: string;
26
+ contentDisposition?: string;
27
+ contentEncoding?: string;
28
+ contentLanguage?: string;
29
+ cacheControl?: string;
30
+ expires?: Date;
31
+ userMetadata: Record<string, string>;
32
+ checksum?: Checksum;
33
+ encryption?: ObjectEncryption;
34
+ deleteMarker?: boolean;
35
+ objectLock?: ObjectLockRetention;
36
+ }
37
+ export interface ObjectSummary {
38
+ key: string;
39
+ etag: string;
40
+ size: number;
41
+ lastModified: Date;
42
+ storageClass: StorageClass;
43
+ owner?: Owner;
44
+ }
45
+ export interface Checksum {
46
+ crc32?: string;
47
+ crc32c?: string;
48
+ crc64nvme?: string;
49
+ sha1?: string;
50
+ sha256?: string;
51
+ }
52
+ export interface ObjectEncryption {
53
+ algorithm: EncryptionAlgorithm;
54
+ kmsKeyId?: string;
55
+ bucketKeyEnabled?: boolean;
56
+ }
57
+ export interface ObjectLockRetention {
58
+ mode: ObjectLockMode;
59
+ retainUntilDate: Date;
60
+ legalHold?: 'ON' | 'OFF';
61
+ }
62
+ export interface ListObjectsV2Request {
63
+ bucket: string;
64
+ prefix?: string;
65
+ delimiter?: string;
66
+ maxKeys?: number;
67
+ continuationToken?: string;
68
+ startAfter?: string;
69
+ encodingType?: 'url';
70
+ }
71
+ export interface ListObjectsV2Result {
72
+ name: string;
73
+ prefix?: string;
74
+ delimiter?: string;
75
+ maxKeys: number;
76
+ keyCount: number;
77
+ isTruncated: boolean;
78
+ contents: ObjectSummary[];
79
+ commonPrefixes: string[];
80
+ continuationToken?: string;
81
+ nextContinuationToken?: string;
82
+ startAfter?: string;
83
+ encodingType?: 'url';
84
+ }
85
+ export interface PutObjectRequest {
86
+ bucket: string;
87
+ key: string;
88
+ body: Buffer;
89
+ metadata?: Partial<ObjectMetadata>;
90
+ }
91
+ export interface GetObjectResult {
92
+ body: Buffer;
93
+ metadata: ObjectMetadata;
94
+ }
95
+ export interface CopyObjectRequest {
96
+ sourceBucket: string;
97
+ sourceKey: string;
98
+ sourceVersionId?: string;
99
+ destinationBucket: string;
100
+ destinationKey: string;
101
+ metadataDirective?: 'COPY' | 'REPLACE';
102
+ metadata?: Partial<ObjectMetadata>;
103
+ }
104
+ export interface CopyObjectResult {
105
+ etag: string;
106
+ lastModified: Date;
107
+ versionId?: string;
108
+ }
109
+ export interface MultipartUpload {
110
+ uploadId: string;
111
+ bucket: string;
112
+ key: string;
113
+ initiated: Date;
114
+ initiator: Owner;
115
+ owner: Owner;
116
+ storageClass: StorageClass;
117
+ parts: MultipartPart[];
118
+ }
119
+ export interface MultipartPart {
120
+ partNumber: number;
121
+ etag: string;
122
+ size: number;
123
+ lastModified: Date;
124
+ }
125
+ export interface CreateMultipartUploadResult {
126
+ uploadId: string;
127
+ bucket: string;
128
+ key: string;
129
+ }
130
+ export interface UploadPartRequest {
131
+ bucket: string;
132
+ key: string;
133
+ uploadId: string;
134
+ partNumber: number;
135
+ body: Buffer;
136
+ }
137
+ export interface CompleteMultipartUploadPart {
138
+ partNumber: number;
139
+ etag: string;
140
+ }
141
+ export interface CompleteMultipartUploadRequest {
142
+ bucket: string;
143
+ key: string;
144
+ uploadId: string;
145
+ parts: CompleteMultipartUploadPart[];
146
+ }
147
+ export interface CompleteMultipartUploadResult {
148
+ bucket: string;
149
+ key: string;
150
+ etag: string;
151
+ versionId?: string;
152
+ }
153
+ export interface ListPartsRequest {
154
+ bucket: string;
155
+ key: string;
156
+ uploadId: string;
157
+ partNumberMarker?: number;
158
+ maxParts?: number;
159
+ }
160
+ export interface ListPartsResult {
161
+ bucket: string;
162
+ key: string;
163
+ uploadId: string;
164
+ parts: MultipartPart[];
165
+ isTruncated: boolean;
166
+ nextPartNumberMarker?: number;
167
+ }
168
+ export interface ListMultipartUploadsRequest {
169
+ bucket: string;
170
+ prefix?: string;
171
+ keyMarker?: string;
172
+ uploadIdMarker?: string;
173
+ delimiter?: string;
174
+ maxUploads?: number;
175
+ }
176
+ export interface ListMultipartUploadsResult {
177
+ bucket: string;
178
+ uploads: MultipartUpload[];
179
+ commonPrefixes: string[];
180
+ isTruncated: boolean;
181
+ nextKeyMarker?: string;
182
+ nextUploadIdMarker?: string;
183
+ }
184
+ export interface Tag {
185
+ key: string;
186
+ value: string;
187
+ }
188
+ export interface TagSet {
189
+ tags: Tag[];
190
+ }
191
+ export interface VersioningConfiguration {
192
+ status?: VersioningStatus;
193
+ mfaDelete?: 'Enabled' | 'Disabled';
194
+ }
195
+ export interface ObjectVersion {
196
+ key: string;
197
+ versionId: string;
198
+ isLatest: boolean;
199
+ isDeleteMarker?: boolean;
200
+ etag?: string;
201
+ size?: number;
202
+ lastModified: Date;
203
+ storageClass?: StorageClass;
204
+ owner?: Owner;
205
+ }
206
+ export interface ListObjectVersionsResult {
207
+ bucket: string;
208
+ versions: ObjectVersion[];
209
+ deleteMarkers: ObjectVersion[];
210
+ isTruncated: boolean;
211
+ nextKeyMarker?: string;
212
+ nextVersionIdMarker?: string;
213
+ }
214
+ export interface CORSRule {
215
+ allowedOrigins: string[];
216
+ allowedMethods: string[];
217
+ allowedHeaders?: string[];
218
+ exposeHeaders?: string[];
219
+ maxAgeSeconds?: number;
220
+ }
221
+ export interface BucketCORSConfiguration {
222
+ rules: CORSRule[];
223
+ }
224
+ export interface LifecycleRule {
225
+ id?: string;
226
+ status: 'Enabled' | 'Disabled';
227
+ filter?: LifecycleFilter;
228
+ transitions?: LifecycleTransition[];
229
+ expiration?: LifecycleExpiration;
230
+ noncurrentVersionTransitions?: NoncurrentVersionTransition[];
231
+ noncurrentVersionExpiration?: NoncurrentVersionExpiration;
232
+ }
233
+ export interface LifecycleFilter {
234
+ prefix?: string;
235
+ tags?: Tag[];
236
+ and?: {
237
+ prefix?: string;
238
+ tags?: Tag[];
239
+ };
240
+ }
241
+ export interface LifecycleTransition {
242
+ date?: Date;
243
+ days?: number;
244
+ storageClass: StorageClass;
245
+ }
246
+ export interface LifecycleExpiration {
247
+ date?: Date;
248
+ days?: number;
249
+ expiredObjectDeleteMarker?: boolean;
250
+ }
251
+ export interface NoncurrentVersionTransition {
252
+ noncurrentDays: number;
253
+ storageClass: StorageClass;
254
+ }
255
+ export interface NoncurrentVersionExpiration {
256
+ noncurrentDays: number;
257
+ }
258
+ export interface Grantee {
259
+ id?: string;
260
+ type: 'CanonicalUser' | 'AmazonCustomerByEmail' | 'Group';
261
+ uri?: string;
262
+ emailAddress?: string;
263
+ }
264
+ export interface Grant {
265
+ grantee: Grantee;
266
+ permission: ACLPermission;
267
+ }
268
+ export interface AccessControlPolicy {
269
+ owner: Owner;
270
+ grants: Grant[];
271
+ }
272
+ export interface BucketPolicy {
273
+ version: string;
274
+ id?: string;
275
+ statements: PolicyStatement[];
276
+ }
277
+ export interface PolicyStatement {
278
+ sid?: string;
279
+ effect: 'Allow' | 'Deny';
280
+ principal: string | string[] | {
281
+ aws?: string | string[];
282
+ };
283
+ action: string | string[];
284
+ resource: string | string[];
285
+ condition?: Record<string, Record<string, string | string[]>>;
286
+ }
287
+ export interface ServerSideEncryptionConfiguration {
288
+ rules: ServerSideEncryptionRule[];
289
+ }
290
+ export interface ServerSideEncryptionRule {
291
+ algorithm: EncryptionAlgorithm;
292
+ kmsMasterKeyId?: string;
293
+ bucketKeyEnabled?: boolean;
294
+ }
295
+ export interface WebsiteConfiguration {
296
+ indexDocument?: {
297
+ suffix: string;
298
+ };
299
+ errorDocument?: {
300
+ key: string;
301
+ };
302
+ redirectAllRequestsTo?: {
303
+ hostName: string;
304
+ protocol?: string;
305
+ };
306
+ routingRules?: RoutingRule[];
307
+ }
308
+ export interface RoutingRule {
309
+ condition: {
310
+ keyPrefixEquals?: string;
311
+ httpErrorCodeReturnedEquals?: string;
312
+ };
313
+ redirect: {
314
+ hostName?: string;
315
+ protocol?: string;
316
+ replaceKeyPrefixWith?: string;
317
+ replaceKeyWith?: string;
318
+ httpRedirectCode?: string;
319
+ };
320
+ }
321
+ export interface BucketLoggingStatus {
322
+ targetBucket?: string;
323
+ targetPrefix?: string;
324
+ }
325
+ export interface NotificationConfiguration {
326
+ queueConfigurations?: NotificationQueueConfiguration[];
327
+ topicConfigurations?: NotificationTopicConfiguration[];
328
+ lambdaConfigurations?: NotificationLambdaConfiguration[];
329
+ eventBridgeEnabled?: boolean;
330
+ }
331
+ export interface NotificationFilter {
332
+ key?: {
333
+ filterRules: {
334
+ name: 'prefix' | 'suffix';
335
+ value: string;
336
+ }[];
337
+ };
338
+ }
339
+ export interface NotificationQueueConfiguration {
340
+ id?: string;
341
+ queue: string;
342
+ events: string[];
343
+ filter?: NotificationFilter;
344
+ }
345
+ export interface NotificationTopicConfiguration {
346
+ id?: string;
347
+ topic: string;
348
+ events: string[];
349
+ filter?: NotificationFilter;
350
+ }
351
+ export interface NotificationLambdaConfiguration {
352
+ id?: string;
353
+ function: string;
354
+ events: string[];
355
+ filter?: NotificationFilter;
356
+ }
357
+ export interface ReplicationConfiguration {
358
+ role: string;
359
+ rules: ReplicationRule[];
360
+ }
361
+ export interface ReplicationRule {
362
+ id?: string;
363
+ priority?: number;
364
+ status: 'Enabled' | 'Disabled';
365
+ filter?: LifecycleFilter;
366
+ destination: ReplicationDestination;
367
+ deleteMarkerReplication?: {
368
+ status: 'Enabled' | 'Disabled';
369
+ };
370
+ }
371
+ export interface ReplicationDestination {
372
+ bucket: string;
373
+ account?: string;
374
+ storageClass?: StorageClass;
375
+ encryptionConfiguration?: {
376
+ replicaKmsKeyId: string;
377
+ };
378
+ }
379
+ export interface S3StorageContract {
380
+ listBuckets(): Promise<Bucket[]>;
381
+ createBucket(bucket: Bucket): Promise<void>;
382
+ headBucket(bucket: string): Promise<void>;
383
+ deleteBucket(bucket: string): Promise<void>;
384
+ putObject(request: PutObjectRequest): Promise<ObjectMetadata>;
385
+ getObject(bucket: string, key: string, versionId?: string): Promise<GetObjectResult>;
386
+ headObject(bucket: string, key: string, versionId?: string): Promise<ObjectMetadata>;
387
+ deleteObject(bucket: string, key: string, versionId?: string): Promise<void>;
388
+ listObjectsV2(request: ListObjectsV2Request): Promise<ListObjectsV2Result>;
389
+ copyObject(request: CopyObjectRequest): Promise<CopyObjectResult>;
390
+ createMultipartUpload(bucket: string, key: string): Promise<CreateMultipartUploadResult>;
391
+ uploadPart(request: UploadPartRequest): Promise<MultipartPart>;
392
+ completeMultipartUpload(request: CompleteMultipartUploadRequest): Promise<CompleteMultipartUploadResult>;
393
+ abortMultipartUpload(bucket: string, key: string, uploadId: string): Promise<void>;
394
+ listParts(request: ListPartsRequest): Promise<ListPartsResult>;
395
+ listMultipartUploads(request: ListMultipartUploadsRequest): Promise<ListMultipartUploadsResult>;
396
+ }
@@ -0,0 +1,4 @@
1
+ // Type contracts for the S3-compatible API. This module intentionally contains
2
+ // no runtime values, classes, or implementation helpers.
3
+ export {};
4
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/types/contracts.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yDAAyD"}
@@ -0,0 +1,118 @@
1
+ export type StorageClass = 'STANDARD' | 'STANDARD_IA' | 'ONEZONE_IA' | 'INTELLIGENT_TIERING' | 'GLACIER' | 'DEEP_ARCHIVE' | 'GLACIER_IR';
2
+ export declare const VALID_STORAGE_CLASSES: StorageClass[];
3
+ export declare const VALID_LOCATION_CONSTRAINTS: string[];
4
+ export interface Bucket {
5
+ name: string;
6
+ locationConstraint: string;
7
+ creationDate: Date;
8
+ }
9
+ export interface ObjectMetadata {
10
+ key: string;
11
+ bucket: string;
12
+ versionId: string;
13
+ size: number;
14
+ etag: string;
15
+ contentType: string;
16
+ contentLanguage?: string;
17
+ contentDisposition?: string;
18
+ contentEncoding?: string;
19
+ cacheControl?: string;
20
+ expires?: Date;
21
+ lastModified: Date;
22
+ storageClass: StorageClass;
23
+ ownerId: string;
24
+ ownerDisplayName: string;
25
+ userMetadata: Record<string, string>;
26
+ serverSideEncryption?: 'AES256' | 'aws:kms';
27
+ sseKmsKeyId?: string;
28
+ objectLockMode?: 'GOVERNANCE' | 'COMPLIANCE';
29
+ objectLockRetainUntilDate?: Date;
30
+ objectLockLegalHold?: boolean;
31
+ }
32
+ export interface UploadedPart {
33
+ partNumber: number;
34
+ etag: string;
35
+ size: number;
36
+ }
37
+ export interface MultipartUpload {
38
+ uploadId: string;
39
+ bucket: string;
40
+ key: string;
41
+ initiator: string;
42
+ initiatorDisplayName: string;
43
+ storageClass?: StorageClass;
44
+ serverSideEncryption?: 'AES256' | 'aws:kms';
45
+ initiated: Date;
46
+ parts: Map<number, UploadedPart>;
47
+ }
48
+ export interface Tag {
49
+ Key: string;
50
+ Value: string;
51
+ }
52
+ export interface CORSRule {
53
+ allowedOrigins: string[];
54
+ allowedMethods: string[];
55
+ allowedHeaders?: string[];
56
+ maxAgeSeconds?: number;
57
+ exposeHeaders?: string[];
58
+ }
59
+ export interface BucketCorsConfiguration {
60
+ corsRules: CORSRule[];
61
+ }
62
+ export declare class S3Error extends Error {
63
+ code: string;
64
+ httpCode: number;
65
+ bucketName?: string | undefined;
66
+ keyName?: string | undefined;
67
+ constructor(code: string, message: string, httpCode?: number, bucketName?: string | undefined, keyName?: string | undefined);
68
+ toResponseXml(requestId: string): string;
69
+ }
70
+ export interface ObjectSummary {
71
+ Key: string;
72
+ LastModified: Date;
73
+ ETag: string;
74
+ Size: number;
75
+ StorageClass: StorageClass;
76
+ Owner?: {
77
+ ID: string;
78
+ DisplayName: string;
79
+ };
80
+ }
81
+ export interface CommonPrefix {
82
+ Prefix: string;
83
+ }
84
+ export interface ListObjectsV2Response {
85
+ Name?: string;
86
+ Prefix?: string;
87
+ MaxKeys?: number;
88
+ Delimiter?: string;
89
+ IsTruncated: boolean;
90
+ Contents?: ObjectSummary[];
91
+ CommonPrefixes?: CommonPrefix[];
92
+ ContinuationToken?: string;
93
+ NextContinuationToken?: string;
94
+ StartAfter?: string;
95
+ }
96
+ export interface VersioningConfiguration {
97
+ Status: 'Enabled' | 'Suspended' | null;
98
+ }
99
+ export interface CreateObjectParams {
100
+ body: Buffer;
101
+ meta?: Record<string, string>;
102
+ contentType?: string;
103
+ contentDisposition?: string;
104
+ contentEncoding?: string;
105
+ cacheControl?: string;
106
+ expires?: Date;
107
+ storageClass?: StorageClass;
108
+ userMetadata?: Record<string, string>;
109
+ }
110
+ export interface CopyResult {
111
+ ETag: string;
112
+ LastModified: Date;
113
+ Source: string;
114
+ }
115
+ export declare function generateETag(body: Buffer): string;
116
+ export declare function generateVersionId(): string;
117
+ export declare const DEFAULT_OWNER_ID = "000000000000000000000000";
118
+ export declare const COPY_SOURCE_MAX: number;
@@ -0,0 +1,40 @@
1
+ export const VALID_STORAGE_CLASSES = [
2
+ 'STANDARD', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING',
3
+ 'GLACIER', 'DEEP_ARCHIVE', 'GLACIER_IR',
4
+ ];
5
+ export const VALID_LOCATION_CONSTRAINTS = [
6
+ 'us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1',
7
+ 'eu-central-1', 'ap-southeast-1', 'ap-northeast-1', 'sa-east-1'
8
+ ];
9
+ export class S3Error extends Error {
10
+ code;
11
+ httpCode;
12
+ bucketName;
13
+ keyName;
14
+ constructor(code, message, httpCode = 400, bucketName, keyName) {
15
+ super(message);
16
+ this.code = code;
17
+ this.httpCode = httpCode;
18
+ this.bucketName = bucketName;
19
+ this.keyName = keyName;
20
+ this.name = 'S3Error';
21
+ }
22
+ toResponseXml(requestId) {
23
+ const esc = (t) => t.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
24
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<Error>\n <Code>${esc(this.code)}</Code>\n <Message>${esc(this.message)}</Message>\n${this.bucketName ? ` <BucketName>${esc(this.bucketName)}</BucketName>\n` : ''}${this.keyName ? ` <KeyName>${esc(this.keyName)}</KeyName>\n` : ''} <RequestId>${requestId}</RequestId>\n</Error>`;
25
+ }
26
+ }
27
+ export function generateETag(body) {
28
+ return '"' + crypto.createHash('md5').update(body).digest('hex') + '"';
29
+ }
30
+ export function generateVersionId() {
31
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
32
+ let r = '';
33
+ for (let i = 0; i < 32; i++)
34
+ r += chars[Math.floor(Math.random() * chars.length)];
35
+ return r + '+';
36
+ }
37
+ export const DEFAULT_OWNER_ID = '000000000000000000000000';
38
+ export const COPY_SOURCE_MAX = 5 * 1024 * 1024;
39
+ import crypto from 'node:crypto';
40
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/types/models.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACnD,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,qBAAqB;IAC9D,SAAS,EAAE,cAAc,EAAE,YAAY;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAa;IAClD,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW;IAClD,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW;CAChE,CAAC;AAmEF,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAEvB;IAEA;IACA;IACA;IALT,YACS,IAAY,EACnB,OAAe,EACR,WAAmB,GAAG,EACtB,UAAmB,EACnB,OAAgB;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,SAAI,GAAJ,IAAI,CAAQ;QAEZ,aAAQ,GAAR,QAAQ,CAAc;QACtB,eAAU,GAAV,UAAU,CAAS;QACnB,YAAO,GAAP,OAAO,CAAS;QAGvB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxH,OAAO,4DAA4D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,gBAAgB,SAAS,wBAAwB,CAAC;IAC7U,CAAC;CACF;AAkDD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,gEAAgE,CAAC;IAC/E,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,GAAG,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,OAAO,MAAM,MAAM,aAAa,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@cloud-cli/s3mini",
3
+ "version": "1.42.0",
4
+ "description": "A minimal S3-compatible object storage server in TypeScript",
5
+ "keywords": [
6
+ "s3",
7
+ "object-storage",
8
+ "minio",
9
+ "backblaze",
10
+ "storage-server"
11
+ ],
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/apphorde/s3mini.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/apphorde/s3mini/issues"
19
+ },
20
+ "homepage": "https://github.com/apphorde/s3mini#readme",
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
29
+ "type": "module",
30
+ "main": "dist/index.js",
31
+ "types": "dist/index.d.ts",
32
+ "engines": {
33
+ "node": ">=22.5.0"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "start": "node dist/index.js",
38
+ "dev": "tsx src/index.ts",
39
+ "test": "vitest run",
40
+ "test:watch": "vitest"
41
+ },
42
+ "dependencies": {
43
+ "@fastify/cors": "^11.0.0",
44
+ "fast-querystring": "^1.1.2",
45
+ "fastify": "^5.6.0",
46
+ "uuid": "^11.1.0"
47
+ },
48
+ "devDependencies": {
49
+ "@aws-sdk/client-s3": "^3.1131.0",
50
+ "@types/node": "^24.0.0",
51
+ "@types/uuid": "^10.0.0",
52
+ "tsx": "^4.20.0",
53
+ "typescript": "^5.9.0",
54
+ "vitest": "^3.1.0"
55
+ }
56
+ }