152 lines
4.9 KiB
JavaScript
152 lines
4.9 KiB
JavaScript
const {default: PQueue} = require("p-queue");
|
||
|
||
const DeferCounter = require("./src/defer-counter.js");
|
||
const BuildLogger = require("./src/build-logger.js");
|
||
const Util = require("./src/util.js");
|
||
const Image = require("./src/image.js");
|
||
const DirectoryManager = require("./src/directory-manager.js");
|
||
|
||
// For exports
|
||
const getImageSize = require("image-size");
|
||
const ImagePath = require("./src/image-path.js");
|
||
|
||
const debug = require("debug")("Eleventy:Image");
|
||
|
||
const GLOBAL_OPTIONS = require("./src/global-options.js").defaults;
|
||
|
||
const { memCache, diskCache } = require("./src/caches.js");
|
||
|
||
let deferCounter = new DeferCounter();
|
||
let buildLogger = new BuildLogger();
|
||
let directoryManager = new DirectoryManager();
|
||
|
||
/* Queue */
|
||
let processingQueue = new PQueue({
|
||
concurrency: GLOBAL_OPTIONS.concurrency
|
||
});
|
||
processingQueue.on("active", () => {
|
||
debug( `Concurrency: ${processingQueue.concurrency}, Size: ${processingQueue.size}, Pending: ${processingQueue.pending}` );
|
||
});
|
||
|
||
// TODO move this into build-logger.js
|
||
function setupLogger(eleventyConfig, opts) {
|
||
if(typeof eleventyConfig?.logger?.logWithOptions !== "function" || Util.isRequested(opts?.generatedVia)) {
|
||
return;
|
||
}
|
||
|
||
buildLogger.setupOnce(eleventyConfig, () => {
|
||
// before build
|
||
deferCounter.resetCount();
|
||
memCache.resetCount();
|
||
diskCache.resetCount();
|
||
}, () => {
|
||
// after build
|
||
let [memoryCacheHit] = memCache.getCount();
|
||
let [diskCacheHit, diskCacheMiss] = diskCache.getCount();
|
||
// these are unique images, multiple requests to optimize the same image are de-duplicated
|
||
let deferCount = deferCounter.getCount();
|
||
|
||
let cachedCount = memoryCacheHit + diskCacheHit;
|
||
let optimizedCount = diskCacheMiss + diskCacheHit + memoryCacheHit + deferCount;
|
||
|
||
let msg = [];
|
||
msg.push(`${optimizedCount} ${optimizedCount !== 1 ? "images" : "image"} optimized`);
|
||
|
||
if(cachedCount > 0 || deferCount > 0) {
|
||
let innerMsg = [];
|
||
if(cachedCount > 0) {
|
||
innerMsg.push(`${cachedCount} cached`);
|
||
}
|
||
if(deferCount > 0) {
|
||
innerMsg.push(`${deferCount} deferred`);
|
||
}
|
||
msg.push(` (${innerMsg.join(", ")})`);
|
||
}
|
||
|
||
if(optimizedCount > 0 || cachedCount > 0 || deferCount > 0) {
|
||
eleventyConfig?.logger?.logWithOptions({
|
||
message: msg.join(""),
|
||
prefix: "[11ty/eleventy-img]",
|
||
color: "green",
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
function createImage(src, opts = {}) {
|
||
let eleventyConfig = opts.eleventyConfig;
|
||
|
||
if(opts?.eleventyConfig && {}.propertyIsEnumerable.call(opts, "eleventyConfig")) {
|
||
delete opts.eleventyConfig;
|
||
Util.addConfig(eleventyConfig, opts);
|
||
}
|
||
|
||
let img = Image.create(src, opts);
|
||
|
||
img.setQueue(processingQueue);
|
||
img.setBuildLogger(buildLogger);
|
||
img.setDirectoryManager(directoryManager);
|
||
|
||
setupLogger(eleventyConfig, opts);
|
||
|
||
if(opts.transformOnRequest) {
|
||
deferCounter.increment(src);
|
||
}
|
||
|
||
return img;
|
||
};
|
||
|
||
function queueImage(src, opts = {}) {
|
||
if(src.constructor?.name === "UserConfig") {
|
||
throw new Error(`Eleventy Image’s default export is not an Eleventy Plugin and cannot be used with \`eleventyConfig.addPlugin()\`. Use the \`eleventyImageTransformPlugin\` named export instead, like this: \`import { eleventyImageTransformPlugin } from '@11ty/eleventy-img';\` or this: \`const { eleventyImageTransformPlugin } = require('@11ty/eleventy-img');\``);
|
||
}
|
||
|
||
let img = createImage(src, opts);
|
||
return img.queue();
|
||
}
|
||
|
||
// Exports
|
||
|
||
module.exports = queueImage;
|
||
|
||
Object.defineProperty(module.exports, "concurrency", {
|
||
get: function() {
|
||
return processingQueue.concurrency;
|
||
},
|
||
set: function(concurrency) {
|
||
processingQueue.concurrency = concurrency;
|
||
},
|
||
});
|
||
|
||
module.exports.Util = Util;
|
||
module.exports.Image = Image;
|
||
module.exports.ImagePath = ImagePath;
|
||
module.exports.ImageSize = getImageSize;
|
||
|
||
// Backwards compat
|
||
module.exports.statsSync = Image.statsSync;
|
||
module.exports.statsByDimensionsSync = Image.statsByDimensionsSync;
|
||
module.exports.getFormats = Image.getFormatsArray;
|
||
module.exports.getWidths = Image.getValidWidths;
|
||
|
||
module.exports.getHash = function getHash(src, options) {
|
||
let img = new Image(src, options);
|
||
return img.getHash();
|
||
};
|
||
|
||
module.exports.setupLogger = setupLogger;
|
||
|
||
const generateHTML = require("./src/generate-html.js");
|
||
module.exports.generateHTML = generateHTML;
|
||
module.exports.generateObject = generateHTML.generateObject;
|
||
|
||
const { eleventyWebcOptionsPlugin } = require("./src/webc-options-plugin.js");
|
||
module.exports.eleventyImagePlugin = eleventyWebcOptionsPlugin;
|
||
module.exports.eleventyImageWebcOptionsPlugin = eleventyWebcOptionsPlugin;
|
||
|
||
const { eleventyImageTransformPlugin } = require("./src/transform-plugin.js");
|
||
module.exports.eleventyImageTransformPlugin = eleventyImageTransformPlugin;
|
||
|
||
const { eleventyImageOnRequestDuringServePlugin } = require("./src/on-request-during-serve-plugin.js");
|
||
module.exports.eleventyImageOnRequestDuringServePlugin = eleventyImageOnRequestDuringServePlugin;
|