A simpler static site generator with extensive templating support and plugin ecosystem.
npx @tessl/cli install tessl/npm-11ty--eleventy@3.1.0Eleventy is a simpler static site generator that transforms directories of templates of varying types (HTML, Markdown, JavaScript, Liquid, Nunjucks) into static HTML websites. It provides a flexible and powerful build system with extensive templating engine support, plugin architecture, development server capabilities, and comprehensive customization options for modern web development workflows.
npm install @11ty/eleventyESM (Recommended):
import Eleventy from "@11ty/eleventy";
import { UserConfig } from "@11ty/eleventy/UserConfig";CommonJS:
const Eleventy = require("@11ty/eleventy");
const { UserConfig } = require("@11ty/eleventy/UserConfig");Built-in Plugins:
import {
RenderPlugin,
I18nPlugin,
HtmlBasePlugin,
InputPathToUrlTransformPlugin,
BundlePlugin,
IdAttributePlugin
} from "@11ty/eleventy";import Eleventy from "@11ty/eleventy";
// Basic programmatic usage
const elev = new Eleventy("./src", "./_site");
// Initialize and build
await elev.init();
await elev.write();
// Development mode with watch
const elev = new Eleventy("./src", "./_site", {
runMode: "serve"
});
await elev.init();
await elev.watch();
await elev.serve(8080);Configuration:
import Eleventy from "@11ty/eleventy";
const elev = new Eleventy("./src", "./_site", {
configPath: ".eleventy.js",
pathPrefix: "/mysite/",
quietMode: false,
config: (eleventyConfig) => {
// Programmatic configuration
eleventyConfig.addFilter("myFilter", (content) => {
return content.toUpperCase();
});
}
});Eleventy is built around several key components:
Eleventy class for programmatic builds and UserConfig for configurationCore programmatic interface for running Eleventy builds, configuring options, and controlling the build process.
class Eleventy {
constructor(
input?: string,
output?: string,
options?: EleventyOptions,
eleventyConfig?: TemplateConfig
);
init(options?: { viaConfigReset?: boolean }): Promise<void>;
write(): Promise<[passthroughCopy: any[], templates: any[]]>;
toJSON(): Promise<any[]>;
toNDJSON(): Promise<ReadableStream>;
watch(): Promise<Function>;
serve(port?: number): Promise<void>;
}
interface EleventyOptions {
source?: 'cli' | 'script';
runMode?: 'build' | 'serve' | 'watch';
dryRun?: boolean;
configPath?: string;
pathPrefix?: string;
quietMode?: boolean;
config?: (eleventyConfig: UserConfig) => void;
inputDir?: string;
loader?: 'esm' | 'cjs' | 'auto';
}Comprehensive configuration system for customizing template processing, adding filters and shortcodes, configuring plugins, and setting up data processing.
class UserConfig {
// Filters
addFilter(name: string, callback: Function): void;
addAsyncFilter(name: string, callback: Function): void;
// Shortcodes
addShortcode(name: string, callback: Function): void;
addPairedShortcode(name: string, callback: Function): void;
// Collections
addCollection(name: string, callback: Function): void;
// Transforms
addTransform(name: string, callback: Function): void;
// Plugins
addPlugin(plugin: PluginDefinition, options?: any): void;
// Template formats and extensions
setTemplateFormats(formats: string | string[]): void;
addExtension(extension: string | string[], options?: ExtensionOptions): void;
}Multi-engine template system supporting various templating languages with shared filters, shortcodes, and data.
// Template engines supported
type TemplateEngine =
| 'liquid' // Shopify Liquid
| 'njk' // Nunjucks
| 'md' // Markdown
| 'html' // HTML
| '11ty.js' // JavaScript templates
| 'hbs' // Handlebars (via plugin)
| 'mustache' // Mustache (via plugin)
| 'ejs' // EJS (via plugin)
| 'pug' // Pug (via plugin);
// Engine-specific configuration
interface EngineConfiguration {
liquid?: {
options?: any;
tags?: Record<string, Function>;
filters?: Record<string, Function>;
shortcodes?: Record<string, Function>;
};
nunjucks?: {
environmentOptions?: any;
filters?: Record<string, Function>;
tags?: Record<string, Function>;
globals?: Record<string, any>;
};
}Hierarchical data cascade system providing template data from multiple sources with configurable merging.
// Data sources (in order of priority)
interface DataCascade {
computedData: any; // Computed data
frontMatter: any; // Template front matter
templateData: any; // Template directory data
directoryData: any; // Directory data files
globalData: any; // Global data directory
}
// Data file configuration
interface DataConfiguration {
dataFileSuffixes?: string[];
dataFileDirBaseName?: string;
dataDeepMerge?: boolean;
dataExtensions?: Map<string, DataExtensionConfig>;
}Extensible plugin architecture with built-in plugins and support for community plugins.
interface PluginDefinition {
configFunction?: (eleventyConfig: UserConfig, options?: any) => void;
eleventyPackage?: string;
eleventyPluginOptions?: {
unique?: boolean;
};
}
// Built-in plugins
const RenderPlugin: PluginDefinition; // Template rendering utilities
const I18nPlugin: PluginDefinition; // Internationalization
const HtmlBasePlugin: PluginDefinition; // Base href processing
const BundlePlugin: PluginDefinition; // Asset bundling
const IdAttributePlugin: PluginDefinition; // Auto ID attributesFile processing pipeline including passthrough copy, transforms, collections, and output generation.
interface BuildPipeline {
// File processing
passthroughCopy: Record<string, PassthroughCopyOptions>;
transforms: Record<string, TransformFunction>;
preprocessors: Record<string, PreprocessorConfig>;
linters: Record<string, LinterFunction>;
// Collections
collections: Record<string, CollectionFunction>;
// Output configuration
outputDir: string;
pathPrefix: string;
urlTransforms: UrlTransformFunction[];
}
type TransformFunction = (content: string, outputPath: string) => string | Promise<string>;
type CollectionFunction = (collectionApi: CollectionApi) => any[];Development server, file watching, and live reload capabilities for efficient development workflows.
interface DevelopmentConfig {
// Watch configuration
watchJavaScriptDependencies?: boolean;
additionalWatchTargets?: string[];
watchIgnores?: string[];
chokidarConfig?: any;
watchThrottleWaitTime?: number;
// Server configuration
serverOptions?: {
port?: number;
showAllHosts?: boolean;
showVersion?: boolean;
encoding?: string;
};
serverPassthroughCopyBehavior?: 'copy' | 'passthrough';
}// Core template data structure
interface TemplateData {
page: {
url: string;
fileSlug: string;
filePathStem: string;
date: Date;
inputPath: string;
outputPath: string;
};
collections: {
all: CollectionItem[];
[key: string]: CollectionItem[];
};
[key: string]: any; // Additional data
}
interface CollectionItem {
template: any;
inputPath: string;
fileSlug: string;
outputPath: string;
url: string;
date: Date;
data: any;
}
// Extension configuration
interface ExtensionOptions {
key?: string;
extension?: string;
outputFileExtension?: string;
compile?: CompileFunction;
compileOptions?: any;
getData?: GetDataFunction;
getInstanceFromInputPath?: GetInstanceFunction;
}
type CompileFunction = (inputContent: string, inputPath: string) => RenderFunction;
type RenderFunction = (data: any) => string | Promise<string>;