summaryrefslogtreecommitdiff
path: root/node_modules/@11ty/eleventy/src/Util/TransformsUtil.js
blob: 3ba8ab05770a00d2346ba7ea3f8ea7ff6d6db916 (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
import EleventyBaseError from "../Errors/EleventyBaseError.js";
import { isPlainObject } from "@11ty/eleventy-utils";
import debugUtil from "debug";

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

class EleventyTransformError extends EleventyBaseError {}

class TransformsUtil {
	static changeTransformsToArray(transformsObj) {
		let transforms = [];
		for (let name in transformsObj) {
			transforms.push({
				name: name,
				callback: transformsObj[name],
			});
		}
		return transforms;
	}

	static async runAll(content, pageData, transforms = {}, options = {}) {
		let { baseHrefOverride, logger } = options;
		let { inputPath, outputPath, url } = pageData;

		if (!isPlainObject(transforms)) {
			throw new Error("Object of transforms expected.");
		}

		let transformsArray = this.changeTransformsToArray(transforms);

		for (let { callback, name } of transformsArray) {
			debug("Running %o transform on %o: %o", name, inputPath, outputPath);

			try {
				let hadContentBefore = !!content;

				content = await callback.call(
					{
						inputPath,
						outputPath,
						url,
						page: pageData,
						baseHref: baseHrefOverride,
					},
					content,
					outputPath,
				);

				if (hadContentBefore && !content) {
					if (!logger || !logger.warn) {
						throw new Error("Internal error: missing `logger` instance.");
					}

					logger.warn(
						`Warning: Transform \`${name}\` returned empty when writing ${outputPath} from ${inputPath}.`,
					);
				}
			} catch (e) {
				throw new EleventyTransformError(
					`Transform \`${name}\` encountered an error when transforming ${inputPath}.`,
					e,
				);
			}
		}

		return content;
	}
}

export default TransformsUtil;