@sapphire/duration 1.1.0-next.d5ead90.0 → 1.1.0-next.ddebb70.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
package/dist/index.d.ts CHANGED
@@ -26,11 +26,14 @@ interface DurationFormatAssetsTime {
26
26
  }
27
27
 
28
28
  declare enum Time {
29
+ Nanosecond = 0.000001,
30
+ Microsecond = 0.001,
29
31
  Millisecond = 1,
30
32
  Second = 1000,
31
33
  Minute = 60000,
32
34
  Hour = 3600000,
33
35
  Day = 86400000,
36
+ Week = 604800000,
34
37
  Month = 2628000000,
35
38
  Year = 31536000000
36
39
  }
@@ -11,11 +11,14 @@ var SapphireDuration = (function (exports) {
11
11
 
12
12
  // src/lib/constants.ts
13
13
  var Time = /* @__PURE__ */ ((Time2) => {
14
+ Time2[Time2["Nanosecond"] = 1e-6] = "Nanosecond";
15
+ Time2[Time2["Microsecond"] = 1e-3] = "Microsecond";
14
16
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
15
17
  Time2[Time2["Second"] = 1e3] = "Second";
16
18
  Time2[Time2["Minute"] = 6e4] = "Minute";
17
19
  Time2[Time2["Hour"] = 36e5] = "Hour";
18
20
  Time2[Time2["Day"] = 864e5] = "Day";
21
+ Time2[Time2["Week"] = 6048e5] = "Week";
19
22
  Time2[Time2["Month"] = 2628e6] = "Month";
20
23
  Time2[Time2["Year"] = 31536e6] = "Year";
21
24
  return Time2;
@@ -107,16 +110,34 @@ var SapphireDuration = (function (exports) {
107
110
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
108
111
  ]);
109
112
  var _Duration = class {
113
+ /**
114
+ * Create a new Duration instance
115
+ * @param pattern The string to parse
116
+ */
110
117
  constructor(pattern) {
118
+ /**
119
+ * The offset
120
+ */
111
121
  __publicField(this, "offset");
112
122
  this.offset = _Duration.parse(pattern.toLowerCase());
113
123
  }
124
+ /**
125
+ * Get the date from now
126
+ */
114
127
  get fromNow() {
115
- return this.dateFrom(new Date());
128
+ return this.dateFrom(/* @__PURE__ */ new Date());
116
129
  }
130
+ /**
131
+ * Get the date from
132
+ * @param date The Date instance to get the date from
133
+ */
117
134
  dateFrom(date) {
118
135
  return new Date(date.getTime() + this.offset);
119
136
  }
137
+ /**
138
+ * Parse the pattern
139
+ * @param pattern The pattern to parse
140
+ */
120
141
  static parse(pattern) {
121
142
  let result = 0;
122
143
  let valid = false;
@@ -133,13 +154,23 @@ var SapphireDuration = (function (exports) {
133
154
  };
134
155
  var Duration = _Duration;
135
156
  __name(Duration, "Duration");
157
+ /**
158
+ * The RegExp used for the pattern parsing
159
+ */
136
160
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
161
+ /**
162
+ * The RegExp used for removing commas
163
+ */
137
164
  __publicField(Duration, "kCommaRegex", /,/g);
165
+ /**
166
+ * The RegExp used for replacing a/an with 1
167
+ */
138
168
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
139
169
 
140
170
  // src/lib/DurationFormatter.ts
141
171
  var kTimeDurations = [
142
172
  ["year" /* Year */, 31536e6],
173
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
143
174
  ["month" /* Month */, 2628e6],
144
175
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
145
176
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -187,9 +218,8 @@ var SapphireDuration = (function (exports) {
187
218
  exports.Time = Time;
188
219
  exports.TimeTypes = TimeTypes;
189
220
 
190
- Object.defineProperty(exports, '__esModule', { value: true });
191
-
192
221
  return exports;
193
222
 
194
223
  })({});
224
+ //# sourceMappingURL=out.js.map
195
225
  //# sourceMappingURL=index.global.js.map
@@ -1 +1 @@
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"]}
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\tNanosecond = 1 / 1_000_000,\n\tMicrosecond = 1 / 1000,\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = Second * 60,\n\tHour = Minute * 60,\n\tDay = Hour * 24,\n\tWeek = Day * 7,\n\tMonth = Day * (365 / 12),\n\tYear = Day * 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,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var __defProp = Object.defineProperty;
6
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
5
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -12,11 +10,14 @@ var __publicField = (obj, key, value) => {
12
10
 
13
11
  // src/lib/constants.ts
14
12
  var Time = /* @__PURE__ */ ((Time2) => {
13
+ Time2[Time2["Nanosecond"] = 1e-6] = "Nanosecond";
14
+ Time2[Time2["Microsecond"] = 1e-3] = "Microsecond";
15
15
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
16
16
  Time2[Time2["Second"] = 1e3] = "Second";
17
17
  Time2[Time2["Minute"] = 6e4] = "Minute";
18
18
  Time2[Time2["Hour"] = 36e5] = "Hour";
19
19
  Time2[Time2["Day"] = 864e5] = "Day";
20
+ Time2[Time2["Week"] = 6048e5] = "Week";
20
21
  Time2[Time2["Month"] = 2628e6] = "Month";
21
22
  Time2[Time2["Year"] = 31536e6] = "Year";
22
23
  return Time2;
@@ -108,16 +109,34 @@ var tokens = /* @__PURE__ */ new Map([
108
109
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
109
110
  ]);
110
111
  var _Duration = class {
112
+ /**
113
+ * Create a new Duration instance
114
+ * @param pattern The string to parse
115
+ */
111
116
  constructor(pattern) {
117
+ /**
118
+ * The offset
119
+ */
112
120
  __publicField(this, "offset");
113
121
  this.offset = _Duration.parse(pattern.toLowerCase());
114
122
  }
123
+ /**
124
+ * Get the date from now
125
+ */
115
126
  get fromNow() {
116
- return this.dateFrom(new Date());
127
+ return this.dateFrom(/* @__PURE__ */ new Date());
117
128
  }
129
+ /**
130
+ * Get the date from
131
+ * @param date The Date instance to get the date from
132
+ */
118
133
  dateFrom(date) {
119
134
  return new Date(date.getTime() + this.offset);
120
135
  }
136
+ /**
137
+ * Parse the pattern
138
+ * @param pattern The pattern to parse
139
+ */
121
140
  static parse(pattern) {
122
141
  let result = 0;
123
142
  let valid = false;
@@ -134,13 +153,23 @@ var _Duration = class {
134
153
  };
135
154
  var Duration = _Duration;
136
155
  __name(Duration, "Duration");
156
+ /**
157
+ * The RegExp used for the pattern parsing
158
+ */
137
159
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
160
+ /**
161
+ * The RegExp used for removing commas
162
+ */
138
163
  __publicField(Duration, "kCommaRegex", /,/g);
164
+ /**
165
+ * The RegExp used for replacing a/an with 1
166
+ */
139
167
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
140
168
 
141
169
  // src/lib/DurationFormatter.ts
142
170
  var kTimeDurations = [
143
171
  ["year" /* Year */, 31536e6],
172
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
144
173
  ["month" /* Month */, 2628e6],
145
174
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
146
175
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -187,4 +216,5 @@ exports.Duration = Duration;
187
216
  exports.DurationFormatter = DurationFormatter;
188
217
  exports.Time = Time;
189
218
  exports.TimeTypes = TimeTypes;
219
+ //# sourceMappingURL=out.js.map
190
220
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"]}
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\tNanosecond = 1 / 1_000_000,\n\tMicrosecond = 1 / 1000,\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = Second * 60,\n\tHour = Minute * 60,\n\tDay = Hour * 24,\n\tWeek = Day * 7,\n\tMonth = Day * (365 / 12),\n\tYear = Day * 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
@@ -8,11 +8,14 @@ var __publicField = (obj, key, value) => {
8
8
 
9
9
  // src/lib/constants.ts
10
10
  var Time = /* @__PURE__ */ ((Time2) => {
11
+ Time2[Time2["Nanosecond"] = 1e-6] = "Nanosecond";
12
+ Time2[Time2["Microsecond"] = 1e-3] = "Microsecond";
11
13
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
12
14
  Time2[Time2["Second"] = 1e3] = "Second";
13
15
  Time2[Time2["Minute"] = 6e4] = "Minute";
14
16
  Time2[Time2["Hour"] = 36e5] = "Hour";
15
17
  Time2[Time2["Day"] = 864e5] = "Day";
18
+ Time2[Time2["Week"] = 6048e5] = "Week";
16
19
  Time2[Time2["Month"] = 2628e6] = "Month";
17
20
  Time2[Time2["Year"] = 31536e6] = "Year";
18
21
  return Time2;
@@ -104,16 +107,34 @@ var tokens = /* @__PURE__ */ new Map([
104
107
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
105
108
  ]);
106
109
  var _Duration = class {
110
+ /**
111
+ * Create a new Duration instance
112
+ * @param pattern The string to parse
113
+ */
107
114
  constructor(pattern) {
115
+ /**
116
+ * The offset
117
+ */
108
118
  __publicField(this, "offset");
109
119
  this.offset = _Duration.parse(pattern.toLowerCase());
110
120
  }
121
+ /**
122
+ * Get the date from now
123
+ */
111
124
  get fromNow() {
112
- return this.dateFrom(new Date());
125
+ return this.dateFrom(/* @__PURE__ */ new Date());
113
126
  }
127
+ /**
128
+ * Get the date from
129
+ * @param date The Date instance to get the date from
130
+ */
114
131
  dateFrom(date) {
115
132
  return new Date(date.getTime() + this.offset);
116
133
  }
134
+ /**
135
+ * Parse the pattern
136
+ * @param pattern The pattern to parse
137
+ */
117
138
  static parse(pattern) {
118
139
  let result = 0;
119
140
  let valid = false;
@@ -130,13 +151,23 @@ var _Duration = class {
130
151
  };
131
152
  var Duration = _Duration;
132
153
  __name(Duration, "Duration");
154
+ /**
155
+ * The RegExp used for the pattern parsing
156
+ */
133
157
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
158
+ /**
159
+ * The RegExp used for removing commas
160
+ */
134
161
  __publicField(Duration, "kCommaRegex", /,/g);
162
+ /**
163
+ * The RegExp used for replacing a/an with 1
164
+ */
135
165
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
136
166
 
137
167
  // src/lib/DurationFormatter.ts
138
168
  var kTimeDurations = [
139
169
  ["year" /* Year */, 31536e6],
170
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
140
171
  ["month" /* Month */, 2628e6],
141
172
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
142
173
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -178,4 +209,5 @@ function addUnit(time, unit, separator) {
178
209
  __name(addUnit, "addUnit");
179
210
 
180
211
  export { DEFAULT_SEPARATORS, DEFAULT_UNITS, Duration, DurationFormatter, Time, TimeTypes };
212
+ //# sourceMappingURL=out.js.map
181
213
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
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"]}
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\tNanosecond = 1 / 1_000_000,\n\tMicrosecond = 1 / 1000,\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = Second * 60,\n\tHour = Minute * 60,\n\tDay = Hour * 24,\n\tWeek = Day * 7,\n\tMonth = Day * (365 / 12),\n\tYear = Day * 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.1.0-next.d5ead90.0",
3
+ "version": "1.1.0-next.ddebb70.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.8",
61
- "@vitest/coverage-c8": "^0.23.4",
62
- "tsup": "^6.2.3",
63
- "typedoc": "^0.23.15",
64
- "typedoc-json-parser": "^5.0.1",
65
- "typescript": "^4.8.4",
66
- "vitest": "^0.23.4"
60
+ "@favware/cliff-jumper": "^2.0.0",
61
+ "@vitest/coverage-c8": "^0.29.2",
62
+ "tsup": "^6.6.3",
63
+ "typedoc": "^0.23.26",
64
+ "typedoc-json-parser": "^7.2.0",
65
+ "typescript": "^4.9.5",
66
+ "vitest": "^0.29.2"
67
67
  }
68
68
  }