@flusys/nestjs-storage 7.1.0 → 8.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/index.d.ts +3 -3
- package/controllers/file-manager.controller.d.ts +4 -4
- package/controllers/folder.controller.d.ts +2 -2
- package/controllers/index.d.ts +4 -4
- package/controllers/storage-config.controller.d.ts +2 -2
- package/controllers/upload.controller.d.ts +3 -3
- package/docs/index.d.ts +1 -1
- package/docs/storage-swagger.config.d.ts +2 -2
- package/dtos/index.d.ts +4 -4
- package/entities/file-manager-with-company.entity.d.ts +2 -2
- package/entities/file-manager.entity.d.ts +1 -1
- package/entities/folder-with-company.entity.d.ts +1 -1
- package/entities/index.d.ts +15 -15
- package/entities/storage-config-with-company.entity.d.ts +1 -1
- package/enums/index.d.ts +1 -1
- package/fesm/493.js +2768 -0
- package/fesm/537.js +1157 -0
- package/fesm/562.js +786 -0
- package/fesm/{providers/azure-provider.optional.js → chunks/190.js} +33 -30
- package/fesm/chunks/252.js +12 -0
- package/fesm/chunks/327.js +12 -0
- package/fesm/chunks/385.js +12 -0
- package/fesm/{providers/s3-provider.optional.js → chunks/591.js} +37 -34
- package/fesm/chunks/746.js +12 -0
- package/fesm/chunks/798.js +12 -0
- package/fesm/{providers/sftp-provider.optional.js → chunks/918.js} +35 -31
- package/fesm/config/index.js +119 -3
- package/fesm/controllers/index.js +16 -4
- package/fesm/docs/index.js +206 -1
- package/fesm/dtos/index.js +879 -4
- package/fesm/entities/index.js +463 -18
- package/fesm/enums/index.js +36 -1
- package/fesm/index.js +398 -12
- package/fesm/interfaces/index.js +19 -5
- package/fesm/modules/index.js +16 -1
- package/fesm/providers/index.js +364 -3
- package/fesm/runtime.js +252 -0
- package/fesm/services/index.js +16 -6
- package/fesm/utils/index.js +149 -1
- package/index.d.ts +11 -11
- package/interfaces/file-manager.interface.d.ts +1 -1
- package/interfaces/folder.interface.d.ts +1 -1
- package/interfaces/index.d.ts +5 -5
- package/interfaces/storage-config.interface.d.ts +1 -1
- package/interfaces/storage-module-options.interface.d.ts +3 -3
- package/interfaces/storage-provider.interface.d.ts +1 -1
- package/middlewares/file-serve.middleware.d.ts +4 -3
- package/middlewares/index.d.ts +1 -1
- package/modules/index.d.ts +1 -1
- package/modules/storage.module.d.ts +2 -2
- package/package.json +30 -41
- package/providers/azure-provider.optional.d.ts +2 -2
- package/providers/index.d.ts +3 -3
- package/providers/local-provider.d.ts +2 -2
- package/providers/s3-provider.optional.d.ts +2 -2
- package/providers/sftp-provider.optional.d.ts +2 -2
- package/providers/storage-factory.service.d.ts +3 -3
- package/providers/storage-provider.registry.d.ts +2 -2
- package/services/file-manager.service.d.ts +9 -8
- package/services/folder.service.d.ts +6 -6
- package/services/index.d.ts +6 -6
- package/services/storage-config.service.d.ts +3 -3
- package/services/storage-datasource.provider.d.ts +3 -3
- package/services/storage-provider-config.service.d.ts +7 -7
- package/services/upload.service.d.ts +6 -6
- package/utils/image-compressor.util.d.ts +1 -1
- package/utils/index.d.ts +1 -1
- package/cjs/config/event-actions.js +0 -34
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -46
- package/cjs/config/storage.constants.js +0 -28
- package/cjs/controllers/file-manager.controller.js +0 -152
- package/cjs/controllers/file-manager.controller.spec.js +0 -135
- package/cjs/controllers/folder.controller.js +0 -102
- package/cjs/controllers/folder.controller.spec.js +0 -86
- package/cjs/controllers/index.js +0 -21
- package/cjs/controllers/storage-config.controller.js +0 -102
- package/cjs/controllers/storage-config.controller.spec.js +0 -85
- package/cjs/controllers/upload.controller.js +0 -234
- package/cjs/controllers/upload.controller.spec.js +0 -132
- package/cjs/docs/index.js +0 -11
- package/cjs/docs/storage-swagger.config.js +0 -188
- package/cjs/docs/storage-swagger.config.spec.js +0 -72
- package/cjs/dtos/file-manager.dto.js +0 -327
- package/cjs/dtos/folder.dto.js +0 -105
- package/cjs/dtos/index.js +0 -21
- package/cjs/dtos/storage-config.dto.js +0 -170
- package/cjs/dtos/upload.dto.js +0 -272
- package/cjs/entities/file-manager-with-company.entity.js +0 -61
- package/cjs/entities/file-manager.entity.js +0 -122
- package/cjs/entities/folder-with-company.entity.js +0 -55
- package/cjs/entities/folder.entity.js +0 -64
- package/cjs/entities/index.js +0 -63
- package/cjs/entities/index.spec.js +0 -18
- package/cjs/entities/storage-config-with-company.entity.js +0 -51
- package/cjs/entities/storage-config.entity.js +0 -96
- package/cjs/enums/file-location.enum.js +0 -17
- package/cjs/enums/index.js +0 -18
- package/cjs/index.js +0 -29
- package/cjs/interfaces/file-manager.interface.js +0 -4
- package/cjs/interfaces/folder.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -22
- package/cjs/interfaces/storage-config.interface.js +0 -4
- package/cjs/interfaces/storage-module-options.interface.js +0 -4
- package/cjs/interfaces/storage-provider.interface.js +0 -4
- package/cjs/middlewares/file-serve.middleware.js +0 -241
- package/cjs/middlewares/file-serve.middleware.spec.js +0 -211
- package/cjs/middlewares/index.js +0 -18
- package/cjs/modules/index.js +0 -18
- package/cjs/modules/storage.module.js +0 -165
- package/cjs/modules/storage.module.spec.js +0 -184
- package/cjs/providers/azure-provider.optional.js +0 -155
- package/cjs/providers/azure-provider.optional.spec.js +0 -228
- package/cjs/providers/index.js +0 -26
- package/cjs/providers/local-provider.js +0 -230
- package/cjs/providers/local-provider.spec.js +0 -239
- package/cjs/providers/s3-provider.optional.js +0 -175
- package/cjs/providers/s3-provider.optional.spec.js +0 -243
- package/cjs/providers/sftp-provider.optional.js +0 -203
- package/cjs/providers/sftp-provider.optional.spec.js +0 -217
- package/cjs/providers/storage-factory.service.js +0 -175
- package/cjs/providers/storage-factory.service.spec.js +0 -253
- package/cjs/providers/storage-provider.registry.js +0 -41
- package/cjs/providers/storage-provider.registry.spec.js +0 -67
- package/cjs/services/file-manager.service.js +0 -387
- package/cjs/services/file-manager.service.spec.js +0 -580
- package/cjs/services/folder.service.js +0 -101
- package/cjs/services/folder.service.spec.js +0 -167
- package/cjs/services/index.js +0 -23
- package/cjs/services/storage-config.service.js +0 -129
- package/cjs/services/storage-config.service.spec.js +0 -257
- package/cjs/services/storage-datasource.provider.js +0 -137
- package/cjs/services/storage-datasource.provider.spec.js +0 -217
- package/cjs/services/storage-provider-config.service.js +0 -171
- package/cjs/services/storage-provider-config.service.spec.js +0 -265
- package/cjs/services/upload.service.js +0 -376
- package/cjs/services/upload.service.spec.js +0 -426
- package/cjs/utils/file-validator.util.js +0 -440
- package/cjs/utils/file-validator.util.spec.js +0 -259
- package/cjs/utils/image-compressor.util.js +0 -162
- package/cjs/utils/image-compressor.util.spec.js +0 -166
- package/cjs/utils/index.js +0 -18
- package/fesm/config/event-actions.js +0 -13
- package/fesm/config/message-keys.js +0 -22
- package/fesm/config/storage.constants.js +0 -7
- package/fesm/controllers/file-manager.controller.js +0 -142
- package/fesm/controllers/file-manager.controller.spec.js +0 -131
- package/fesm/controllers/folder.controller.js +0 -92
- package/fesm/controllers/folder.controller.spec.js +0 -82
- package/fesm/controllers/storage-config.controller.js +0 -92
- package/fesm/controllers/storage-config.controller.spec.js +0 -81
- package/fesm/controllers/upload.controller.js +0 -224
- package/fesm/controllers/upload.controller.spec.js +0 -128
- package/fesm/docs/storage-swagger.config.js +0 -181
- package/fesm/docs/storage-swagger.config.spec.js +0 -68
- package/fesm/dtos/file-manager.dto.js +0 -300
- package/fesm/dtos/folder.dto.js +0 -84
- package/fesm/dtos/storage-config.dto.js +0 -149
- package/fesm/dtos/upload.dto.js +0 -245
- package/fesm/entities/file-manager-with-company.entity.js +0 -51
- package/fesm/entities/file-manager.entity.js +0 -112
- package/fesm/entities/folder-with-company.entity.js +0 -45
- package/fesm/entities/folder.entity.js +0 -54
- package/fesm/entities/index.spec.js +0 -14
- package/fesm/entities/storage-config-with-company.entity.js +0 -41
- package/fesm/entities/storage-config.entity.js +0 -86
- package/fesm/enums/file-location.enum.js +0 -7
- package/fesm/interfaces/file-manager.interface.js +0 -1
- package/fesm/interfaces/folder.interface.js +0 -1
- package/fesm/interfaces/storage-config.interface.js +0 -1
- package/fesm/interfaces/storage-module-options.interface.js +0 -3
- package/fesm/interfaces/storage-provider.interface.js +0 -4
- package/fesm/middlewares/file-serve.middleware.js +0 -190
- package/fesm/middlewares/file-serve.middleware.spec.js +0 -207
- package/fesm/middlewares/index.js +0 -1
- package/fesm/modules/storage.module.js +0 -156
- package/fesm/modules/storage.module.spec.js +0 -180
- package/fesm/providers/azure-provider.optional.spec.js +0 -224
- package/fesm/providers/local-provider.js +0 -182
- package/fesm/providers/local-provider.spec.js +0 -194
- package/fesm/providers/s3-provider.optional.spec.js +0 -239
- package/fesm/providers/sftp-provider.optional.spec.js +0 -213
- package/fesm/providers/storage-factory.service.js +0 -124
- package/fesm/providers/storage-factory.service.spec.js +0 -249
- package/fesm/providers/storage-provider.registry.js +0 -34
- package/fesm/providers/storage-provider.registry.spec.js +0 -63
- package/fesm/services/file-manager.service.js +0 -336
- package/fesm/services/file-manager.service.spec.js +0 -576
- package/fesm/services/folder.service.js +0 -91
- package/fesm/services/folder.service.spec.js +0 -163
- package/fesm/services/storage-config.service.js +0 -119
- package/fesm/services/storage-config.service.spec.js +0 -253
- package/fesm/services/storage-datasource.provider.js +0 -86
- package/fesm/services/storage-datasource.provider.spec.js +0 -172
- package/fesm/services/storage-provider-config.service.js +0 -161
- package/fesm/services/storage-provider-config.service.spec.js +0 -261
- package/fesm/services/upload.service.js +0 -366
- package/fesm/services/upload.service.spec.js +0 -422
- package/fesm/utils/file-validator.util.js +0 -433
- package/fesm/utils/file-validator.util.spec.js +0 -255
- package/fesm/utils/image-compressor.util.js +0 -114
- package/fesm/utils/image-compressor.util.spec.js +0 -162
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import * as sharpModule from 'sharp';
|
|
2
|
-
// Handle ESM/CJS interop - sharp exports differently in each module system
|
|
3
|
-
const sharp = sharpModule.default || sharpModule;
|
|
4
|
-
/**
|
|
5
|
-
* Image Compression Utility
|
|
6
|
-
* Handles image compression and format conversion using sharp
|
|
7
|
-
*/ export class ImageCompressor {
|
|
8
|
-
/**
|
|
9
|
-
* Dynamically compresses an image based on its format and provided options.
|
|
10
|
-
* - Preserves original format if not overridden
|
|
11
|
-
* - Adjusts compression settings for each codec
|
|
12
|
-
*/ static async compress(buffer, mimetype, options = {}) {
|
|
13
|
-
const { maxWidth = 1280, maxHeight = 1280, quality = 85, format = 'original' } = options;
|
|
14
|
-
// Skip processing for SVG
|
|
15
|
-
if (mimetype === 'image/svg+xml') {
|
|
16
|
-
return {
|
|
17
|
-
buffer,
|
|
18
|
-
format: mimetype
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
// Initialize sharp with improved error handling
|
|
22
|
-
const image = sharp(buffer, {
|
|
23
|
-
failOnError: false,
|
|
24
|
-
density: 300
|
|
25
|
-
});
|
|
26
|
-
// Apply initial resize
|
|
27
|
-
image.resize({
|
|
28
|
-
width: maxWidth,
|
|
29
|
-
height: maxHeight,
|
|
30
|
-
fit: 'inside',
|
|
31
|
-
withoutEnlargement: true
|
|
32
|
-
});
|
|
33
|
-
// Determine target format
|
|
34
|
-
let targetFormat = format !== 'original' ? format : mimetype.split('/')[1];
|
|
35
|
-
// Format-specific optimizations
|
|
36
|
-
switch(targetFormat.toLowerCase()){
|
|
37
|
-
case 'jpeg':
|
|
38
|
-
case 'jpg':
|
|
39
|
-
image.jpeg({
|
|
40
|
-
quality,
|
|
41
|
-
mozjpeg: true,
|
|
42
|
-
chromaSubsampling: '4:4:4'
|
|
43
|
-
});
|
|
44
|
-
break;
|
|
45
|
-
case 'png':
|
|
46
|
-
image.png({
|
|
47
|
-
compressionLevel: 9,
|
|
48
|
-
adaptiveFiltering: true,
|
|
49
|
-
palette: true,
|
|
50
|
-
quality,
|
|
51
|
-
colors: 256,
|
|
52
|
-
dither: 1.0
|
|
53
|
-
});
|
|
54
|
-
break;
|
|
55
|
-
case 'webp':
|
|
56
|
-
image.webp({
|
|
57
|
-
quality,
|
|
58
|
-
smartSubsample: true,
|
|
59
|
-
effort: 6,
|
|
60
|
-
lossless: quality === 100
|
|
61
|
-
});
|
|
62
|
-
break;
|
|
63
|
-
case 'avif':
|
|
64
|
-
image.avif({
|
|
65
|
-
quality,
|
|
66
|
-
effort: 6,
|
|
67
|
-
chromaSubsampling: '4:4:4'
|
|
68
|
-
});
|
|
69
|
-
break;
|
|
70
|
-
case 'tiff':
|
|
71
|
-
image.tiff({
|
|
72
|
-
quality,
|
|
73
|
-
compression: 'lzw',
|
|
74
|
-
predictor: 'horizontal',
|
|
75
|
-
pyramid: true
|
|
76
|
-
});
|
|
77
|
-
break;
|
|
78
|
-
case 'gif':
|
|
79
|
-
image.gif({
|
|
80
|
-
colours: 256,
|
|
81
|
-
effort: 10,
|
|
82
|
-
dither: 1
|
|
83
|
-
});
|
|
84
|
-
break;
|
|
85
|
-
case 'jp2':
|
|
86
|
-
image.jp2({
|
|
87
|
-
quality,
|
|
88
|
-
lossless: quality === 100
|
|
89
|
-
});
|
|
90
|
-
break;
|
|
91
|
-
default:
|
|
92
|
-
// Fallback to WebP for best compression/quality ratio
|
|
93
|
-
targetFormat = 'webp';
|
|
94
|
-
image.webp({
|
|
95
|
-
quality,
|
|
96
|
-
smartSubsample: true,
|
|
97
|
-
effort: 6
|
|
98
|
-
});
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const compressedBuffer = await image.toBuffer();
|
|
103
|
-
return {
|
|
104
|
-
buffer: compressedBuffer,
|
|
105
|
-
format: `image/${targetFormat}`
|
|
106
|
-
};
|
|
107
|
-
} catch {
|
|
108
|
-
return {
|
|
109
|
-
buffer,
|
|
110
|
-
format: mimetype
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
const mockToBuffer = jest.fn();
|
|
2
|
-
const mockJpeg = jest.fn();
|
|
3
|
-
const mockPng = jest.fn();
|
|
4
|
-
const mockWebp = jest.fn();
|
|
5
|
-
const mockAvif = jest.fn();
|
|
6
|
-
const mockTiff = jest.fn();
|
|
7
|
-
const mockGif = jest.fn();
|
|
8
|
-
const mockJp2 = jest.fn();
|
|
9
|
-
const mockResize = jest.fn();
|
|
10
|
-
function buildChainableImage() {
|
|
11
|
-
const image = {};
|
|
12
|
-
image.resize = mockResize.mockReturnValue(image);
|
|
13
|
-
image.jpeg = mockJpeg.mockReturnValue(image);
|
|
14
|
-
image.png = mockPng.mockReturnValue(image);
|
|
15
|
-
image.webp = mockWebp.mockReturnValue(image);
|
|
16
|
-
image.avif = mockAvif.mockReturnValue(image);
|
|
17
|
-
image.tiff = mockTiff.mockReturnValue(image);
|
|
18
|
-
image.gif = mockGif.mockReturnValue(image);
|
|
19
|
-
image.jp2 = mockJp2.mockReturnValue(image);
|
|
20
|
-
image.toBuffer = mockToBuffer;
|
|
21
|
-
return image;
|
|
22
|
-
}
|
|
23
|
-
const mockSharpFactory = jest.fn();
|
|
24
|
-
jest.mock('sharp', ()=>{
|
|
25
|
-
const factory = (...args)=>mockSharpFactory(...args);
|
|
26
|
-
return {
|
|
27
|
-
__esModule: true,
|
|
28
|
-
default: factory
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
import { ImageCompressor } from './image-compressor.util';
|
|
32
|
-
describe('ImageCompressor', ()=>{
|
|
33
|
-
beforeEach(()=>{
|
|
34
|
-
jest.clearAllMocks();
|
|
35
|
-
mockSharpFactory.mockImplementation(()=>buildChainableImage());
|
|
36
|
-
mockToBuffer.mockResolvedValue(Buffer.from('compressed-image-data'));
|
|
37
|
-
});
|
|
38
|
-
it('returns the buffer unchanged for image/svg+xml without invoking sharp', async ()=>{
|
|
39
|
-
const buffer = Buffer.from('<svg></svg>');
|
|
40
|
-
const result = await ImageCompressor.compress(buffer, 'image/svg+xml');
|
|
41
|
-
expect(result.buffer).toBe(buffer);
|
|
42
|
-
expect(result.format).toBe('image/svg+xml');
|
|
43
|
-
expect(mockSharpFactory).not.toHaveBeenCalled();
|
|
44
|
-
});
|
|
45
|
-
it('resizes using default maxWidth/maxHeight when no options are provided', async ()=>{
|
|
46
|
-
await ImageCompressor.compress(Buffer.from('jpeg-bytes'), 'image/jpeg');
|
|
47
|
-
expect(mockResize).toHaveBeenCalledWith(expect.objectContaining({
|
|
48
|
-
width: 1280,
|
|
49
|
-
height: 1280,
|
|
50
|
-
fit: 'inside',
|
|
51
|
-
withoutEnlargement: true
|
|
52
|
-
}));
|
|
53
|
-
});
|
|
54
|
-
it('resizes using custom maxWidth/maxHeight when provided', async ()=>{
|
|
55
|
-
await ImageCompressor.compress(Buffer.from('jpeg-bytes'), 'image/jpeg', {
|
|
56
|
-
maxWidth: 500,
|
|
57
|
-
maxHeight: 600
|
|
58
|
-
});
|
|
59
|
-
expect(mockResize).toHaveBeenCalledWith(expect.objectContaining({
|
|
60
|
-
width: 500,
|
|
61
|
-
height: 600
|
|
62
|
-
}));
|
|
63
|
-
});
|
|
64
|
-
it('preserves the original format (derived from mimetype) when format is "original"', async ()=>{
|
|
65
|
-
const result = await ImageCompressor.compress(Buffer.from('png-bytes'), 'image/png', {
|
|
66
|
-
format: 'original'
|
|
67
|
-
});
|
|
68
|
-
expect(mockPng).toHaveBeenCalled();
|
|
69
|
-
expect(result.format).toBe('image/png');
|
|
70
|
-
});
|
|
71
|
-
it('applies jpeg-specific compression options with quality', async ()=>{
|
|
72
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/jpeg', {
|
|
73
|
-
quality: 70
|
|
74
|
-
});
|
|
75
|
-
expect(mockJpeg).toHaveBeenCalledWith(expect.objectContaining({
|
|
76
|
-
quality: 70,
|
|
77
|
-
mozjpeg: true
|
|
78
|
-
}));
|
|
79
|
-
});
|
|
80
|
-
it('applies png-specific compression options', async ()=>{
|
|
81
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/png', {
|
|
82
|
-
quality: 90
|
|
83
|
-
});
|
|
84
|
-
expect(mockPng).toHaveBeenCalledWith(expect.objectContaining({
|
|
85
|
-
quality: 90,
|
|
86
|
-
colors: 256
|
|
87
|
-
}));
|
|
88
|
-
});
|
|
89
|
-
it('applies webp-specific options and sets lossless=true only when quality is 100', async ()=>{
|
|
90
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/webp', {
|
|
91
|
-
quality: 100,
|
|
92
|
-
format: 'webp'
|
|
93
|
-
});
|
|
94
|
-
expect(mockWebp).toHaveBeenCalledWith(expect.objectContaining({
|
|
95
|
-
quality: 100,
|
|
96
|
-
lossless: true
|
|
97
|
-
}));
|
|
98
|
-
});
|
|
99
|
-
it('applies webp-specific options with lossless=false for quality < 100', async ()=>{
|
|
100
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/webp', {
|
|
101
|
-
quality: 80,
|
|
102
|
-
format: 'webp'
|
|
103
|
-
});
|
|
104
|
-
expect(mockWebp).toHaveBeenCalledWith(expect.objectContaining({
|
|
105
|
-
quality: 80,
|
|
106
|
-
lossless: false
|
|
107
|
-
}));
|
|
108
|
-
});
|
|
109
|
-
it('applies avif-specific compression options', async ()=>{
|
|
110
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/avif', {
|
|
111
|
-
format: 'avif'
|
|
112
|
-
});
|
|
113
|
-
expect(mockAvif).toHaveBeenCalled();
|
|
114
|
-
});
|
|
115
|
-
it('applies tiff-specific compression options', async ()=>{
|
|
116
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/tiff', {
|
|
117
|
-
format: 'tiff'
|
|
118
|
-
});
|
|
119
|
-
expect(mockTiff).toHaveBeenCalled();
|
|
120
|
-
});
|
|
121
|
-
it('applies gif-specific compression options', async ()=>{
|
|
122
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/gif', {
|
|
123
|
-
format: 'gif'
|
|
124
|
-
});
|
|
125
|
-
expect(mockGif).toHaveBeenCalled();
|
|
126
|
-
});
|
|
127
|
-
it('applies jp2-specific compression options', async ()=>{
|
|
128
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/jp2', {
|
|
129
|
-
format: 'jp2'
|
|
130
|
-
});
|
|
131
|
-
expect(mockJp2).toHaveBeenCalled();
|
|
132
|
-
});
|
|
133
|
-
it('falls back to webp for an unrecognized target format', async ()=>{
|
|
134
|
-
const result = await ImageCompressor.compress(Buffer.from('bytes'), 'image/unknownformat', {
|
|
135
|
-
format: 'original'
|
|
136
|
-
});
|
|
137
|
-
expect(mockWebp).toHaveBeenCalled();
|
|
138
|
-
expect(result.format).toBe('image/webp');
|
|
139
|
-
});
|
|
140
|
-
it('returns the compressed buffer and content-type prefixed format on success', async ()=>{
|
|
141
|
-
mockToBuffer.mockResolvedValue(Buffer.from('final-bytes'));
|
|
142
|
-
const result = await ImageCompressor.compress(Buffer.from('bytes'), 'image/jpeg', {
|
|
143
|
-
format: 'jpeg'
|
|
144
|
-
});
|
|
145
|
-
expect(result.buffer).toEqual(Buffer.from('final-bytes'));
|
|
146
|
-
expect(result.format).toBe('image/jpeg');
|
|
147
|
-
});
|
|
148
|
-
it('falls back to the original buffer and mimetype when sharp processing throws', async ()=>{
|
|
149
|
-
const originalBuffer = Buffer.from('original-bytes');
|
|
150
|
-
mockToBuffer.mockRejectedValue(new Error('corrupt image'));
|
|
151
|
-
const result = await ImageCompressor.compress(originalBuffer, 'image/png');
|
|
152
|
-
expect(result.buffer).toBe(originalBuffer);
|
|
153
|
-
expect(result.format).toBe('image/png');
|
|
154
|
-
});
|
|
155
|
-
it('initializes sharp with failOnError=false and a density hint', async ()=>{
|
|
156
|
-
await ImageCompressor.compress(Buffer.from('bytes'), 'image/jpeg');
|
|
157
|
-
expect(mockSharpFactory).toHaveBeenCalledWith(expect.any(Buffer), expect.objectContaining({
|
|
158
|
-
failOnError: false,
|
|
159
|
-
density: 300
|
|
160
|
-
}));
|
|
161
|
-
});
|
|
162
|
-
});
|