@11ty/eleventy-plugin-bundle
Version:
Little bundles of code, little bundles of joy.
89 lines (71 loc) • 2.94 kB
JavaScript
import { OutOfOrderRender } from "./OutOfOrderRender.js";
import { createDebug } from "obug";
const debug = createDebug("Eleventy:Bundle");
export default function($config, pluginOptions = {}) {
let managers = $config.getBundleManagers();
let writeToFileSystem = true;
function bundleTransform(content, stage = 0) {
// Only run if content is string
// Only run if managers are in play
if(typeof content !== "string" || Object.keys(managers).length === 0) {
return content;
}
let render = new OutOfOrderRender(content);
for(let key in managers) {
render.setAssetManager(key, managers[key]);
}
render.setOutputDirectory($config.directories.output);
render.setWriteToFileSystem(writeToFileSystem);
return render.replaceAll(this.page, stage);
}
$config.on("eleventy.before", async ({ outputMode }) => {
if(Object.keys(managers).length === 0) {
return;
}
if(outputMode !== "fs") {
writeToFileSystem = false;
debug("Skipping writing to the file system due to output mode: %o", outputMode);
}
});
// e.g. `getBundle` shortcode to get code in current page bundle
// bucket can be an array
// This shortcode name is not configurable on purpose (for wider plugin compatibility)
$config.addShortcode("getBundle", function getContent(type, bucket, explicitUrl) {
if(!type || !(type in managers) || Object.keys(managers).length === 0) {
throw new Error(`Invalid bundle type: ${type}. Available options: ${Object.keys(managers)}`);
}
return OutOfOrderRender.getAssetKey("get", type, bucket);
});
// write a bundle to the file system
// This shortcode name is not configurable on purpose (for wider plugin compatibility)
$config.addShortcode("getBundleFileUrl", function(type, bucket, explicitUrl) {
if(!type || !(type in managers) || Object.keys(managers).length === 0) {
throw new Error(`Invalid bundle type: ${type}. Available options: ${Object.keys(managers)}`);
}
return OutOfOrderRender.getAssetKey("file", type, bucket);
});
$config.addTransform("@11ty/eleventy-bundle", function (content) {
let managers = $config.getBundleManagers();
let nonDelayedManager = Object.values(managers).find(manager => {
return typeof manager.isDelayed !== "function" || !manager.isDelayed();
});
if(!Boolean(nonDelayedManager)) {
return content;
}
return bundleTransform.call(this, content, 0);
});
// We use addplugin here so the delayed transform adds after the HTML Transformer API
$config.addPlugin(($config) => {
// Delayed bundles *MUST* not alter URLs
$config.addTransform("@11ty/eleventy-bundle/delayed", function (content) {
let managers = $config.getBundleManagers();
let delayedManager = Object.values(managers).find(manager => {
return typeof manager.isDelayed === "function" && manager.isDelayed();
});
if(!Boolean(delayedManager)) {
return content;
}
return bundleTransform.call(this, content, 1);
});
});
};