summaryrefslogtreecommitdiff
path: root/node_modules/@11ty/eleventy-plugin-bundle/src/eleventy.shortcodes.js
blob: 924731a8582346bf405b5b6c2955f5ed82c42760 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { OutOfOrderRender } from "./OutOfOrderRender.js";
import debugUtil from "debug";

const debug = debugUtil("Eleventy:Bundle");

export default function(eleventyConfig, pluginOptions = {}) {
	let managers = eleventyConfig.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;
		}

		debug("Processing %o", this.page.url);
		let render = new OutOfOrderRender(content);
		for(let key in managers) {
			render.setAssetManager(key, managers[key]);
		}

		render.setOutputDirectory(eleventyConfig.directories.output);
		render.setWriteToFileSystem(writeToFileSystem);

		return render.replaceAll(this.page, stage);
	}

	eleventyConfig.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)
	eleventyConfig.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)
	eleventyConfig.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);
	});

	eleventyConfig.addTransform("@11ty/eleventy-bundle", function (content) {
		let hasNonDelayedManagers = Boolean(Object.values(eleventyConfig.getBundleManagers()).find(manager => {
			return typeof manager.isDelayed !== "function" || !manager.isDelayed();
		}));
		if(hasNonDelayedManagers) {
			return bundleTransform.call(this, content, 0);
		}
		return content;
	});

	eleventyConfig.addPlugin((eleventyConfig) => {
		// Delayed bundles *MUST* not alter URLs
		eleventyConfig.addTransform("@11ty/eleventy-bundle/delayed", function (content) {
			let hasDelayedManagers = Boolean(Object.values(eleventyConfig.getBundleManagers()).find(manager => {
				return typeof manager.isDelayed === "function" && manager.isDelayed();
			}));
			if(hasDelayedManagers) {
				return bundleTransform.call(this, content, 1);
			}
			return content;
		});
	});
};