diff --git a/packages/core/integration-tests/test/image.js b/packages/core/integration-tests/test/image.js index 4299e050aed..a12897068cf 100644 --- a/packages/core/integration-tests/test/image.js +++ b/packages/core/integration-tests/test/image.js @@ -113,6 +113,31 @@ describe('image', function() { assert(output.length < input.length); }); + it('should lossless optimise progressive JPEGs', async function() { + let img = path.join(__dirname, '/integration/image/banana.jpg'); + let b = await bundle(img, { + defaultTargetOptions: { + shouldOptimize: true, + }, + logLevel: 'verbose', + }); + + const imagePath = b.getBundles().find(b => b.type === 'jpg').filePath; + + // let input = await inputFS.readFile(img); + // let inputRaw = await sharp(input) + // .toFormat('raw') + // .toBuffer(); + // Check validity of image + let output = await outputFS.readFile(imagePath); + await sharp(output) + .toFormat('raw') + .toBuffer(); + + // assert(outputRaw.equals(inputRaw)); + // assert(output.length < input.length); + }); + it('should lossless optimise PNGs', async function() { let img = path.join(__dirname, '/integration/image/clock.png'); let b = await bundle(img, { diff --git a/packages/core/integration-tests/test/integration/image/banana.jpg b/packages/core/integration-tests/test/integration/image/banana.jpg new file mode 100644 index 00000000000..23b5408399e Binary files /dev/null and b/packages/core/integration-tests/test/integration/image/banana.jpg differ diff --git a/packages/optimizers/image/package.json b/packages/optimizers/image/package.json index 686b08ba34b..57bbf8ff2d8 100644 --- a/packages/optimizers/image/package.json +++ b/packages/optimizers/image/package.json @@ -34,6 +34,7 @@ "dependencies": { "@parcel/plugin": "^2.0.0", "@parcel/utils": "^2.0.0", + "@parcel/diagnostic": "^2.0.0", "detect-libc": "^1.0.3" }, "devDependencies": { diff --git a/packages/optimizers/image/src/ImageOptimizer.js b/packages/optimizers/image/src/ImageOptimizer.js index e12cb53d3fc..5f4f506ffdc 100644 --- a/packages/optimizers/image/src/ImageOptimizer.js +++ b/packages/optimizers/image/src/ImageOptimizer.js @@ -1,18 +1,36 @@ // @flow +import path from 'path'; +import process from 'process'; import {Optimizer} from '@parcel/plugin'; import {blobToBuffer} from '@parcel/utils'; +import {md} from '@parcel/diagnostic'; import {optimize} from '../native'; export default (new Optimizer({ - async optimize({bundle, contents}) { + async optimize({bundle, contents, logger}) { if (!bundle.env.shouldOptimize) { return {contents}; } let buffer = await blobToBuffer(contents); - let optimized = optimize(bundle.type, buffer); - return { - contents: optimized.length < buffer.length ? optimized : buffer, - }; + + // Attempt to optimize it, if the optimize fails we log a warning... + try { + let optimized = optimize(bundle.type, buffer); + return { + contents: optimized.length < buffer.length ? optimized : buffer, + }; + } catch (err) { + const filepath = bundle.getMainEntry()?.filePath; + const filename = filepath + ? path.relative(process.cwd(), filepath) + : 'unknown'; + logger.warn({ + message: md`Could not optimize image ${filename}: ${err.message}`, + stack: err.stack, + }); + } + + return {contents: buffer}; }, }): Optimizer);