From 5ea81bda8e7efb1d5ebe1b937cf639542071c014 Mon Sep 17 00:00:00 2001 From: Gigi Date: Fri, 3 Oct 2025 09:25:05 +0200 Subject: [PATCH] fix(deps): replace relative-time with date-fns for timestamp formatting - Replace relative-time package (which uses Temporal API) with date-fns - Update formatDate to use formatDistanceToNow from date-fns - Remove relative-time type declarations - Apply fix to both helpers.ts and bookmarkUtils.tsx - Fix runtime error: relative-time expects Temporal objects, not Date objects - date-fns provides better compatibility with current JavaScript standards --- node_modules/.package-lock.json | 16 ++++++++++------ package-lock.json | 18 +++++++++++------- package.json | 2 +- src/types/relative-time.d.ts | 7 ------- src/utils/bookmarkUtils.tsx | 6 ++---- src/utils/helpers.ts | 6 ++---- 6 files changed, 26 insertions(+), 29 deletions(-) delete mode 100644 src/types/relative-time.d.ts diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 696661e1..f42fc088 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -2613,6 +2613,16 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5027,12 +5037,6 @@ "node": ">=0.10.0" } }, - "node_modules/relative-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/relative-time/-/relative-time-2.1.0.tgz", - "integrity": "sha512-F27Uw3MySeXh3CQF7ufdhujG9QqKlLIWUQ9EG0cSaddUCFVzqsPQ5lVV3aoqu9Z4hRuq0FZHtc/g4r6idnqnPA==", - "license": "MIT" - }, "node_modules/remark": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", diff --git a/package-lock.json b/package-lock.json index 671f8344..74512f1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,11 +17,11 @@ "applesauce-loaders": "^3.1.0", "applesauce-react": "^3.1.0", "applesauce-relay": "^3.1.0", + "date-fns": "^4.1.0", "nostr-tools": "^2.4.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^10.1.0", - "relative-time": "^2.1.0", "remark-gfm": "^4.0.1" }, "devDependencies": { @@ -2603,6 +2603,16 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5017,12 +5027,6 @@ "node": ">=0.10.0" } }, - "node_modules/relative-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/relative-time/-/relative-time-2.1.0.tgz", - "integrity": "sha512-F27Uw3MySeXh3CQF7ufdhujG9QqKlLIWUQ9EG0cSaddUCFVzqsPQ5lVV3aoqu9Z4hRuq0FZHtc/g4r6idnqnPA==", - "license": "MIT" - }, "node_modules/remark": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", diff --git a/package.json b/package.json index 2f575cc1..6a7cd3ae 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,11 @@ "applesauce-loaders": "^3.1.0", "applesauce-react": "^3.1.0", "applesauce-relay": "^3.1.0", + "date-fns": "^4.1.0", "nostr-tools": "^2.4.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^10.1.0", - "relative-time": "^2.1.0", "remark-gfm": "^4.0.1" }, "devDependencies": { diff --git a/src/types/relative-time.d.ts b/src/types/relative-time.d.ts deleted file mode 100644 index 61a6f99c..00000000 --- a/src/types/relative-time.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare module 'relative-time' { - class RelativeTime { - from(date: Date): string - } - export default RelativeTime -} - diff --git a/src/utils/bookmarkUtils.tsx b/src/utils/bookmarkUtils.tsx index cb911d77..48ed55d2 100644 --- a/src/utils/bookmarkUtils.tsx +++ b/src/utils/bookmarkUtils.tsx @@ -1,14 +1,12 @@ import React from 'react' -import RelativeTime from 'relative-time' +import { formatDistanceToNow } from 'date-fns' import { ParsedContent, ParsedNode } from '../types/bookmarks' import ResolvedMention from '../components/ResolvedMention' // Note: ContentWithResolvedProfiles is imported by components directly to keep this file component-only for fast refresh -const relativeTime = new RelativeTime() - export const formatDate = (timestamp: number) => { const date = new Date(timestamp * 1000) - return relativeTime.from(date) + return formatDistanceToNow(date, { addSuffix: true }) } // Component to render content with resolved nprofile names diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts index 9b79263e..6c4074bc 100644 --- a/src/utils/helpers.ts +++ b/src/utils/helpers.ts @@ -1,10 +1,8 @@ -import RelativeTime from 'relative-time' - -const relativeTime = new RelativeTime() +import { formatDistanceToNow } from 'date-fns' export const formatDate = (timestamp: number): string => { const date = new Date(timestamp * 1000) - return relativeTime.from(date) + return formatDistanceToNow(date, { addSuffix: true }) } // Extract pubkeys from nprofile strings in content