Skip to main content
Module

x/eta/config.ts

Embedded JS template engine for Node, Deno, and the browser. Lighweight, fast, and pluggable. Written in TypeScript
Very Popular
Go to Latest
File
import { templates } from "./containers.ts";import { copyProps, XMLEscape } from "./utils.ts";import EtaErr from "./err.ts";
/* TYPES */
import type { TemplateFunction } from "./compile.ts";import type { Cacher } from "./storage.ts";
type trimConfig = "nl" | "slurp" | false;
export interface EtaConfig { /** Whether or not to automatically XML-escape interpolations. Default true */ autoEscape: boolean;
/** Configure automatic whitespace trimming. Default `[false, 'nl']` */ autoTrim: trimConfig | [trimConfig, trimConfig];
/** Compile to async function */ async: boolean;
/** Whether or not to cache templates if `name` or `filename` is passed */ cache: boolean;
/** XML-escaping function */ e: (str: string) => string;
/** Parsing options */ parse: { /** Which prefix to use for evaluation. Default `""` */ exec: string;
/** Which prefix to use for interpolation. Default `"="` */ interpolate: string;
/** Which prefix to use for raw interpolation. Default `"~"` */ raw: string; };
/** Array of plugins */ plugins: Array< { processFnString?: Function; processAST?: Function; processTemplate?: Function; } >;
/** Remove all safe-to-remove whitespace */ rmWhitespace: boolean;
/** Delimiters: by default `['<%', '%>']` */ tags: [string, string];
/** Holds template cache */ templates: Cacher<TemplateFunction>;
/** Name of the data object. Default `it` */ varName: string;
/** Absolute path to template file */ filename?: string;
/** Holds cache of resolved filepaths. Set to `false` to disable */ filepathCache?: Record<string, string> | false;
/** Function to include templates by name */ include?: Function;
/** Function to include templates by filepath */ includeFile?: Function;
/** Name of template */ name?: string;
/** Where should absolute paths begin? Default '/' */ root?: string;
/** Make data available on the global object instead of varName */ useWith?: boolean;
/** Whether or not to cache templates if `name` or `filename` is passed: duplicate of `cache` */ "view cache"?: boolean;
/** Directory or directories that contain templates */ views?: string | Array<string>;
[index: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any}
export interface EtaConfigWithFilename extends EtaConfig { filename: string;}
export type PartialConfig = Partial<EtaConfig>;
/* END TYPES */
/** * Include a template based on its name (or filepath, if it's already been cached). * * Called like `include(templateNameOrPath, data)` */
function includeHelper( this: EtaConfig, templateNameOrPath: string, data: object,): string { var template = this.templates.get(templateNameOrPath); if (!template) { throw EtaErr('Could not fetch template "' + templateNameOrPath + '"'); } return template(data, this);}
/** Eta's base (global) configuration */var config: EtaConfig = { async: false, autoEscape: true, autoTrim: [false, "nl"], cache: false, e: XMLEscape, include: includeHelper, parse: { exec: "", interpolate: "=", raw: "~", }, plugins: [], rmWhitespace: false, tags: ["<%", "%>"], templates: templates, useWith: false, varName: "it",};
/** * Takes one or two partial (not necessarily complete) configuration objects, merges them 1 layer deep into eta.config, and returns the result * * @param override Partial configuration object * @param baseConfig Partial configuration object to merge before `override` * * **Example** * * ```js * let customConfig = getConfig({tags: ['!#', '#!']}) * ``` */
function getConfig(override: PartialConfig, baseConfig?: EtaConfig): EtaConfig { // TODO: run more tests on this
var res: PartialConfig = {}; // Linked copyProps(res, config); // Creates deep clone of eta.config, 1 layer deep
if (baseConfig) { copyProps(res, baseConfig); }
if (override) { copyProps(res, override); }
return res as EtaConfig;}
/** Update Eta's base config */
function configure(options: PartialConfig) { return copyProps(config, options);}
export { config, getConfig, configure };