hastily
Version:
express middleware to simulate fastly cdn
110 lines • 9.61 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
*/
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const accepts_1 = __importDefault(require("accepts"));
const background_flatten_1 = __importDefault(require("./mappers/background-flatten"));
const blur_1 = __importDefault(require("./mappers/blur"));
const extend_1 = __importDefault(require("./mappers/extend"));
const extract_crop_1 = __importDefault(require("./mappers/extract-crop"));
const orient_1 = __importDefault(require("./mappers/orient"));
const resize_1 = __importDefault(require("./mappers/resize"));
const resize_canvas_1 = __importDefault(require("./mappers/resize-canvas"));
const unsupported_1 = __importDefault(require("./mappers/unsupported"));
const mappers = [
['width', resize_1.default],
['height', resize_1.default],
['dpr', resize_1.default],
['fit', resize_1.default],
['disable', resize_1.default],
['enable', resize_1.default],
['resize-filter', resize_1.default],
['crop', extract_crop_1.default],
['canvas', resize_canvas_1.default],
['pad', extend_1.default],
['orient', orient_1.default],
['bg-color', background_flatten_1.default],
['blur', blur_1.default],
['brightness', unsupported_1.default('brightness', 'absolute brightness adjustment')],
['contrast', unsupported_1.default('contrast', 'absolute contrast adjustment')],
['saturation', unsupported_1.default('saturation', 'absolute saturation adjustment')],
['sharpen', unsupported_1.default('sharpen', 'unsharp mask')],
['trim', unsupported_1.default('trim', 'relative trimming from all four sides')],
];
const formatters = {
gif: unsupported_1.default('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_1.default(req).types();
if (!types || (typeof types === 'string' && types !== 'image/webp')) {
return false;
}
return types.includes('image/webp');
}
/**
* @hidden
*/
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);
}
exports.default = optoToSharp;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21hcC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsWUFBWSxDQUFDOzs7OztBQUViLHNEQUE4QjtBQUs5QixzRkFBcUQ7QUFDckQsMERBQWtDO0FBQ2xDLDhEQUFzQztBQUN0QywwRUFBaUQ7QUFDakQsOERBQXNDO0FBQ3RDLDhEQUFzQztBQUN0Qyw0RUFBbUQ7QUFDbkQsd0VBQWdEO0FBRWhELE1BQU0sT0FBTyxHQUFzQjtJQUNqQyxDQUFDLE9BQU8sRUFBRSxnQkFBTSxDQUFDO0lBQ2pCLENBQUMsUUFBUSxFQUFFLGdCQUFNLENBQUM7SUFDbEIsQ0FBQyxLQUFLLEVBQUUsZ0JBQU0sQ0FBQztJQUNmLENBQUMsS0FBSyxFQUFFLGdCQUFNLENBQUM7SUFDZixDQUFDLFNBQVMsRUFBRSxnQkFBTSxDQUFDO0lBQ25CLENBQUMsUUFBUSxFQUFFLGdCQUFNLENBQUM7SUFDbEIsQ0FBQyxlQUFlLEVBQUUsZ0JBQU0sQ0FBQztJQUN6QixDQUFDLE1BQU0sRUFBRSxzQkFBVyxDQUFDO0lBQ3JCLENBQUMsUUFBUSxFQUFFLHVCQUFZLENBQUM7SUFDeEIsQ0FBQyxLQUFLLEVBQUUsZ0JBQU0sQ0FBQztJQUNmLENBQUMsUUFBUSxFQUFFLGdCQUFNLENBQUM7SUFDbEIsQ0FBQyxVQUFVLEVBQUUsNEJBQVMsQ0FBQztJQUN2QixDQUFDLE1BQU0sRUFBRSxjQUFJLENBQUM7SUFDZCxDQUFDLFlBQVksRUFBRSxxQkFBVyxDQUFDLFlBQVksRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQzNFLENBQUMsVUFBVSxFQUFFLHFCQUFXLENBQUMsVUFBVSxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFDckUsQ0FBQyxZQUFZLEVBQUUscUJBQVcsQ0FBQyxZQUFZLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUMzRSxDQUFDLFNBQVMsRUFB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