eleventy-plugin-vento 5.2.1 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # eleventy-plugin-vento
2
2
 
3
+ ## 5.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 712a39d: Error logging improvements (thanks @tmcw for the help on this!)
8
+
9
+ Re-implements Vento's `stringifyError` function tailored specifically for Eleventy in order to show errors in a nice format that Eleventy expects
10
+
11
+ Notably, the one case where this doesn't work is if Vento cannot capture a position from the source code [due to limitations in Node/Bun](https://github.com/noelforte/eleventy-plugin-vento/issues/408#issuecomment-3748576474). In this case, we'll log a warning to the console...
12
+
13
+ ```
14
+ [warning] A `SyntaxError` was thrown, but the exact position within the source code cannot be obtained
15
+ [warning] Use DEBUG="Eleventy:Vento*" to view raw `ErrorContext` information
16
+ ```
17
+
18
+ ...and log the entire context object to the `DEBUG` namespace `Eleventy:Vento:Error`:
19
+
20
+ ```
21
+ Eleventy:Vento:Error ErrorContext (via Vento) {
22
+ Eleventy:Vento:Error type: 'SyntaxError',
23
+ Eleventy:Vento:Error message: "Unexpected token '{'",
24
+ Eleventy:Vento:Error source: '<div class="image-grid">\n' +
25
+ Eleventy:Vento:Error ' {{ for image of collections.{{gallery}} }}\n' +
26
+ Eleventy:Vento:Error ' <img src="{{ image }} ">\n' +
27
+ Eleventy:Vento:Error ' {{ /for }}\n' +
28
+ Eleventy:Vento:Error '</div>\n',
29
+ Eleventy:Vento:Error code: '\n' +
30
+ Eleventy:Vento:Error ' var {image,collections,gallery} = it;\n' +
31
+ Eleventy:Vento:Error ' {\n' +
32
+ Eleventy:Vento:Error '__exports.content += "<div class=\\"image-grid\\">\\n ";\n' +
33
+ Eleventy:Vento:Error '__pos=27;\n' +
34
+ Eleventy:Vento:Error 'for (let image of __env.utils.toIterator(collections.{{gallery}})) {\n' +
35
+ Eleventy:Vento:Error '__exports.content += "\\n <img src=\\"";\n' +
36
+ Eleventy:Vento:Error '__pos=84;\n' +
37
+ Eleventy:Vento:Error '__exports.content += (image) ?? "";\n' +
38
+ Eleventy:Vento:Error '__exports.content += " \\">\\n ";\n' +
39
+ Eleventy:Vento:Error '}\n' +
40
+ Eleventy:Vento:Error '__exports.content += "\\n</div>\\n";\n' +
41
+ Eleventy:Vento:Error '}\n' +
42
+ Eleventy:Vento:Error ' ',
43
+ Eleventy:Vento:Error file: '_includes/partials/imageGrid.vto'
44
+ Eleventy:Vento:Error } +0ms
45
+ ```
46
+
47
+ ### Patch Changes
48
+
49
+ - 9f8c8ae: Update ventojs to v2.3.1
50
+
51
+ ## 5.3.0
52
+
53
+ ### Minor Changes
54
+
55
+ - bf9130c: Update Vento to v2.3.0
56
+
57
+ [Upstream release notes](https://github.com/ventojs/vento/blob/main/CHANGELOG.md#230---2025-12-25)
58
+
3
59
  ## 5.2.1
4
60
 
5
61
  ### Patch Changes
package/dist/plugin.d.mts CHANGED
@@ -1,44 +1,105 @@
1
+ /// <reference types="node" />
1
2
  import * as ventojs from "ventojs";
2
- import UserConfig from "@11ty/eleventy/UserConfig";
3
- import { LiteralUnion } from "type-fest";
3
+ import _UserConfig from "@11ty/eleventy/UserConfig";
4
4
  import { Plugin } from "ventojs/core/environment.js";
5
5
 
6
+ //#region node_modules/.pnpm/11ty.ts@0.0.7_@11ty+eleventy@3.1.2/node_modules/11ty.ts/dist/index.d.ts
7
+ declare global {
8
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- It has to be an `interface` so that it can be merged.
9
+ interface SymbolConstructor {
10
+ readonly observable: symbol;
11
+ }
12
+ }
13
+ /**
14
+ Allows creating a union type by combining primitive types and literal types without sacrificing auto-completion in IDEs for the literal type part of the union.
15
+
16
+ Currently, when a union type of a primitive type is combined with literal types, TypeScript loses all information about the combined literals. Thus, when such type is used in an IDE with autocompletion, no suggestions are made for the declared literals.
17
+
18
+ This type is a workaround for [Microsoft/TypeScript#29729](https://github.com/Microsoft/TypeScript/issues/29729). It will be removed as soon as it's not needed anymore.
19
+
20
+ @example
21
+ ```
22
+ import type {LiteralUnion} from 'type-fest';
23
+
24
+ // Before
25
+
26
+ type Pet = 'dog' | 'cat' | string;
27
+
28
+ const pet: Pet = '';
29
+ // Start typing in your TypeScript-enabled IDE.
30
+ // You **will not** get auto-completion for `dog` and `cat` literals.
31
+
32
+ // After
33
+
34
+ type Pet2 = LiteralUnion<'dog' | 'cat', string>;
35
+
36
+ const pet: Pet2 = '';
37
+ // You **will** get auto-completion for `dog` and `cat` literals.
38
+ ```
39
+
40
+ @category Type
41
+ */
42
+ //#endregion
43
+ //#region src/types/utilities.d.ts
44
+ /**
45
+ * Matches any given string so autocomplete in literal unions works as expected
46
+ */
47
+ type AnyString = string & Record<never, never>;
48
+ //#endregion
49
+ //#region src/types/eleventy.d.ts
50
+ interface UserConfig extends _UserConfig {
51
+ directories: {
52
+ input: string;
53
+ output: string;
54
+ includes: string;
55
+ layouts: string;
56
+ };
57
+ }
58
+ //#endregion
6
59
  //#region src/types/options.d.ts
7
60
  interface PluginOptions {
8
61
  /**
9
62
  * An array of Vento plugins
10
63
  */
11
- plugins?: Plugin[];
64
+ plugins: Plugin[];
12
65
  /**
13
66
  * Enables Vento's autotrim plugin.
14
- * ```js
67
+ * @example
15
68
  * // Set to an array of tags
16
69
  * autotrim: ['tag1', 'tag2']
17
- *
70
+ * @example
18
71
  * // Use Vento's defaults and Eleventy paired shortcodes
19
- * // If set to `true`, uses both
72
+ * // Setting `true` is functionally equivalent to both
73
+ * // `@vento` and `@11ty` being present
20
74
  * autotrim: ['@vento', '@11ty']
21
75
  * autotrim: true
22
- * ```
23
76
  */
24
- autotrim?: LiteralUnion<'@11ty' | '@vento', string>[] | boolean;
25
- /** Enable use of Eleventy filters */
26
- filters?: boolean;
27
- /** Enable use of Eleventy shortcodes */
28
- shortcodes?: boolean;
29
- /** Enable use of Eleventy paired shortcodes */
30
- pairedShortcodes?: boolean;
77
+ autotrim: ('@11ty' | '@vento' | AnyString)[] | boolean;
78
+ /**
79
+ * Enable use of Eleventy filters
80
+ */
81
+ filters: boolean;
82
+ /**
83
+ * Enable use of Eleventy shortcodes
84
+ */
85
+ shortcodes: boolean;
86
+ /**
87
+ * Enable use of Eleventy paired shortcodes
88
+ */
89
+ pairedShortcodes: boolean;
31
90
  /**
32
91
  * A Vento configuration object.
33
- *
34
- * **Note that `ventoOptions.includes` defaults to
35
- * Eleventy's own `dir.includes` location.**
36
92
  * @see {@link https://vento.js.org/configuration/}
93
+ * @default
94
+ * {
95
+ * // Defaults to Eleventy's own `includes` directory
96
+ * includes: eleventyConfig.directories.includes
97
+ * }
37
98
  */
38
- ventoOptions?: ventojs.Options;
99
+ ventoOptions: ventojs.Options;
39
100
  }
40
101
  //#endregion
41
102
  //#region src/plugin.d.ts
42
- declare function VentoPlugin(eleventyConfig: UserConfig, userOptions: PluginOptions): void;
103
+ declare function VentoPlugin(eleventyConfig: UserConfig, userOptions?: Partial<PluginOptions>): void;
43
104
  //#endregion
44
105
  export { VentoPlugin };
package/dist/plugin.mjs CHANGED
@@ -1,6 +1,8 @@
1
1
  import path from "node:path";
2
2
  import autotrimPlugin, { defaultTags } from "ventojs/plugins/auto_trim.js";
3
3
  import createVentoEnv from "ventojs";
4
+ import { VentoError } from "ventojs/core/errors.js";
5
+ import { styleText } from "node:util";
4
6
  import createDebugger from "debug";
5
7
 
6
8
  //#region src/utils/create-vento-tag.ts
@@ -32,11 +34,74 @@ function createVentoTag(tagInfo) {
32
34
  }
33
35
 
34
36
  //#endregion
35
- //#region src/utils/debuggers.ts
36
- const debugBaseNamespace = "Eleventy:Vento";
37
- const debugMain = createDebugger(debugBaseNamespace);
38
- const debugCache = createDebugger(`${debugBaseNamespace}:Cache`);
39
- const debugRender = createDebugger(`${debugBaseNamespace}:Render`);
37
+ //#region src/utils/logging.ts
38
+ const debug = {
39
+ main: createDebugger("Eleventy:Vento"),
40
+ get cache() {
41
+ return this.main.extend("Cache");
42
+ },
43
+ get render() {
44
+ return this.main.extend("Render");
45
+ },
46
+ get error() {
47
+ return this.main.extend("Error");
48
+ }
49
+ };
50
+ function warn(...messages) {
51
+ for (const message of messages) console.error(styleText("gray", "[warning]"), styleText("yellow", message));
52
+ }
53
+
54
+ //#endregion
55
+ //#region src/utils/errors.ts
56
+ const LINE_TERMINATOR = /(\r\n?|[\n\u2028\u2029])/;
57
+ var EleventyVentoError = class extends Error {
58
+ constructor(message, context, cause) {
59
+ super(message, { cause });
60
+ this.context = context;
61
+ }
62
+ static async createFromContext(error) {
63
+ const ctx = await error.getContext();
64
+ const err = new this("An unknown error occured processing Vento templates", ctx, error);
65
+ if (!ctx.position || !ctx.file) warn(`A \`${ctx.type}\` was thrown, but the exact position within the source code cannot be obtained`, "Use DEBUG=\"Eleventy:Vento*\" to view raw `ErrorContext` information");
66
+ debug.error("Received `ErrorContext` from Vento: %O", ctx);
67
+ if (ctx.file === void 0) return err;
68
+ err.message = `${ctx.type} in ${ctx.file}`;
69
+ if (ctx.position === void 0 || ctx.source === void 0) return err;
70
+ const sourceLines = codeToLines(ctx.source);
71
+ const [sourceLine, sourceColumn] = locateInCode(sourceLines, ctx.position);
72
+ err.message += `:${sourceLine}:${sourceColumn}:\n\n`;
73
+ const pad = sourceLine.toString().length;
74
+ const indent = " ".repeat(pad);
75
+ for (let line = Math.max(sourceLine - 3, 1); line <= sourceLine; line++) err.message += `${`${line}`.padStart(pad)} │ ${sourceLines[line - 1].trimEnd()}\n`;
76
+ err.message += `${indent} ${" ".repeat(sourceColumn - 1)}^`;
77
+ if (!ctx.code || ctx.line === void 0 || ctx.column === void 0) return err;
78
+ const codelines = codeToLines(ctx.code);
79
+ err.message += `\n\n${indent} | /* ...compiled to... */\n${indent} │ ${codelines[ctx.line - 1].trimEnd()}\n${indent} ${" ".repeat(ctx.column - 1)}^`;
80
+ return err;
81
+ }
82
+ };
83
+ /**
84
+ * Converts a code string to an array of lines
85
+ */
86
+ function codeToLines(code) {
87
+ const doubleLines = code.split(LINE_TERMINATOR);
88
+ const lines = [];
89
+ for (let i = 0; i < doubleLines.length; i += 2) lines.push(`${doubleLines[i]}${doubleLines[i + 1] ?? ""}`);
90
+ return lines;
91
+ }
92
+ /**
93
+ * Identifies the line/column location from a character index
94
+ */
95
+ function locateInCode(lines, position) {
96
+ if (position < 0) return [1, 1];
97
+ let index = 0;
98
+ for (const [line, content] of lines.entries()) {
99
+ const { length } = content;
100
+ if (position < index + length) return [line + 1, position - index + 1];
101
+ index += length;
102
+ }
103
+ throw new Error(`Positon ${position} is out of bounds for the provided source`);
104
+ }
40
105
 
41
106
  //#endregion
42
107
  //#region src/engine.ts
@@ -81,13 +146,19 @@ function createVentoEngine(options) {
81
146
  }
82
147
  async function getTemplateFunction(source, file, useVentoCache = true) {
83
148
  let template = await env.cache.get(file);
84
- if (template?.source === source) debugCache("Cache HIT for `%s`, used precompiled template", file);
85
- else {
149
+ if (template?.source === source) {
150
+ debug.cache("Cache HIT for `%s`, using precompiled template", file);
151
+ return template;
152
+ }
153
+ try {
154
+ debug.cache("Cache MISS for `%s`, will compile new template function", file);
86
155
  template = env.compile(source, file);
87
- debugCache(`Cache MISS for \`%s\`, compiled new template; %s\n\n${template}`, file, useVentoCache ? "let Vento cache result" : "defer result caching to Eleventy");
88
156
  if (useVentoCache) env.cache.set(file, template);
157
+ return template;
158
+ } catch (error) {
159
+ if (error instanceof VentoError) throw await EleventyVentoError.createFromContext(error);
160
+ throw error;
89
161
  }
90
- return template;
91
162
  }
92
163
  return {
93
164
  cache: env.cache,
@@ -99,15 +170,20 @@ function createVentoEngine(options) {
99
170
  };
100
171
  }
101
172
  async function renderVentoTemplate(template, data, from) {
102
- debugRender("Rendering `%s`", from);
103
- const { content } = await template(data);
104
- return content;
173
+ try {
174
+ debug.render("Rendering `%s`", from);
175
+ const { content } = await template(data);
176
+ return content;
177
+ } catch (error) {
178
+ if (error instanceof VentoError) throw await EleventyVentoError.createFromContext(error);
179
+ throw error;
180
+ }
105
181
  }
106
182
 
107
183
  //#endregion
108
184
  //#region src/plugin.ts
109
185
  function VentoPlugin(eleventyConfig, userOptions) {
110
- debugMain("Initializing eleventy-plugin-vento");
186
+ debug.main("Initializing eleventy-plugin-vento");
111
187
  eleventyConfig.versionCheck(">=3.0.0");
112
188
  const options = {
113
189
  autotrim: false,
@@ -118,13 +194,13 @@ function VentoPlugin(eleventyConfig, userOptions) {
118
194
  ventoOptions: { includes: eleventyConfig.directories.includes },
119
195
  ...userOptions
120
196
  };
121
- debugMain("Merged default and user config: %O", options);
197
+ debug.main("Merged default and user config: %O", options);
122
198
  const filters = eleventyConfig.getFilters();
123
- debugMain("Reading filters from Eleventy: %o", filters);
199
+ debug.main("Reading filters from Eleventy: %o", filters);
124
200
  const shortcodes = eleventyConfig.getShortcodes();
125
- debugMain("Reading shortcodes from Eleventy: %o", shortcodes);
201
+ debug.main("Reading shortcodes from Eleventy: %o", shortcodes);
126
202
  const pairedShortcodes = eleventyConfig.getPairedShortcodes();
127
- debugMain("Reading paired shortcodes from Eleventy: %o", pairedShortcodes);
203
+ debug.main("Reading paired shortcodes from Eleventy: %o", pairedShortcodes);
128
204
  if (options.autotrim) {
129
205
  const tagSet = new Set(options.autotrim === true ? ["@vento", "@11ty"] : options.autotrim);
130
206
  if (tagSet.has("@vento")) {
@@ -135,54 +211,54 @@ function VentoPlugin(eleventyConfig, userOptions) {
135
211
  tagSet.delete("@11ty");
136
212
  for (const name in pairedShortcodes) tagSet.add(name);
137
213
  }
138
- debugMain("Enabled autotrim for tags: %o", tagSet);
214
+ debug.main("Enabled autotrim for tags: %o", tagSet);
139
215
  options.plugins.push(autotrimPlugin({ tags: [...tagSet] }));
140
216
  }
141
- debugMain("Initializing Vento environment");
217
+ debug.main("Initializing Vento environment");
142
218
  const engine = createVentoEngine(options.ventoOptions);
143
- debugMain("Loading plugins: %o", options.plugins);
219
+ debug.main("Loading plugins: %o", options.plugins);
144
220
  engine.loadPlugins(options.plugins);
145
221
  if (options.filters) {
146
- debugMain("Loading filters: %o", filters);
222
+ debug.main("Loading filters: %o", filters);
147
223
  engine.loadFilters(filters);
148
224
  }
149
225
  if (options.shortcodes) {
150
- debugMain("Loading shortcodes: %o", shortcodes);
226
+ debug.main("Loading shortcodes: %o", shortcodes);
151
227
  engine.loadShortcodes(shortcodes);
152
228
  }
153
229
  if (options.pairedShortcodes) {
154
- debugMain("Loading paired shortcodes: %o", pairedShortcodes);
230
+ debug.main("Loading paired shortcodes: %o", pairedShortcodes);
155
231
  engine.loadPairedShortcodes(pairedShortcodes);
156
232
  }
157
- debugMain("Registering Vento cache handler on eleventy.beforeWatch event");
233
+ debug.main("Registering Vento cache handler on eleventy.beforeWatch event");
158
234
  eleventyConfig.on("eleventy.beforeWatch", async (updatedFiles) => {
159
235
  for (let file of updatedFiles) {
160
236
  file = path.normalize(file);
161
- debugCache("Delete cache entry for %s", file);
237
+ debug.cache("Delete cache entry for %s", file);
162
238
  engine.cache.delete(file);
163
239
  }
164
240
  });
165
- debugMain("Registering .vto as a template format");
241
+ debug.main("Registering .vto as a template format");
166
242
  eleventyConfig.addTemplateFormats("vto");
167
- debugMain("Registering .vto extension with eleventy");
243
+ debug.main("Registering .vto extension with eleventy");
168
244
  eleventyConfig.addExtension("vto", {
169
245
  outputFileExtension: "html",
170
246
  read: true,
171
247
  async compile(inputContent, inputPath) {
172
248
  inputPath = path.normalize(inputPath);
173
- debugMain("Getting template function for `%s`", inputPath);
249
+ debug.main("Getting template function for `%s`", inputPath);
174
250
  const template = await engine.getTemplateFunction(inputContent, inputPath, false);
175
251
  return async (data) => await renderVentoTemplate(template, data, inputPath);
176
252
  },
177
253
  compileOptions: { async permalink(permalinkContent, inputPath) {
178
254
  if (typeof permalinkContent !== "string" || !/\{\{\s+.+\s+\}\}/.test(permalinkContent)) return permalinkContent;
179
255
  inputPath = "EleventyVentoDynamicPermalink:".concat(path.normalize(inputPath));
180
- debugMain("Getting template function for `%s`", inputPath);
256
+ debug.main("Getting template function for `%s`", inputPath);
181
257
  const template = await engine.getTemplateFunction(permalinkContent, inputPath);
182
258
  return async (data) => await renderVentoTemplate(template, data, inputPath);
183
259
  } }
184
260
  });
185
- debugMain("eleventy-plugin-vento initialized");
261
+ debug.main("eleventy-plugin-vento initialized");
186
262
  }
187
263
 
188
264
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eleventy-plugin-vento",
3
- "version": "5.2.1",
3
+ "version": "5.4.0",
4
4
  "description": "Adds support for the Vento templating language to Eleventy.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -37,25 +37,24 @@
37
37
  "license": "MIT",
38
38
  "dependencies": {
39
39
  "debug": "4.4.3",
40
- "ventojs": "2.2.0"
40
+ "ventojs": "2.3.1"
41
41
  },
42
42
  "devDependencies": {
43
- "11ty.ts": "0.0.6",
43
+ "11ty.ts": "0.0.7",
44
44
  "@11ty/eleventy": "3.1.2",
45
45
  "@changesets/cli": "2.29.8",
46
- "@eslint/js": "9.39.1",
46
+ "@eslint/js": "10.0.1",
47
47
  "@types/debug": "4.1.12",
48
- "@types/node": "24.10.1",
49
- "eslint": "9.39.1",
48
+ "@types/node": "24.11.0",
49
+ "eslint": "10.0.2",
50
50
  "eslint-config-prettier": "10.1.8",
51
- "eslint-plugin-unicorn": "62.0.0",
52
- "globals": "16.5.0",
53
- "knip": "5.70.2",
54
- "prettier": "3.6.2",
55
- "tsdown": "0.16.7",
56
- "type-fest": "5.2.0",
51
+ "eslint-plugin-unicorn": "63.0.0",
52
+ "globals": "17.4.0",
53
+ "knip": "5.85.0",
54
+ "prettier": "3.8.1",
55
+ "tsdown": "0.20.3",
57
56
  "typescript": "5.9.3",
58
- "typescript-eslint": "8.48.0",
59
- "vitest": "4.0.14"
57
+ "typescript-eslint": "8.56.1",
58
+ "vitest": "4.0.18"
60
59
  }
61
60
  }
package/readme.md CHANGED
@@ -4,6 +4,7 @@
4
4
  [![Github Actions Status](https://img.shields.io/github/actions/workflow/status/noelforte/eleventy-plugin-vento/ci.yml?style=flat-square&logo=github&logoColor=fff&label=Tests&labelColor=333)](https://github.com/noelforte/eleventy-plugin-vento/actions/workflows/ci.yml)
5
5
  [![eleventy-plugin-vento on npm](https://img.shields.io/npm/v/eleventy-plugin-vento?style=flat-square&logo=npm&logoColor=fff&labelColor=333)](https://npmjs.com/package/eleventy-plugin-vento)
6
6
  [![Changesets on GitHub](https://img.shields.io/badge/🦋_Changesets-333?style=flat-square)](https://github.com/changesets/changesets/)
7
+ [![Uses Prettier](https://img.shields.io/badge/code_style-prettier-cc00aa?style=flat-square&labelColor=333)](https://prettier.io/)
7
8
 
8
9
  An [Eleventy](https://11ty.dev/) plugin that adds support for [Vento](https://vento.js.org/) templates.
9
10
 
@@ -20,9 +21,7 @@ An [Eleventy](https://11ty.dev/) plugin that adds support for [Vento](https://ve
20
21
 
21
22
  ## Installing
22
23
 
23
- ```sh
24
- npm install eleventy-plugin-vento
25
- ```
24
+ This plugin is available [via the `npm` registry](https://www.npmjs.com/package/eleventy-plugin-vento). You may install it via any compatible package manager (`npm`, `pnpm`, `yarn`, direct download, etc).
26
25
 
27
26
  [↑ Return to Top](#contents)
28
27
 
@@ -46,7 +45,7 @@ export default function (eleventyConfig) {
46
45
 
47
46
  ## Plugin Options
48
47
 
49
- This plugin ships with default options out of the box, but you can [pass an options object](https://www.11ty.dev/docs/plugins/#plugin-configuration-options) to your `addPlugin` call to configure things further. The below example shows the configurable options as well as their defaults.
48
+ This plugin ships with default options out of the box, but you can [pass an options object](https://www.11ty.dev/docs/create-plugin/#plugin-configuration-options) to your `addPlugin` call to configure things further. The below example shows the configurable options as well as their defaults.
50
49
 
51
50
  ```js
52
51
  import { VentoPlugin } from 'eleventy-plugin-vento';
@@ -232,9 +231,10 @@ Vento: See [Auto Trim Plugin](https://vento.js.org/plugins/auto-trim/).
232
231
 
233
232
  Like Eleventy, this plugin uses the [`debug`](https://www.npmjs.com/package/debug) package to handle verbose logging. The following `DEBUG` namespaces are implemented:
234
233
 
235
- - `Eleventy:Vento` - Logs initial setup of the plugin, loading features, pre-page compile setup steps (like changing `page` and `eleventy` objects)
234
+ - `Eleventy:Vento` - Logs initial setup of the plugin, loading features, pre-page compile setup steps (like changing `page` and `eleventy` objects).
236
235
  - `Eleventy:Vento:Cache` - Logs updates to Vento's own internal cache, which is used in tandem with Eleventy's cache.
237
- - `Eleventy:Vento:Render` - Logs when templates are rendered
236
+ - `Eleventy:Vento:Render` - Logs when templates are rendered.
237
+ - `Eleventy:Vento:Error` - Logs extra debugging information when errors occur.
238
238
 
239
239
  Because it is a child of the `Eleventy:` namespace, the following command will include output from this plugin as well:
240
240