summaryrefslogtreecommitdiff
path: root/node_modules/@11ty/eleventy/src/TemplateBehavior.js
blob: 8dff97c3e5ae73ac28b0535240cc5709bb608f78 (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
84
85
import { isPlainObject } from "@11ty/eleventy-utils";

class TemplateBehavior {
	#isRenderOptional;

	constructor(config) {
		this.render = true;
		this.write = true;
		this.outputFormat = null;

		if (!config) {
			throw new Error("Missing config argument in TemplateBehavior");
		}
		this.config = config;
	}

	// Render override set to false
	isRenderableDisabled() {
		return this.renderableOverride === false;
	}

	isRenderableOptional() {
		return this.#isRenderOptional;
	}

	// undefined (fallback), true, false
	setRenderableOverride(renderableOverride) {
		if (renderableOverride === "optional") {
			this.#isRenderOptional = true;
			this.renderableOverride = undefined;
		} else {
			this.#isRenderOptional = false;
			this.renderableOverride = renderableOverride;
		}
	}

	// permalink *has* a build key or output is json/ndjson
	isRenderable() {
		return this.renderableOverride ?? (this.render || this.isRenderForced());
	}

	setOutputFormat(format) {
		this.outputFormat = format;
	}

	isRenderForced() {
		return this.outputFormat === "json" || this.outputFormat === "ndjson";
	}

	isWriteable() {
		return this.write;
	}

	// Duplicate logic with TemplatePermalink constructor
	setRenderViaDataCascade(data) {
		// render is false *only* if `build` key does not exist in permalink objects (both in data and eleventyComputed)
		// (note that permalink: false means it won’t write but will still render)

		let keys = new Set();
		if (isPlainObject(data.permalink)) {
			for (let key of Object.keys(data.permalink)) {
				keys.add(key);
			}
		}

		let computedKey = this.config.keys.computed;
		if (computedKey in data && isPlainObject(data[computedKey]?.permalink)) {
			for (let key of Object.keys(data[computedKey].permalink)) {
				keys.add(key);
			}
		}

		if (keys.size) {
			this.render = keys.has("build");
		}
	}

	setFromPermalink(templatePermalink) {
		// this.render is duplicated between TemplatePermalink and `setRenderViaDataCascade` above
		this.render = templatePermalink._isRendered;

		this.write = templatePermalink._writeToFileSystem;
	}
}
export default TemplateBehavior;