Files
beall-11ty/node_modules/@11ty/eleventy/src/defaultConfig.js

179 lines
6.6 KiB
JavaScript
Raw Normal View History

2026-03-31 16:38:22 -07:00
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: {},
};
}