medusa-plugin-r2 1.0.4 → 1.1.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.
@@ -0,0 +1,516 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /// <reference types="jest" />
4
+ const client_s3_1 = require("@aws-sdk/client-s3");
5
+ const lib_storage_1 = require("@aws-sdk/lib-storage");
6
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const provider_1 = require("../r2/provider");
9
+ jest.mock('@aws-sdk/client-s3');
10
+ jest.mock('@aws-sdk/lib-storage');
11
+ jest.mock('@aws-sdk/s3-request-presigner');
12
+ jest.mock('ulid', () => ({ ulid: () => 'TESTULID0000000000000000' }));
13
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
14
+ const SIGNED_URL = 'https://signed.r2.example.com/file?X-Amz-Signature=abc';
15
+ const baseOptions = {
16
+ region: 'auto',
17
+ bucket: 'public-bucket',
18
+ accessKeyId: 'pub-key-id',
19
+ secretAccessKey: 'pub-secret',
20
+ fileUrl: 'https://cdn.example.com',
21
+ endpoint: 'https://account.r2.cloudflarestorage.com',
22
+ privateRegion: 'auto',
23
+ privateBucket: 'private-bucket',
24
+ privateAccessKeyId: 'priv-key-id',
25
+ privateSecretAccessKey: 'priv-secret',
26
+ privateEndpoint: 'https://account-private.r2.cloudflarestorage.com'
27
+ };
28
+ const mockLogger = {
29
+ error: jest.fn(),
30
+ info: jest.fn(),
31
+ warn: jest.fn(),
32
+ debug: jest.fn()
33
+ };
34
+ function makeService(overrides = {}) {
35
+ return new provider_1.R2FileProvider({ logger: mockLogger }, { ...baseOptions, ...overrides });
36
+ }
37
+ // ─── Mock state ───────────────────────────────────────────────────────────────
38
+ let mockSend;
39
+ let mockUploadDone;
40
+ beforeEach(() => {
41
+ jest.clearAllMocks();
42
+ mockSend = jest.fn().mockResolvedValue({
43
+ Body: {
44
+ transformToByteArray: jest.fn().mockResolvedValue(new Uint8Array([72, 101, 108, 108, 111]))
45
+ }
46
+ });
47
+ client_s3_1.S3Client.mockImplementation(() => ({ send: mockSend, destroy: jest.fn() }));
48
+ mockUploadDone = jest.fn().mockResolvedValue({});
49
+ lib_storage_1.Upload.mockImplementation(() => ({ done: mockUploadDone }));
50
+ s3_request_presigner_1.getSignedUrl.mockResolvedValue(SIGNED_URL);
51
+ });
52
+ // ─── Constructor ──────────────────────────────────────────────────────────────
53
+ describe('R2FileService — constructor', () => {
54
+ it('throws when accessKeyId is missing', () => {
55
+ expect(() => makeService({ accessKeyId: undefined })).toThrow(utils_1.MedusaError);
56
+ });
57
+ it('throws when secretAccessKey is missing', () => {
58
+ expect(() => makeService({ secretAccessKey: undefined })).toThrow(utils_1.MedusaError);
59
+ });
60
+ it('throws when private bucket config is incomplete', () => {
61
+ expect(() => makeService({ privateBucket: undefined })).toThrow(utils_1.MedusaError);
62
+ });
63
+ it('throws when privateAccessKeyId is missing', () => {
64
+ expect(() => makeService({ privateAccessKeyId: undefined })).toThrow(utils_1.MedusaError);
65
+ });
66
+ it('constructs successfully with full config', () => {
67
+ expect(() => makeService()).not.toThrow();
68
+ });
69
+ it('creates two S3Client instances (public + private)', () => {
70
+ makeService();
71
+ expect(client_s3_1.S3Client).toHaveBeenCalledTimes(2);
72
+ });
73
+ it('applies globalPrefix default to empty string', () => {
74
+ const svc = makeService({ globalPrefix: undefined });
75
+ expect(svc.config_.globalPrefix).toBe('');
76
+ });
77
+ it('applies custom globalPrefix', () => {
78
+ const svc = makeService({ globalPrefix: 'media/' });
79
+ expect(svc.config_.globalPrefix).toBe('media/');
80
+ });
81
+ it('uses default cacheControl when not specified', () => {
82
+ const svc = makeService({ cacheControl: undefined });
83
+ expect(svc.config_.cacheControl).toBe('public, max-age=31536000');
84
+ });
85
+ it('uses default downloadFileDuration of 3600', () => {
86
+ const svc = makeService({ downloadFileDuration: undefined });
87
+ expect(svc.config_.downloadFileDuration).toBe(3600);
88
+ });
89
+ });
90
+ // ─── upload() — public ACL ────────────────────────────────────────────────────
91
+ describe('R2FileService — upload() — public', () => {
92
+ it('sends PutObjectCommand to the public bucket', async () => {
93
+ const svc = makeService();
94
+ await svc.upload({
95
+ filename: 'photo.jpg',
96
+ mimeType: 'image/jpeg',
97
+ content: 'aGVsbG8=', // base64 "hello"
98
+ access: 'public'
99
+ });
100
+ expect(client_s3_1.PutObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'public-bucket' }));
101
+ expect(mockSend).toHaveBeenCalledTimes(1);
102
+ });
103
+ it('returns a public CDN url with encoded key', async () => {
104
+ const svc = makeService();
105
+ const result = await svc.upload({
106
+ filename: 'photo.jpg',
107
+ mimeType: 'image/jpeg',
108
+ content: 'aGVsbG8=',
109
+ access: 'public'
110
+ });
111
+ expect(result.url).toMatch(/^https:\/\/cdn\.example\.com\//);
112
+ expect(result.key).toMatch(/^photo-TESTULID0000000000000000\.jpg$/);
113
+ });
114
+ it('includes globalPrefix in the file key', async () => {
115
+ const svc = makeService({ globalPrefix: 'uploads/' });
116
+ const result = await svc.upload({
117
+ filename: 'banner.png',
118
+ mimeType: 'image/png',
119
+ content: 'aGVsbG8=',
120
+ access: 'public'
121
+ });
122
+ expect(result.key).toMatch(/^uploads\/banner-/);
123
+ });
124
+ it('includes the file prefix in the key when provided', async () => {
125
+ const svc = makeService();
126
+ const result = await svc.upload({
127
+ filename: 'thumb.png',
128
+ mimeType: 'image/png',
129
+ content: 'aGVsbG8=',
130
+ access: 'public',
131
+ prefix: 'thumbnails/'
132
+ });
133
+ expect(result.key).toMatch(/^thumbnails\/thumb-/);
134
+ });
135
+ it('stores original-filename in object metadata', async () => {
136
+ const svc = makeService();
137
+ await svc.upload({
138
+ filename: 'my file.pdf',
139
+ mimeType: 'application/pdf',
140
+ content: 'aGVsbG8=',
141
+ access: 'public'
142
+ });
143
+ expect(client_s3_1.PutObjectCommand).toHaveBeenCalledWith(expect.objectContaining({
144
+ Metadata: expect.objectContaining({
145
+ 'original-filename': encodeURIComponent('my file.pdf')
146
+ })
147
+ }));
148
+ });
149
+ it('sets ContentType on the command', async () => {
150
+ const svc = makeService();
151
+ await svc.upload({
152
+ filename: 'doc.pdf',
153
+ mimeType: 'application/pdf',
154
+ content: 'aGVsbG8=',
155
+ access: 'public'
156
+ });
157
+ expect(client_s3_1.PutObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ ContentType: 'application/pdf' }));
158
+ });
159
+ it('decodes valid base64 content', async () => {
160
+ const svc = makeService();
161
+ const b64 = Buffer.from('Hello World').toString('base64'); // 'SGVsbG8gV29ybGQ='
162
+ await svc.upload({
163
+ filename: 'hello.txt',
164
+ mimeType: 'text/plain',
165
+ content: b64,
166
+ access: 'public'
167
+ });
168
+ const [call] = client_s3_1.PutObjectCommand.mock.calls;
169
+ const body = call[0].Body;
170
+ expect(body.toString('utf8')).toBe('Hello World');
171
+ });
172
+ it('treats non-base64 content as utf8', async () => {
173
+ const svc = makeService();
174
+ await svc.upload({
175
+ filename: 'data.json',
176
+ mimeType: 'application/json',
177
+ content: '{"key":"value"}',
178
+ access: 'public'
179
+ });
180
+ const [call] = client_s3_1.PutObjectCommand.mock.calls;
181
+ const body = call[0].Body;
182
+ expect(body.toString('utf8')).toBe('{"key":"value"}');
183
+ });
184
+ it('handles PNG image upload', async () => {
185
+ const svc = makeService();
186
+ const fakePng = Buffer.from([0x89, 0x50, 0x4e, 0x47]).toString('base64');
187
+ const result = await svc.upload({
188
+ filename: 'image.png',
189
+ mimeType: 'image/png',
190
+ content: fakePng,
191
+ access: 'public'
192
+ });
193
+ expect(result.url).toContain('cdn.example.com');
194
+ expect(result.key).toContain('.png');
195
+ });
196
+ it('handles SVG upload', async () => {
197
+ const svc = makeService();
198
+ const result = await svc.upload({
199
+ filename: 'icon.svg',
200
+ mimeType: 'image/svg+xml',
201
+ content: '<svg xmlns="http://www.w3.org/2000/svg"/>',
202
+ access: 'public'
203
+ });
204
+ expect(result.key).toContain('.svg');
205
+ });
206
+ it('preserves file extension including double extensions', async () => {
207
+ const svc = makeService();
208
+ const result = await svc.upload({
209
+ filename: 'archive.tar.gz',
210
+ mimeType: 'application/gzip',
211
+ content: 'aGVsbG8=',
212
+ access: 'public'
213
+ });
214
+ // path.parse('archive.tar.gz').ext === '.gz'
215
+ expect(result.key).toMatch(/\.gz$/);
216
+ });
217
+ });
218
+ // ─── upload() — private ACL ───────────────────────────────────────────────────
219
+ describe('R2FileService — upload() — private', () => {
220
+ it('sends PutObjectCommand to the private bucket', async () => {
221
+ const svc = makeService();
222
+ await svc.upload({
223
+ filename: 'report.pdf',
224
+ mimeType: 'application/pdf',
225
+ content: 'aGVsbG8=',
226
+ access: 'private'
227
+ });
228
+ expect(client_s3_1.PutObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'private-bucket' }));
229
+ });
230
+ it('returns an empty url for private files', async () => {
231
+ const svc = makeService();
232
+ const result = await svc.upload({
233
+ filename: 'secret.pdf',
234
+ mimeType: 'application/pdf',
235
+ content: 'aGVsbG8=',
236
+ access: 'private'
237
+ });
238
+ expect(result.url).toBe('');
239
+ expect(result.key).toBeTruthy();
240
+ });
241
+ it('handles CSV upload to private bucket', async () => {
242
+ const svc = makeService();
243
+ const result = await svc.upload({
244
+ filename: 'export.csv',
245
+ mimeType: 'text/csv',
246
+ content: 'id,name\n1,Alice',
247
+ access: 'private'
248
+ });
249
+ expect(result.key).toContain('.csv');
250
+ expect(result.url).toBe('');
251
+ });
252
+ });
253
+ // ─── upload() — validation ────────────────────────────────────────────────────
254
+ describe('R2FileService — upload() — validation', () => {
255
+ it('throws when filename is missing', async () => {
256
+ const svc = makeService();
257
+ await expect(svc.upload({ mimeType: 'image/jpeg', content: 'aGVsbG8=', access: 'public' })).rejects.toThrow(utils_1.MedusaError);
258
+ });
259
+ it('propagates S3 send errors', async () => {
260
+ mockSend.mockRejectedValue(new Error('S3 network error'));
261
+ const svc = makeService();
262
+ await expect(svc.upload({
263
+ filename: 'photo.jpg',
264
+ mimeType: 'image/jpeg',
265
+ content: 'aGVsbG8=',
266
+ access: 'public'
267
+ })).rejects.toThrow('S3 network error');
268
+ expect(mockLogger.error).toHaveBeenCalled();
269
+ });
270
+ });
271
+ // ─── delete() ────────────────────────────────────────────────────────────────
272
+ describe('R2FileService — delete()', () => {
273
+ it('sends DeleteObjectCommand for a single public file', async () => {
274
+ const svc = makeService();
275
+ await svc.delete({ fileKey: 'photo-TESTULID.jpg', access: 'public' });
276
+ expect(client_s3_1.DeleteObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'public-bucket', Key: 'photo-TESTULID.jpg' }));
277
+ });
278
+ it('sends DeleteObjectCommand for a single private file', async () => {
279
+ const svc = makeService();
280
+ await svc.delete({ fileKey: 'secret-TESTULID.pdf', access: 'private' });
281
+ expect(client_s3_1.DeleteObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'private-bucket', Key: 'secret-TESTULID.pdf' }));
282
+ });
283
+ it('sends DeleteObjectsCommand for an array of files', async () => {
284
+ const svc = makeService();
285
+ await svc.delete([
286
+ { fileKey: 'file-1.jpg', access: 'public' },
287
+ { fileKey: 'file-2.jpg', access: 'public' }
288
+ ]);
289
+ expect(client_s3_1.DeleteObjectsCommand).toHaveBeenCalledWith(expect.objectContaining({
290
+ Bucket: 'public-bucket',
291
+ Delete: {
292
+ Objects: [{ Key: 'file-1.jpg' }, { Key: 'file-2.jpg' }],
293
+ Quiet: true
294
+ }
295
+ }));
296
+ });
297
+ it('logs errors instead of throwing on S3 failure', async () => {
298
+ mockSend.mockRejectedValue(new Error('Delete failed'));
299
+ const svc = makeService();
300
+ await expect(svc.delete({ fileKey: 'gone.jpg', access: 'public' })).resolves.toBeUndefined();
301
+ expect(mockLogger.error).toHaveBeenCalled();
302
+ });
303
+ });
304
+ // ─── getPresignedDownloadUrl() ────────────────────────────────────────────────
305
+ describe('R2FileService — getPresignedDownloadUrl()', () => {
306
+ it('returns a signed URL for private files', async () => {
307
+ const svc = makeService();
308
+ const url = await svc.getPresignedDownloadUrl({
309
+ fileKey: 'secret-TESTULID.pdf',
310
+ access: 'private'
311
+ });
312
+ expect(url).toBe(SIGNED_URL);
313
+ expect(s3_request_presigner_1.getSignedUrl).toHaveBeenCalledTimes(1);
314
+ });
315
+ it('creates GetObjectCommand with private bucket and key', async () => {
316
+ const svc = makeService();
317
+ await svc.getPresignedDownloadUrl({
318
+ fileKey: 'report.pdf',
319
+ access: 'private'
320
+ });
321
+ expect(client_s3_1.GetObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'private-bucket', Key: 'report.pdf' }));
322
+ });
323
+ it('uses the configured downloadFileDuration for expiry', async () => {
324
+ const svc = makeService({ downloadFileDuration: 1800 });
325
+ await svc.getPresignedDownloadUrl({ fileKey: 'file.pdf', access: 'private' });
326
+ expect(s3_request_presigner_1.getSignedUrl).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.objectContaining({ expiresIn: 1800 }));
327
+ });
328
+ it('throws MedusaError for public files', async () => {
329
+ const svc = makeService();
330
+ await expect(svc.getPresignedDownloadUrl({ fileKey: 'photo.jpg', access: 'public' })).rejects.toThrow(utils_1.MedusaError);
331
+ });
332
+ it('throws with INVALID_DATA type for public files', async () => {
333
+ const svc = makeService();
334
+ await expect(svc.getPresignedDownloadUrl({ fileKey: 'photo.jpg', access: 'public' })).rejects.toMatchObject({ type: utils_1.MedusaError.Types.INVALID_DATA });
335
+ });
336
+ });
337
+ // ─── getPresignedUploadUrl() ──────────────────────────────────────────────────
338
+ describe('R2FileService — getPresignedUploadUrl()', () => {
339
+ it('returns a signed URL and key for private files', async () => {
340
+ const svc = makeService();
341
+ const result = await svc.getPresignedUploadUrl({
342
+ filename: 'upload.pdf',
343
+ mimeType: 'application/pdf',
344
+ access: 'private'
345
+ });
346
+ expect(result.url).toBe(SIGNED_URL);
347
+ expect(result.key).toBe('upload.pdf'); // globalPrefix is '' by default
348
+ });
349
+ it('includes globalPrefix in the key', async () => {
350
+ const svc = makeService({ globalPrefix: 'docs/' });
351
+ const result = await svc.getPresignedUploadUrl({
352
+ filename: 'contract.pdf',
353
+ mimeType: 'application/pdf',
354
+ access: 'private'
355
+ });
356
+ expect(result.key).toBe('docs/contract.pdf');
357
+ });
358
+ it('creates PutObjectCommand with private bucket', async () => {
359
+ const svc = makeService();
360
+ await svc.getPresignedUploadUrl({
361
+ filename: 'upload.pdf',
362
+ mimeType: 'application/pdf',
363
+ access: 'private'
364
+ });
365
+ expect(client_s3_1.PutObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'private-bucket' }));
366
+ });
367
+ it('uses the provided expiresIn duration', async () => {
368
+ const svc = makeService();
369
+ await svc.getPresignedUploadUrl({
370
+ filename: 'upload.pdf',
371
+ mimeType: 'application/pdf',
372
+ access: 'private',
373
+ expiresIn: 300
374
+ });
375
+ expect(s3_request_presigner_1.getSignedUrl).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.objectContaining({ expiresIn: 300 }));
376
+ });
377
+ it('falls back to 3600s when expiresIn is not provided', async () => {
378
+ const svc = makeService();
379
+ await svc.getPresignedUploadUrl({
380
+ filename: 'upload.pdf',
381
+ mimeType: 'application/pdf',
382
+ access: 'private'
383
+ });
384
+ expect(s3_request_presigner_1.getSignedUrl).toHaveBeenCalledWith(expect.anything(), expect.anything(), expect.objectContaining({ expiresIn: 3600 }));
385
+ });
386
+ it('throws MedusaError for public files', async () => {
387
+ const svc = makeService();
388
+ await expect(svc.getPresignedUploadUrl({
389
+ filename: 'photo.jpg',
390
+ mimeType: 'image/jpeg',
391
+ access: 'public'
392
+ })).rejects.toThrow(utils_1.MedusaError);
393
+ });
394
+ it('throws MedusaError when filename is missing', async () => {
395
+ const svc = makeService();
396
+ await expect(svc.getPresignedUploadUrl({
397
+ mimeType: 'application/pdf',
398
+ access: 'private'
399
+ })).rejects.toThrow(utils_1.MedusaError);
400
+ });
401
+ });
402
+ // ─── getDownloadStream() ──────────────────────────────────────────────────────
403
+ describe('R2FileService — getDownloadStream()', () => {
404
+ it('throws when fileKey is missing', async () => {
405
+ const svc = makeService();
406
+ await expect(svc.getDownloadStream({ access: 'public' })).rejects.toThrow(utils_1.MedusaError);
407
+ });
408
+ it('sends GetObjectCommand to public bucket for public files', async () => {
409
+ const svc = makeService();
410
+ await svc.getDownloadStream({ fileKey: 'photo.jpg', access: 'public' });
411
+ expect(client_s3_1.GetObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'public-bucket', Key: 'photo.jpg' }));
412
+ });
413
+ it('sends GetObjectCommand to private bucket for private files', async () => {
414
+ const svc = makeService();
415
+ await svc.getDownloadStream({ fileKey: 'report.pdf', access: 'private' });
416
+ expect(client_s3_1.GetObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'private-bucket', Key: 'report.pdf' }));
417
+ });
418
+ it('returns the response Body stream', async () => {
419
+ const fakeStream = { pipe: jest.fn() };
420
+ mockSend.mockResolvedValue({ Body: fakeStream });
421
+ const svc = makeService();
422
+ const result = await svc.getDownloadStream({ fileKey: 'photo.jpg', access: 'public' });
423
+ expect(result).toBe(fakeStream);
424
+ });
425
+ });
426
+ // ─── getAsBuffer() ────────────────────────────────────────────────────────────
427
+ describe('R2FileService — getAsBuffer()', () => {
428
+ it('throws when fileKey is missing', async () => {
429
+ const svc = makeService();
430
+ await expect(svc.getAsBuffer({ access: 'public' })).rejects.toThrow(utils_1.MedusaError);
431
+ });
432
+ it('sends GetObjectCommand to public bucket for public files', async () => {
433
+ const svc = makeService();
434
+ await svc.getAsBuffer({ fileKey: 'photo.jpg', access: 'public' });
435
+ expect(client_s3_1.GetObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'public-bucket', Key: 'photo.jpg' }));
436
+ });
437
+ it('sends GetObjectCommand to private bucket for private files', async () => {
438
+ const svc = makeService();
439
+ await svc.getAsBuffer({ fileKey: 'report.pdf', access: 'private' });
440
+ expect(client_s3_1.GetObjectCommand).toHaveBeenCalledWith(expect.objectContaining({ Bucket: 'private-bucket', Key: 'report.pdf' }));
441
+ });
442
+ it('returns file contents as a Buffer', async () => {
443
+ const content = new Uint8Array([1, 2, 3, 4, 5]);
444
+ mockSend.mockResolvedValue({
445
+ Body: { transformToByteArray: jest.fn().mockResolvedValue(content) }
446
+ });
447
+ const svc = makeService();
448
+ const result = await svc.getAsBuffer({ fileKey: 'data.bin', access: 'public' });
449
+ expect(Buffer.isBuffer(result)).toBe(true);
450
+ expect(result).toEqual(Buffer.from(content));
451
+ });
452
+ });
453
+ // ─── getUploadStream() ────────────────────────────────────────────────────────
454
+ describe('R2FileService — getUploadStream()', () => {
455
+ it('throws when filename is missing', async () => {
456
+ const svc = makeService();
457
+ await expect(svc.getUploadStream({ mimeType: 'image/jpeg', access: 'public' })).rejects.toThrow(utils_1.MedusaError);
458
+ });
459
+ it('returns writeStream, promise, url, and fileKey', async () => {
460
+ const svc = makeService();
461
+ const result = await svc.getUploadStream({
462
+ filename: 'video.mp4',
463
+ mimeType: 'video/mp4',
464
+ access: 'public'
465
+ });
466
+ expect(result.writeStream).toBeDefined();
467
+ expect(result.promise).toBeInstanceOf(Promise);
468
+ expect(result.url).toContain('cdn.example.com');
469
+ expect(result.fileKey).toMatch(/^video-TESTULID/);
470
+ });
471
+ it('passes public bucket to Upload for public access', async () => {
472
+ const svc = makeService();
473
+ await svc.getUploadStream({
474
+ filename: 'video.mp4',
475
+ mimeType: 'video/mp4',
476
+ access: 'public'
477
+ });
478
+ const uploadCall = lib_storage_1.Upload.mock.calls[0][0];
479
+ expect(uploadCall.params.Bucket).toBe('public-bucket');
480
+ });
481
+ it('passes private bucket to Upload for private access', async () => {
482
+ const svc = makeService();
483
+ await svc.getUploadStream({
484
+ filename: 'backup.zip',
485
+ mimeType: 'application/zip',
486
+ access: 'private'
487
+ });
488
+ const uploadCall = lib_storage_1.Upload.mock.calls[0][0];
489
+ expect(uploadCall.params.Bucket).toBe('private-bucket');
490
+ });
491
+ it('promise resolves to url + key for public upload', async () => {
492
+ mockUploadDone.mockResolvedValue({});
493
+ const svc = makeService();
494
+ const { promise } = await svc.getUploadStream({
495
+ filename: 'photo.jpg',
496
+ mimeType: 'image/jpeg',
497
+ access: 'public'
498
+ });
499
+ const result = await promise;
500
+ expect(result.url).toMatch(/^https:\/\/cdn\.example\.com\//);
501
+ expect(result.key).toMatch(/^photo-TESTULID/);
502
+ });
503
+ it('promise resolves to empty url for private upload', async () => {
504
+ mockUploadDone.mockResolvedValue({});
505
+ const svc = makeService();
506
+ const { promise } = await svc.getUploadStream({
507
+ filename: 'secret.zip',
508
+ mimeType: 'application/zip',
509
+ access: 'private'
510
+ });
511
+ const result = await promise;
512
+ expect(result.url).toBe('');
513
+ expect(result.key).toMatch(/^secret-TESTULID/);
514
+ });
515
+ });
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIudW5pdC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9fX3Rlc3RzX18vcHJvdmlkZXIudW5pdC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOEJBQThCO0FBQzlCLGtEQU0yQjtBQUMzQixzREFBNkM7QUFDN0Msd0VBQTREO0FBQzVELHFEQUF1RDtBQUN2RCw2Q0FBcUU7QUFFckUsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtBQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUE7QUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUVyRSxnRkFBZ0Y7QUFFaEYsTUFBTSxVQUFVLEdBQUcsd0RBQXdELENBQUE7QUFFM0UsTUFBTSxXQUFXLEdBQUc7SUFDbkIsTUFBTSxFQUFFLE1BQU07SUFDZCxNQUFNLEVBQUUsZUFBZTtJQUN2QixXQUFXLEVBQUUsWUFBWTtJQUN6QixlQUFlLEVBQUUsWUFBWTtJQUM3QixPQUFPLEVBQUUseUJBQXlCO0lBQ2xDLFFBQVEsRUFBRSwwQ0FBMEM7SUFDcEQsYUFBYSxFQUFFLE1BQU07SUFDckIsYUFBYSxFQUFFLGdCQUFnQjtJQUMvQixrQkFBa0IsRUFBRSxhQUFhO0lBQ2pDLHNCQUFzQixFQUFFLGFBQWE7SUFDckMsZUFBZSxFQUFFLGtEQUFrRDtDQUNuRSxDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUc7SUFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0NBQ2hCLENBQUE7QUFFRCxTQUFTLFdBQVcsQ0FBQyxZQUEyQyxFQUFFO0lBQ2pFLE9BQU8sSUFBSSx5QkFBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQWlCLEVBQUUsRUFBRSxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQTtBQUMzRixDQUFDO0FBRUQsaUZBQWlGO0FBRWpGLElBQUksUUFBbUIsQ0FBQTtBQUN2QixJQUFJLGNBQXlCLENBQUE7QUFFN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUVwQixRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1FBQ3RDLElBQUksRUFBRTtZQUNMLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzNGO0tBQ0QsQ0FBQyxDQUNEO0lBQUMsb0JBQThDLENBQUMsa0JBQWtCLENBQ2xFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBUSxDQUNyRCxDQUFBO0lBRUQsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FDL0M7SUFBQyxvQkFBMEMsQ0FBQyxrQkFBa0IsQ0FDOUQsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBUSxDQUN2QyxDQUNBO0lBQUMsbUNBQXlELENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUE7QUFDMUYsQ0FBQyxDQUFDLENBQUE7QUFFRixpRkFBaUY7QUFFakYsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUM1QyxFQUFFLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBVyxDQUFDLENBQUE7SUFDM0UsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBVyxDQUFDLENBQUE7SUFDL0UsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1FBQzFELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBVyxDQUFDLENBQUE7SUFDN0UsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFXLENBQUMsQ0FBQTtJQUNsRixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQzFDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxXQUFXLEVBQUUsQ0FBQTtRQUNiLE1BQU0sQ0FBQyxvQkFBUSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELE1BQU0sQ0FBRSxHQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNuRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7UUFDdEMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDbkQsTUFBTSxDQUFFLEdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtRQUN2RCxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNwRCxNQUFNLENBQUUsR0FBVyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUMzRSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUUsR0FBVyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM3RCxDQUFDLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUYsaUZBQWlGO0FBRWpGLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7SUFDbEQsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNoQixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsWUFBWTtZQUN0QixPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQjtZQUN0QyxNQUFNLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsNEJBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQ3BELENBQUE7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDMUMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDMUQsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7UUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtJQUNwRSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDL0IsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLFdBQVc7WUFDckIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsTUFBTSxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUNoRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsRSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDL0IsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLFdBQVc7WUFDckIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsTUFBTSxFQUFFLGFBQWE7U0FDZCxDQUFDLENBQUE7UUFDVCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ2xELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzVELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNoQixRQUFRLEVBQUUsYUFBYTtZQUN2QixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyw0QkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUM1QyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDdkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDakMsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUMsYUFBYSxDQUFDO2FBQ3RELENBQUM7U0FDRixDQUFDLENBQ0YsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNoQixRQUFRLEVBQUUsU0FBUztZQUNuQixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyw0QkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUM1QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUMzRCxDQUFBO0lBQ0YsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsOEJBQThCLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0MsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUEsQ0FBQyxxQkFBcUI7UUFDL0UsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLE9BQU8sRUFBRSxHQUFHO1lBQ1osTUFBTSxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFJLDRCQUE4RCxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUE7UUFDekYsTUFBTSxJQUFJLEdBQUksSUFBSSxDQUFDLENBQUMsQ0FBUyxDQUFDLElBQWMsQ0FBQTtRQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNsRCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNsRCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDaEIsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBSSw0QkFBOEQsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBO1FBQ3pGLE1BQU0sSUFBSSxHQUFJLElBQUksQ0FBQyxDQUFDLENBQVMsQ0FBQyxJQUFjLENBQUE7UUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUN0RCxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkMsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLE9BQU8sRUFBRSwyQ0FBMkM7WUFDcEQsTUFBTSxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckUsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxnQkFBZ0I7WUFDMUIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixPQUFPLEVBQUUsVUFBVTtZQUNuQixNQUFNLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQUE7UUFDRiw2Q0FBNkM7UUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEMsQ0FBQyxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUMsQ0FBQTtBQUVGLGlGQUFpRjtBQUVqRixRQUFRLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO0lBQ25ELEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3RCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDaEIsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixPQUFPLEVBQUUsVUFBVTtZQUNuQixNQUFNLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsNEJBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FDckQsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMvQixRQUFRLEVBQUUsWUFBWTtZQUN0QixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE1BQU0sRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDckQsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLE9BQU8sRUFBRSxrQkFBa0I7WUFDM0IsTUFBTSxFQUFFLFNBQVM7U0FDakIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDcEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDNUIsQ0FBQyxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUMsQ0FBQTtBQUVGLGlGQUFpRjtBQUVqRixRQUFRLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO0lBQ3RELEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNoRCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLE1BQU0sQ0FDWCxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVMsQ0FBQyxDQUNwRixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQVcsQ0FBQyxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUE7UUFDekQsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLENBQ1gsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUNWLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FDRixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDNUMsQ0FBQyxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUMsQ0FBQTtBQUVGLGdGQUFnRjtBQUVoRixRQUFRLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDckUsTUFBTSxDQUFDLCtCQUFtQixDQUFDLENBQUMsb0JBQW9CLENBQy9DLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FDL0UsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUN2RSxNQUFNLENBQUMsK0JBQW1CLENBQUMsQ0FBQyxvQkFBb0IsQ0FDL0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQ2pGLENBQUE7SUFDRixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqRSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDaEIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7WUFDM0MsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7U0FDM0MsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLGdDQUFvQixDQUFDLENBQUMsb0JBQW9CLENBQ2hELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUN2QixNQUFNLEVBQUUsZUFBZTtZQUN2QixNQUFNLEVBQUU7Z0JBQ1AsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZELEtBQUssRUFBRSxJQUFJO2FBQ1g7U0FDRCxDQUFDLENBQ0YsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzlELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1FBQ3RELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzVGLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtJQUM1QyxDQUFDLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUYsaUZBQWlGO0FBRWpGLFFBQVEsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7SUFDMUQsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDLHVCQUF1QixDQUFDO1lBQzdDLE9BQU8sRUFBRSxxQkFBcUI7WUFDOUIsTUFBTSxFQUFFLFNBQVM7U0FDakIsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM1QixNQUFNLENBQUMsbUNBQVksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzlDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JFLE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLHVCQUF1QixDQUFDO1lBQ2pDLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLE1BQU0sRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyw0QkFBZ0IsQ0FBQyxDQUFDLG9CQUFvQixDQUM1QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQ3hFLENBQUE7SUFDRixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRSxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZELE1BQU0sR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUM3RSxNQUFNLENBQUMsbUNBQVksQ0FBQyxDQUFDLG9CQUFvQixDQUN4QyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQ2pCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFDakIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQzVDLENBQUE7SUFDRixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLE1BQU0sQ0FDWCxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUN2RSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQVcsQ0FBQyxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQy9ELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sTUFBTSxDQUNYLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQ3ZFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBO0lBQ2xFLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRixpRkFBaUY7QUFFakYsUUFBUSxDQUFDLHlDQUF5QyxFQUFFLEdBQUcsRUFBRTtJQUN4RCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMscUJBQXFCLENBQUM7WUFDOUMsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixNQUFNLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQSxDQUFDLGdDQUFnQztJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqRCxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNsRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsY0FBYztZQUN4QixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLE1BQU0sRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFDN0MsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsOENBQThDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDN0QsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxHQUFHLENBQUMscUJBQXFCLENBQUM7WUFDL0IsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixNQUFNLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsNEJBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FDckQsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3JELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLHFCQUFxQixDQUFDO1lBQy9CLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0IsTUFBTSxFQUFFLFNBQVM7WUFDakIsU0FBUyxFQUFFLEdBQUc7U0FDZCxDQUFDLENBQUE7UUFDRixNQUFNLENBQUMsbUNBQVksQ0FBQyxDQUFDLG9CQUFvQixDQUN4QyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQ2pCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFDakIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQzNDLENBQUE7SUFDRixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztZQUMvQixRQUFRLEVBQUUsWUFBWTtZQUN0QixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLE1BQU0sRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxtQ0FBWSxDQUFDLENBQUMsb0JBQW9CLENBQ3hDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFDakIsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUNqQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDNUMsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sTUFBTSxDQUNYLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztZQUN6QixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsWUFBWTtZQUN0QixNQUFNLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQ0YsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFXLENBQUMsQ0FBQTtJQUMvQixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM1RCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLE1BQU0sQ0FDWCxHQUFHLENBQUMscUJBQXFCLENBQUM7WUFDekIsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixNQUFNLEVBQUUsU0FBUztTQUNWLENBQUMsQ0FDVCxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsbUJBQVcsQ0FBQyxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRixpRkFBaUY7QUFFakYsUUFBUSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtJQUNwRCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFXLENBQUMsQ0FBQTtJQUM5RixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN6RSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDdkUsTUFBTSxDQUFDLDRCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQzVDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQ3RFLENBQUE7SUFDRixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMzRSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDekUsTUFBTSxDQUFDLDRCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQzVDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FDeEUsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pELE1BQU0sVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQ3RDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUN0RixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2hDLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRixpRkFBaUY7QUFFakYsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM5QyxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0MsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBVyxDQUFDLENBQUE7SUFDeEYsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDekUsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxNQUFNLENBQUMsNEJBQWdCLENBQUMsQ0FBQyxvQkFBb0IsQ0FDNUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FDdEUsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQzNFLE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDbkUsTUFBTSxDQUFDLDRCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQzVDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FDeEUsQ0FBQTtJQUNGLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDL0MsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQzFCLElBQUksRUFBRSxFQUFFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtTQUNwRSxDQUFDLENBQUE7UUFDRixNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzdDLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFRixpRkFBaUY7QUFFakYsUUFBUSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsRUFBRTtJQUNsRCxFQUFFLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDaEQsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLENBQ1gsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBUyxDQUFDLENBQ3hFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQkFBVyxDQUFDLENBQUE7SUFDL0IsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsZ0RBQWdELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDL0QsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQ3hDLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ2xELENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2pFLE1BQU0sR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFBO1FBQ3pCLE1BQU0sR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN6QixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsV0FBVztZQUNyQixNQUFNLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQUE7UUFDRixNQUFNLFVBQVUsR0FBSSxvQkFBMEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sQ0FBRSxVQUFVLENBQUMsTUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoRSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuRSxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDekIsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixNQUFNLEVBQUUsU0FBUztTQUNqQixDQUFDLENBQUE7UUFDRixNQUFNLFVBQVUsR0FBSSxvQkFBMEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQy9FLE1BQU0sQ0FBRSxVQUFVLENBQUMsTUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ2pFLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hFLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQTtRQUN6QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsZUFBZSxDQUFDO1lBQzdDLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLE1BQU0sRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFBO1FBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7UUFDNUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUM5QyxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNqRSxjQUFjLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDcEMsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUE7UUFDekIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUM3QyxRQUFRLEVBQUUsWUFBWTtZQUN0QixRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLE1BQU0sRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFBO1FBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDL0MsQ0FBQyxDQUFDLENBQUE7QUFDSCxDQUFDLENBQUMsQ0FBQSJ9
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@medusajs/types").ModuleProviderExports;
2
+ export default _default;
3
+ export * from './provider';
@@ -1,8 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
17
  const utils_1 = require("@medusajs/framework/utils");
4
18
  const provider_1 = require("./provider");
5
19
  exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.FILE, {
6
20
  services: [provider_1.R2FileProvider]
7
21
  });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3IyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQW1FO0FBQ25FLHlDQUEyQztBQUUzQyxrQkFBZSxJQUFBLHNCQUFjLEVBQUMsZUFBTyxDQUFDLElBQUksRUFBRTtJQUMzQyxRQUFRLEVBQUUsQ0FBQyx5QkFBYyxDQUFDO0NBQzFCLENBQUMsQ0FBQSJ9
22
+ __exportStar(require("./provider"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3IyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBbUU7QUFDbkUseUNBQTJDO0FBRTNDLGtCQUFlLElBQUEsc0JBQWMsRUFBQyxlQUFPLENBQUMsSUFBSSxFQUFFO0lBQzNDLFFBQVEsRUFBRSxDQUFDLHlCQUFjLENBQUM7Q0FDMUIsQ0FBQyxDQUFBO0FBRUYsNkNBQTBCIn0=
@@ -0,0 +1,52 @@
1
+ import { S3Client } from '@aws-sdk/client-s3';
2
+ import { FileTypes, Logger } from '@medusajs/framework/types';
3
+ import { AbstractFileProviderService } from '@medusajs/framework/utils';
4
+ import { Readable, Writable } from 'stream';
5
+ type InjectedDependencies = {
6
+ logger: Logger;
7
+ };
8
+ export interface R2FileProviderConfig {
9
+ region: string;
10
+ bucket: string;
11
+ accessKeyId?: string;
12
+ secretAccessKey?: string;
13
+ fileUrl: string;
14
+ endpoint?: string;
15
+ globalPrefix?: string;
16
+ cacheControl?: string;
17
+ downloadFileDuration?: number;
18
+ additionalClientConfig?: Record<string, any>;
19
+ privateRegion?: string;
20
+ privateBucket?: string;
21
+ privateAccessKeyId?: string;
22
+ privateSecretAccessKey?: string;
23
+ privateEndpoint?: string;
24
+ }
25
+ export declare class R2FileProvider extends AbstractFileProviderService {
26
+ static identifier: string;
27
+ protected config_: R2FileProviderConfig;
28
+ protected logger_: Logger;
29
+ protected client_: S3Client;
30
+ protected privateClient_: S3Client;
31
+ constructor({ logger }: InjectedDependencies, options: R2FileProviderConfig);
32
+ protected getClient(priv?: boolean): S3Client;
33
+ upload(file: FileTypes.ProviderUploadFileDTO & {
34
+ prefix?: string;
35
+ }): Promise<FileTypes.ProviderFileResultDTO>;
36
+ getUploadStream(fileData: FileTypes.ProviderUploadStreamDTO & {
37
+ prefix?: string;
38
+ }): Promise<{
39
+ writeStream: Writable;
40
+ promise: Promise<FileTypes.ProviderFileResultDTO>;
41
+ url: string;
42
+ fileKey: string;
43
+ }>;
44
+ delete(files: FileTypes.ProviderDeleteFileDTO | FileTypes.ProviderDeleteFileDTO[]): Promise<void>;
45
+ deleteByUrl(url: string): Promise<void>;
46
+ getPresignedDownloadUrl(fileData: FileTypes.ProviderGetFileDTO): Promise<string>;
47
+ getPresignedUploadUrl(fileData: FileTypes.ProviderGetPresignedUploadUrlDTO): Promise<FileTypes.ProviderFileResultDTO>;
48
+ getDownloadStream(file: FileTypes.ProviderGetFileDTO): Promise<Readable>;
49
+ getAsBuffer(file: FileTypes.ProviderGetFileDTO): Promise<Buffer>;
50
+ private getFileKey;
51
+ }
52
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "medusa-plugin-r2",
3
- "version": "1.0.4",
3
+ "version": "1.1.1",
4
4
  "description": "R2 file storage provider for Medusa v2",
5
5
  "author": "Lacey Pevey",
6
6
  "license": "MIT",
@@ -14,11 +14,26 @@
14
14
  ],
15
15
  "exports": {
16
16
  "./package.json": "./package.json",
17
- "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
18
- "./modules/*": "./.medusa/server/src/modules/*/index.js",
19
- "./providers/*": "./.medusa/server/src/providers/*/index.js",
20
- "./*": "./.medusa/server/src/*.js",
21
- ".": "./.medusa/server/src/providers/r2/index.js"
17
+ "./.medusa/server/src/modules/*": {
18
+ "types": "./.medusa/server/src/modules/*/index.d.ts",
19
+ "default": "./.medusa/server/src/modules/*/index.js"
20
+ },
21
+ "./modules/*": {
22
+ "types": "./.medusa/server/src/modules/*/index.d.ts",
23
+ "default": "./.medusa/server/src/modules/*/index.js"
24
+ },
25
+ "./providers/*": {
26
+ "types": "./.medusa/server/src/providers/*/index.d.ts",
27
+ "default": "./.medusa/server/src/providers/*/index.js"
28
+ },
29
+ "./*": {
30
+ "types": "./.medusa/server/src/*.d.ts",
31
+ "default": "./.medusa/server/src/*.js"
32
+ },
33
+ ".": {
34
+ "types": "./.medusa/server/src/providers/r2/index.d.ts",
35
+ "default": "./.medusa/server/src/providers/r2/index.js"
36
+ }
22
37
  },
23
38
  "keywords": [
24
39
  "medusa-plugin-integration",
@@ -39,40 +54,35 @@
39
54
  "test:integration": "NODE_OPTIONS=--experimental-vm-modules jest --silent --runInBand --detectOpenHandles --forceExit -- integration-tests"
40
55
  },
41
56
  "devDependencies": {
42
- "@medusajs/admin-sdk": "2.13.6",
43
- "@medusajs/cli": "2.13.6",
44
- "@medusajs/framework": "2.13.6",
45
- "@medusajs/icons": "2.13.6",
46
- "@medusajs/medusa": "2.13.6",
47
- "@medusajs/test-utils": "2.13.6",
48
- "@medusajs/ui": "4.0.25",
49
- "@swc/core": "^1.7.28",
50
- "@swc/jest": "^0.2.39",
51
- "@types/jest": "^30.0.0",
52
- "@types/node": "^20.0.0",
53
- "@types/react": "^18.3.2",
54
- "@types/react-dom": "^18.2.25",
55
- "axios": "^1.7.0",
56
- "jest": "^29.7.0",
57
- "prop-types": "^15.8.1",
58
- "react": "^18.2.0",
59
- "react-dom": "^18.2.0",
60
- "ts-node": "^10.9.2",
61
- "typescript": "^5.6.2",
62
- "vite": "^5.2.11",
63
- "yalc": "^1.0.0-pre.53"
57
+ "@medusajs/admin-sdk": "2.16.0",
58
+ "@medusajs/cli": "2.16.0",
59
+ "@medusajs/framework": "2.16.0",
60
+ "@medusajs/icons": "2.16.0",
61
+ "@medusajs/ui": "4.1.16",
62
+ "@swc/core": "1.15.33",
63
+ "@swc/jest": "0.2.39",
64
+ "@types/jest": "30.0.0",
65
+ "@types/node": "20.0.0",
66
+ "@types/react": "18.3.2",
67
+ "@types/react-dom": "18.2.25",
68
+ "axios": "1.7.0",
69
+ "jest": "29.7.0",
70
+ "prop-types": "15.8.1",
71
+ "react": "18.3.1",
72
+ "react-dom": "18.3.1",
73
+ "ts-node": "10.9.2",
74
+ "typescript": "6.0.3",
75
+ "vite": "8.0.8",
76
+ "yalc": "1.0.0-pre.53"
64
77
  },
65
78
  "peerDependencies": {
66
- "@medusajs/admin-sdk": "2.13.6",
67
- "@medusajs/cli": "2.13.6",
68
- "@medusajs/framework": "2.13.6",
69
- "@medusajs/icons": "2.13.6",
70
- "@medusajs/medusa": "2.13.6",
71
- "@medusajs/test-utils": "2.13.6",
72
- "@medusajs/ui": "4.0.25"
79
+ "@medusajs/framework": "2.16.0",
80
+ "@medusajs/js-sdk": "2.16.0",
81
+ "@medusajs/medusa": "2.16.0"
73
82
  },
74
83
  "engines": {
75
84
  "node": ">=20"
76
85
  },
77
- "packageManager": "yarn@4.13.0+sha512.5c20ba010c99815433e5c8453112165e673f1c7948d8d2b267f4b5e52097538658388ebc9f9580656d9b75c5cc996f990f611f99304a2197d4c56d21eea370e7"
78
- }
86
+ "packageManager": "yarn@4.13.0+sha512.5c20ba010c99815433e5c8453112165e673f1c7948d8d2b267f4b5e52097538658388ebc9f9580656d9b75c5cc996f990f611f99304a2197d4c56d21eea370e7",
87
+ "gitHead": "e09c71de0e01897fa9441b40b67315b5a7b6d5bf"
88
+ }