UNPKG

@11ty/eleventy-plugin-bundle

Version:

Little bundles of code, little bundles of joy.

106 lines (84 loc) 3.27 kB
import { createDebug } from "obug"; import { CodeManager } from "./CodeManager.js"; import { addHtmlPlucker } from "./BundlePlucker.js" const debug = createDebug("Eleventy:Bundle"); function generateManager(name, bundleOptions = {}) { let manager = new CodeManager(name); if(bundleOptions.delayed !== undefined) { manager.setDelayed(bundleOptions.delayed); } if(bundleOptions.hoist !== undefined) { manager.setHoisting(bundleOptions.hoist); } if(bundleOptions.bundleHtmlContentFromSelector !== undefined) { // must happen after setDelayed above (overrides value) manager.setPluckedSelector(bundleOptions.bundleHtmlContentFromSelector); } if(bundleOptions.bundleExportKey !== undefined) { manager.setBundleExportKey(bundleOptions.bundleExportKey); } if(bundleOptions.outputFileExtension) { manager.setFileExtension(bundleOptions.outputFileExtension); } if(bundleOptions.toFileDirectory) { manager.setBundleDirectory(bundleOptions.toFileDirectory); } if(bundleOptions.transforms) { manager.setTransforms(bundleOptions.transforms); } return manager; } export default function eleventyBundleManagers(eleventyConfig, pluginOptions = {}) { if(pluginOptions.force) { // no errors } else if(("getBundleManagers" in eleventyConfig || "addBundle" in eleventyConfig)) { throw new Error("Duplicate addPlugin calls for @11ty/eleventy-plugin-bundle"); } let managers = {}; eleventyConfig.addBundle = function addBundle(name, bundleOptions = {}) { let manager; let isCodeManagerInstance = name?.constructor?.name === "CodeManager"; if(isCodeManagerInstance) { manager = name; name = manager.name; managers[name] = manager; } else if(typeof name === "string") { if(name in managers) { // note: shortcode must still be added debug("Bundle exists %o, skipping.", name); } else { debug("Creating new bundle %o", name); manager = generateManager(name, bundleOptions); managers[name] = manager; } } if(manager && manager.getPluckedSelector()) { addHtmlPlucker(eleventyConfig, manager); } // if undefined, defaults to `name` if(isCodeManagerInstance || bundleOptions.shortcodeName !== false) { let shortcodeName = bundleOptions.shortcodeName || name; // e.g. `css` shortcode to add code to page bundle // These shortcode names are not configurable on purpose (for wider plugin compatibility) // Core v4.0.0-alpha.5 regression in https://github.com/11ty/buildawesome/issues/2261 // Nunjucks paired shortcodes need to be async to receive async rendered child `content` argument. // Related to https://github.com/11ty/eleventy-plugin-bundle/issues/36 // Core v4.0.0-alpha.9 uses fully-async nunjucks (v4.0.0-alpha.3) see test for Issue #25 eleventyConfig.addPairedShortcode(shortcodeName, function addContent(content, bucket, explicitUrl) { let url = explicitUrl || this.page?.url; if(url) { // don’t add if a file doesn’t have an output URL managers[name].addToPage(url, content, bucket); } return ""; }); } }; eleventyConfig.getBundleManagers = function() { return managers; }; eleventyConfig.on("eleventy.before", async () => { for(let manager of Object.values(managers)) { manager.reset(); } }); };