From d326cf7139e1caa4a6be2ec6789bb998db8f4769 Mon Sep 17 00:00:00 2001 From: Jared Wray Date: Sun, 15 Dec 2024 12:20:09 -0800 Subject: [PATCH] adding in date parsing for the date helper --- package.json | 2 ++ src/helpers/date.ts | 23 +++++++++++++++++++++++ test/helpers/date.test.ts | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index aa4ecc6..025ecdd 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,9 @@ "arr-flatten": "^1.1.0", "array-sort": "^1.0.0", "cacheable": "^1.8.5", + "chrono-node": "^2.7.7", "create-frame": "^1.0.0", + "dayjs": "^1.11.13", "define-property": "^2.0.2", "ent": "^2.2.1", "extend-shallow": "^3.0.2", diff --git a/src/helpers/date.ts b/src/helpers/date.ts index 9ac28b6..0c964ad 100644 --- a/src/helpers/date.ts +++ b/src/helpers/date.ts @@ -1,11 +1,34 @@ +import {parseDate} from 'chrono-node'; +import dayjs from 'dayjs'; import {type Helper} from '../helper-registry.js'; const year = () => new Date().getFullYear().toString(); +const date = (humanReadableDate: string, formatString: string): string => { + const parsedDate = parseDate(humanReadableDate); + if (!parsedDate) { + throw new Error(`Unable to parse date: ${humanReadableDate}`); + } + + // Format the parsed date using `dayjs` + return dayjs(parsedDate).format(formatString); +}; + export const helpers: Helper[] = [ { name: 'year', category: 'date', fn: year, }, + { + name: 'date', + category: 'date', + fn: date, + }, + { + /* Adding this in for legacy support */ + name: 'moment', + category: 'date', + fn: date, + }, ]; diff --git a/test/helpers/date.test.ts b/test/helpers/date.test.ts index dcb81fc..9c71d40 100644 --- a/test/helpers/date.test.ts +++ b/test/helpers/date.test.ts @@ -1,7 +1,9 @@ import {describe, it, expect} from 'vitest'; +import dayjs from 'dayjs'; +import {parseDate} from 'chrono-node'; import {helpers} from '../../src/helpers/date.js'; -describe('helpers', () => { +describe('year', () => { it('should have a "year" helper with the correct properties', () => { // Find the 'year' helper in the array const yearHelper = helpers.find(helper => helper.name === 'year'); @@ -25,3 +27,32 @@ describe('helpers', () => { expect(yearHelper?.fn()).toBe(currentYear); }); }); + +describe('date', () => { + it('should correctly calculate and format "5 years ago"', () => { + const dateHelper = helpers.find(helper => helper.name === 'date'); + expect(dateHelper).toBeDefined(); + + const formattedDate = dateHelper?.fn('5 years ago', 'YYYY'); + const expectedDate = dayjs().subtract(5, 'years').format('YYYY'); + expect(formattedDate).toBe(expectedDate); + }); + + it('should correctly calculate and format "next Friday"', () => { + const dateHelper = helpers.find(helper => helper.name === 'date'); + expect(dateHelper).toBeDefined(); + + const formattedDate = dateHelper?.fn('next Friday', 'MM/DD/YYYY'); + const expectedDate = dayjs(parseDate('next Friday')).format('MM/DD/YYYY'); + expect(formattedDate).toBe(expectedDate); + }); + + it('should throw an error for an invalid date format', () => { + const dateHelper = helpers.find(helper => helper.name === 'date'); + expect(dateHelper).toBeDefined(); + + expect(() => dateHelper?.fn('invalid date', 'YYYY')).toThrowError( + 'Unable to parse date: invalid date', + ); + }); +});