@sapphire/duration 1.0.1-next.ff9cb61.0 → 1.1.0-next.0af731f.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 +148 -1
- package/dist/index.global.js +15 -31
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +10 -39
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -18,7 +18,10 @@
|
|
|
18
18
|
- [Features](#features)
|
|
19
19
|
- [Installation](#installation)
|
|
20
20
|
- [Usage](#usage)
|
|
21
|
-
- [
|
|
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!
|
|
@@ -108,6 +248,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|
|
108
248
|
<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
249
|
<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
250
|
<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>
|
|
251
|
+
<td align="center"><a href="https://github.com/r-priyam"><img src="https://avatars.githubusercontent.com/u/50884372?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Priyam</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=r-priyam" title="Code">💻</a></td>
|
|
252
|
+
<td align="center"><a href="https://github.com/legendhimslef"><img src="https://avatars.githubusercontent.com/u/69213593?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Voxelli</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=legendhimslef" title="Code">💻</a></td>
|
|
253
|
+
<td align="center"><a href="https://github.com/CitTheDev"><img src="https://avatars.githubusercontent.com/u/94020875?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cit The Dev</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=CitTheDev" title="Code">💻</a></td>
|
|
254
|
+
</tr>
|
|
255
|
+
<tr>
|
|
256
|
+
<td align="center"><a href="https://www.goestav.com/"><img src="https://avatars.githubusercontent.com/u/27970303?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Goestav</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=goestav" title="Code">💻</a></td>
|
|
257
|
+
<td align="center"><a href="https://github.com/didinele"><img src="https://avatars.githubusercontent.com/u/27137376?v=4?s=100" width="100px;" alt=""/><br /><sub><b>DD</b></sub></a><br /><a href="https://github.com/sapphiredev/utilities/commits?author=didinele" title="Code">💻</a></td>
|
|
111
258
|
</tr>
|
|
112
259
|
</table>
|
|
113
260
|
|
package/dist/index.global.js
CHANGED
|
@@ -1,40 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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";
|
|
@@ -205,6 +179,16 @@ var SapphireDuration = (() => {
|
|
|
205
179
|
return `${time}${separator}${unit.DEFAULT}`;
|
|
206
180
|
}
|
|
207
181
|
__name(addUnit, "addUnit");
|
|
208
|
-
|
|
209
|
-
|
|
182
|
+
|
|
183
|
+
exports.DEFAULT_SEPARATORS = DEFAULT_SEPARATORS;
|
|
184
|
+
exports.DEFAULT_UNITS = DEFAULT_UNITS;
|
|
185
|
+
exports.Duration = Duration;
|
|
186
|
+
exports.DurationFormatter = DurationFormatter;
|
|
187
|
+
exports.Time = Time;
|
|
188
|
+
exports.TimeTypes = TimeTypes;
|
|
189
|
+
|
|
190
|
+
return exports;
|
|
191
|
+
|
|
192
|
+
})({});
|
|
193
|
+
//# sourceMappingURL=out.js.map
|
|
210
194
|
//# sourceMappingURL=index.global.js.map
|
package/dist/index.global.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":"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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
|
-
|
|
2
|
-
|
|
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";
|
|
@@ -206,13 +178,12 @@ function addUnit(time, unit, separator) {
|
|
|
206
178
|
return `${time}${separator}${unit.DEFAULT}`;
|
|
207
179
|
}
|
|
208
180
|
__name(addUnit, "addUnit");
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
});
|
|
181
|
+
|
|
182
|
+
exports.DEFAULT_SEPARATORS = DEFAULT_SEPARATORS;
|
|
183
|
+
exports.DEFAULT_UNITS = DEFAULT_UNITS;
|
|
184
|
+
exports.Duration = Duration;
|
|
185
|
+
exports.DurationFormatter = DurationFormatter;
|
|
186
|
+
exports.Time = Time;
|
|
187
|
+
exports.TimeTypes = TimeTypes;
|
|
188
|
+
//# sourceMappingURL=out.js.map
|
|
218
189
|
//# 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":"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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.mjs
CHANGED
|
@@ -176,12 +176,7 @@ function addUnit(time, unit, separator) {
|
|
|
176
176
|
return `${time}${separator}${unit.DEFAULT}`;
|
|
177
177
|
}
|
|
178
178
|
__name(addUnit, "addUnit");
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
Duration,
|
|
183
|
-
DurationFormatter,
|
|
184
|
-
Time,
|
|
185
|
-
TimeTypes
|
|
186
|
-
};
|
|
179
|
+
|
|
180
|
+
export { DEFAULT_SEPARATORS, DEFAULT_UNITS, Duration, DurationFormatter, Time, TimeTypes };
|
|
181
|
+
//# sourceMappingURL=out.js.map
|
|
187
182
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":";;;;;;;;;AAEO,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":";;;;;;;;;AAEO,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;;;AC3DA,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;;;ACzFrC,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","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
|
|
3
|
+
"version": "1.1.0-next.0af731f.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.
|
|
61
|
-
"@vitest/coverage-c8": "^0.
|
|
62
|
-
"tsup": "^6.
|
|
63
|
-
"typedoc": "^0.23.
|
|
64
|
-
"typedoc-json-parser": "^
|
|
65
|
-
"typescript": "^4.
|
|
66
|
-
"vitest": "^0.
|
|
60
|
+
"@favware/cliff-jumper": "^1.9.0",
|
|
61
|
+
"@vitest/coverage-c8": "^0.25.2",
|
|
62
|
+
"tsup": "^6.5.0",
|
|
63
|
+
"typedoc": "^0.23.21",
|
|
64
|
+
"typedoc-json-parser": "^7.0.1",
|
|
65
|
+
"typescript": "^4.9.3",
|
|
66
|
+
"vitest": "^0.25.2"
|
|
67
67
|
}
|
|
68
68
|
}
|