UNPKG

@11ty/eleventy-plugin-bundle

Version:

Little bundles of code, little bundles of joy.

89 lines (71 loc) 2.94 kB
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); }); }); };