@allegria/aws-file-manager 1.0.1 → 1.0.3

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 (38) hide show
  1. package/dist/cjs/aws-file-manager.d.ts +318 -0
  2. package/dist/cjs/aws-file-manager.js +426 -0
  3. package/dist/cjs/aws-file-manager.js.map +1 -0
  4. package/dist/cjs/package.json +3 -0
  5. package/dist/lib/aws-file-manager.d.ts +1 -1
  6. package/dist/lib/aws-file-manager.js +5 -1
  7. package/dist/lib/aws-file-manager.js.map +1 -1
  8. package/package.json +27 -9
  9. package/dist/examples/01-setup.d.ts +0 -14
  10. package/dist/examples/01-setup.js +0 -42
  11. package/dist/examples/01-setup.js.map +0 -1
  12. package/dist/examples/02-upload-multer.d.ts +0 -13
  13. package/dist/examples/02-upload-multer.js +0 -63
  14. package/dist/examples/02-upload-multer.js.map +0 -1
  15. package/dist/examples/03-upload-web.d.ts +0 -12
  16. package/dist/examples/03-upload-web.js +0 -38
  17. package/dist/examples/03-upload-web.js.map +0 -1
  18. package/dist/examples/04-signed-urls.d.ts +0 -12
  19. package/dist/examples/04-signed-urls.js +0 -48
  20. package/dist/examples/04-signed-urls.js.map +0 -1
  21. package/dist/examples/05-download.d.ts +0 -14
  22. package/dist/examples/05-download.js +0 -53
  23. package/dist/examples/05-download.js.map +0 -1
  24. package/dist/examples/06-delete.d.ts +0 -17
  25. package/dist/examples/06-delete.js +0 -44
  26. package/dist/examples/06-delete.js.map +0 -1
  27. package/dist/examples/07-copy.d.ts +0 -14
  28. package/dist/examples/07-copy.js +0 -35
  29. package/dist/examples/07-copy.js.map +0 -1
  30. package/dist/examples/08-list-paginated.d.ts +0 -16
  31. package/dist/examples/08-list-paginated.js +0 -60
  32. package/dist/examples/08-list-paginated.js.map +0 -1
  33. package/dist/examples/09-exists.d.ts +0 -13
  34. package/dist/examples/09-exists.js +0 -32
  35. package/dist/examples/09-exists.js.map +0 -1
  36. package/dist/tests/aws-file-manager.test.d.ts +0 -1
  37. package/dist/tests/aws-file-manager.test.js +0 -359
  38. package/dist/tests/aws-file-manager.test.js.map +0 -1
@@ -1,359 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { AwsFileManager, fromMulterFile, fromWebFile, } from "../lib/aws-file-manager.js";
3
- // ---------------------------------------------------------------------------
4
- // Mock AWS SDK modules
5
- // ---------------------------------------------------------------------------
6
- const mockSend = vi.fn();
7
- // All SDK classes are used with `new`, so they must be regular functions.
8
- function makeConstructor() {
9
- return vi.fn().mockImplementation(function (input) {
10
- this.input = input;
11
- });
12
- }
13
- vi.mock("@aws-sdk/client-s3", () => ({
14
- S3Client: vi.fn().mockImplementation(function () {
15
- this.send = mockSend;
16
- }),
17
- PutObjectCommand: makeConstructor(),
18
- GetObjectCommand: makeConstructor(),
19
- DeleteObjectCommand: makeConstructor(),
20
- CopyObjectCommand: makeConstructor(),
21
- ListObjectsV2Command: makeConstructor(),
22
- StorageClass: {
23
- INTELLIGENT_TIERING: "INTELLIGENT_TIERING",
24
- STANDARD: "STANDARD",
25
- },
26
- }));
27
- vi.mock("@aws-sdk/s3-request-presigner", () => ({
28
- getSignedUrl: vi.fn().mockResolvedValue("https://signed.example.com/file"),
29
- }));
30
- // ---------------------------------------------------------------------------
31
- // Shared test fixtures
32
- // ---------------------------------------------------------------------------
33
- const BASE_CONFIG = {
34
- region: "us-east-1",
35
- bucketName: "test-bucket",
36
- };
37
- const SAMPLE_FILE = {
38
- buffer: Buffer.from("hello world"),
39
- originalName: "photo.jpg",
40
- mimeType: "image/jpeg",
41
- size: 11,
42
- };
43
- // Clear mock call counts between every test so toHaveBeenCalledTimes is isolated
44
- afterEach(() => {
45
- vi.clearAllMocks();
46
- });
47
- // ---------------------------------------------------------------------------
48
- // fromMulterFile
49
- // ---------------------------------------------------------------------------
50
- describe("fromMulterFile", () => {
51
- it("maps multer fields to FileInput", () => {
52
- const multerFile = {
53
- buffer: Buffer.from("data"),
54
- originalname: "test.png",
55
- mimetype: "image/png",
56
- size: 4,
57
- };
58
- const result = fromMulterFile(multerFile);
59
- expect(result).toEqual({
60
- buffer: multerFile.buffer,
61
- originalName: "test.png",
62
- mimeType: "image/png",
63
- size: 4,
64
- });
65
- });
66
- });
67
- // ---------------------------------------------------------------------------
68
- // fromWebFile
69
- // ---------------------------------------------------------------------------
70
- describe("fromWebFile", () => {
71
- it("converts a Web API File to FileInput", async () => {
72
- const bytes = new Uint8Array([1, 2, 3]);
73
- const webFile = new File([bytes], "upload.pdf", { type: "application/pdf" });
74
- const result = await fromWebFile(webFile);
75
- expect(result.originalName).toBe("upload.pdf");
76
- expect(result.mimeType).toBe("application/pdf");
77
- expect(result.size).toBe(3);
78
- expect(Buffer.isBuffer(result.buffer)).toBe(true);
79
- expect(result.buffer).toEqual(Buffer.from(bytes));
80
- });
81
- });
82
- // ---------------------------------------------------------------------------
83
- // AwsFileManager — constructor
84
- // ---------------------------------------------------------------------------
85
- describe("AwsFileManager constructor", () => {
86
- it("throws when region is missing", () => {
87
- expect(() => new AwsFileManager({ region: "", bucketName: "b" })).toThrow("AWS region is required");
88
- });
89
- it("throws when bucketName is missing", () => {
90
- expect(() => new AwsFileManager({ region: "us-east-1", bucketName: "" })).toThrow("S3 bucket name is required");
91
- });
92
- it("constructs successfully with minimal config", () => {
93
- expect(() => new AwsFileManager(BASE_CONFIG)).not.toThrow();
94
- });
95
- });
96
- // ---------------------------------------------------------------------------
97
- // upload()
98
- // ---------------------------------------------------------------------------
99
- describe("AwsFileManager.upload()", () => {
100
- let fm;
101
- beforeEach(() => {
102
- fm = new AwsFileManager(BASE_CONFIG);
103
- mockSend.mockResolvedValue({ ETag: '"abc123"' });
104
- });
105
- it("returns an UploadResult with the correct fields", async () => {
106
- const result = await fm.upload(SAMPLE_FILE);
107
- expect(result.originalName).toBe("photo.jpg");
108
- expect(result.size).toBe(11);
109
- expect(result.contentType).toBe("image/jpeg");
110
- expect(result.etag).toBe("abc123"); // quotes stripped
111
- expect(result.storageClass).toBe("INTELLIGENT_TIERING");
112
- expect(result.key).toBe("photo.jpg");
113
- expect(result.storedName).toBe("photo.jpg");
114
- });
115
- it("prepends basePath to the key", async () => {
116
- const fmWithBase = new AwsFileManager({ ...BASE_CONFIG, basePath: "uploads" });
117
- const result = await fmWithBase.upload(SAMPLE_FILE);
118
- expect(result.key).toBe("uploads/photo.jpg");
119
- });
120
- it("includes folder in the key", async () => {
121
- const result = await fm.upload(SAMPLE_FILE, { folder: "avatars" });
122
- expect(result.key).toBe("avatars/photo.jpg");
123
- });
124
- it("uses an explicit key when options.key is provided", async () => {
125
- const result = await fm.upload(SAMPLE_FILE, { key: "custom/path/file.jpg" });
126
- expect(result.key).toBe("custom/path/file.jpg");
127
- expect(result.storedName).toBe("file.jpg");
128
- });
129
- it("uses options.fileName over originalName", async () => {
130
- const result = await fm.upload(SAMPLE_FILE, { fileName: "renamed.jpg" });
131
- expect(result.storedName).toBe("renamed.jpg");
132
- expect(result.key).toBe("renamed.jpg");
133
- });
134
- it("generates a UUID filename when generateUniqueFileName is true", async () => {
135
- const result = await fm.upload(SAMPLE_FILE, { generateUniqueFileName: true });
136
- // UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.jpg
137
- expect(result.storedName).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jpg$/);
138
- });
139
- it("preserves extension when generating UUID filename", async () => {
140
- const file = { ...SAMPLE_FILE, originalName: "archive.tar.gz" };
141
- const result = await fm.upload(file, { generateUniqueFileName: true });
142
- expect(result.storedName).toMatch(/\.gz$/);
143
- });
144
- it("handles files with no extension when generating UUID filename", async () => {
145
- const file = { ...SAMPLE_FILE, originalName: "Makefile" };
146
- const result = await fm.upload(file, { generateUniqueFileName: true });
147
- expect(result.storedName).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
148
- });
149
- it("strips quotes from ETag", async () => {
150
- mockSend.mockResolvedValue({ ETag: '"etag-value"' });
151
- const result = await fm.upload(SAMPLE_FILE);
152
- expect(result.etag).toBe("etag-value");
153
- });
154
- it("handles missing ETag in response", async () => {
155
- mockSend.mockResolvedValue({});
156
- const result = await fm.upload(SAMPLE_FILE);
157
- expect(result.etag).toBeUndefined();
158
- });
159
- });
160
- // ---------------------------------------------------------------------------
161
- // getSignedUrl()
162
- // ---------------------------------------------------------------------------
163
- describe("AwsFileManager.getSignedUrl()", () => {
164
- let fm;
165
- beforeEach(() => {
166
- fm = new AwsFileManager(BASE_CONFIG);
167
- });
168
- it("returns a signed URL string", async () => {
169
- const url = await fm.getSignedUrl("uploads/file.jpg");
170
- expect(url).toBe("https://signed.example.com/file");
171
- });
172
- it("accepts disposition and fileName options without throwing", async () => {
173
- await expect(fm.getSignedUrl("key.pdf", { disposition: "attachment", fileName: "report.pdf" })).resolves.toBe("https://signed.example.com/file");
174
- });
175
- it("accepts inline disposition without throwing", async () => {
176
- await expect(fm.getSignedUrl("key.jpg", { disposition: "inline" })).resolves.toBe("https://signed.example.com/file");
177
- });
178
- });
179
- // ---------------------------------------------------------------------------
180
- // download()
181
- // ---------------------------------------------------------------------------
182
- describe("AwsFileManager.download()", () => {
183
- let fm;
184
- beforeEach(() => {
185
- fm = new AwsFileManager(BASE_CONFIG);
186
- });
187
- it("returns null when the key does not exist", async () => {
188
- const err = Object.assign(new Error("NoSuchKey"), { name: "NoSuchKey" });
189
- mockSend.mockRejectedValue(err);
190
- const result = await fm.download("missing.jpg", "buffer");
191
- expect(result).toBeNull();
192
- });
193
- it("re-throws non-NoSuchKey errors", async () => {
194
- const err = Object.assign(new Error("AccessDenied"), { name: "AccessDenied" });
195
- mockSend.mockRejectedValue(err);
196
- await expect(fm.download("key.jpg", "buffer")).rejects.toThrow("AccessDenied");
197
- });
198
- it("returns a stream result in stream mode", async () => {
199
- const { Readable } = await import("stream");
200
- const fakeStream = Readable.from(["data"]);
201
- mockSend.mockResolvedValue({
202
- Body: fakeStream,
203
- ContentType: "text/plain",
204
- ContentLength: 4,
205
- });
206
- const result = await fm.download("key.txt", "stream");
207
- expect(result).not.toBeNull();
208
- expect(result.metadata.contentType).toBe("text/plain");
209
- });
210
- it("returns a buffer result in buffer mode", async () => {
211
- const { Readable } = await import("stream");
212
- const fakeStream = Readable.from([Buffer.from("hello")]);
213
- mockSend.mockResolvedValue({
214
- Body: fakeStream,
215
- ContentType: "text/plain",
216
- });
217
- const result = await fm.download("key.txt", "buffer");
218
- expect(result).not.toBeNull();
219
- expect(result.buffer).toEqual(Buffer.from("hello"));
220
- });
221
- it("returns null when Body is missing", async () => {
222
- mockSend.mockResolvedValue({ Body: null });
223
- const result = await fm.download("key.txt", "buffer");
224
- expect(result).toBeNull();
225
- });
226
- });
227
- // ---------------------------------------------------------------------------
228
- // delete()
229
- // ---------------------------------------------------------------------------
230
- describe("AwsFileManager.delete()", () => {
231
- let fm;
232
- beforeEach(() => {
233
- fm = new AwsFileManager(BASE_CONFIG);
234
- mockSend.mockResolvedValue({});
235
- });
236
- it("resolves without throwing", async () => {
237
- await expect(fm.delete("uploads/file.jpg")).resolves.toBeUndefined();
238
- });
239
- it("calls send once", async () => {
240
- await fm.delete("key");
241
- expect(mockSend).toHaveBeenCalledTimes(1);
242
- });
243
- });
244
- // ---------------------------------------------------------------------------
245
- // deleteMany()
246
- // ---------------------------------------------------------------------------
247
- describe("AwsFileManager.deleteMany()", () => {
248
- let fm;
249
- beforeEach(() => {
250
- fm = new AwsFileManager(BASE_CONFIG);
251
- mockSend.mockResolvedValue({});
252
- });
253
- it("resolves without throwing for an empty array", async () => {
254
- await expect(fm.deleteMany([])).resolves.toBeUndefined();
255
- expect(mockSend).not.toHaveBeenCalled();
256
- });
257
- it("calls delete for each key", async () => {
258
- await fm.deleteMany(["a", "b", "c"]);
259
- expect(mockSend).toHaveBeenCalledTimes(3);
260
- });
261
- });
262
- // ---------------------------------------------------------------------------
263
- // copy()
264
- // ---------------------------------------------------------------------------
265
- describe("AwsFileManager.copy()", () => {
266
- let fm;
267
- beforeEach(() => {
268
- fm = new AwsFileManager(BASE_CONFIG);
269
- mockSend.mockResolvedValue({});
270
- });
271
- it("resolves without throwing", async () => {
272
- await expect(fm.copy("source/key.jpg", "dest/key.jpg")).resolves.toBeUndefined();
273
- });
274
- it("calls send once", async () => {
275
- await fm.copy("src", "dst");
276
- expect(mockSend).toHaveBeenCalledTimes(1);
277
- });
278
- });
279
- // ---------------------------------------------------------------------------
280
- // list()
281
- // ---------------------------------------------------------------------------
282
- describe("AwsFileManager.list()", () => {
283
- let fm;
284
- beforeEach(() => {
285
- fm = new AwsFileManager(BASE_CONFIG);
286
- });
287
- it("returns entries and hasMore=false when result is not truncated", async () => {
288
- mockSend.mockResolvedValue({
289
- Contents: [
290
- {
291
- Key: "uploads/file.jpg",
292
- Size: 100,
293
- LastModified: new Date("2024-01-01"),
294
- StorageClass: "INTELLIGENT_TIERING",
295
- ETag: '"etag1"',
296
- },
297
- ],
298
- IsTruncated: false,
299
- });
300
- const result = await fm.list({ folder: "uploads" });
301
- expect(result.hasMore).toBe(false);
302
- expect(result.continuationToken).toBeUndefined();
303
- expect(result.entries).toHaveLength(1);
304
- expect(result.entries[0].key).toBe("uploads/file.jpg");
305
- expect(result.entries[0].fileName).toBe("file.jpg");
306
- expect(result.entries[0].size).toBe(100);
307
- expect(result.entries[0].etag).toBe("etag1"); // quotes stripped
308
- });
309
- it("returns continuationToken and hasMore=true when truncated", async () => {
310
- mockSend.mockResolvedValue({
311
- Contents: [],
312
- IsTruncated: true,
313
- NextContinuationToken: "token-abc",
314
- });
315
- const result = await fm.list();
316
- expect(result.hasMore).toBe(true);
317
- expect(result.continuationToken).toBe("token-abc");
318
- });
319
- it("returns empty entries when Contents is missing", async () => {
320
- mockSend.mockResolvedValue({ IsTruncated: false });
321
- const result = await fm.list();
322
- expect(result.entries).toHaveLength(0);
323
- });
324
- });
325
- // ---------------------------------------------------------------------------
326
- // exists()
327
- // ---------------------------------------------------------------------------
328
- describe("AwsFileManager.exists()", () => {
329
- let fm;
330
- beforeEach(() => {
331
- fm = new AwsFileManager(BASE_CONFIG);
332
- });
333
- it("returns true when the object exists", async () => {
334
- mockSend.mockResolvedValue({});
335
- expect(await fm.exists("key.jpg")).toBe(true);
336
- });
337
- it("returns false when NoSuchKey is thrown", async () => {
338
- const err = Object.assign(new Error("NoSuchKey"), { name: "NoSuchKey" });
339
- mockSend.mockRejectedValue(err);
340
- expect(await fm.exists("missing.jpg")).toBe(false);
341
- });
342
- it("re-throws other errors", async () => {
343
- const err = Object.assign(new Error("Forbidden"), { name: "Forbidden" });
344
- mockSend.mockRejectedValue(err);
345
- await expect(fm.exists("key.jpg")).rejects.toThrow("Forbidden");
346
- });
347
- });
348
- // ---------------------------------------------------------------------------
349
- // getS3Client()
350
- // ---------------------------------------------------------------------------
351
- describe("AwsFileManager.getS3Client()", () => {
352
- it("returns the underlying S3Client instance", () => {
353
- const fm = new AwsFileManager(BASE_CONFIG);
354
- const client = fm.getS3Client();
355
- expect(client).toBeDefined();
356
- expect(typeof client.send).toBe("function");
357
- });
358
- });
359
- //# sourceMappingURL=aws-file-manager.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aws-file-manager.test.js","sourceRoot":"","sources":["../../tests/aws-file-manager.test.ts"],"names":[],"mappings":"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"}