{"_id":"@apurvapawaskar/timeago-plus","_rev":"7-15d9b030802a44dc3bcc6e0bb2ea77dc","name":"@apurvapawaskar/timeago-plus","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.5":{"name":"@apurvapawaskar/timeago-plus","version":"0.1.5","keywords":["timeago","relative-time","date","time","react","angular","pipe","hook","typescript"],"license":"MIT","_id":"@apurvapawaskar/timeago-plus@0.1.5","maintainers":[{"name":"apurvapawaskar","email":"developer.apurvapawaskar@gmail.com"}],"homepage":"https://github.com/apurvapawaskar/timeago-plus","bugs":{"url":"https://github.com/apurvapawaskar/timeago-plus/issues"},"dist":{"shasum":"a33f66c6cdc3a5f7c06c3913fe8f55c6de31b443","tarball":"https://registry.npmjs.org/@apurvapawaskar/timeago-plus/-/timeago-plus-0.1.5.tgz","fileCount":21,"integrity":"sha512-rlwRL1oUfqrkPmfK1ojztOpA3gVwrgdttC/MqO4dW4aJovmfLUNpgD0/iKz4lhz31ePXi+lcekBv2/Ve7o8gjQ==","signatures":[{"sig":"MEUCIGbDcsrU1pmV15e6sILj0kP0CfvF5VWzpYe6AOxGVPpKAiEAvobHtkm62AuKT/Gd3c6YFbNKZJGN11HSahBrIWrsoqc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93591},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js","require":"./dist/react.cjs"},"./angular":{"types":"./dist/angular.d.ts","import":"./dist/angular.js","require":"./dist/angular.cjs"}},"gitHead":"450555fb98de5ef8421831d989a70b98ddd5ff26","_npmUser":{"name":"apurvapawaskar","email":"developer.apurvapawaskar@gmail.com"},"repository":{"url":"git+https://github.com/apurvapawaskar/timeago-plus.git","type":"git"},"_npmVersion":"11.6.2","description":"Tiny, dependency-free relative time strings (just now, 2m ago, in 3h).","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"react":">=17 <20","@angular/core":">=14 <23"},"peerDependenciesMeta":{"react":{"optional":true},"@angular/core":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/timeago-plus_0.1.5_1772574110897_0.031558957898415674","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@apurvapawaskar/timeago-plus","version":"0.1.6","description":"Tiny, dependency-free relative time strings (just now, 2m ago, in 3h).","license":"MIT","repository":{"type":"git","url":"git+https://github.com/apurvapawaskar/timeago-plus.git"},"publishConfig":{"access":"public"},"homepage":"https://github.com/apurvapawaskar/timeago-plus","type":"module","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js","require":"./dist/react.cjs"},"./angular":{"types":"./dist/angular.d.ts","import":"./dist/angular.js","require":"./dist/angular.cjs"}},"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"peerDependencies":{"react":">=17 <20","@angular/core":">=14 <23"},"peerDependenciesMeta":{"@angular/core":{"optional":true},"react":{"optional":true}},"keywords":["timeago","relative-time","date","time","react","angular","pipe","hook","typescript","timeago-plus","time-ago"],"gitHead":"84689aa84ab5e355f573219f7ae3a16a3396450e","_id":"@apurvapawaskar/timeago-plus@0.1.6","bugs":{"url":"https://github.com/apurvapawaskar/timeago-plus/issues"},"_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-Lt2jINocVJWvrpmLc1nXlVz4DjdALzjwHloOm1ht46sRXLe4ZO8Kxiy6QAoNc+mGbxoOqpQX1vf6mYcqRQmBOg==","shasum":"2ed1ce93e5cfe4357c1be5459cc022b4273c8a27","tarball":"https://registry.npmjs.org/@apurvapawaskar/timeago-plus/-/timeago-plus-0.1.6.tgz","fileCount":26,"unpackedSize":152367,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDjaGG0iJ43W3mTETAC1UfqEKPPQnsGRZQfGcfG6iOpGwIgY1oufsz6fbAYBJidtEWFrtg6XBLb/uD5Kq4mElhuB2A="}]},"_npmUser":{"name":"apurvapawaskar","email":"developer.apurvapawaskar@gmail.com"},"directories":{},"maintainers":[{"name":"apurvapawaskar","email":"developer.apurvapawaskar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/timeago-plus_0.1.6_1772820733763_0.8097040810254426"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-03T21:41:50.666Z","modified":"2026-03-06T18:12:13.999Z","0.1.3":"2026-02-23T15:44:04.160Z","0.1.4":"2026-03-03T21:37:41.907Z","0.1.5":"2026-03-03T21:41:51.042Z","0.1.6":"2026-03-06T18:12:13.912Z"},"bugs":{"url":"https://github.com/apurvapawaskar/timeago-plus/issues"},"license":"MIT","homepage":"https://github.com/apurvapawaskar/timeago-plus","keywords":["timeago","relative-time","date","time","react","angular","pipe","hook","typescript","timeago-plus","time-ago"],"repository":{"type":"git","url":"git+https://github.com/apurvapawaskar/timeago-plus.git"},"description":"Tiny, dependency-free relative time strings (just now, 2m ago, in 3h).","maintainers":[{"name":"apurvapawaskar","email":"developer.apurvapawaskar@gmail.com"}],"readme":"# @apurvapawaskar/timeago-plus\r\n\r\n![npm](https://img.shields.io/npm/v/@apurvapawaskar/timeago-plus)\r\n![bundle size](https://img.shields.io/bundlephobia/minzip/@apurvapawaskar/timeago-plus)\r\n![downloads](https://img.shields.io/npm/dm/@apurvapawaskar/timeago-plus)\r\n![license](https://img.shields.io/npm/l/@apurvapawaskar/timeago-plus)\r\n![TypeScript ready](https://img.shields.io/badge/TypeScript-ready-blue)\r\n\r\n**Tiny, dependency-free relative time formatter with i18n, React hooks & Angular pipes.**\r\n\r\n- No runtime dependencies\r\n- ESM + CommonJS support\r\n- Tree-shakeable (`sideEffects: false`)\r\n- Extremely small footprint\r\n\r\n## 📦 Install\r\n\r\n```bash\r\nnpm i @apurvapawaskar/timeago-plus\r\n```\r\n\r\n## ⚡ Basic Usage\r\n\r\n- Input: `Date | number | string` — invalid inputs never throw, return `\"invalid date\"`\r\n- Numbers `< 1e12` are treated as epoch **seconds**; `>= 1e12` as epoch **milliseconds**\r\n\r\n```ts\r\nimport { timeAgo } from \"@apurvapawaskar/timeago-plus\";\r\n\r\ntimeAgo(new Date(Date.now() - 30_000)); // \"30s ago\"\r\ntimeAgo(Date.now() - 2 * 60_000);      // \"2m ago\"\r\ntimeAgo(new Date(Date.now() + 2 * 60_000)); // \"in 2m\"\r\ntimeAgo(Date.now() - 1_000);           // \"just now\" (within 2s threshold)\r\n```\r\n\r\n## ⚙️ Options\r\n\r\n```ts\r\ntimeAgo(input, {\r\n  now?: Date | number,       // reference time, defaults to Date.now()\r\n  short?: boolean,           // true = \"2m ago\", false = \"2 minutes ago\". Default: true\r\n  future?: boolean,          // allow future output like \"in 2m\". Default: true\r\n  locale?: string,           // \"en\" | \"fr\" | \"es\" (or subtag like \"es-ES\"). Default: \"en\"\r\n  labels?: Partial<TimeAgoLabels>, // override any label string\r\n  justNowThreshold?: number, // seconds within which to return \"just now\". Minimum 2, default: 2\r\n  futureDisabledLabel?: string, // string to show when future: false and input is a future date. Default: \"just now\"\r\n});\r\n```\r\n\r\n**Behaviour notes:**\r\n- Seconds use `Math.floor`; all larger units use `Math.round`\r\n\r\n## ⚛ React\r\n\r\nRequires React 17–19. `react` is a peer dependency (not bundled).\r\n\r\n```tsx\r\nimport { useTimeAgo } from \"@apurvapawaskar/timeago-plus/react\";\r\n\r\nexport function Example() {\r\n  const text = useTimeAgo(Date.now() - 30_000);\r\n  return <span>{text}</span>;\r\n}\r\n```\r\n\r\nFor optimal performance, memoize the options object with `useMemo` when passing dynamic options.\r\n\r\n## 🅰 Angular\r\n\r\nRequires Angular 14+. `TimeAgoPipe` is a **standalone** pipe — add it to `imports`, not `declarations`.\r\n\r\n```ts\r\nimport { TimeAgoPipe } from \"@apurvapawaskar/timeago-plus/angular\";\r\n\r\n@Component({\r\n  standalone: true,\r\n  imports: [TimeAgoPipe],\r\n  template: `<span>{{ createdAt | timeAgo }}</span>`\r\n})\r\nexport class ExampleComponent {}\r\n```\r\n\r\nWith options:\r\n\r\n```html\r\n<span>{{ createdAt | timeAgo : { locale: 'fr', short: false } }}</span>\r\n```\r\n\r\nUsing from an NgModule (Angular 14+):\r\n\r\n```ts\r\nimport { NgModule } from \"@angular/core\";\r\nimport { TimeAgoPipe } from \"@apurvapawaskar/timeago-plus/angular\";\r\n\r\n@NgModule({\r\n  imports: [TimeAgoPipe],   // standalone pipes go in imports[], not declarations[]\r\n  exports: [TimeAgoPipe]\r\n})\r\nexport class SharedModule {}\r\n```\r\n\r\n## 🧪 Playground\r\n\r\nTry the playground online:\r\n\r\n- [Core](https://timeago-plus.apurvapawaskar.in/)\r\n- [React](https://react.timeago-plus.apurvapawaskar.in/)\r\n- [Angular](https://angular.timeago-plus.apurvapawaskar.in/)\r\n\r\n\r\n## 📚 Docs\r\n\r\n- [API](./docs/api.md)\r\n- [i18n](./docs/i18n.md)\r\n- [React](./docs/react.md)\r\n- [Angular](./docs/angular.md)\r\n- [Examples](./docs/examples.md)\r\n\r\n## 🛠 Development\r\n\r\n```bash\r\nnpm test\r\nnpm run build\r\n```\r\n\r\n","readmeFilename":"README.md"}