102 lines
2.9 KiB
JavaScript
102 lines
2.9 KiB
JavaScript
import { AstroError, AstroErrorData } from "../../core/errors/index.js";
|
|
import {
|
|
baseService,
|
|
parseQuality
|
|
} from "./service.js";
|
|
let sharp;
|
|
const qualityTable = {
|
|
low: 25,
|
|
mid: 50,
|
|
high: 80,
|
|
max: 100
|
|
};
|
|
async function loadSharp() {
|
|
let sharpImport;
|
|
try {
|
|
sharpImport = (await import("sharp")).default;
|
|
} catch {
|
|
throw new AstroError(AstroErrorData.MissingSharp);
|
|
}
|
|
sharpImport.cache(false);
|
|
return sharpImport;
|
|
}
|
|
const fitMap = {
|
|
fill: "fill",
|
|
contain: "inside",
|
|
cover: "cover",
|
|
none: "outside",
|
|
"scale-down": "inside",
|
|
outside: "outside",
|
|
inside: "inside"
|
|
};
|
|
const sharpService = {
|
|
validateOptions: baseService.validateOptions,
|
|
getURL: baseService.getURL,
|
|
parseURL: baseService.parseURL,
|
|
getHTMLAttributes: baseService.getHTMLAttributes,
|
|
getSrcSet: baseService.getSrcSet,
|
|
async transform(inputBuffer, transformOptions, config) {
|
|
if (!sharp) sharp = await loadSharp();
|
|
const transform = transformOptions;
|
|
if (transform.format === "svg") return { data: inputBuffer, format: "svg" };
|
|
const result = sharp(inputBuffer, {
|
|
failOnError: false,
|
|
pages: -1,
|
|
limitInputPixels: config.service.config.limitInputPixels
|
|
});
|
|
result.rotate();
|
|
const withoutEnlargement = Boolean(transform.fit);
|
|
if (transform.width && transform.height && transform.fit) {
|
|
const fit = fitMap[transform.fit] ?? "inside";
|
|
result.resize({
|
|
width: Math.round(transform.width),
|
|
height: Math.round(transform.height),
|
|
fit,
|
|
position: transform.position,
|
|
withoutEnlargement
|
|
});
|
|
} else if (transform.height && !transform.width) {
|
|
result.resize({
|
|
height: Math.round(transform.height),
|
|
withoutEnlargement
|
|
});
|
|
} else if (transform.width) {
|
|
result.resize({
|
|
width: Math.round(transform.width),
|
|
withoutEnlargement
|
|
});
|
|
}
|
|
if (transform.format) {
|
|
let quality = void 0;
|
|
if (transform.quality) {
|
|
const parsedQuality = parseQuality(transform.quality);
|
|
if (typeof parsedQuality === "number") {
|
|
quality = parsedQuality;
|
|
} else {
|
|
quality = transform.quality in qualityTable ? qualityTable[transform.quality] : void 0;
|
|
}
|
|
}
|
|
const isGifInput = inputBuffer[0] === 71 && // 'G'
|
|
inputBuffer[1] === 73 && // 'I'
|
|
inputBuffer[2] === 70 && // 'F'
|
|
inputBuffer[3] === 56 && // '8'
|
|
(inputBuffer[4] === 57 || inputBuffer[4] === 55) && // '9' or '7'
|
|
inputBuffer[5] === 97;
|
|
if (transform.format === "webp" && isGifInput) {
|
|
result.webp({ quality: typeof quality === "number" ? quality : void 0, loop: 0 });
|
|
} else {
|
|
result.toFormat(transform.format, { quality });
|
|
}
|
|
}
|
|
const { data, info } = await result.toBuffer({ resolveWithObject: true });
|
|
return {
|
|
data,
|
|
format: info.format
|
|
};
|
|
}
|
|
};
|
|
var sharp_default = sharpService;
|
|
export {
|
|
sharp_default as default
|
|
};
|