@oliversalzburg/js-utils 0.7.0 → 0.8.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.
Files changed (178) hide show
  1. package/lib/async/async.d.ts +44 -0
  2. package/lib/async/async.js +76 -0
  3. package/lib/async/async.js.map +1 -0
  4. package/lib/async/async.test.d.ts +1 -0
  5. package/lib/async/async.test.js +26 -0
  6. package/lib/async/async.test.js.map +1 -0
  7. package/lib/cli/args.d.ts +9 -0
  8. package/lib/cli/args.js +49 -0
  9. package/lib/cli/args.js.map +1 -0
  10. package/lib/cli/args.test.d.ts +1 -0
  11. package/lib/cli/args.test.js +31 -0
  12. package/lib/cli/args.test.js.map +1 -0
  13. package/lib/core.d.ts +43 -0
  14. package/lib/core.js +2 -0
  15. package/lib/core.js.map +1 -0
  16. package/lib/data/array.d.ts +55 -0
  17. package/lib/data/array.js +90 -0
  18. package/lib/data/array.js.map +1 -0
  19. package/lib/data/nil.d.ts +92 -0
  20. package/lib/data/nil.js +131 -0
  21. package/lib/data/nil.js.map +1 -0
  22. package/lib/data/random.d.ts +111 -0
  23. package/lib/data/random.js +381 -0
  24. package/lib/data/random.js.map +1 -0
  25. package/lib/data/string.d.ts +30 -0
  26. package/lib/data/string.js +53 -0
  27. package/lib/data/string.js.map +1 -0
  28. package/lib/data/tree.d.ts +28 -0
  29. package/lib/data/tree.js +45 -0
  30. package/lib/data/tree.js.map +1 -0
  31. package/lib/device/shake.d.ts +79 -0
  32. package/lib/device/shake.js +135 -0
  33. package/lib/device/shake.js.map +1 -0
  34. package/lib/dom/core.d.ts +21 -0
  35. package/lib/dom/core.js +41 -0
  36. package/lib/dom/core.js.map +1 -0
  37. package/lib/errors/AbstractError.d.ts +29 -0
  38. package/lib/errors/AbstractError.js +59 -0
  39. package/lib/errors/AbstractError.js.map +1 -0
  40. package/lib/errors/InternalError.d.ts +19 -0
  41. package/lib/errors/InternalError.js +38 -0
  42. package/lib/errors/InternalError.js.map +1 -0
  43. package/lib/errors/InvalidArgumentError.d.ts +13 -0
  44. package/lib/errors/InvalidArgumentError.js +22 -0
  45. package/lib/errors/InvalidArgumentError.js.map +1 -0
  46. package/lib/errors/InvalidOperationError.d.ts +13 -0
  47. package/lib/errors/InvalidOperationError.js +22 -0
  48. package/lib/errors/InvalidOperationError.js.map +1 -0
  49. package/lib/errors/NotImplementedError.d.ts +12 -0
  50. package/lib/errors/NotImplementedError.js +21 -0
  51. package/lib/errors/NotImplementedError.js.map +1 -0
  52. package/lib/errors/PermissionViolationError.d.ts +13 -0
  53. package/lib/errors/PermissionViolationError.js +22 -0
  54. package/lib/errors/PermissionViolationError.js.map +1 -0
  55. package/lib/errors/ResourceConflictError.d.ts +12 -0
  56. package/lib/errors/ResourceConflictError.js +21 -0
  57. package/lib/errors/ResourceConflictError.js.map +1 -0
  58. package/lib/errors/UnknownError.d.ts +16 -0
  59. package/lib/errors/UnknownError.js +25 -0
  60. package/lib/errors/UnknownError.js.map +1 -0
  61. package/lib/errors/console.d.ts +7 -0
  62. package/lib/errors/console.js +13 -0
  63. package/lib/errors/console.js.map +1 -0
  64. package/lib/errors/error-serializer.d.ts +45 -0
  65. package/lib/errors/error-serializer.js +74 -0
  66. package/lib/errors/error-serializer.js.map +1 -0
  67. package/lib/errors/error-serializer.test.d.ts +1 -0
  68. package/lib/errors/error-serializer.test.js +109 -0
  69. package/lib/errors/error-serializer.test.js.map +1 -0
  70. package/lib/errors/stream.d.ts +7 -0
  71. package/lib/errors/stream.js +15 -0
  72. package/lib/errors/stream.js.map +1 -0
  73. package/lib/errors/tools.d.ts +10 -0
  74. package/lib/errors/tools.js +13 -0
  75. package/lib/errors/tools.js.map +1 -0
  76. package/lib/events/event.d.ts +9 -0
  77. package/lib/events/event.js +10 -0
  78. package/lib/events/event.js.map +1 -0
  79. package/lib/format/bytes.d.ts +118 -0
  80. package/lib/format/bytes.js +138 -0
  81. package/lib/format/bytes.js.map +1 -0
  82. package/lib/format/bytes.test.d.ts +1 -0
  83. package/lib/format/bytes.test.js +146 -0
  84. package/lib/format/bytes.test.js.map +1 -0
  85. package/lib/format/count.d.ts +14 -0
  86. package/lib/format/count.js +51 -0
  87. package/lib/format/count.js.map +1 -0
  88. package/lib/format/count.test.d.ts +1 -0
  89. package/lib/format/count.test.js +42 -0
  90. package/lib/format/count.test.js.map +1 -0
  91. package/lib/format/milliseconds.d.ts +100 -0
  92. package/lib/format/milliseconds.js +199 -0
  93. package/lib/format/milliseconds.js.map +1 -0
  94. package/lib/format/milliseconds.test.d.ts +1 -0
  95. package/lib/format/milliseconds.test.js +393 -0
  96. package/lib/format/milliseconds.test.js.map +1 -0
  97. package/lib/format/string.d.ts +24 -0
  98. package/lib/format/string.js +32 -0
  99. package/lib/format/string.js.map +1 -0
  100. package/lib/format/string.test.d.ts +1 -0
  101. package/lib/format/string.test.js +17 -0
  102. package/lib/format/string.test.js.map +1 -0
  103. package/lib/graphics/canvas-sandbox-mp.d.ts +258 -0
  104. package/lib/graphics/canvas-sandbox-mp.js +280 -0
  105. package/lib/graphics/canvas-sandbox-mp.js.map +1 -0
  106. package/lib/graphics/canvas-sandbox.d.ts +255 -0
  107. package/lib/graphics/canvas-sandbox.js +358 -0
  108. package/lib/graphics/canvas-sandbox.js.map +1 -0
  109. package/lib/graphics/canvas.d.ts +57 -0
  110. package/lib/graphics/canvas.js +37 -0
  111. package/lib/graphics/canvas.js.map +1 -0
  112. package/lib/graphics/canvas2d-headless.d.ts +85 -0
  113. package/lib/graphics/canvas2d-headless.js +197 -0
  114. package/lib/graphics/canvas2d-headless.js.map +1 -0
  115. package/lib/graphics/canvas2d.d.ts +162 -0
  116. package/lib/graphics/canvas2d.js +332 -0
  117. package/lib/graphics/canvas2d.js.map +1 -0
  118. package/lib/graphics/canvas3d.d.ts +41 -0
  119. package/lib/graphics/canvas3d.js +67 -0
  120. package/lib/graphics/canvas3d.js.map +1 -0
  121. package/lib/graphics/color.d.ts +22 -0
  122. package/lib/graphics/color.js +38 -0
  123. package/lib/graphics/color.js.map +1 -0
  124. package/lib/graphics/core.d.ts +89 -0
  125. package/lib/graphics/core.js +146 -0
  126. package/lib/graphics/core.js.map +1 -0
  127. package/lib/graphics/palette-sampler.d.ts +7 -0
  128. package/lib/graphics/palette-sampler.js +21 -0
  129. package/lib/graphics/palette-sampler.js.map +1 -0
  130. package/lib/graphics/palette.d.ts +120 -0
  131. package/lib/graphics/palette.js +574 -0
  132. package/lib/graphics/palette.js.map +1 -0
  133. package/lib/graphics/palette.test.d.ts +1 -0
  134. package/lib/graphics/palette.test.js +43 -0
  135. package/lib/graphics/palette.test.js.map +1 -0
  136. package/lib/graphics/render-loop.d.ts +76 -0
  137. package/lib/graphics/render-loop.js +114 -0
  138. package/lib/graphics/render-loop.js.map +1 -0
  139. package/lib/graphics/shader.d.ts +56 -0
  140. package/lib/graphics/shader.js +80 -0
  141. package/lib/graphics/shader.js.map +1 -0
  142. package/lib/log/log.d.ts +11 -0
  143. package/lib/log/log.js +2 -0
  144. package/lib/log/log.js.map +1 -0
  145. package/lib/log/report.d.ts +57 -0
  146. package/lib/log/report.js +88 -0
  147. package/lib/log/report.js.map +1 -0
  148. package/lib/math/core.d.ts +85 -0
  149. package/lib/math/core.js +125 -0
  150. package/lib/math/core.js.map +1 -0
  151. package/lib/math/easing.d.ts +204 -0
  152. package/lib/math/easing.js +366 -0
  153. package/lib/math/easing.js.map +1 -0
  154. package/lib/math/euler.d.ts +18 -0
  155. package/lib/math/euler.js +22 -0
  156. package/lib/math/euler.js.map +1 -0
  157. package/lib/math/matrix3.d.ts +227 -0
  158. package/lib/math/matrix3.js +508 -0
  159. package/lib/math/matrix3.js.map +1 -0
  160. package/lib/math/quaternion.d.ts +119 -0
  161. package/lib/math/quaternion.js +270 -0
  162. package/lib/math/quaternion.js.map +1 -0
  163. package/lib/math/transformation.d.ts +26 -0
  164. package/lib/math/transformation.js +31 -0
  165. package/lib/math/transformation.js.map +1 -0
  166. package/lib/math/vector2.d.ts +202 -0
  167. package/lib/math/vector2.js +310 -0
  168. package/lib/math/vector2.js.map +1 -0
  169. package/lib/math/vector3.d.ts +293 -0
  170. package/lib/math/vector3.js +492 -0
  171. package/lib/math/vector3.js.map +1 -0
  172. package/lib/math/vector4.d.ts +182 -0
  173. package/lib/math/vector4.js +302 -0
  174. package/lib/math/vector4.js.map +1 -0
  175. package/lib/measurement/performance.d.ts +13 -0
  176. package/lib/measurement/performance.js +19 -0
  177. package/lib/measurement/performance.js.map +1 -0
  178. package/package.json +5 -7
@@ -0,0 +1,118 @@
1
+ /**
2
+ * This code was derived from https://github.com/sindresorhus/pretty-bytes/tree/71d686a4cefb314c13b57107de5add5789753900.
3
+ * It is available under the MIT license.
4
+ */
5
+ /**
6
+ * Options for the `formatBytes` function.
7
+ */
8
+ export interface FormatBytesOptions {
9
+ /**
10
+ * Include plus sign for positive numbers. If the difference is exactly zero a space character will be prepended instead for better alignment.
11
+ */
12
+ signed?: boolean;
13
+ /**
14
+ * - If `false`: Output won't be localized.
15
+ * - If `true`: Localize the output using the system/browser locale.
16
+ * - If `string`: Expects a [BCP 47 language tag](https://en.wikipedia.org/wiki/IETF_language_tag) (For example: `en`, `de`, …)
17
+ * - If `string[]`: Expects a list of [BCP 47 language tags](https://en.wikipedia.org/wiki/IETF_language_tag) (For example: `en`, `de`, …)
18
+ */
19
+ locale?: boolean | string | ReadonlyArray<string>;
20
+ /**
21
+ * Format the number as [bits](https://en.wikipedia.org/wiki/Bit) instead of [bytes](https://en.wikipedia.org/wiki/Byte). This can be useful when, for example, referring to [bit rate](https://en.wikipedia.org/wiki/Bit_rate).
22
+ * @example
23
+ * ```
24
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
25
+ *
26
+ * formatBytes(1337, {bits: true});
27
+ * //=> '1.34 kbit'
28
+ * ```
29
+ */
30
+ bits?: boolean;
31
+ /**
32
+ * Format the number using the [Binary Prefix](https://en.wikipedia.org/wiki/Binary_prefix) instead of the [SI Prefix](https://en.wikipedia.org/wiki/SI_prefix). This can be useful for presenting memory amounts. However, this should not be used for presenting file sizes.
33
+ * @example
34
+ * ```
35
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
36
+ *
37
+ * formatBytes(1000, {binary: true});
38
+ * //=> '1000 bit'
39
+ *
40
+ * formatBytes(1024, {binary: true});
41
+ * //=> '1 kiB'
42
+ * ```
43
+ */
44
+ binary?: boolean;
45
+ /**
46
+ * The minimum number of fraction digits to display.
47
+ *
48
+ * If neither `minimumFractionDigits` or `maximumFractionDigits` are set, the default behavior is to round to 3 significant digits.
49
+ * @example
50
+ * ```
51
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
52
+ *
53
+ * // Show the number with at least 3 fractional digits
54
+ * formatBytes(1900, {minimumFractionDigits: 3});
55
+ * //=> '1.900 kB'
56
+ *
57
+ * formatBytes(1900);
58
+ * //=> '1.9 kB'
59
+ * ```
60
+ */
61
+ minimumFractionDigits?: number;
62
+ /**
63
+ * The maximum number of fraction digits to display.
64
+ *
65
+ * If neither `minimumFractionDigits` or `maximumFractionDigits` are set, the default behavior is to round to 3 significant digits.
66
+ * @example
67
+ * ```
68
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
69
+ *
70
+ * // Show the number with at most 1 fractional digit
71
+ * formatBytes(1920, {maximumFractionDigits: 1});
72
+ * //=> '1.9 kB'
73
+ *
74
+ * formatBytes(1920);
75
+ * //=> '1.92 kB'
76
+ * ```
77
+ */
78
+ maximumFractionDigits?: number;
79
+ /**
80
+ * Put a space between the number and unit.
81
+ * @example
82
+ * ```
83
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
84
+ *
85
+ * formatBytes(1920, {space: false});
86
+ * //=> '1.9kB'
87
+ *
88
+ * formatBytes(1920);
89
+ * //=> '1.92 kB'
90
+ * ```
91
+ */
92
+ space?: boolean;
93
+ }
94
+ /**
95
+ * Convert bytes to a human readable string: `1337` → `1.34 kB`.
96
+ * @param number - The number to format.
97
+ * @param options - The options for formatting the number.
98
+ * @returns The formatted string.
99
+ * @example
100
+ * ```
101
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
102
+ *
103
+ * formatBytes(1337);
104
+ * //=> '1.34 kB'
105
+ *
106
+ * formatBytes(100);
107
+ * //=> '100 B'
108
+ *
109
+ * // Display file size differences
110
+ * formatBytes(42, {signed: true});
111
+ * //=> '+42 B'
112
+ *
113
+ * // Localized output using German locale
114
+ * formatBytes(1337, {locale: 'de'});
115
+ * //=> '1,34 kB'
116
+ * ```
117
+ */
118
+ export declare const formatBytes: (number: number, options?: Readonly<FormatBytesOptions>) => string;
@@ -0,0 +1,138 @@
1
+ /**
2
+ * This code was derived from https://github.com/sindresorhus/pretty-bytes/tree/71d686a4cefb314c13b57107de5add5789753900.
3
+ * It is available under the MIT license.
4
+ */
5
+ const BYTE_UNITS = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
6
+ const BIBYTE_UNITS = [
7
+ "B",
8
+ "KiB",
9
+ "MiB",
10
+ "GiB",
11
+ "TiB",
12
+ "PiB",
13
+ "EiB",
14
+ "ZiB",
15
+ "YiB",
16
+ ];
17
+ const BIT_UNITS = [
18
+ "b",
19
+ "kbit",
20
+ "Mbit",
21
+ "Gbit",
22
+ "Tbit",
23
+ "Pbit",
24
+ "Ebit",
25
+ "Zbit",
26
+ "Ybit",
27
+ ];
28
+ const BIBIT_UNITS = [
29
+ "b",
30
+ "kibit",
31
+ "Mibit",
32
+ "Gibit",
33
+ "Tibit",
34
+ "Pibit",
35
+ "Eibit",
36
+ "Zibit",
37
+ "Yibit",
38
+ ];
39
+ /**
40
+ * Formats the given number using `Number#toLocaleString`.
41
+ * - If locale is a string, the value is expected to be a locale-key (for example: `de`).
42
+ * - If locale is true, the system default locale is used for translation.
43
+ * - If no value for locale is specified, the number is returned unmodified.
44
+ * @param number - The number to be formatted.
45
+ * @param locale - The locale to use for formatting.
46
+ * @param options - Formatting options.
47
+ * @returns The formatted number.
48
+ */
49
+ const toLocaleStringInternal = (number, locale, options) => {
50
+ let result = number;
51
+ if (typeof locale === "string" || Array.isArray(locale)) {
52
+ result = number.toLocaleString(locale, options);
53
+ }
54
+ else if (locale === true || options !== undefined) {
55
+ result = number.toLocaleString(undefined, options);
56
+ }
57
+ return result.toString();
58
+ };
59
+ /**
60
+ * Convert bytes to a human readable string: `1337` → `1.34 kB`.
61
+ * @param number - The number to format.
62
+ * @param options - The options for formatting the number.
63
+ * @returns The formatted string.
64
+ * @example
65
+ * ```
66
+ * import formatBytes from '@oliversalzburg/js-utils/format/bytes.js';
67
+ *
68
+ * formatBytes(1337);
69
+ * //=> '1.34 kB'
70
+ *
71
+ * formatBytes(100);
72
+ * //=> '100 B'
73
+ *
74
+ * // Display file size differences
75
+ * formatBytes(42, {signed: true});
76
+ * //=> '+42 B'
77
+ *
78
+ * // Localized output using German locale
79
+ * formatBytes(1337, {locale: 'de'});
80
+ * //=> '1,34 kB'
81
+ * ```
82
+ */
83
+ export const formatBytes = (number, options = {
84
+ binary: false,
85
+ bits: false,
86
+ space: true,
87
+ }) => {
88
+ if (!Number.isFinite(number)) {
89
+ throw new TypeError(`Expected a finite number, got ${typeof number}: ${number.toString()}`);
90
+ }
91
+ options = {
92
+ binary: false,
93
+ bits: false,
94
+ space: true,
95
+ ...options,
96
+ };
97
+ const UNITS = options.bits
98
+ ? options.binary
99
+ ? BIBIT_UNITS
100
+ : BIT_UNITS
101
+ : options.binary
102
+ ? BIBYTE_UNITS
103
+ : BYTE_UNITS;
104
+ const separator = options.space ? " " : "";
105
+ if (options.signed && number === 0) {
106
+ return ` 0${separator}${UNITS[0]}`;
107
+ }
108
+ const isNegative = number < 0;
109
+ const prefix = isNegative ? "-" : options.signed ? "+" : "";
110
+ if (isNegative) {
111
+ number = -number;
112
+ }
113
+ let localeOptions;
114
+ if (options.minimumFractionDigits !== undefined) {
115
+ localeOptions = { minimumFractionDigits: options.minimumFractionDigits };
116
+ }
117
+ if (options.maximumFractionDigits !== undefined) {
118
+ localeOptions = {
119
+ maximumFractionDigits: options.maximumFractionDigits,
120
+ ...localeOptions,
121
+ };
122
+ }
123
+ if (number < 1) {
124
+ const numberString = toLocaleStringInternal(number, options.locale, localeOptions);
125
+ return prefix + numberString + separator + UNITS[0];
126
+ }
127
+ const exponent = Math.min(Math.floor(options.binary
128
+ ? Math.log(number) / Math.log(1024)
129
+ : Math.log10(number) / 3), UNITS.length - 1);
130
+ number /= (options.binary ? 1024 : 1000) ** exponent;
131
+ if (!localeOptions) {
132
+ number = Number(number.toPrecision(3));
133
+ }
134
+ const numberString = toLocaleStringInternal(number, options.locale, localeOptions);
135
+ const unit = UNITS[exponent];
136
+ return prefix + numberString + separator + unit;
137
+ };
138
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../source/format/bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,146 @@
1
+ import assert from "node:assert";
2
+ import { it } from "node:test";
3
+ import { formatBytes } from "./bytes.js";
4
+ it("throws on invalid input", () => {
5
+ assert.throws(() => {
6
+ formatBytes("");
7
+ });
8
+ assert.throws(() => {
9
+ formatBytes("1");
10
+ });
11
+ assert.throws(() => {
12
+ formatBytes(Number.NaN);
13
+ });
14
+ assert.throws(() => {
15
+ formatBytes(true);
16
+ });
17
+ assert.throws(() => {
18
+ formatBytes(Number.POSITIVE_INFINITY);
19
+ });
20
+ assert.throws(() => {
21
+ formatBytes(Number.NEGATIVE_INFINITY);
22
+ });
23
+ assert.throws(() => {
24
+ formatBytes(null);
25
+ });
26
+ });
27
+ it("converts bytes to human readable strings", () => {
28
+ assert.strictEqual(formatBytes(0), "0 B");
29
+ assert.strictEqual(formatBytes(0.4), "0.4 B");
30
+ assert.strictEqual(formatBytes(0.7), "0.7 B");
31
+ assert.strictEqual(formatBytes(10), "10 B");
32
+ assert.strictEqual(formatBytes(10.1), "10.1 B");
33
+ assert.strictEqual(formatBytes(999), "999 B");
34
+ assert.strictEqual(formatBytes(1001), "1 kB");
35
+ assert.strictEqual(formatBytes(1e16), "10 PB");
36
+ assert.strictEqual(formatBytes(1e30), "1000000 YB");
37
+ });
38
+ it("supports negative number", () => {
39
+ assert.strictEqual(formatBytes(-0.4), "-0.4 B");
40
+ assert.strictEqual(formatBytes(-0.7), "-0.7 B");
41
+ assert.strictEqual(formatBytes(-10.1), "-10.1 B");
42
+ assert.strictEqual(formatBytes(-999), "-999 B");
43
+ assert.strictEqual(formatBytes(-1001), "-1 kB");
44
+ });
45
+ it("locale option", () => {
46
+ assert.strictEqual(formatBytes(-0.4, { locale: "de" }), "-0,4 B");
47
+ assert.strictEqual(formatBytes(0.4, { locale: "de" }), "0,4 B");
48
+ assert.strictEqual(formatBytes(1001, { locale: "de" }), "1 kB");
49
+ assert.strictEqual(formatBytes(10.1, { locale: "de" }), "10,1 B");
50
+ assert.strictEqual(formatBytes(1e30, { locale: "de" }), "1.000.000 YB");
51
+ assert.strictEqual(formatBytes(-0.4, { locale: "en" }), "-0.4 B");
52
+ assert.strictEqual(formatBytes(0.4, { locale: "en" }), "0.4 B");
53
+ assert.strictEqual(formatBytes(1001, { locale: "en" }), "1 kB");
54
+ assert.strictEqual(formatBytes(10.1, { locale: "en" }), "10.1 B");
55
+ assert.strictEqual(formatBytes(1e30, { locale: "en" }), "1,000,000 YB");
56
+ assert.strictEqual(formatBytes(-0.4, { locale: ["unknown", "de", "en"] }), "-0,4 B");
57
+ assert.strictEqual(formatBytes(0.4, { locale: ["unknown", "de", "en"] }), "0,4 B");
58
+ assert.strictEqual(formatBytes(1001, { locale: ["unknown", "de", "en"] }), "1 kB");
59
+ assert.strictEqual(formatBytes(10.1, { locale: ["unknown", "de", "en"] }), "10,1 B");
60
+ assert.strictEqual(formatBytes(1e30, { locale: ["unknown", "de", "en"] }), "1.000.000 YB");
61
+ assert.strictEqual(formatBytes(-0.4, { locale: true }), "-0.4 B");
62
+ assert.strictEqual(formatBytes(0.4, { locale: true }), "0.4 B");
63
+ assert.strictEqual(formatBytes(1001, { locale: true }), "1 kB");
64
+ assert.strictEqual(formatBytes(10.1, { locale: true }), "10.1 B");
65
+ assert.strictEqual(formatBytes(1e30, { locale: true }), "1,000,000 YB");
66
+ assert.strictEqual(formatBytes(-0.4, { locale: false }), "-0.4 B");
67
+ assert.strictEqual(formatBytes(0.4, { locale: false }), "0.4 B");
68
+ assert.strictEqual(formatBytes(1001, { locale: false }), "1 kB");
69
+ assert.strictEqual(formatBytes(10.1, { locale: false }), "10.1 B");
70
+ assert.strictEqual(formatBytes(1e30, { locale: false }), "1000000 YB");
71
+ assert.strictEqual(formatBytes(-0.4, { locale: undefined }), "-0.4 B");
72
+ assert.strictEqual(formatBytes(0.4, { locale: undefined }), "0.4 B");
73
+ assert.strictEqual(formatBytes(1001, { locale: undefined }), "1 kB");
74
+ assert.strictEqual(formatBytes(10.1, { locale: undefined }), "10.1 B");
75
+ assert.strictEqual(formatBytes(1e30, { locale: undefined }), "1000000 YB");
76
+ });
77
+ it("signed option", () => {
78
+ assert.strictEqual(formatBytes(42, { signed: true }), "+42 B");
79
+ assert.strictEqual(formatBytes(-13, { signed: true }), "-13 B");
80
+ assert.strictEqual(formatBytes(0, { signed: true }), " 0 B");
81
+ });
82
+ it("bits option", () => {
83
+ assert.strictEqual(formatBytes(0, { bits: true }), "0 b");
84
+ assert.strictEqual(formatBytes(0.4, { bits: true }), "0.4 b");
85
+ assert.strictEqual(formatBytes(0.7, { bits: true }), "0.7 b");
86
+ assert.strictEqual(formatBytes(10, { bits: true }), "10 b");
87
+ assert.strictEqual(formatBytes(10.1, { bits: true }), "10.1 b");
88
+ assert.strictEqual(formatBytes(999, { bits: true }), "999 b");
89
+ assert.strictEqual(formatBytes(1001, { bits: true }), "1 kbit");
90
+ assert.strictEqual(formatBytes(1001, { bits: true }), "1 kbit");
91
+ assert.strictEqual(formatBytes(1e16, { bits: true }), "10 Pbit");
92
+ assert.strictEqual(formatBytes(1e30, { bits: true }), "1000000 Ybit");
93
+ });
94
+ it("binary option", () => {
95
+ assert.strictEqual(formatBytes(0, { binary: true }), "0 B");
96
+ assert.strictEqual(formatBytes(4, { binary: true }), "4 B");
97
+ assert.strictEqual(formatBytes(10, { binary: true }), "10 B");
98
+ assert.strictEqual(formatBytes(10.1, { binary: true }), "10.1 B");
99
+ assert.strictEqual(formatBytes(999, { binary: true }), "999 B");
100
+ assert.strictEqual(formatBytes(1025, { binary: true }), "1 KiB");
101
+ assert.strictEqual(formatBytes(1001, { binary: true }), "1000 B");
102
+ assert.strictEqual(formatBytes(1e16, { binary: true }), "8.88 PiB");
103
+ assert.strictEqual(formatBytes(1e30, { binary: true }), "827000 YiB");
104
+ });
105
+ it("bits and binary option", () => {
106
+ assert.strictEqual(formatBytes(0, { binary: true, bits: true }), "0 b");
107
+ assert.strictEqual(formatBytes(4, { binary: true, bits: true }), "4 b");
108
+ assert.strictEqual(formatBytes(10, { binary: true, bits: true }), "10 b");
109
+ assert.strictEqual(formatBytes(999, { binary: true, bits: true }), "999 b");
110
+ assert.strictEqual(formatBytes(1025, { binary: true, bits: true }), "1 kibit");
111
+ assert.strictEqual(formatBytes(1e6, { binary: true, bits: true }), "977 kibit");
112
+ });
113
+ it("fractional digits options", () => {
114
+ assert.strictEqual(formatBytes(1900, { maximumFractionDigits: 1 }), "1.9 kB");
115
+ assert.strictEqual(formatBytes(1900, { minimumFractionDigits: 3 }), "1.900 kB");
116
+ assert.strictEqual(formatBytes(1911, { maximumFractionDigits: 1 }), "1.9 kB");
117
+ assert.strictEqual(formatBytes(1111, { maximumFractionDigits: 2 }), "1.11 kB");
118
+ assert.strictEqual(formatBytes(1019, { maximumFractionDigits: 3 }), "1.019 kB");
119
+ assert.strictEqual(formatBytes(1001, { maximumFractionDigits: 3 }), "1.001 kB");
120
+ assert.strictEqual(formatBytes(1000, { maximumFractionDigits: 3, minimumFractionDigits: 1 }), "1.0 kB");
121
+ assert.strictEqual(formatBytes(3942, { maximumFractionDigits: 2, minimumFractionDigits: 1 }), "3.94 kB");
122
+ assert.strictEqual(formatBytes(4001, { binary: true, maximumFractionDigits: 3 }), "3.907 KiB");
123
+ assert.strictEqual(formatBytes(18_717, { binary: true, maximumFractionDigits: 2 }), "18.28 KiB");
124
+ assert.strictEqual(formatBytes(18_717, { binary: true, maximumFractionDigits: 4 }), "18.2783 KiB");
125
+ assert.strictEqual(formatBytes(32_768, {
126
+ binary: true,
127
+ maximumFractionDigits: 3,
128
+ minimumFractionDigits: 2,
129
+ }), "32.00 KiB");
130
+ assert.strictEqual(formatBytes(65_536, {
131
+ binary: true,
132
+ maximumFractionDigits: 3,
133
+ minimumFractionDigits: 1,
134
+ }), "64.0 KiB");
135
+ });
136
+ it("space option", () => {
137
+ assert.strictEqual(formatBytes(0), "0 B");
138
+ assert.strictEqual(formatBytes(0, { space: false }), "0B");
139
+ assert.strictEqual(formatBytes(999), "999 B");
140
+ assert.strictEqual(formatBytes(999, { space: false }), "999B");
141
+ assert.strictEqual(formatBytes(-13, { signed: true }), "-13 B");
142
+ assert.strictEqual(formatBytes(-13, { signed: true, space: false }), "-13B");
143
+ assert.strictEqual(formatBytes(42, { signed: true }), "+42 B");
144
+ assert.strictEqual(formatBytes(42, { signed: true, space: false }), "+42B");
145
+ });
146
+ //# sourceMappingURL=bytes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.test.js","sourceRoot":"","sources":["../../source/format/bytes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Convert counts to a human readable string: `1234` → `1.234K`.
3
+ * @param count - The count to format.
4
+ * @param locale - The locale to use.
5
+ * @returns The formatted string.
6
+ */
7
+ export declare const formatCount: (count: number | bigint, locale?: string) => string;
8
+ /**
9
+ * Convert counts from a human readable string back to a number: `1.234K` → `1234`.
10
+ * @param count - The count to parse.
11
+ * @param locale - The locale to use.
12
+ * @returns The number represented by the input string.
13
+ */
14
+ export declare const parseCount: (count: string, locale?: string) => number;
@@ -0,0 +1,51 @@
1
+ import { mustExist } from "../data/nil.js";
2
+ /**
3
+ * Convert counts to a human readable string: `1234` → `1.234K`.
4
+ * @param count - The count to format.
5
+ * @param locale - The locale to use.
6
+ * @returns The formatted string.
7
+ */
8
+ export const formatCount = (count, locale) => {
9
+ return new Intl.NumberFormat(locale, {
10
+ compactDisplay: "short",
11
+ maximumFractionDigits: 3,
12
+ notation: "compact",
13
+ }).format(count);
14
+ };
15
+ /**
16
+ * Convert counts from a human readable string back to a number: `1.234K` → `1234`.
17
+ * @param count - The count to parse.
18
+ * @param locale - The locale to use.
19
+ * @returns The number represented by the input string.
20
+ */
21
+ export const parseCount = (count, locale) => {
22
+ const format = new Intl.NumberFormat(locale, {
23
+ compactDisplay: "short",
24
+ maximumFractionDigits: 3,
25
+ notation: "compact",
26
+ });
27
+ const parts = format.formatToParts(-12345.6);
28
+ const orders = Array.from({ length: 20 }).map((_, i) => format.formatToParts(10 ** i).find((d) => d.type === "compact")?.value ??
29
+ "");
30
+ const numerals = Array.from({ length: 10 }).map((_, i) => format.format(i));
31
+ const index = new Map(numerals.map((d, i) => [d, i]));
32
+ const minusSign = new RegExp(`[${mustExist(parts.find((d) => d.type === "minusSign")).value}]`);
33
+ const decimal = new RegExp(`[${mustExist(parts.find((d) => d.type === "decimal")).value}]`);
34
+ const numeral = new RegExp(`[${numerals.join("")}]`, "g");
35
+ const order = new RegExp(`(${[...new Set(orders.filter((o) => o !== ""))].join("|")})`, "g");
36
+ const DIRECTION_MARK = /\u061c|\u200e|\u200f/g;
37
+ let multiplier = 1;
38
+ const value = count
39
+ .trim()
40
+ .replace(DIRECTION_MARK, "")
41
+ .replace(decimal, ".")
42
+ .replace(numeral, (d) => mustExist(index.get(d)).toString())
43
+ .replace(minusSign, "-")
44
+ .replace(order, (o) => {
45
+ multiplier = 10 ** orders.indexOf(o);
46
+ return "";
47
+ })
48
+ .replace(/[ \u00a0]/g, "");
49
+ return +value * multiplier;
50
+ };
51
+ //# sourceMappingURL=count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.js","sourceRoot":"","sources":["../../source/format/count.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ import assert from "node:assert";
2
+ import { it } from "node:test";
3
+ import { formatCount, parseCount } from "./count.js";
4
+ it("formats counts as expected", () => {
5
+ assert.strictEqual(formatCount(-1), "-1");
6
+ assert.strictEqual(formatCount(0), "0");
7
+ assert.strictEqual(formatCount(1), "1");
8
+ assert.strictEqual(formatCount(10), "10");
9
+ assert.strictEqual(formatCount(100), "100");
10
+ assert.strictEqual(formatCount(1000), "1K");
11
+ assert.strictEqual(formatCount(1234), "1.234K");
12
+ });
13
+ it("parses counts as expected", () => {
14
+ const testCount = (count, inputLocale, input) => {
15
+ const locales = inputLocale
16
+ ? [inputLocale]
17
+ : "af,af-ZA,ar,ar-AE,ar-BH,ar-DZ,ar-EG,ar-IQ,ar-JO,ar-KW,ar-LB,ar-LY,ar-MA,ar-OM,ar-QA,ar-SA,ar-SY,ar-TN,ar-YE,az,az-AZ,az-AZ,be,be-BY,bg,bg-BG,bs-BA,ca,ca-ES,cs,cs-CZ,cy,cy-GB,da,da-DK,de,de-AT,de-CH,de-DE,de-LI,de-LU,dv,dv-MV,el,el-GR,en,en-AU,en-BZ,en-CA,en-CB,en-GB,en-IE,en-JM,en-NZ,en-PH,en-TT,en-US,en-ZA,en-ZW,eo,es,es-AR,es-BO,es-CL,es-CO,es-CR,es-DO,es-EC,es-ES,es-ES,es-GT,es-HN,es-MX,es-NI,es-PA,es-PE,es-PR,es-PY,es-SV,es-UY,es-VE,et,et-EE,eu,eu-ES,fa,fa-IR,fi,fi-FI,fo,fo-FO,fr,fr-BE,fr-CA,fr-CH,fr-FR,fr-LU,fr-MC,gl,gl-ES,gu,gu-IN,he,he-IL,hi,hi-IN,hr,hr-BA,hr-HR,hu,hu-HU,hy,hy-AM,id,id-ID,is,is-IS,it,it-CH,it-IT,ja,ja-JP,ka,ka-GE,kk,kk-KZ,kn,kn-IN,ko,ko-KR,kok,kok-IN,ky,ky-KG,lt,lt-LT,lv,lv-LV,mi,mi-NZ,mk,mk-MK,mn,mn-MN,mr,mr-IN,ms,ms-BN,ms-MY,mt,mt-MT,nb,nb-NO,nl,nl-BE,nl-NL,nn-NO,ns,ns-ZA,pa,pa-IN,pl,pl-PL,ps,ps-AR,pt,pt-BR,pt-PT,qu,qu-BO,qu-EC,qu-PE,ro,ro-RO,ru,ru-RU,sa,sa-IN,se,se-FI,se-FI,se-FI,se-NO,se-NO,se-NO,se-SE,se-SE,se-SE,sk,sk-SK,sl,sl-SI,sq,sq-AL,sr-BA,sr-BA,sr-SP,sr-SP,sv,sv-FI,sv-SE,sw,sw-KE,syr,syr-SY,ta,ta-IN,te,te-IN,th,th-TH,tl,tl-PH,tn,tn-ZA,tr,tr-TR,tt,tt-RU,ts,uk,uk-UA,ur,ur-PK,uz,uz-UZ,uz-UZ,vi,vi-VN,xh,xh-ZA,zh,zh-CN,zh-HK,zh-MO,zh-SG,zh-TW,zu,zu-ZA".split(",");
18
+ locales.forEach((locale) => {
19
+ const formatted = input ?? formatCount(count, locale);
20
+ const parsed = parseCount(formatted, locale);
21
+ if (parsed !== count) {
22
+ const parts = new Intl.NumberFormat(locale).formatToParts(count);
23
+ const literal = parts
24
+ .filter((p) => p.type !== "literal")
25
+ .map((part) => `${part.type}:${part.value
26
+ .split("")
27
+ .map((char) => `U+${char.charCodeAt(0).toString(16).padStart(4, "0")}`)
28
+ .join(", ")}`);
29
+ assert.strictEqual(parsed, count, `Failed for locale '${locale}': '${literal.join(", ")}'`);
30
+ }
31
+ });
32
+ };
33
+ testCount(-1, "en-US", "-1");
34
+ testCount(0, "en-US", "0");
35
+ testCount(1, "en-US", "1");
36
+ testCount(10, "en-US", "10");
37
+ testCount(100, "en-US", "100");
38
+ testCount(1000, "en-US", "1K");
39
+ testCount(1234, "en-US", "1.234K");
40
+ testCount(-1234, "en-US", "-1.234K");
41
+ });
42
+ //# sourceMappingURL=count.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.test.js","sourceRoot":"","sources":["../../source/format/count.test.ts"],"names":[],"mappings":"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"}