From 124ccc1b8d183c0e5bbd28cf7b752d7d144622cd Mon Sep 17 00:00:00 2001 From: Stuart Schechter Date: Tue, 26 Mar 2024 15:24:26 -0400 Subject: [PATCH] add date format HUMAN_SINCE add date format HUMAN_SINCE_STRICT --- CHANGELOG.md | 1 + deps/date.ts | 2 ++ plugins/date.ts | 14 ++++++++++++-- tests/date.test.ts | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bbaec9d..82dc7b05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Go to the `v1` branch to see the changelog of Lume 1. ## [2.1.3] - Unreleased ### Added - PostCSS plugin: new option `name` with the default value `postcss` [#582]. +- date plugin: new formats `HUMAN_SINCE` and `HUMAN_SINCE_STRICT` expose [`formatDistanceToNow`](https://date-fns.org/v3.6.0/docs/formatDistanceToNow) and [`formatDistanceToNowStrict`](https://date-fns.org/v3.6.0/docs/formatDistanceToNowStrict) in the [date-fns](https://date-fns.org/) package, so you can refer to the amount of time that has passed since the an article was last written/modified, rather than just the date it was written. ### Changed - Do not ignore the `/.well-known` folder by default [#585]. diff --git a/deps/date.ts b/deps/date.ts index dd34727f..400404b8 100644 --- a/deps/date.ts +++ b/deps/date.ts @@ -1,2 +1,4 @@ export { format } from "npm:date-fns@3.6.0/format"; +export { formatDistanceToNow } from "npm:date-fns@3.6.0/formatDistanceToNow"; +export { formatDistanceToNowStrict } from "npm:date-fns@3.6.0/formatDistanceToNowStrict"; export type { Locale } from "npm:date-fns@3.6.0/locale"; diff --git a/plugins/date.ts b/plugins/date.ts index db9bfd26..7a74bb88 100644 --- a/plugins/date.ts +++ b/plugins/date.ts @@ -1,4 +1,8 @@ -import { format } from "../deps/date.ts"; +import { + format, + formatDistanceToNow, + formatDistanceToNowStrict, +} from "../deps/date.ts"; import { merge } from "../core/utils/object.ts"; import type Site from "../core/site.ts"; @@ -56,7 +60,13 @@ export default function (userOptions?: Options) { const patt = options.formats[pattern] || pattern; const locale = lang ? options.locales[lang] : undefined; - return format(date, patt, { locale }); + if (pattern === "HUMAN_SINCE") { + return formatDistanceToNow(date, { locale }); + } else if (pattern === "HUMAN_SINCE_STRICT") { + return formatDistanceToNowStrict(date, { locale }); + } else { + return format(date, patt, { locale }); + } } }; } diff --git a/tests/date.test.ts b/tests/date.test.ts index e93d107c..346b451e 100644 --- a/tests/date.test.ts +++ b/tests/date.test.ts @@ -35,6 +35,23 @@ Deno.test("date plugin", () => { equals(format(date0, "CUSTOM"), "1970_01"); }); +Deno.test("date plugin formats: HUMAN_SINCE and HUMAN_SINCE_STRICT", () => { + const site = lume(); + site.use(date()); + + const { helpers } = site.renderer; + assert(helpers.has("date")); + const [format] = helpers.get("date")!; + + const aBitMoreThanAYearFromNow = new Date( + Date.now() + 367 * 24 * 60 * 60 * 1000, + ); + // See https://date-fns.org/v3.6.0/docs/formatDistanceToNow + equals(format(aBitMoreThanAYearFromNow, "HUMAN_SINCE"), "about 1 year"); + // See https://date-fns.org/v3.6.0/docs/formatDistanceToNowStrict + equals(format(aBitMoreThanAYearFromNow, "HUMAN_SINCE_STRICT"), "1 year"); +}); + Deno.test("date plugin with custom locale", async () => { const site = lume(); site.use(date({