Files
beall-11ty/node_modules/@11ty/eleventy/src/defaultConfig.js
2026-03-31 16:38:22 -07:00

179 lines
6.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import bundlePlugin from "@11ty/eleventy-plugin-bundle";
import urlFilter from "./Filters/Url.js";
import slugFilter from "./Filters/Slug.js";
import slugifyFilter from "./Filters/Slugify.js";
import getLocaleCollectionItem from "./Filters/GetLocaleCollectionItem.js";
import getCollectionItemIndex from "./Filters/GetCollectionItemIndex.js";
import { FilterPlugin as InputPathToUrlFilterPlugin } from "./Plugins/InputPathToUrl.js";
import { HtmlTransformer } from "./Util/HtmlTransformer.js";
import TransformsUtil from "./Util/TransformsUtil.js";
import MemoizeUtil from "./Util/MemoizeFunction.js";
import { HtmlRelativeCopyPlugin } from "./Plugins/HtmlRelativeCopyPlugin.js";
/**
* @module 11ty/eleventy/defaultConfig
*/
/**
* @callback addFilter - Register a global filter.
* @param {string} name - Register a template filter by this name.
* @param {function} callback - The filter logic.
*/
/**
* @typedef {object} config
* @property {addFilter} addFilter - Register a new global filter.
*/
/**
* @typedef {object} defaultConfig
* @property {Array<string>} templateFormats - An array of accepted template formats.
* @property {string} [pathPrefix='/'] - The directory under which all output files should be written to.
* @property {string} [markdownTemplateEngine='liquid'] - Template engine to process markdown files with.
* @property {string} [htmlTemplateEngine='liquid'] - Template engine to process html files with.
* @property {boolean} [dataTemplateEngine=false] - Changed in v1.0
* @property {string} [jsDataFileSuffix='.11tydata'] - File suffix for jsData files.
* @property {object} keys
* @property {string} [keys.package='pkg'] - Global data property for package.json data
* @property {string} [keys.layout='layout']
* @property {string} [keys.permalink='permalink']
* @property {string} [keys.permalinkRoot='permalinkBypassOutputDir']
* @property {string} [keys.engineOverride='templateEngineOverride']
* @property {string} [keys.computed='eleventyComputed']
* @property {object} dir
* @property {string} [dir.input='.']
* @property {string} [dir.includes='_includes']
* @property {string} [dir.data='_data']
* @property {string} [dir.output='_site']
* @deprecated handlebarsHelpers
* @deprecated nunjucksFilters
*/
/**
* Default configuration object factory.
*
* @param {config} config - Eleventy configuration object.
* @returns {defaultConfig}
*/
export default function (config) {
let templateConfig = this;
// Used for the HTML <base>, InputPathToUrl, Image transform plugins
let ut = new HtmlTransformer();
ut.setUserConfig(config);
// This needs to be assigned before bundlePlugin is added below.
config.htmlTransformer = ut;
config.exists = (filePath) => {
return this.existsCache.exists(filePath);
};
// Remember: the transform added here runs before the `htmlTransformer` transform
config.addPlugin(bundlePlugin, {
bundles: false, // no default bundles included—must be opt-in.
immediate: true,
});
// Filter: Maps an input path to output URL
config.addPlugin(InputPathToUrlFilterPlugin, {
immediate: true,
});
let memoizeBench = config.benchmarkManager.get("Configuration");
config.addFilter("slug", MemoizeUtil(slugFilter, { name: "slug", bench: memoizeBench }));
config.addFilter("slugify", MemoizeUtil(slugifyFilter, { name: "slugify", bench: memoizeBench }));
// Deprecated, use HtmlBasePlugin instead.
// Adds a pathPrefix manually to a URL string
config.addFilter("url", function addPathPrefixFilter(url, pathPrefixOverride) {
let pathPrefix;
if (pathPrefixOverride && typeof pathPrefixOverride === "string") {
pathPrefix = pathPrefixOverride;
} else {
pathPrefix = templateConfig.getPathPrefix();
}
return urlFilter.call(this, url, pathPrefix);
});
config.addFilter("log", (input, ...messages) => {
console.log(input, ...messages);
return input;
});
config.addFilter("getCollectionItemIndex", function (collection, pageOverride) {
return getCollectionItemIndex.call(this, collection, pageOverride);
});
config.addFilter("getCollectionItem", function (collection, pageOverride, langCode) {
return getLocaleCollectionItem.call(this, config, collection, pageOverride, langCode, 0);
});
config.addFilter("getPreviousCollectionItem", function (collection, pageOverride, langCode) {
return getLocaleCollectionItem.call(this, config, collection, pageOverride, langCode, -1);
});
config.addFilter("getNextCollectionItem", function (collection, pageOverride, langCode) {
return getLocaleCollectionItem.call(this, config, collection, pageOverride, langCode, 1);
});
// Process arbitrary content with transforms
config.addFilter(
"renderTransforms",
async function transformsFilter(content, pageEntryOverride, baseHrefOverride) {
return TransformsUtil.runAll(content, pageEntryOverride || this.page, config.transforms, {
baseHrefOverride,
logger: config.logger,
});
},
);
// Run the `htmlTransformer` transform
config.addTransform("@11ty/eleventy/html-transformer", async function (content) {
// Runs **AFTER** the bundle plugin transform (except: delayed bundles)
return ut.transformContent(this.outputPath, content, this);
});
// Requires user configuration, so must run as second-stage
config.addPlugin(HtmlRelativeCopyPlugin);
return {
templateFormats: ["liquid", "md", "njk", "html", "11ty.js"],
// if your site deploys to a subdirectory, change this
pathPrefix: "/",
markdownTemplateEngine: "liquid",
htmlTemplateEngine: "liquid",
// Renamed from `jsDataFileSuffix` in 2.0 (and swapped to an Array)
// If you remove "" we wont look for dir/dir.json or file.json
dataFileSuffixes: [".11tydata", ""],
// "index" will look for `directory/index.*` directory data files instead of `directory/directory.*`
dataFileDirBaseNameOverride: false,
keys: {
// TODO breaking: use `false` by default
package: "pkg", // supports `false`
layout: "layout",
permalink: "permalink",
permalinkRoot: "permalinkBypassOutputDir",
engineOverride: "templateEngineOverride",
computed: "eleventyComputed",
dataSchema: "eleventyDataSchema",
},
// Deprecated, define using `export const directories = {}` instead.
// Reference values using `eleventyConfig.directories` instead.
dir: {
// These values here arent used internally either (except by a few tests), instead were using `ProjectDirectories.defaults`.
// These are kept in place for backwards compat with `eleventyConfig.dir` references in project config code and plugins.
input: ".",
includes: "_includes",
data: "_data",
output: "_site",
},
// deprecated, use config.addNunjucksFilter
nunjucksFilters: {},
};
}