@visulima/humanizer 2.0.5 → 3.0.0-alpha.1
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/dist/index.js +3 -1
- package/dist/language/af.js +41 -1
- package/dist/language/am.js +33 -1
- package/dist/language/ar.js +53 -1
- package/dist/language/bg.js +42 -1
- package/dist/language/bn.js +33 -1
- package/dist/language/ca.js +41 -1
- package/dist/language/ckb.js +33 -1
- package/dist/language/cs.js +53 -1
- package/dist/language/cy.js +53 -1
- package/dist/language/da.js +45 -1
- package/dist/language/de.js +47 -1
- package/dist/language/el.js +53 -1
- package/dist/language/en.js +57 -1
- package/dist/language/eo.js +47 -1
- package/dist/language/es.js +46 -1
- package/dist/language/et.js +47 -1
- package/dist/language/eu.js +41 -1
- package/dist/language/fa.js +38 -1
- package/dist/language/fi.js +55 -1
- package/dist/language/fo.js +48 -1
- package/dist/language/fr.js +52 -1
- package/dist/language/he.js +52 -1
- package/dist/language/hi.js +55 -1
- package/dist/language/hr.js +110 -1
- package/dist/language/hu.js +51 -1
- package/dist/language/id.js +50 -1
- package/dist/language/is.js +52 -1
- package/dist/language/it.js +51 -1
- package/dist/language/ja.js +47 -1
- package/dist/language/km.js +57 -1
- package/dist/language/kn.js +50 -1
- package/dist/language/ko.js +42 -1
- package/dist/language/ku.js +54 -1
- package/dist/language/lo.js +58 -1
- package/dist/language/lt.js +69 -1
- package/dist/language/lv.js +55 -1
- package/dist/language/mk.js +55 -1
- package/dist/language/mn.js +46 -1
- package/dist/language/mr.js +43 -1
- package/dist/language/ms.js +49 -1
- package/dist/language/nl.js +50 -1
- package/dist/language/no.js +47 -1
- package/dist/language/pl.js +73 -1
- package/dist/language/pt.js +50 -1
- package/dist/language/ro.js +53 -1
- package/dist/language/ru.js +59 -1
- package/dist/language/sk.js +64 -1
- package/dist/language/sl.js +138 -1
- package/dist/language/sq.js +51 -1
- package/dist/language/sr.js +83 -1
- package/dist/language/sr_Latn.js +21 -1
- package/dist/language/sv.js +49 -1
- package/dist/language/sw.js +51 -1
- package/dist/language/ta.js +54 -1
- package/dist/language/te.js +50 -1
- package/dist/language/th.js +44 -1
- package/dist/language/tr.js +42 -1
- package/dist/language/uk.js +61 -1
- package/dist/language/ur.js +57 -1
- package/dist/language/util/create-duration-language.js +33 -1
- package/dist/language/util/duration/get-czech-or-slovak-form.js +14 -1
- package/dist/language/util/duration/get-slavic-form.js +17 -1
- package/dist/language/util/validate-duration-language.js +36 -1
- package/dist/language/uz.js +43 -1
- package/dist/language/uz_CYR.js +43 -1
- package/dist/language/vi.js +34 -1
- package/dist/language/zh_CN.js +39 -1
- package/dist/language/zh_TW.js +39 -1
- package/dist/packem_shared/duration-C62ipnQn.js +214 -0
- package/dist/packem_shared/parseBytes-JWspeMzP.js +238 -0
- package/dist/packem_shared/parseDuration-CeFaBgx9.js +111 -0
- package/package.json +3 -3
- package/dist/packem_shared/duration-B8tBhwXw.js +0 -1
- package/dist/packem_shared/parseBytes-Da87aeh8.js +0 -1
- package/dist/packem_shared/parseDuration-Bo02kq8G.js +0 -1
package/dist/language/uk.js
CHANGED
|
@@ -1 +1,61 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
import getSlavicForm from './util/duration/get-slavic-form.js';
|
|
3
|
+
|
|
4
|
+
const ukUnitMap = {
|
|
5
|
+
г: "h",
|
|
6
|
+
год: "h",
|
|
7
|
+
годин: "h",
|
|
8
|
+
година: "h",
|
|
9
|
+
години: "h",
|
|
10
|
+
д: "d",
|
|
11
|
+
день: "d",
|
|
12
|
+
дні: "d",
|
|
13
|
+
днів: "d",
|
|
14
|
+
мілісекунд: "ms",
|
|
15
|
+
мілісекунда: "ms",
|
|
16
|
+
мілісекунди: "ms",
|
|
17
|
+
міс: "mo",
|
|
18
|
+
місяці: "mo",
|
|
19
|
+
місяців: "mo",
|
|
20
|
+
місяць: "mo",
|
|
21
|
+
мс: "ms",
|
|
22
|
+
р: "y",
|
|
23
|
+
рік: "y",
|
|
24
|
+
роки: "y",
|
|
25
|
+
років: "y",
|
|
26
|
+
с: "s",
|
|
27
|
+
сек: "s",
|
|
28
|
+
секунд: "s",
|
|
29
|
+
секунда: "s",
|
|
30
|
+
секунди: "s",
|
|
31
|
+
т: "w",
|
|
32
|
+
тижд: "w",
|
|
33
|
+
тиждень: "w",
|
|
34
|
+
тижні: "w",
|
|
35
|
+
тижнів: "w",
|
|
36
|
+
хв: "m",
|
|
37
|
+
хвилин: "m",
|
|
38
|
+
хвилина: "m",
|
|
39
|
+
хвилини: "m"
|
|
40
|
+
};
|
|
41
|
+
const durationLanguage = createDurationLanguage(
|
|
42
|
+
(counter) => ["років", "рік", "роки"][getSlavicForm(counter)],
|
|
43
|
+
(counter) => ["місяців", "місяць", "місяці"][getSlavicForm(counter)],
|
|
44
|
+
(counter) => ["тижнів", "тиждень", "тижні"][getSlavicForm(counter)],
|
|
45
|
+
(counter) => ["днів", "день", "дні"][getSlavicForm(counter)],
|
|
46
|
+
(counter) => ["годин", "година", "години"][getSlavicForm(counter)],
|
|
47
|
+
(counter) => ["хвилин", "хвилина", "хвилини"][getSlavicForm(counter)],
|
|
48
|
+
(counter) => ["секунд", "секунда", "секунди"][getSlavicForm(counter)],
|
|
49
|
+
(counter) => ["мілісекунд", "мілісекунда", "мілісекунди"][getSlavicForm(counter)],
|
|
50
|
+
"за %s",
|
|
51
|
+
"%s тому",
|
|
52
|
+
",",
|
|
53
|
+
// decimal separator
|
|
54
|
+
ukUnitMap,
|
|
55
|
+
" ",
|
|
56
|
+
// group separator (space is standard)
|
|
57
|
+
"_"
|
|
58
|
+
// placeholder separator
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
export { durationLanguage };
|
package/dist/language/ur.js
CHANGED
|
@@ -1 +1,57 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
|
|
3
|
+
const urUnitMap = {
|
|
4
|
+
ms: "ms",
|
|
5
|
+
ث: "s",
|
|
6
|
+
// Alternative Abbreviation
|
|
7
|
+
د: "d",
|
|
8
|
+
// Abbreviation
|
|
9
|
+
دن: "d",
|
|
10
|
+
س: "y",
|
|
11
|
+
// Abbreviation
|
|
12
|
+
سال: "y",
|
|
13
|
+
سیک: "s",
|
|
14
|
+
// Abbreviation
|
|
15
|
+
سیکنڈ: "s",
|
|
16
|
+
گھ: "h",
|
|
17
|
+
// Abbreviation
|
|
18
|
+
گھنٹہ: "h",
|
|
19
|
+
گھنٹے: "h",
|
|
20
|
+
م: "m",
|
|
21
|
+
// Abbreviation
|
|
22
|
+
ماہ: "mo",
|
|
23
|
+
// Alternative word
|
|
24
|
+
مل: "ms",
|
|
25
|
+
// Abbreviation
|
|
26
|
+
ملی_سیکنڈ: "ms",
|
|
27
|
+
منٹ: "m",
|
|
28
|
+
مہ: "mo",
|
|
29
|
+
// Abbreviation
|
|
30
|
+
مہینہ: "mo",
|
|
31
|
+
مہینے: "mo",
|
|
32
|
+
ہ: "w",
|
|
33
|
+
// Abbreviation
|
|
34
|
+
ہفتہ: "w",
|
|
35
|
+
ہفتے: "w"
|
|
36
|
+
};
|
|
37
|
+
const durationLanguage = createDurationLanguage(
|
|
38
|
+
"سال",
|
|
39
|
+
(counter) => counter === 1 ? "مہینہ" : "مہینے",
|
|
40
|
+
(counter) => counter === 1 ? "ہفتہ" : "ہفتے",
|
|
41
|
+
"دن",
|
|
42
|
+
(counter) => counter === 1 ? "گھنٹہ" : "گھنٹے",
|
|
43
|
+
"منٹ",
|
|
44
|
+
"سیکنڈ",
|
|
45
|
+
"ملی سیکنڈ",
|
|
46
|
+
"%s بعد",
|
|
47
|
+
"%s قبل",
|
|
48
|
+
".",
|
|
49
|
+
// decimal separator (Urdu uses .)
|
|
50
|
+
urUnitMap,
|
|
51
|
+
",",
|
|
52
|
+
// group separator (Urdu uses ,)
|
|
53
|
+
"_"
|
|
54
|
+
// placeholder separator
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
export { durationLanguage };
|
|
@@ -1 +1,33 @@
|
|
|
1
|
-
|
|
1
|
+
const createDurationLanguage = (y, mo, w, d, h, m, s, ms, future, past, decimal, unitMap, groupSeparator, placeholderSeparator) => {
|
|
2
|
+
const result = {
|
|
3
|
+
d,
|
|
4
|
+
h,
|
|
5
|
+
m,
|
|
6
|
+
mo,
|
|
7
|
+
ms,
|
|
8
|
+
s,
|
|
9
|
+
w,
|
|
10
|
+
y
|
|
11
|
+
};
|
|
12
|
+
if (future !== void 0) {
|
|
13
|
+
result.future = future;
|
|
14
|
+
}
|
|
15
|
+
if (past !== void 0) {
|
|
16
|
+
result.past = past;
|
|
17
|
+
}
|
|
18
|
+
if (decimal !== void 0) {
|
|
19
|
+
result.decimal = decimal;
|
|
20
|
+
}
|
|
21
|
+
if (unitMap !== void 0) {
|
|
22
|
+
result.unitMap = unitMap;
|
|
23
|
+
}
|
|
24
|
+
if (groupSeparator !== void 0) {
|
|
25
|
+
result.groupSeparator = groupSeparator;
|
|
26
|
+
}
|
|
27
|
+
if (placeholderSeparator !== void 0) {
|
|
28
|
+
result.placeholderSeparator = placeholderSeparator;
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { createDurationLanguage as default };
|
|
@@ -1 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
const getCzechOrSlovakForm = (counter) => {
|
|
2
|
+
if (counter === 1) {
|
|
3
|
+
return 0;
|
|
4
|
+
}
|
|
5
|
+
if (Math.floor(counter) !== counter) {
|
|
6
|
+
return 1;
|
|
7
|
+
}
|
|
8
|
+
if (counter % 10 >= 2 && counter % 10 <= 4 && counter % 100 < 10) {
|
|
9
|
+
return 2;
|
|
10
|
+
}
|
|
11
|
+
return 3;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { getCzechOrSlovakForm as default };
|
|
@@ -1 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
const getSlavicForm = (counter) => {
|
|
2
|
+
if (Math.floor(counter) !== counter) {
|
|
3
|
+
return 2;
|
|
4
|
+
}
|
|
5
|
+
if (counter % 100 >= 5 && counter % 100 <= 20 || counter % 10 >= 5 && counter % 10 <= 9 || counter % 10 === 0) {
|
|
6
|
+
return 0;
|
|
7
|
+
}
|
|
8
|
+
if (counter % 10 === 1) {
|
|
9
|
+
return 1;
|
|
10
|
+
}
|
|
11
|
+
if (counter > 1) {
|
|
12
|
+
return 2;
|
|
13
|
+
}
|
|
14
|
+
return 0;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { getSlavicForm as default };
|
|
@@ -1 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
const validateDurationLanguage = (language) => {
|
|
2
|
+
const requiredProperties = ["y", "mo", "w", "d", "h", "m", "s", "ms", "future", "past"];
|
|
3
|
+
for (const property of requiredProperties) {
|
|
4
|
+
if (!Object.prototype.hasOwnProperty.call(language, property)) {
|
|
5
|
+
throw new TypeError(`Missing required property: ${property}`);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
if (typeof language.future !== "string" || typeof language.past !== "string") {
|
|
9
|
+
throw new TypeError("Properties future and past must be of type string");
|
|
10
|
+
}
|
|
11
|
+
for (const property of ["y", "mo", "w", "d", "h", "m", "s", "ms"]) {
|
|
12
|
+
if (typeof language[property] !== "string" && typeof language[property] !== "function") {
|
|
13
|
+
throw new TypeError(`Property ${property} must be of type string or function`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (language.decimal && typeof language.decimal !== "string") {
|
|
17
|
+
throw new TypeError("Property decimal must be of type string");
|
|
18
|
+
}
|
|
19
|
+
if (language.delimiter && typeof language.delimiter !== "string") {
|
|
20
|
+
throw new TypeError("Property delimiter must be of type string");
|
|
21
|
+
}
|
|
22
|
+
if (language._digitReplacements && !Array.isArray(language._digitReplacements)) {
|
|
23
|
+
throw new TypeError("Property _digitReplacements must be an array");
|
|
24
|
+
}
|
|
25
|
+
if (language._numberFirst && typeof language._numberFirst !== "boolean") {
|
|
26
|
+
throw new TypeError("Property _numberFirst must be of type boolean");
|
|
27
|
+
}
|
|
28
|
+
if (language.unitMap && typeof language.unitMap !== "object") {
|
|
29
|
+
throw new TypeError("Property unitMap must be an object");
|
|
30
|
+
}
|
|
31
|
+
if (language.unitMap && Object.values(language.unitMap).some((value) => typeof value !== "string")) {
|
|
32
|
+
throw new TypeError("All values in unitMap must be of type string");
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { validateDurationLanguage as default };
|
package/dist/language/uz.js
CHANGED
|
@@ -1 +1,43 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
|
|
3
|
+
const uzUnitMap = {
|
|
4
|
+
h: "w",
|
|
5
|
+
hafta: "w",
|
|
6
|
+
k: "d",
|
|
7
|
+
kun: "d",
|
|
8
|
+
m: "m",
|
|
9
|
+
millisekund: "ms",
|
|
10
|
+
min: "m",
|
|
11
|
+
minut: "m",
|
|
12
|
+
ms: "ms",
|
|
13
|
+
o: "mo",
|
|
14
|
+
oy: "mo",
|
|
15
|
+
s: "h",
|
|
16
|
+
sek: "s",
|
|
17
|
+
sekund: "s",
|
|
18
|
+
soat: "h",
|
|
19
|
+
y: "y",
|
|
20
|
+
yil: "y"
|
|
21
|
+
};
|
|
22
|
+
const durationLanguage = createDurationLanguage(
|
|
23
|
+
"yil",
|
|
24
|
+
"oy",
|
|
25
|
+
"hafta",
|
|
26
|
+
"kun",
|
|
27
|
+
"soat",
|
|
28
|
+
"minut",
|
|
29
|
+
"sekund",
|
|
30
|
+
"millisekund",
|
|
31
|
+
"%s da",
|
|
32
|
+
"%s avval",
|
|
33
|
+
// "%s ago"
|
|
34
|
+
",",
|
|
35
|
+
// decimal separator in Uzbek
|
|
36
|
+
uzUnitMap,
|
|
37
|
+
" ",
|
|
38
|
+
// group separator in Uzbek
|
|
39
|
+
"_"
|
|
40
|
+
// placeholder separator
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export { durationLanguage };
|
package/dist/language/uz_CYR.js
CHANGED
|
@@ -1 +1,43 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
|
|
3
|
+
const uzCyrUnitMap = {
|
|
4
|
+
й: "y",
|
|
5
|
+
йил: "y",
|
|
6
|
+
к: "d",
|
|
7
|
+
кун: "d",
|
|
8
|
+
м: "m",
|
|
9
|
+
миллисекунд: "ms",
|
|
10
|
+
мин: "m",
|
|
11
|
+
минут: "m",
|
|
12
|
+
мс: "ms",
|
|
13
|
+
о: "mo",
|
|
14
|
+
ой: "mo",
|
|
15
|
+
с: "h",
|
|
16
|
+
сек: "s",
|
|
17
|
+
секунд: "s",
|
|
18
|
+
соат: "h",
|
|
19
|
+
ҳ: "w",
|
|
20
|
+
ҳафта: "w"
|
|
21
|
+
};
|
|
22
|
+
const durationLanguage = createDurationLanguage(
|
|
23
|
+
"йил",
|
|
24
|
+
"ой",
|
|
25
|
+
"ҳафта",
|
|
26
|
+
"кун",
|
|
27
|
+
"соат",
|
|
28
|
+
"минут",
|
|
29
|
+
"секунд",
|
|
30
|
+
"миллисекунд",
|
|
31
|
+
"%s да",
|
|
32
|
+
"%s аввал",
|
|
33
|
+
// "%s ago"
|
|
34
|
+
",",
|
|
35
|
+
// decimal separator in Uzbek Cyrillic
|
|
36
|
+
uzCyrUnitMap,
|
|
37
|
+
" ",
|
|
38
|
+
// group separator in Uzbek Cyrillic
|
|
39
|
+
"_"
|
|
40
|
+
// placeholder separator
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export { durationLanguage };
|
package/dist/language/vi.js
CHANGED
|
@@ -1 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
|
|
3
|
+
const viUnitMap = {
|
|
4
|
+
giây: "s",
|
|
5
|
+
giờ: "h",
|
|
6
|
+
mili: "ms",
|
|
7
|
+
miligiây: "ms",
|
|
8
|
+
năm: "y",
|
|
9
|
+
ngày: "d",
|
|
10
|
+
phút: "m",
|
|
11
|
+
tháng: "mo",
|
|
12
|
+
tuần: "w"
|
|
13
|
+
};
|
|
14
|
+
const durationLanguage = createDurationLanguage(
|
|
15
|
+
"năm",
|
|
16
|
+
"tháng",
|
|
17
|
+
"tuần",
|
|
18
|
+
"ngày",
|
|
19
|
+
"giờ",
|
|
20
|
+
"phút",
|
|
21
|
+
"giây",
|
|
22
|
+
"mili giây",
|
|
23
|
+
"%s tới",
|
|
24
|
+
"%s trước",
|
|
25
|
+
",",
|
|
26
|
+
// decimal
|
|
27
|
+
viUnitMap,
|
|
28
|
+
".",
|
|
29
|
+
// groupSeparator
|
|
30
|
+
"_"
|
|
31
|
+
// placeholderSeparator
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export { durationLanguage };
|
package/dist/language/zh_CN.js
CHANGED
|
@@ -1 +1,39 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
|
|
3
|
+
const zhCNUnitMap = {
|
|
4
|
+
个月: "mo",
|
|
5
|
+
分: "m",
|
|
6
|
+
分钟: "m",
|
|
7
|
+
周: "w",
|
|
8
|
+
天: "d",
|
|
9
|
+
小时: "h",
|
|
10
|
+
年: "y",
|
|
11
|
+
日: "d",
|
|
12
|
+
时: "h",
|
|
13
|
+
星期: "w",
|
|
14
|
+
月: "mo",
|
|
15
|
+
毫秒: "ms",
|
|
16
|
+
秒: "s",
|
|
17
|
+
秒钟: "s"
|
|
18
|
+
};
|
|
19
|
+
const durationLanguage = createDurationLanguage(
|
|
20
|
+
"年",
|
|
21
|
+
"个月",
|
|
22
|
+
"周",
|
|
23
|
+
"天",
|
|
24
|
+
"小时",
|
|
25
|
+
"分",
|
|
26
|
+
"秒",
|
|
27
|
+
"毫秒",
|
|
28
|
+
"%s后",
|
|
29
|
+
"%s前",
|
|
30
|
+
".",
|
|
31
|
+
// decimal
|
|
32
|
+
zhCNUnitMap,
|
|
33
|
+
",",
|
|
34
|
+
// groupSeparator
|
|
35
|
+
"_"
|
|
36
|
+
// placeholderSeparator
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
export { durationLanguage };
|
package/dist/language/zh_TW.js
CHANGED
|
@@ -1 +1,39 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createDurationLanguage from './util/create-duration-language.js';
|
|
2
|
+
|
|
3
|
+
const zhTWUnitMap = {
|
|
4
|
+
個月: "mo",
|
|
5
|
+
分: "m",
|
|
6
|
+
分鐘: "m",
|
|
7
|
+
天: "d",
|
|
8
|
+
小時: "h",
|
|
9
|
+
年: "y",
|
|
10
|
+
日: "d",
|
|
11
|
+
星期: "w",
|
|
12
|
+
時: "h",
|
|
13
|
+
月: "mo",
|
|
14
|
+
毫秒: "ms",
|
|
15
|
+
秒: "s",
|
|
16
|
+
秒鐘: "s",
|
|
17
|
+
週: "w"
|
|
18
|
+
};
|
|
19
|
+
const durationLanguage = createDurationLanguage(
|
|
20
|
+
"年",
|
|
21
|
+
"個月",
|
|
22
|
+
"周",
|
|
23
|
+
"天",
|
|
24
|
+
"小時",
|
|
25
|
+
"分鐘",
|
|
26
|
+
"秒",
|
|
27
|
+
"毫秒",
|
|
28
|
+
"%s後",
|
|
29
|
+
"%s前",
|
|
30
|
+
".",
|
|
31
|
+
// decimal
|
|
32
|
+
zhTWUnitMap,
|
|
33
|
+
",",
|
|
34
|
+
// groupSeparator
|
|
35
|
+
"_"
|
|
36
|
+
// placeholderSeparator
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
export { durationLanguage };
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { durationLanguage } from '../language/en.js';
|
|
2
|
+
import validateDurationLanguage from '../language/util/validate-duration-language.js';
|
|
3
|
+
|
|
4
|
+
const toFixed = (number_, fixed) => {
|
|
5
|
+
fixed = fixed || -1;
|
|
6
|
+
const matches = new RegExp(String.raw`^-?\d+(?:.\d{0,${String(fixed)}})?`).exec(number_.toString());
|
|
7
|
+
if (matches === null) {
|
|
8
|
+
return number_;
|
|
9
|
+
}
|
|
10
|
+
return Number.parseFloat(matches[0]);
|
|
11
|
+
};
|
|
12
|
+
const renderPiece = ({ unitCount, unitName }, language, options) => {
|
|
13
|
+
let { spacer } = options;
|
|
14
|
+
const { maxDecimalPoints } = options;
|
|
15
|
+
let decimal = ".";
|
|
16
|
+
if (options.decimal !== void 0) {
|
|
17
|
+
decimal = options.decimal;
|
|
18
|
+
} else if (language.decimal !== void 0) {
|
|
19
|
+
decimal = language.decimal;
|
|
20
|
+
}
|
|
21
|
+
let digitReplacements;
|
|
22
|
+
if ("digitReplacements" in options) {
|
|
23
|
+
digitReplacements = options.digitReplacements;
|
|
24
|
+
} else if ("_digitReplacements" in language) {
|
|
25
|
+
digitReplacements = language._digitReplacements;
|
|
26
|
+
}
|
|
27
|
+
let formattedCount;
|
|
28
|
+
let normalizedUnitCount = unitCount;
|
|
29
|
+
if (maxDecimalPoints !== void 0) {
|
|
30
|
+
normalizedUnitCount = toFixed(unitCount, maxDecimalPoints);
|
|
31
|
+
}
|
|
32
|
+
const countString = normalizedUnitCount.toString();
|
|
33
|
+
if (!language._hideCountIf2 || unitCount !== 2) {
|
|
34
|
+
if (digitReplacements) {
|
|
35
|
+
formattedCount = "";
|
|
36
|
+
for (const char of countString) {
|
|
37
|
+
formattedCount += char === "." ? decimal : digitReplacements[char];
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
formattedCount = countString.replace(".", decimal);
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
formattedCount = "";
|
|
44
|
+
}
|
|
45
|
+
const languageWord = language[unitName];
|
|
46
|
+
let word = languageWord;
|
|
47
|
+
if (typeof languageWord === "function") {
|
|
48
|
+
word = languageWord(unitCount);
|
|
49
|
+
}
|
|
50
|
+
if (language._hideCountIf2 && unitCount === 2) {
|
|
51
|
+
spacer = "";
|
|
52
|
+
}
|
|
53
|
+
if (language._numberFirst) {
|
|
54
|
+
return word + spacer + formattedCount;
|
|
55
|
+
}
|
|
56
|
+
return formattedCount + spacer + word;
|
|
57
|
+
};
|
|
58
|
+
const getPieces = (ms, options) => {
|
|
59
|
+
const { units } = options;
|
|
60
|
+
if (units.length === 0) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
const { unitMeasures } = options;
|
|
64
|
+
const largest = options.largest ?? Number.POSITIVE_INFINITY;
|
|
65
|
+
const unitCounts = {};
|
|
66
|
+
let unitName;
|
|
67
|
+
let index;
|
|
68
|
+
let unitCount;
|
|
69
|
+
let msRemaining = ms;
|
|
70
|
+
for (index = 0; index < units.length; index++) {
|
|
71
|
+
unitName = units[index];
|
|
72
|
+
const unitMs = unitMeasures[unitName];
|
|
73
|
+
const isLast = index === units.length - 1;
|
|
74
|
+
unitCount = isLast ? msRemaining / unitMs : Math.floor(msRemaining / unitMs);
|
|
75
|
+
unitCounts[unitName] = unitCount;
|
|
76
|
+
msRemaining -= unitCount * unitMs;
|
|
77
|
+
}
|
|
78
|
+
if (options.round) {
|
|
79
|
+
let unitsRemainingBeforeRound = largest;
|
|
80
|
+
for (index = 0; index < units.length; index++) {
|
|
81
|
+
unitName = units[index];
|
|
82
|
+
unitCount = unitCounts[unitName];
|
|
83
|
+
if (unitCount === 0) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
unitsRemainingBeforeRound--;
|
|
87
|
+
if (unitsRemainingBeforeRound === 0) {
|
|
88
|
+
for (let index_ = index + 1; index_ < units.length; index_++) {
|
|
89
|
+
const smallerUnitName = units[index_];
|
|
90
|
+
const smallerUnitCount = unitCounts[smallerUnitName];
|
|
91
|
+
unitCounts[unitName] += smallerUnitCount * unitMeasures[smallerUnitName] / unitMeasures[unitName];
|
|
92
|
+
unitCounts[smallerUnitName] = 0;
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (index = units.length - 1; index >= 0; index--) {
|
|
98
|
+
unitName = units[index];
|
|
99
|
+
unitCount = unitCounts[unitName];
|
|
100
|
+
if (unitCount === 0) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const rounded = Math.round(unitCount);
|
|
104
|
+
unitCounts[unitName] = rounded;
|
|
105
|
+
if (index === 0) {
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
const previousUnitName = units[index - 1];
|
|
109
|
+
const previousUnitMs = unitMeasures[previousUnitName];
|
|
110
|
+
const amountOfPreviousUnit = Math.floor(rounded * unitMeasures[unitName] / previousUnitMs);
|
|
111
|
+
if (amountOfPreviousUnit) {
|
|
112
|
+
unitCounts[previousUnitName] += amountOfPreviousUnit;
|
|
113
|
+
unitCounts[unitName] = 0;
|
|
114
|
+
} else {
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const result = [];
|
|
120
|
+
for (index = 0; index < units.length && result.length < largest; index++) {
|
|
121
|
+
unitName = units[index];
|
|
122
|
+
unitCount = unitCounts[unitName];
|
|
123
|
+
if (unitCount && !options.round && result.length === largest - 1) {
|
|
124
|
+
let index_;
|
|
125
|
+
let remainder = 0;
|
|
126
|
+
for (index_ = index + 1, units.length; index_ < units.length; index_++) {
|
|
127
|
+
const remainderUnitName = units[index_];
|
|
128
|
+
remainder += unitCounts[remainderUnitName] * (options.unitMeasures[remainderUnitName] / options.unitMeasures[unitName]);
|
|
129
|
+
}
|
|
130
|
+
unitCount += remainder;
|
|
131
|
+
if (options.maxDecimalPoints !== void 0) {
|
|
132
|
+
unitCount = toFixed(unitCount, options.maxDecimalPoints);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (unitCount) {
|
|
136
|
+
result.push({ unitCount, unitName });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
};
|
|
141
|
+
const formatPieces = (pieces, options, ms) => {
|
|
142
|
+
const { language, units } = options;
|
|
143
|
+
if (pieces.length === 0) {
|
|
144
|
+
const smallestUnitName = units.at(-1);
|
|
145
|
+
return renderPiece({ unitCount: 0, unitName: smallestUnitName }, language, options);
|
|
146
|
+
}
|
|
147
|
+
const { conjunction, serialComma } = options;
|
|
148
|
+
let delimiter = ", ";
|
|
149
|
+
if (options.delimiter !== void 0) {
|
|
150
|
+
delimiter = options.delimiter;
|
|
151
|
+
} else if (language.delimiter !== void 0) {
|
|
152
|
+
delimiter = language.delimiter;
|
|
153
|
+
}
|
|
154
|
+
let adverb = "";
|
|
155
|
+
if (options.timeAdverb && ms !== 0) {
|
|
156
|
+
adverb = language.future ?? "";
|
|
157
|
+
if (ms < 0) {
|
|
158
|
+
adverb = language.past ?? "";
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const renderedPieces = [];
|
|
162
|
+
for (const piece_ of pieces) {
|
|
163
|
+
const piece = piece_;
|
|
164
|
+
renderedPieces.push(renderPiece(piece, language, options));
|
|
165
|
+
}
|
|
166
|
+
let result;
|
|
167
|
+
if (!conjunction || pieces.length === 1) {
|
|
168
|
+
result = renderedPieces.join(delimiter);
|
|
169
|
+
} else if (pieces.length === 2) {
|
|
170
|
+
result = renderedPieces.join(conjunction);
|
|
171
|
+
} else {
|
|
172
|
+
result = renderedPieces.slice(0, -1).join(delimiter) + (serialComma ? "," : "") + conjunction + renderedPieces.at(-1);
|
|
173
|
+
}
|
|
174
|
+
if (adverb) {
|
|
175
|
+
result = adverb.replace("%s", result);
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
};
|
|
179
|
+
const duration = (milliseconds, options) => {
|
|
180
|
+
if (Number.isNaN(milliseconds)) {
|
|
181
|
+
throw new TypeError("Expected a valid number");
|
|
182
|
+
}
|
|
183
|
+
if (typeof milliseconds !== "number") {
|
|
184
|
+
throw new TypeError("Expected a number for milliseconds input");
|
|
185
|
+
}
|
|
186
|
+
const config = {
|
|
187
|
+
conjunction: "",
|
|
188
|
+
language: durationLanguage,
|
|
189
|
+
round: false,
|
|
190
|
+
serialComma: true,
|
|
191
|
+
spacer: " ",
|
|
192
|
+
timeAdverb: false,
|
|
193
|
+
unitMeasures: {
|
|
194
|
+
d: 864e5,
|
|
195
|
+
h: 36e5,
|
|
196
|
+
m: 6e4,
|
|
197
|
+
mo: 2629746e3,
|
|
198
|
+
// 365.2425 / 12 = 30.436875 days
|
|
199
|
+
ms: 1,
|
|
200
|
+
s: 1e3,
|
|
201
|
+
w: 6048e5,
|
|
202
|
+
y: 31556952e3
|
|
203
|
+
// 365 + 1/4 - 1/100 + 1/400 (actual leap day rules) = 365.2425 days
|
|
204
|
+
},
|
|
205
|
+
units: ["w", "d", "h", "m", "s"],
|
|
206
|
+
...options
|
|
207
|
+
};
|
|
208
|
+
validateDurationLanguage(config.language);
|
|
209
|
+
const absTime = Math.abs(milliseconds);
|
|
210
|
+
const pieces = getPieces(absTime, config);
|
|
211
|
+
return formatPieces(pieces, config, milliseconds);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
export { duration as default };
|