import { createConditionalPlugin } from "../plugins/control/ConditionalPlugin.js"; import { createLoopPlugin } from "../plugins/control/LoopPlugin.js"; import { createCounterPlugin } from "../plugins/dynamic/CounterPlugin.js"; import { createDateTimePlugin } from "../plugins/dynamic/DateTimePlugin.js"; import { createUuidPlugin } from "../plugins/dynamic/UuidPlugin.js"; import { createCaseTransformPlugin } from "../plugins/transform/CaseTransformPlugin.js"; import { createRegexPlugin } from "../plugins/transform/RegexPlugin.js"; import { createStringSplitPlugin } from "../plugins/transform/StringSplitPlugin.js"; import { createArrayIndexPlugin } from "../plugins/variables/ArrayIndexPlugin.js"; import { createDotNotationPlugin } from "../plugins/variables/DotNotationPlugin.js"; import type { ParseState, PluginPreset, TemplateContext, } from "../types/index.js"; /** * Full preset — all plugins except the loop (loops require a parse-function * reference which is only available from the engine). * * Includes control-flow (conditional), dynamic variables (counter, datetime, * uuid), transforms (string-split, regex, case-transform), and variable * resolution (array-index, dot-notation). */ export function fullPreset< TContext extends TemplateContext = TemplateContext, >(): PluginPreset { return { name: "full", plugins: [ createConditionalPlugin(), createCounterPlugin(), createDateTimePlugin(), createUuidPlugin(), createStringSplitPlugin(), createRegexPlugin(), createCaseTransformPlugin(), createArrayIndexPlugin(), createDotNotationPlugin(), ], }; } /** * Full preset with loop support. * * The `parseFunction` is the engine's internal sync renderer, injected so * the loop plugin can recursively render each iteration body. * * @example * ```ts * const engine = new TemplateEngine(); * engine.usePreset( * fullPresetWithLoops((tpl, ctx, state) => engine["parseInternal"](tpl, ctx, state)) * ); * ``` */ export function fullPresetWithLoops< TContext extends TemplateContext = TemplateContext, >( parseFunction: ( template: string, context: TContext, state: ParseState ) => string ): PluginPreset { const base = fullPreset(); return { ...base, name: "full-with-loops", plugins: [createLoopPlugin(parseFunction), ...base.plugins], }; }