@sapphire/duration 1.0.1-next.ff9cb61.0 → 1.1.0-next.04a16e3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,7 +18,10 @@
18
18
  - [Features](#features)
19
19
  - [Installation](#installation)
20
20
  - [Usage](#usage)
21
- - [Basic Usage](#basic-usage)
21
+ - [Human Readable Milliseconds](#human-readable-milliseconds)
22
+ - [Parsing a Duration](#parsing-a-duration)
23
+ - [Serializing a Duration](#serializing-a-duration)
24
+ - [Localizing with Durations](#localizing-with-durations)
22
25
  - [Buy us some doughnuts](#buy-us-some-doughnuts)
23
26
  - [Contributors ✨](#contributors-%E2%9C%A8)
24
27
 
@@ -37,6 +40,143 @@ You can use the following command to install this package, or replace `npm insta
37
40
  npm install @sapphire/duration
38
41
  ```
39
42
 
43
+ ## Usage
44
+
45
+ **Note:** While this section uses `require`, the imports match 1:1 with ESM imports. For example `const { Duration } = require('@sapphire/duration')` equals `import { Duration } from '@sapphire/duration'`.
46
+
47
+ ### Human Readable Milliseconds
48
+
49
+ Milliseconds are often hard for humans to quickly parse, so it's nice to use
50
+ named enum members to make it easier to read.
51
+
52
+ ```typescript
53
+ // Import the Time enum
54
+ const { Time } = require('@sapphire/duration');
55
+
56
+ setTimeout(() => {
57
+ // Do something in half a second
58
+ }, Time.Second / 2 /* 500 */);
59
+
60
+ setTimeout(() => {
61
+ // Do something in 6 hours
62
+ }, Time.Hour * 6 /* 21600000 */);
63
+
64
+ setTimeout(() => {
65
+ // Do something in 1 day
66
+ }, Time.Day /* 86400000 */);
67
+ ```
68
+
69
+ ### Parsing a Duration
70
+
71
+ ```typescript
72
+ // Import the Duration class
73
+ const { Duration } = require('@sapphire/duration');
74
+
75
+ // Create a Duration from a string
76
+ new Duration('1d3h15m3s').offset; // 98103000
77
+ new Duration('1 day, 3h & 15m, some extra characters, and another 3 seconds').offset; // 98103000
78
+
79
+ // The date from now after the specified duration
80
+ new Duration('1d3h15m3s').fromNow;
81
+
82
+ // Or use a specific date
83
+ new Duration('1d3h15m3s').dateFrom(new Date('2020-01-01T00:00:00.000Z'));
84
+ ```
85
+
86
+ <details>
87
+ <summary>
88
+ <b>Show all available tokens</b>
89
+ </summary>
90
+
91
+ ```typescript
92
+ new Duration('1 nanosecond').offset; // 0.000001
93
+ new Duration('2 nanoseconds').offset; // 0.000002
94
+ new Duration('1 ns').offset; // 0.000001
95
+
96
+ new Duration('1 millisecond').offset; // 1
97
+ new Duration('2 milliseconds').offset; // 2
98
+ new Duration('1 ms').offset; // 1
99
+
100
+ new Duration('1 second').offset; // 1000
101
+ new Duration('2 seconds').offset; // 2000
102
+ new Duration('1 sec').offset; // 1000
103
+ new Duration('2 secs').offset; // 2000
104
+ new Duration('1 s').offset; // 1000
105
+
106
+ new Duration('1 minute').offset; // 60000
107
+ new Duration('2 minutes').offset; // 120000
108
+ new Duration('1 min').offset; // 60000
109
+ new Duration('2 mins').offset; // 120000
110
+ new Duration('1 m').offset; // 60000
111
+
112
+ new Duration('1 hour').offset; // 3600000
113
+ new Duration('2 hours').offset; // 7200000
114
+ new Duration('1 hr').offset; // 3600000
115
+ new Duration('2 hrs').offset; // 7200000
116
+ new Duration('1 h').offset; // 3600000
117
+
118
+ new Duration('1 day').offset; // 86400000
119
+ new Duration('2 days').offset; // 172800000
120
+ new Duration('1 d').offset; // 86400000
121
+
122
+ new Duration('1 week').offset; // 604800000
123
+ new Duration('2 weeks').offset; // 1209600000
124
+ new Duration('1 wk').offset; // 604800000
125
+ new Duration('2 wks').offset; // 1209600000
126
+ new Duration('1 w').offset; // 604800000
127
+
128
+ new Duration('1 month').offset; // 2629800000
129
+ new Duration('2 months').offset; // 5259600000
130
+ new Duration('1 b').offset; // 2629800000
131
+ new Duration('2 mo').offset; // 5259600000
132
+
133
+ new Duration('1 year').offset; // 31557600000
134
+ new Duration('2 years').offset; // 63115200000
135
+ new Duration('1 yr').offset; // 31557600000
136
+ new Duration('2 yrs').offset; // 63115200000
137
+ new Duration('1 y').offset; // 31557600000
138
+ ```
139
+
140
+ </details>
141
+
142
+ ### Serializing a Duration
143
+
144
+ ```typescript
145
+ // Import the DurationFormatter class
146
+ const { DurationFormatter } = require('@sapphire/duration');
147
+
148
+ const formatter = new DurationFormatter();
149
+
150
+ // Serialize a duration
151
+ formatter.format(98103000); // 1 day 3 hours 15 minutes 3 seconds
152
+ formatter.format(-98103000); // -1 day 3 hours 15 minutes 3 seconds
153
+
154
+ // Serialize a duration with specified precision
155
+ formatter.format(98103000, 2); // 1 day 3 hours
156
+ ```
157
+
158
+ ### Localizing with Durations
159
+
160
+ ```typescript
161
+ // Import the DurationFormatter class
162
+ const { DurationFormatter, TimeTypes } = require('@sapphire/duration');
163
+
164
+ // Create custom unit names
165
+ const units = {
166
+ [TimeTypes.Year]: {
167
+ 1: 'año',
168
+ DEFAULT: 'años'
169
+ }
170
+ };
171
+
172
+ // Create a formatter the custom units
173
+ const formatter = new DurationFormatter(units);
174
+
175
+ // Serialize a duration
176
+ formatter.format(31557600000); // 1 año
177
+ formatter.format(63115200000); // 2 años
178
+ ```
179
+
40
180
  ## Buy us some doughnuts
41
181
 
42
182
  Sapphire Community is and always will be open source, even if we don't get donations. That being said, we know there are amazing people who may still want to donate just to show their appreciation. Thank you very much in advance!
@@ -50,70 +190,14 @@ We accept donations through Open Collective, Ko-fi, PayPal, Patreon and GitHub S
50
190
  | Patreon | [Click Here](https://sapphirejs.dev/patreon) |
51
191
  | PayPal | [Click Here](https://sapphirejs.dev/paypal) |
52
192
 
53
- ## Contributors
54
-
55
- Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
56
-
57
- <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
58
- <!-- prettier-ignore-start -->
59
- <!-- markdownlint-disable -->
60
- <table>
61
- <tr>
62
- <td align="center"><a href="https://favware.tech/"><img src="https://avatars3.githubusercontent.com/u/4019718?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jeroen Claassens</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=favna" title="Code">💻</a> <a href="#infra-favna" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#projectManagement-favna" title="Project Management">📆</a> <a href="https://github.com/sapphiredev/utilities/commits?author=favna" title="Documentation">📖</a> <a href="https://github.com/sapphiredev/utilities/commits?author=favna" title="Tests">⚠️</a></td>
63
- <td align="center"><a href="https://github.com/kyranet"><img src="https://avatars0.githubusercontent.com/u/24852502?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aura Román</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=kyranet" title="Code">💻</a> <a href="#projectManagement-kyranet" title="Project Management">📆</a> <a href="https://github.com/sapphiredev/utilities/pulls?q=is%3Apr+reviewed-by%3Akyranet" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sapphiredev/utilities/commits?author=kyranet" title="Tests">⚠️</a></td>
64
- <td align="center"><a href="https://github.com/PyroTechniac"><img src="https://avatars2.githubusercontent.com/u/39341355?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Gryffon Bellish</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=PyroTechniac" title="Code">💻</a> <a href="https://github.com/sapphiredev/utilities/pulls?q=is%3Apr+reviewed-by%3APyroTechniac" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sapphiredev/utilities/commits?author=PyroTechniac" title="Tests">⚠️</a></td>
65
- <td align="center"><a href="https://github.com/vladfrangu"><img src="https://avatars3.githubusercontent.com/u/17960496?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vlad Frangu</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=vladfrangu" title="Code">💻</a> <a href="https://github.com/sapphiredev/utilities/issues?q=author%3Avladfrangu" title="Bug reports">🐛</a> <a href="https://github.com/sapphiredev/utilities/pulls?q=is%3Apr+reviewed-by%3Avladfrangu" title="Reviewed Pull Requests">👀</a> <a href="#userTesting-vladfrangu" title="User Testing">📓</a> <a href="https://github.com/sapphiredev/utilities/commits?author=vladfrangu" title="Tests">⚠️</a></td>
66
- <td align="center"><a href="https://github.com/Stitch07"><img src="https://avatars0.githubusercontent.com/u/29275227?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stitch07</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Stitch07" title="Code">💻</a> <a href="#projectManagement-Stitch07" title="Project Management">📆</a> <a href="https://github.com/sapphiredev/utilities/commits?author=Stitch07" title="Tests">⚠️</a></td>
67
- <td align="center"><a href="https://github.com/apps/depfu"><img src="https://avatars3.githubusercontent.com/in/715?v=4?s=100" width="100px;" alt=""/><br /><sub><b>depfu[bot]</b></sub></a><br /><a href="#maintenance-depfu[bot]" title="Maintenance">🚧</a></td>
68
- <td align="center"><a href="https://github.com/apps/allcontributors"><img src="https://avatars0.githubusercontent.com/in/23186?v=4?s=100" width="100px;" alt=""/><br /><sub><b>allcontributors[bot]</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=allcontributors[bot]" title="Documentation">📖</a></td>
69
- </tr>
70
- <tr>
71
- <td align="center"><a href="https://github.com/Nytelife26"><img src="https://avatars1.githubusercontent.com/u/22531310?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tyler J Russell</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Nytelife26" title="Documentation">📖</a></td>
72
- <td align="center"><a href="https://github.com/Alcremie"><img src="https://avatars0.githubusercontent.com/u/54785334?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ivan Lieder</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Alcremie" title="Code">💻</a> <a href="https://github.com/sapphiredev/utilities/issues?q=author%3AAlcremie" title="Bug reports">🐛</a></td>
73
- <td align="center"><a href="https://github.com/RealShadowNova"><img src="https://avatars3.githubusercontent.com/u/46537907?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Hezekiah Hendry</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=RealShadowNova" title="Code">💻</a> <a href="#tool-RealShadowNova" title="Tools">🔧</a></td>
74
- <td align="center"><a href="https://github.com/Vetlix"><img src="https://avatars.githubusercontent.com/u/31412314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vetlix</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Vetlix" title="Code">💻</a></td>
75
- <td align="center"><a href="https://github.com/ethamitc"><img src="https://avatars.githubusercontent.com/u/27776796?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ethan Mitchell</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=ethamitc" title="Documentation">📖</a></td>
76
- <td align="center"><a href="https://github.com/noftaly"><img src="https://avatars.githubusercontent.com/u/34779161?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Elliot</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=noftaly" title="Code">💻</a></td>
77
- <td align="center"><a href="https://jurien.dev"><img src="https://avatars.githubusercontent.com/u/5418114?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jurien Hamaker</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=jurienhamaker" title="Code">💻</a></td>
78
- </tr>
79
- <tr>
80
- <td align="center"><a href="https://fanoulis.dev/"><img src="https://avatars.githubusercontent.com/u/38255093?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Charalampos Fanoulis</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=cfanoulis" title="Documentation">📖</a></td>
81
- <td align="center"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dependabot[bot]</b></sub></a><br /><a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
82
- <td align="center"><a href="https://kaname.netlify.app/"><img src="https://avatars.githubusercontent.com/u/56084970?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kaname</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=kaname-png" title="Code">💻</a></td>
83
- <td align="center"><a href="https://github.com/nandhagk"><img src="https://avatars.githubusercontent.com/u/62976649?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nandhagk</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/issues?q=author%3Anandhagk" title="Bug reports">🐛</a></td>
84
- <td align="center"><a href="https://megatank58.me/"><img src="https://avatars.githubusercontent.com/u/51410502?v=4?s=100" width="100px;" alt=""/><br /><sub><b>megatank58</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=megatank58" title="Code">💻</a></td>
85
- <td align="center"><a href="https://github.com/UndiedGamer"><img src="https://avatars.githubusercontent.com/u/84702365?v=4?s=100" width="100px;" alt=""/><br /><sub><b>UndiedGamer</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=UndiedGamer" title="Code">💻</a></td>
86
- <td align="center"><a href="https://github.com/Lioness100"><img src="https://avatars.githubusercontent.com/u/65814829?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lioness100</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Lioness100" title="Documentation">📖</a> <a href="https://github.com/sapphiredev/utilities/commits?author=Lioness100" title="Code">💻</a></td>
87
- </tr>
88
- <tr>
89
- <td align="center"><a href="https://gitlab.com/DavidPH/"><img src="https://avatars.githubusercontent.com/u/44669930?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=DavidPHH" title="Code">💻</a></td>
90
- <td align="center"><a href="https://github.com/apps/renovate"><img src="https://avatars.githubusercontent.com/in/2740?v=4?s=100" width="100px;" alt=""/><br /><sub><b>renovate[bot]</b></sub></a><br /><a href="#maintenance-renovate[bot]" title="Maintenance">🚧</a></td>
91
- <td align="center"><a href="https://renovate.whitesourcesoftware.com/"><img src="https://avatars.githubusercontent.com/u/25180681?v=4?s=100" width="100px;" alt=""/><br /><sub><b>WhiteSource Renovate</b></sub></a><br /><a href="#maintenance-renovate-bot" title="Maintenance">🚧</a></td>
92
- <td align="center"><a href="https://fc5570.me/"><img src="https://avatars.githubusercontent.com/u/68158483?v=4?s=100" width="100px;" alt=""/><br /><sub><b>FC</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=FC5570" title="Code">💻</a></td>
93
- <td align="center"><a href="https://github.com/Tokipudi"><img src="https://avatars.githubusercontent.com/u/29551076?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jérémy de Saint Denis</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Tokipudi" title="Code">💻</a></td>
94
- <td align="center"><a href="https://github.com/ItsMrCube"><img src="https://avatars.githubusercontent.com/u/25201357?v=4?s=100" width="100px;" alt=""/><br /><sub><b>MrCube</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=ItsMrCube" title="Code">💻</a></td>
95
- <td align="center"><a href="https://github.com/bitomic"><img src="https://avatars.githubusercontent.com/u/35199700?v=4?s=100" width="100px;" alt=""/><br /><sub><b>bitomic</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=bitomic" title="Code">💻</a></td>
96
- </tr>
97
- <tr>
98
- <td align="center"><a href="https://c43721.dev/"><img src="https://avatars.githubusercontent.com/u/55610086?v=4?s=100" width="100px;" alt=""/><br /><sub><b>c43721</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=c43721" title="Code">💻</a></td>
99
- <td align="center"><a href="https://commandtechno.com/"><img src="https://avatars.githubusercontent.com/u/68407783?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Commandtechno</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Commandtechno" title="Code">💻</a></td>
100
- <td align="center"><a href="https://github.com/dhruv-kaushikk"><img src="https://avatars.githubusercontent.com/u/73697546?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Aura</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=dhruv-kaushikk" title="Code">💻</a></td>
101
- <td align="center"><a href="https://axis.moe/"><img src="https://avatars.githubusercontent.com/u/54381371?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jonathan</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=axisiscool" title="Code">💻</a></td>
102
- <td align="center"><a href="https://github.com/imranbarbhuiya"><img src="https://avatars.githubusercontent.com/u/74945038?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Parbez</b></sub></a><br /><a href="#maintenance-imranbarbhuiya" title="Maintenance">🚧</a></td>
103
- <td align="center"><a href="https://github.com/NotKaskus"><img src="https://avatars.githubusercontent.com/u/75168528?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Paul Andrew</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=NotKaskus" title="Documentation">📖</a></td>
104
- <td align="center"><a href="https://linktr.ee/mzato0001"><img src="https://avatars.githubusercontent.com/u/62367547?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mzato</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=Mzato0001" title="Code">💻</a> <a href="https://github.com/sapphiredev/utilities/issues?q=author%3AMzato0001" title="Bug reports">🐛</a></td>
105
- </tr>
106
- <tr>
107
- <td align="center"><a href="https://github.com/MajesticString"><img src="https://avatars.githubusercontent.com/u/66224939?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Harry Allen</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=MajesticString" title="Documentation">📖</a></td>
108
- <td align="center"><a href="https://github.com/EvolutionX-10"><img src="https://avatars.githubusercontent.com/u/85353424?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Evo</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=EvolutionX-10" title="Code">💻</a></td>
109
- <td align="center"><a href="https://enes.ovh/"><img src="https://avatars.githubusercontent.com/u/61084101?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Enes Genç</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=enxg" title="Code">💻</a></td>
110
- <td align="center"><a href="https://github.com/muchnameless"><img src="https://avatars.githubusercontent.com/u/12682826?v=4?s=100" width="100px;" alt=""/><br /><sub><b>muchnameless</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=muchnameless" title="Code">💻</a></td>
111
- </tr>
112
- </table>
113
-
114
- <!-- markdownlint-restore -->
115
- <!-- prettier-ignore-end -->
116
-
117
- <!-- ALL-CONTRIBUTORS-LIST:END -->
118
-
119
- This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
193
+ ## Contributors
194
+
195
+ Please make sure to read the [Contributing Guide][contributing] before making a pull request.
196
+
197
+ Thank you to all the people who already contributed to Sapphire!
198
+
199
+ <a href="https://github.com/sapphiredev/utilities/graphs/contributors">
200
+ <img src="https://contrib.rocks/image?repo=sapphiredev/utilities" />
201
+ </a>
202
+
203
+ [contributing]: https://github.com/sapphiredev/.github/blob/main/.github/CONTRIBUTING.md
@@ -1,40 +1,14 @@
1
- "use strict";
2
- var SapphireDuration = (() => {
1
+ var SapphireDuration = (function (exports) {
2
+ 'use strict';
3
+
3
4
  var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
5
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
6
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
- var __export = (target, all) => {
10
- for (var name in all)
11
- __defProp(target, name, { get: all[name], enumerable: true });
12
- };
13
- var __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (let key of __getOwnPropNames(from))
16
- if (!__hasOwnProp.call(to, key) && key !== except)
17
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
- }
19
- return to;
20
- };
21
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
7
  var __publicField = (obj, key, value) => {
23
8
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
24
9
  return value;
25
10
  };
26
11
 
27
- // src/index.ts
28
- var src_exports = {};
29
- __export(src_exports, {
30
- DEFAULT_SEPARATORS: () => DEFAULT_SEPARATORS,
31
- DEFAULT_UNITS: () => DEFAULT_UNITS,
32
- Duration: () => Duration,
33
- DurationFormatter: () => DurationFormatter,
34
- Time: () => Time,
35
- TimeTypes: () => TimeTypes
36
- });
37
-
38
12
  // src/lib/constants.ts
39
13
  var Time = /* @__PURE__ */ ((Time2) => {
40
14
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
@@ -133,16 +107,34 @@ var SapphireDuration = (() => {
133
107
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
134
108
  ]);
135
109
  var _Duration = class {
110
+ /**
111
+ * Create a new Duration instance
112
+ * @param pattern The string to parse
113
+ */
136
114
  constructor(pattern) {
115
+ /**
116
+ * The offset
117
+ */
137
118
  __publicField(this, "offset");
138
119
  this.offset = _Duration.parse(pattern.toLowerCase());
139
120
  }
121
+ /**
122
+ * Get the date from now
123
+ */
140
124
  get fromNow() {
141
- return this.dateFrom(new Date());
125
+ return this.dateFrom(/* @__PURE__ */ new Date());
142
126
  }
127
+ /**
128
+ * Get the date from
129
+ * @param date The Date instance to get the date from
130
+ */
143
131
  dateFrom(date) {
144
132
  return new Date(date.getTime() + this.offset);
145
133
  }
134
+ /**
135
+ * Parse the pattern
136
+ * @param pattern The pattern to parse
137
+ */
146
138
  static parse(pattern) {
147
139
  let result = 0;
148
140
  let valid = false;
@@ -159,13 +151,23 @@ var SapphireDuration = (() => {
159
151
  };
160
152
  var Duration = _Duration;
161
153
  __name(Duration, "Duration");
154
+ /**
155
+ * The RegExp used for the pattern parsing
156
+ */
162
157
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
158
+ /**
159
+ * The RegExp used for removing commas
160
+ */
163
161
  __publicField(Duration, "kCommaRegex", /,/g);
162
+ /**
163
+ * The RegExp used for replacing a/an with 1
164
+ */
164
165
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
165
166
 
166
167
  // src/lib/DurationFormatter.ts
167
168
  var kTimeDurations = [
168
169
  ["year" /* Year */, 31536e6],
170
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
169
171
  ["month" /* Month */, 2628e6],
170
172
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
171
173
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -205,6 +207,16 @@ var SapphireDuration = (() => {
205
207
  return `${time}${separator}${unit.DEFAULT}`;
206
208
  }
207
209
  __name(addUnit, "addUnit");
208
- return __toCommonJS(src_exports);
209
- })();
210
+
211
+ exports.DEFAULT_SEPARATORS = DEFAULT_SEPARATORS;
212
+ exports.DEFAULT_UNITS = DEFAULT_UNITS;
213
+ exports.Duration = Duration;
214
+ exports.DurationFormatter = DurationFormatter;
215
+ exports.Time = Time;
216
+ exports.TimeTypes = TimeTypes;
217
+
218
+ return exports;
219
+
220
+ })({});
221
+ //# sourceMappingURL=out.js.map
210
222
  //# sourceMappingURL=index.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"sourcesContent":["export * from './lib/constants';\nexport * from './lib/Duration';\nexport * from './lib/DurationFormatter';\n","import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\nconst tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"],"mappings":"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","names":["Time","TimeTypes"]}
1
+ {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
package/dist/index.js CHANGED
@@ -1,41 +1,13 @@
1
- "use strict";
2
- "use strict";
1
+ 'use strict';
2
+
3
3
  var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
5
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
- var __export = (target, all) => {
10
- for (var name in all)
11
- __defProp(target, name, { get: all[name], enumerable: true });
12
- };
13
- var __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (let key of __getOwnPropNames(from))
16
- if (!__hasOwnProp.call(to, key) && key !== except)
17
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
- }
19
- return to;
20
- };
21
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
6
  var __publicField = (obj, key, value) => {
23
7
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
24
8
  return value;
25
9
  };
26
10
 
27
- // src/index.ts
28
- var src_exports = {};
29
- __export(src_exports, {
30
- DEFAULT_SEPARATORS: () => DEFAULT_SEPARATORS,
31
- DEFAULT_UNITS: () => DEFAULT_UNITS,
32
- Duration: () => Duration,
33
- DurationFormatter: () => DurationFormatter,
34
- Time: () => Time,
35
- TimeTypes: () => TimeTypes
36
- });
37
- module.exports = __toCommonJS(src_exports);
38
-
39
11
  // src/lib/constants.ts
40
12
  var Time = /* @__PURE__ */ ((Time2) => {
41
13
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
@@ -134,16 +106,34 @@ var tokens = /* @__PURE__ */ new Map([
134
106
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
135
107
  ]);
136
108
  var _Duration = class {
109
+ /**
110
+ * Create a new Duration instance
111
+ * @param pattern The string to parse
112
+ */
137
113
  constructor(pattern) {
114
+ /**
115
+ * The offset
116
+ */
138
117
  __publicField(this, "offset");
139
118
  this.offset = _Duration.parse(pattern.toLowerCase());
140
119
  }
120
+ /**
121
+ * Get the date from now
122
+ */
141
123
  get fromNow() {
142
- return this.dateFrom(new Date());
124
+ return this.dateFrom(/* @__PURE__ */ new Date());
143
125
  }
126
+ /**
127
+ * Get the date from
128
+ * @param date The Date instance to get the date from
129
+ */
144
130
  dateFrom(date) {
145
131
  return new Date(date.getTime() + this.offset);
146
132
  }
133
+ /**
134
+ * Parse the pattern
135
+ * @param pattern The pattern to parse
136
+ */
147
137
  static parse(pattern) {
148
138
  let result = 0;
149
139
  let valid = false;
@@ -160,13 +150,23 @@ var _Duration = class {
160
150
  };
161
151
  var Duration = _Duration;
162
152
  __name(Duration, "Duration");
153
+ /**
154
+ * The RegExp used for the pattern parsing
155
+ */
163
156
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
157
+ /**
158
+ * The RegExp used for removing commas
159
+ */
164
160
  __publicField(Duration, "kCommaRegex", /,/g);
161
+ /**
162
+ * The RegExp used for replacing a/an with 1
163
+ */
165
164
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
166
165
 
167
166
  // src/lib/DurationFormatter.ts
168
167
  var kTimeDurations = [
169
168
  ["year" /* Year */, 31536e6],
169
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
170
170
  ["month" /* Month */, 2628e6],
171
171
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
172
172
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -206,13 +206,12 @@ function addUnit(time, unit, separator) {
206
206
  return `${time}${separator}${unit.DEFAULT}`;
207
207
  }
208
208
  __name(addUnit, "addUnit");
209
- // Annotate the CommonJS export names for ESM import in node:
210
- 0 && (module.exports = {
211
- DEFAULT_SEPARATORS,
212
- DEFAULT_UNITS,
213
- Duration,
214
- DurationFormatter,
215
- Time,
216
- TimeTypes
217
- });
209
+
210
+ exports.DEFAULT_SEPARATORS = DEFAULT_SEPARATORS;
211
+ exports.DEFAULT_UNITS = DEFAULT_UNITS;
212
+ exports.Duration = Duration;
213
+ exports.DurationFormatter = DurationFormatter;
214
+ exports.Time = Time;
215
+ exports.TimeTypes = TimeTypes;
216
+ //# sourceMappingURL=out.js.map
218
217
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"sourcesContent":["export * from './lib/constants';\nexport * from './lib/Duration';\nexport * from './lib/DurationFormatter';\n","import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\nconst tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAK,OAAL,kBAAKA,UAAL;AACN,EAAAA,YAAA,iBAAc,KAAd;AACA,EAAAA,YAAA,YAAS,OAAT;AACA,EAAAA,YAAA,YAAS,OAAT;AACA,EAAAA,YAAA,UAAO,QAAP;AACA,EAAAA,YAAA,SAAM,SAAN;AACA,EAAAA,YAAA,WAAQ,UAAR;AACA,EAAAA,YAAA,UAAO,WAAP;AAPW,SAAAA;AAAA,GAAA;AAaL,IAAK,YAAL,kBAAKC,eAAL;AACN,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,UAAO;AAPI,SAAAA;AAAA,GAAA;AAUL,IAAM,gBAA0C;AAAA,EACtD,CAAC,oBAAiB;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,sBAAkB;AAAA,IAClB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,oBAAiB;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,kBAAgB;AAAA,IAChB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,oBAAiB;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,wBAAmB;AAAA,IACnB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,wBAAmB;AAAA,IACnB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AACD;AAEO,IAAM,qBAA+C;AAAA,EAC3D,MAAM;AAAA,EACN,OAAO;AACR;;;AC1DA,IAAM,SAAS,oBAAI,IAAI;AAAA,EACtB,CAAC,cAAc,IAAI,GAAG;AAAA,EACtB,CAAC,eAAe,IAAI,GAAG;AAAA,EACvB,CAAC,MAAM,IAAI,GAAG;AAAA,EAEd,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,gBAAgB,CAAC;AAAA,EAClB,CAAC,MAAM,CAAC;AAAA,EAER,CAAC,UAAU,GAAI;AAAA,EACf,CAAC,WAAW,GAAI;AAAA,EAChB,CAAC,OAAO,GAAI;AAAA,EACZ,CAAC,QAAQ,GAAI;AAAA,EACb,CAAC,KAAK,GAAI;AAAA,EAEV,CAAC,UAAU,MAAO,EAAE;AAAA,EACpB,CAAC,WAAW,MAAO,EAAE;AAAA,EACrB,CAAC,OAAO,MAAO,EAAE;AAAA,EACjB,CAAC,QAAQ,MAAO,EAAE;AAAA,EAClB,CAAC,KAAK,MAAO,EAAE;AAAA,EAEf,CAAC,QAAQ,MAAO,KAAK,EAAE;AAAA,EACvB,CAAC,SAAS,MAAO,KAAK,EAAE;AAAA,EACxB,CAAC,MAAM,MAAO,KAAK,EAAE;AAAA,EACrB,CAAC,OAAO,MAAO,KAAK,EAAE;AAAA,EACtB,CAAC,KAAK,MAAO,KAAK,EAAE;AAAA,EAEpB,CAAC,OAAO,MAAO,KAAK,KAAK,EAAE;AAAA,EAC3B,CAAC,QAAQ,MAAO,KAAK,KAAK,EAAE;AAAA,EAC5B,CAAC,KAAK,MAAO,KAAK,KAAK,EAAE;AAAA,EAEzB,CAAC,QAAQ,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAChC,CAAC,SAAS,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EACjC,CAAC,MAAM,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAC9B,CAAC,OAAO,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAC/B,CAAC,KAAK,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAE7B,CAAC,SAAS,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EAC7C,CAAC,UAAU,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EAC9C,CAAC,KAAK,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EACzC,CAAC,MAAM,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EAE1C,CAAC,QAAQ,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACrC,CAAC,SAAS,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACtC,CAAC,MAAM,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACnC,CAAC,OAAO,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACpC,CAAC,KAAK,MAAO,KAAK,KAAK,KAAK,MAAM;AACnC,CAAC;AAKM,IAAM,YAAN,MAAe;AAAA,EAUd,YAAY,SAAiB;AANpC,wBAAO;AAON,SAAK,SAAS,UAAS,MAAM,QAAQ,YAAY,CAAC;AAAA,EACnD;AAAA,EAKA,IAAW,UAAgB;AAC1B,WAAO,KAAK,SAAS,IAAI,KAAK,CAAC;AAAA,EAChC;AAAA,EAMO,SAAS,MAAkB;AACjC,WAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM;AAAA,EAC7C;AAAA,EAqBA,OAAe,MAAM,SAAyB;AAC7C,QAAI,SAAS;AACb,QAAI,QAAQ;AAEZ,YAEE,QAAQ,UAAS,aAAa,EAAE,EAEhC,QAAQ,UAAS,WAAW,GAAG,EAE/B,QAAQ,UAAS,eAAe,CAAC,GAAG,GAAG,UAAU;AACjD,YAAM,QAAQ,OAAO,IAAI,KAAK;AAC9B,UAAI,UAAU,QAAW;AACxB,kBAAU,OAAO,CAAC,IAAI;AACtB,gBAAQ;AAAA,MACT;AACA,aAAO;AAAA,IACR,CAAC;AAEF,WAAO,QAAQ,SAAS;AAAA,EACzB;AACD;AArEO,IAAM,WAAN;AAAM;AAgCZ,cAhCY,UAgCY,iBAAgB;AAKxC,cArCY,UAqCY,eAAc;AAKtC,cA1CY,UA0CY,aAAY;;;AC1FrC,IAAM,iBAAiD;AAAA,EACtD,oBAAiB,OAAW;AAAA,EAE5B,sBAAkB,MAAU;AAAA,EAC5B,oBAAiB,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EACxC,kBAAgB,MAAO,KAAK,KAAK,EAAE;AAAA,EACnC,oBAAiB,MAAO,KAAK,EAAE;AAAA,EAC/B,wBAAmB,MAAO,EAAE;AAAA,EAC5B,wBAAmB,GAAI;AACxB;AAOO,IAAM,oBAAN,MAAwB;AAAA,EACvB,YAAmB,QAAkC,eAAe;AAAjD;AAAA,EAAkD;AAAA,EAErE,OACN,UACA,YAAY,GACZ;AAAA,IACC,MAAM,gBAAgB,mBAAmB;AAAA,IACzC,OAAO,iBAAiB,mBAAmB;AAAA,EAC5C,IAA8B,oBAC7B;AACD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAW,WAAW;AAC5B,QAAI;AAAU,kBAAY;AAE1B,eAAW,CAAC,MAAM,YAAY,KAAK,gBAAgB;AAClD,YAAM,WAAW,WAAW;AAC5B,UAAI,WAAW;AAAG;AAElB,YAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,kBAAY,UAAU;AACtB,aAAO,KAAK,QAAQ,SAAS,KAAK,MAAM,OAAO,aAAc,CAAC;AAG9D,UAAI,OAAO,UAAU;AAAW;AAAA,IACjC;AAEA,WAAO,GAAG,WAAW,MAAM,KAAK,OAAO,KAAK,cAAc,KAAK,QAAQ,GAAG,KAAK,MAAM,QAAQ,aAAc;AAAA,EAC5G;AACD;AA7Ba;AAoCb,SAAS,QAAQ,MAAc,MAAgC,WAAmB;AACjF,MAAI,QAAQ,IAAI,MAAM,IAAI;AAAG,WAAO,GAAG,OAAO,YAAY,QAAQ,IAAI,MAAM,IAAI;AAChF,SAAO,GAAG,OAAO,YAAY,KAAK;AACnC;AAHS;","names":["Time","TimeTypes"]}
1
+ {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -104,16 +104,34 @@ var tokens = /* @__PURE__ */ new Map([
104
104
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
105
105
  ]);
106
106
  var _Duration = class {
107
+ /**
108
+ * Create a new Duration instance
109
+ * @param pattern The string to parse
110
+ */
107
111
  constructor(pattern) {
112
+ /**
113
+ * The offset
114
+ */
108
115
  __publicField(this, "offset");
109
116
  this.offset = _Duration.parse(pattern.toLowerCase());
110
117
  }
118
+ /**
119
+ * Get the date from now
120
+ */
111
121
  get fromNow() {
112
- return this.dateFrom(new Date());
122
+ return this.dateFrom(/* @__PURE__ */ new Date());
113
123
  }
124
+ /**
125
+ * Get the date from
126
+ * @param date The Date instance to get the date from
127
+ */
114
128
  dateFrom(date) {
115
129
  return new Date(date.getTime() + this.offset);
116
130
  }
131
+ /**
132
+ * Parse the pattern
133
+ * @param pattern The pattern to parse
134
+ */
117
135
  static parse(pattern) {
118
136
  let result = 0;
119
137
  let valid = false;
@@ -130,13 +148,23 @@ var _Duration = class {
130
148
  };
131
149
  var Duration = _Duration;
132
150
  __name(Duration, "Duration");
151
+ /**
152
+ * The RegExp used for the pattern parsing
153
+ */
133
154
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
155
+ /**
156
+ * The RegExp used for removing commas
157
+ */
134
158
  __publicField(Duration, "kCommaRegex", /,/g);
159
+ /**
160
+ * The RegExp used for replacing a/an with 1
161
+ */
135
162
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
136
163
 
137
164
  // src/lib/DurationFormatter.ts
138
165
  var kTimeDurations = [
139
166
  ["year" /* Year */, 31536e6],
167
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
140
168
  ["month" /* Month */, 2628e6],
141
169
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
142
170
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -176,12 +204,7 @@ function addUnit(time, unit, separator) {
176
204
  return `${time}${separator}${unit.DEFAULT}`;
177
205
  }
178
206
  __name(addUnit, "addUnit");
179
- export {
180
- DEFAULT_SEPARATORS,
181
- DEFAULT_UNITS,
182
- Duration,
183
- DurationFormatter,
184
- Time,
185
- TimeTypes
186
- };
207
+
208
+ export { DEFAULT_SEPARATORS, DEFAULT_UNITS, Duration, DurationFormatter, Time, TimeTypes };
209
+ //# sourceMappingURL=out.js.map
187
210
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","/* eslint-disable @typescript-eslint/restrict-plus-operands */\nconst tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\t// eslint-disable-next-line @typescript-eslint/naming-convention\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"],"mappings":"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","names":["Time","TimeTypes"]}
1
+ {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/duration",
3
- "version": "1.0.1-next.ff9cb61.0",
3
+ "version": "1.1.0-next.04a16e3.0",
4
4
  "description": "A time duration utility library for JavaScript.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -57,12 +57,12 @@
57
57
  "access": "public"
58
58
  },
59
59
  "devDependencies": {
60
- "@favware/cliff-jumper": "^1.8.7",
61
- "@vitest/coverage-c8": "^0.23.4",
62
- "tsup": "^6.2.3",
63
- "typedoc": "^0.23.14",
64
- "typedoc-json-parser": "^4.0.0",
65
- "typescript": "^4.8.3",
66
- "vitest": "^0.23.4"
60
+ "@favware/cliff-jumper": "^1.10.0",
61
+ "@vitest/coverage-c8": "^0.29.1",
62
+ "tsup": "^6.6.3",
63
+ "typedoc": "^0.23.25",
64
+ "typedoc-json-parser": "^7.1.0",
65
+ "typescript": "^4.9.5",
66
+ "vitest": "^0.29.1"
67
67
  }
68
68
  }