import type Site from "../core/site.ts"; import { getGitDate } from "../core/utils/date.ts"; import { merge } from "../core/utils/object.ts"; import { type FFFFlavoredFrontmatter, type FFFTransformPreset, postTypeDiscovery, strict, type StrictPresetOptions, transform, } from "../deps/fff.ts"; export interface Options { /** * The list of presets to apply * @see https://fff.js.org/concepts/flavor-transform.html#fff-transform-preset */ presets: FFFTransformPreset[]; strict: false | StrictPresetOptions; /** To convert the generic `date` field to one of these values */ date?: "created" | "updated" | "published"; /** Get the date from the git history */ getGitDate?: boolean; postTypeDiscovery?: boolean; } // Default options export const defaults: Options = { presets: [], strict: false, }; /** * A plugin to transform frontmatter using FFF * @see https://lume.land/plugins/fff/ */ export function fff(userOptions?: Partial) { const options = merge(defaults, userOptions); return (site: Site) => { site.preprocess([".html"], function processFFF(pages) { for (const page of pages) { if (options.getGitDate && page.src.entry) { if (!page.data.created) { page.data.created = getGitDate("created", page.src.entry.src); } if (!page.data.updated) { page.data.updated = getGitDate("modified", page.src.entry.src); } } page.data = transform(page.data, [ ...options.presets, ...(options.date ? [{ "date": options.date }] : []), ...(options.strict === false ? [] : [strict(options.strict)]), ]); if (options.postTypeDiscovery) { page.data.type = postTypeDiscovery(page.data); } } }); }; } export default fff; /** Extends Data interface */ declare global { namespace Lume { export interface Data extends Omit {} } }