hastily
Version:
express middleware to simulate fastly cdn
105 lines • 9.16 kB
JavaScript
/**
* Only partial compatibility is achieved here. Notes:
*
* - Cannot do percentage-based dimension changes using our streaming strategy
* - Same for percentage-based crops and aspect-ratio-based crops
*/
;
import accepts from 'accepts';
import bgFlatten from './mappers/background-flatten';
import blur from './mappers/blur';
import extend from './mappers/extend';
import extractCrop from './mappers/extract-crop';
import orient from './mappers/orient';
import resize from './mappers/resize';
import resizeCanvas from './mappers/resize-canvas';
import unsupported from './mappers/unsupported';
const mappers = [
['width', resize],
['height', resize],
['dpr', resize],
['fit', resize],
['disable', resize],
['enable', resize],
['resize-filter', resize],
['crop', extractCrop],
['canvas', resizeCanvas],
['pad', extend],
['orient', orient],
['bg-color', bgFlatten],
['blur', blur],
['brightness', unsupported('brightness', 'absolute brightness adjustment')],
['contrast', unsupported('contrast', 'absolute contrast adjustment')],
['saturation', unsupported('saturation', 'absolute saturation adjustment')],
['sharpen', unsupported('sharpen', 'unsharp mask')],
['trim', unsupported('trim', 'relative trimming from all four sides')],
];
const formatters = {
gif: unsupported('format', 'GIF output unsupported by node-hastily'),
jpg: (transform, params) => transform.jpeg({ quality: params.quality }),
pjpg: (transform, params) => transform.jpeg({ quality: params.quality, progressive: true }),
png: (transform, params) => transform.png({ quality: params.quality }),
png8: (transform, params) => transform.png({ palette: true, quality: params.quality }),
webp: (transform, params) => transform.webp({ quality: params.quality }),
webpll: (transform, params) => transform.webp({ quality: params.quality, lossless: true }),
webply: (transform, params) => transform.webp({ quality: params.quality }),
};
/**
* @hidden
*/
function supportsWebP(req) {
const types = accepts(req).types();
if (!types || (typeof types === 'string' && types !== 'image/webp')) {
return false;
}
return types.includes('image/webp');
}
/**
* @hidden
*/
export default function optoToSharp(params, sharpStream) {
const applied = new Set();
const { req, res, log } = params;
const { query } = req;
let transform = sharpStream;
for (const [name, mapper] of mappers) {
if (query.hasOwnProperty(name) && !applied.has(mapper)) {
log.debug('running mapper for %s', name);
const out = mapper(transform, params);
if (out) {
applied.add(mapper);
transform = out;
}
}
}
if (query.auto === 'webp' && supportsWebP(req)) {
log.debug('returning webp');
res.type('image/webp');
return formatters.webp(transform, params);
}
const arguedFormat = query.format;
const tryJpeg = (xform, { quality }) => {
if (applied.size === 0) {
log.debug('no mappers or formatters applied, doing nothing');
return false;
}
return xform.jpeg({
force: false,
quality,
});
};
if (!arguedFormat) {
log.debug('no format argument, returning jpeg or whatever');
res.type('image/jpeg');
return tryJpeg(transform, params);
}
const mapFormat = formatters[arguedFormat];
if (typeof mapFormat !== 'function') {
log.debug('bad format argument %s, returning jpeg', arguedFormat);
return tryJpeg(transform, params);
}
log.debug('attempting "%s" transform', arguedFormat);
res.type(`image/${arguedFormat}`);
return mapFormat(transform, params);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21hcC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsWUFBWSxDQUFDO0FBRWIsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBSzlCLE9BQU8sU0FBUyxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sSUFBSSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xDLE9BQU8sTUFBTSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sTUFBTSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sTUFBTSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sWUFBWSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBRWhELE1BQU0sT0FBTyxHQUFzQjtJQUNqQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7SUFDakIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztJQUNmLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztJQUNmLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUNuQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDbEIsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztJQUNyQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUM7SUFDeEIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2YsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0lBQ2xCLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQztJQUN2QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7SUFDZCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsWUFB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