@ix-xs/node-comfort 1.2.0 → 2.1.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 (78) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +137 -548
  3. package/index.js +80 -35
  4. package/package.json +161 -33
  5. package/src/Arr.js +1050 -418
  6. package/src/Async.js +817 -0
  7. package/src/Cache.js +433 -0
  8. package/src/Checker.js +1202 -539
  9. package/src/Cli.js +1293 -0
  10. package/src/Color.js +556 -0
  11. package/src/Crypto.js +1082 -0
  12. package/src/Emitter.js +356 -0
  13. package/src/Env.js +689 -0
  14. package/src/FS.js +1626 -894
  15. package/src/Func.js +823 -356
  16. package/src/Http.js +700 -0
  17. package/src/Id.js +568 -200
  18. package/src/Logger.js +963 -378
  19. package/src/Num.js +965 -360
  20. package/src/Obj.js +1077 -379
  21. package/src/SQLite.js +1629 -1005
  22. package/src/Schema.js +2101 -0
  23. package/src/Str.js +1209 -432
  24. package/src/Sys.js +654 -0
  25. package/src/Time.js +1533 -440
  26. package/src/Utils.js +342 -325
  27. package/src/errors.js +335 -0
  28. package/src/internal/shared.js +415 -0
  29. package/types/index.d.ts +735 -526
  30. package/types/src/Arr.d.ts +533 -145
  31. package/types/src/Arr.d.ts.map +1 -1
  32. package/types/src/Async.d.ts +372 -0
  33. package/types/src/Async.d.ts.map +1 -0
  34. package/types/src/Cache.d.ts +221 -0
  35. package/types/src/Cache.d.ts.map +1 -0
  36. package/types/src/Checker.d.ts +651 -232
  37. package/types/src/Checker.d.ts.map +1 -1
  38. package/types/src/Cli.d.ts +664 -0
  39. package/types/src/Cli.d.ts.map +1 -0
  40. package/types/src/Color.d.ts +300 -0
  41. package/types/src/Color.d.ts.map +1 -0
  42. package/types/src/Crypto.d.ts +620 -0
  43. package/types/src/Crypto.d.ts.map +1 -0
  44. package/types/src/Emitter.d.ts +189 -0
  45. package/types/src/Emitter.d.ts.map +1 -0
  46. package/types/src/Env.d.ts +412 -0
  47. package/types/src/Env.d.ts.map +1 -0
  48. package/types/src/FS.d.ts +717 -238
  49. package/types/src/FS.d.ts.map +1 -1
  50. package/types/src/Func.d.ts +508 -135
  51. package/types/src/Func.d.ts.map +1 -1
  52. package/types/src/Http.d.ts +444 -0
  53. package/types/src/Http.d.ts.map +1 -0
  54. package/types/src/Id.d.ts +199 -66
  55. package/types/src/Id.d.ts.map +1 -1
  56. package/types/src/Logger.d.ts +414 -46
  57. package/types/src/Logger.d.ts.map +1 -1
  58. package/types/src/Num.d.ts +514 -137
  59. package/types/src/Num.d.ts.map +1 -1
  60. package/types/src/Obj.d.ts +453 -104
  61. package/types/src/Obj.d.ts.map +1 -1
  62. package/types/src/SQLite.d.ts +754 -308
  63. package/types/src/SQLite.d.ts.map +1 -1
  64. package/types/src/Schema.d.ts +1189 -0
  65. package/types/src/Schema.d.ts.map +1 -0
  66. package/types/src/Str.d.ts +617 -166
  67. package/types/src/Str.d.ts.map +1 -1
  68. package/types/src/Sys.d.ts +314 -0
  69. package/types/src/Sys.d.ts.map +1 -0
  70. package/types/src/Time.d.ts +759 -204
  71. package/types/src/Time.d.ts.map +1 -1
  72. package/types/src/Utils.d.ts +158 -102
  73. package/types/src/Utils.d.ts.map +1 -1
  74. package/types/src/errors.d.ts +316 -0
  75. package/types/src/errors.d.ts.map +1 -0
  76. package/types/src/internal/shared.d.ts +123 -0
  77. package/types/src/internal/shared.d.ts.map +1 -0
  78. package/types/index.d.ts.map +0 -1
@@ -1,242 +1,619 @@
1
1
  /**
2
- * Clamps a number between a minimum and maximum.
2
+ * Options for `formatBytes()`.
3
+ */
4
+ export type FormatBytesOptions = {
5
+ /**
6
+ * Maximum decimals. Defaults to `1`.
7
+ */
8
+ decimals?: number | undefined;
9
+ /**
10
+ * 1 KB is 1024 bytes when `true`, 1000 when `false`. Defaults to `true`.
11
+ */
12
+ binary?: boolean | undefined;
13
+ /**
14
+ * Use `KiB`, `MiB`, `GiB` labels.
15
+ */
16
+ iec?: boolean | undefined;
17
+ /**
18
+ * Formats the number for a language, like `"fr"` for `"1,5 KB"`.
19
+ */
20
+ locale?: string | undefined;
21
+ /**
22
+ * Your own labels from bytes up, like `["o", "Ko", "Mo", "Go", "To"]`.
23
+ */
24
+ units?: string[] | undefined;
25
+ };
26
+ /**
27
+ * Options for `parseBytes()`.
28
+ */
29
+ export type ParseBytesOptions = {
30
+ /**
31
+ * 1 KB is 1024 bytes when `true`, 1000 when `false`. `KiB` units are always 1024. Defaults to `true`.
32
+ */
33
+ binary?: boolean | undefined;
34
+ };
35
+ /**
36
+ * Options for `format()`.
37
+ */
38
+ export type FormatNumberOptions = {
39
+ /**
40
+ * Language, like `"fr"` or `"en-US"`. Defaults to the one set with `setLocale()`, or `"en"`.
41
+ */
42
+ locale?: string | undefined;
43
+ /**
44
+ * Exact number of decimals.
45
+ */
46
+ decimals?: number | undefined;
47
+ /**
48
+ * Minimum decimals.
49
+ */
50
+ minDecimals?: number | undefined;
51
+ /**
52
+ * Maximum decimals. Defaults to `3`.
53
+ */
54
+ maxDecimals?: number | undefined;
55
+ /**
56
+ * Short notation like `1.2K` or `3.4M`.
57
+ */
58
+ compact?: boolean | undefined;
59
+ /**
60
+ * `"percent"` multiplies by 100 and adds `%`.
61
+ */
62
+ style?: "percent" | "decimal" | undefined;
63
+ /**
64
+ * Any `Intl` unit: `"kilometer"`, `"celsius"`, `"megabyte"`...
65
+ */
66
+ unit?: string | undefined;
67
+ /**
68
+ * How the unit is written. Defaults to `"short"`.
69
+ */
70
+ unitDisplay?: "long" | "short" | "narrow" | undefined;
71
+ /**
72
+ * When to show the sign. `"exceptZero"` gives `+5`.
73
+ */
74
+ signDisplay?: "auto" | "always" | "never" | "exceptZero" | undefined;
75
+ /**
76
+ * Thousands separators. Defaults to `true`.
77
+ */
78
+ grouping?: boolean | undefined;
79
+ };
80
+ /**
81
+ * Options for `currency()`.
82
+ */
83
+ export type CurrencyOptions = {
84
+ /**
85
+ * Language. Defaults to the one set with `setLocale()`, or `"en"`.
86
+ */
87
+ locale?: string | undefined;
88
+ /**
89
+ * Defaults to the currency's usual decimals (2 for EUR, 0 for JPY).
90
+ */
91
+ decimals?: number | undefined;
92
+ /**
93
+ * `€`, `€`, `EUR` or `euros`. Defaults to `"symbol"`.
94
+ */
95
+ display?: "symbol" | "name" | "code" | "narrowSymbol" | undefined;
96
+ /**
97
+ * Show negative amounts in parentheses, like `($5.00)`.
98
+ */
99
+ accounting?: boolean | undefined;
100
+ };
101
+ /**
102
+ * Options for `ordinal()`.
103
+ */
104
+ export type OrdinalOptions = {
105
+ /**
106
+ * Built in: `en`, `fr`, `es`, `it`, `pt`, `de`, `nl`. Defaults to the one set with `setLocale()`, or `"en"`.
107
+ */
108
+ locale?: string | undefined;
109
+ /**
110
+ * Your own suffixes, for other languages.
111
+ */
112
+ suffixes?: Partial<Record<Intl.LDMLPluralRule, string>> | undefined;
113
+ };
114
+ /**
115
+ * Options for `variance()` and `stdDev()`.
116
+ */
117
+ export type VarianceOptions = {
118
+ /**
119
+ * Sample statistic (divides by n - 1) instead of population.
120
+ */
121
+ sample?: boolean | undefined;
122
+ };
123
+ /**
124
+ * Sets the default language of `format`, `currency`, `ordinal` and
125
+ * `formatBytes`.
3
126
  *
4
127
  * @example
5
- * nodeComfort.num.clamp(15, 0, 10); // 10
6
- * nodeComfort.num.clamp(-3, 0, 10); // 0
128
+ * num.setLocale("fr");
129
+ * num.currency(1234.5, "EUR"); // "1 234,50 €"
7
130
  *
8
- * @param {number} value - Value to clamp.
9
- * @param {number} min - Lower bound.
10
- * @param {number} max - Upper bound.
11
- * @returns {number} The clamped value.
131
+ * @param {string} locale Like `"fr"`, `"en-GB"` or `"pt-BR"`.
132
+ * @returns {typeof import("./Num")} The module, so calls chain.
133
+ */
134
+ export function setLocale(locale: string): typeof import("./Num");
135
+ /**
136
+ * The current default language.
137
+ *
138
+ * @example
139
+ * num.getLocale(); // "en"
140
+ *
141
+ * @returns {string}
142
+ */
143
+ export function getLocale(): string;
144
+ /**
145
+ * Keeps a number between `min` and `max`.
146
+ *
147
+ * @example
148
+ * num.clamp(150, 0, 100); // 100
149
+ * num.clamp(-5, 0, 100); // 0
150
+ *
151
+ * @param {number} value
152
+ * @param {number} min
153
+ * @param {number} max
154
+ * @returns {number}
12
155
  */
13
156
  export function clamp(value: number, min: number, max: number): number;
14
157
  /**
15
- * Checks whether a number is within an inclusive `[min, max]` range.
158
+ * Is the number between `min` and `max`, both included?
159
+ *
160
+ * @example
161
+ * num.inRange(10, 0, 10); // true
16
162
  *
17
- * @param {number} value - Value to test.
18
- * @param {number} min - Lower bound.
19
- * @param {number} max - Upper bound.
20
- * @returns {boolean} True if within range.
163
+ * @param {number} value
164
+ * @param {number} min
165
+ * @param {number} max
166
+ * @returns {boolean}
21
167
  */
22
168
  export function inRange(value: number, min: number, max: number): boolean;
23
169
  /**
24
- * Rounds a number to a given number of decimal places (avoids float artifacts).
170
+ * Wraps a number around a range, like an angle or a carousel index.
171
+ * `max` is excluded.
25
172
  *
26
173
  * @example
27
- * nodeComfort.num.round(1.005, 2); // 1.01
174
+ * num.wrap(370, 0, 360); // 10
175
+ * num.wrap(-1, 0, 5); // 4
28
176
  *
29
- * @param {number} value - Value to round.
30
- * @param {number} [decimals=0] - Number of decimal places.
31
- * @returns {number} The rounded number.
177
+ * @param {number} value
178
+ * @param {number} min
179
+ * @param {number} max
180
+ * @returns {number}
181
+ */
182
+ export function wrap(value: number, min: number, max: number): number;
183
+ /**
184
+ * Rounds to `decimals` places without floating-point surprises:
185
+ * `Math.round(1.005 * 100) / 100` gives `1`, this gives `1.01`. Halves round
186
+ * away from zero, like in a spreadsheet.
187
+ *
188
+ * @example
189
+ * num.round(1.005, 2); // 1.01
190
+ * num.round(1234, -2); // 1200
191
+ * num.round(-2.5); // -3
192
+ *
193
+ * @param {number} value
194
+ * @param {number} [decimals=0] Negative values round to tens, hundreds...
195
+ * @returns {number}
32
196
  */
33
197
  export function round(value: number, decimals?: number): number;
34
198
  /**
35
- * Rounds a number down to a given number of decimal places.
199
+ * Rounds down to `decimals` places.
200
+ *
201
+ * @example
202
+ * num.floor(1.789, 2); // 1.78
36
203
  *
37
- * @param {number} value - Value to round.
38
- * @param {number} [decimals=0] - Number of decimal places.
39
- * @returns {number} The floored number.
204
+ * @param {number} value
205
+ * @param {number} [decimals=0]
206
+ * @returns {number}
40
207
  */
41
208
  export function floor(value: number, decimals?: number): number;
42
209
  /**
43
- * Rounds a number up to a given number of decimal places.
210
+ * Rounds up to `decimals` places.
44
211
  *
45
- * @param {number} value - Value to round.
46
- * @param {number} [decimals=0] - Number of decimal places.
47
- * @returns {number} The ceiled number.
212
+ * @example
213
+ * num.ceil(1.231, 2); // 1.24
214
+ *
215
+ * @param {number} value
216
+ * @param {number} [decimals=0]
217
+ * @returns {number}
48
218
  */
49
219
  export function ceil(value: number, decimals?: number): number;
50
220
  /**
51
- * Linearly interpolates between `start` and `end` by ratio `t` (0..1).
221
+ * Rounds to the nearest multiple of `step`.
52
222
  *
53
223
  * @example
54
- * nodeComfort.num.lerp(0, 100, 0.5); // 50
224
+ * num.snap(17, 5); // 15
225
+ * num.snap(0.37, 0.25); // 0.25
55
226
  *
56
- * @param {number} start - Start value.
57
- * @param {number} end - End value.
58
- * @param {number} t - Interpolation factor (usually 0..1).
59
- * @returns {number} The interpolated value.
227
+ * @param {number} value
228
+ * @param {number} step
229
+ * @returns {number}
60
230
  */
61
- export function lerp(start: number, end: number, t: number): number;
231
+ export function snap(value: number, step: number): number;
232
+ /**
233
+ * Are two numbers equal within a small tolerance? The right way to compare
234
+ * float results, since `0.1 + 0.2 === 0.3` is `false`.
235
+ *
236
+ * @example
237
+ * num.approxEqual(0.1 + 0.2, 0.3); // true
238
+ *
239
+ * @param {number} a
240
+ * @param {number} b
241
+ * @param {number} [epsilon=Number.EPSILON * 16] Allowed difference, relative to the size of the numbers.
242
+ * @returns {boolean}
243
+ */
244
+ export function approxEqual(a: number, b: number, epsilon?: number): boolean;
62
245
  /**
63
- * Re-maps a number from one range to another.
246
+ * The value at ratio `t` between `start` and `end`.
64
247
  *
65
248
  * @example
66
- * nodeComfort.num.mapRange(5, 0, 10, 0, 100); // 50
249
+ * num.lerp(0, 100, 0.25); // 25
67
250
  *
68
- * @param {number} value - Value to map.
69
- * @param {number} inMin - Input range minimum.
70
- * @param {number} inMax - Input range maximum.
71
- * @param {number} outMin - Output range minimum.
72
- * @param {number} outMax - Output range maximum.
73
- * @returns {number} The mapped value.
251
+ * @param {number} start
252
+ * @param {number} end
253
+ * @param {number} t Usually between 0 and 1.
254
+ * @returns {number}
255
+ */
256
+ export function lerp(start: number, end: number, t: number): number;
257
+ /**
258
+ * Moves a number from one range to another, keeping its relative position.
259
+ *
260
+ * @example
261
+ * num.mapRange(5, 0, 10, 0, 100); // 50
262
+ * num.mapRange(75, 0, 100, 1, 0); // 0.25
263
+ *
264
+ * @param {number} value
265
+ * @param {number} inMin
266
+ * @param {number} inMax
267
+ * @param {number} outMin
268
+ * @param {number} outMax
269
+ * @returns {number}
74
270
  */
75
271
  export function mapRange(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number;
76
272
  /**
77
- * Returns a random number (float) in `[min, max)`.
273
+ * A random float from `min` (included) to `max` (excluded). Not for
274
+ * security: it uses `Math.random`.
78
275
  *
79
- * Not cryptographically secure. For secure randomness use `nodeComfort.id`.
276
+ * @example
277
+ * num.random(10, 20); // 13.84...
80
278
  *
81
- * @param {number} [min=0] - Lower bound (inclusive).
82
- * @param {number} [max=1] - Upper bound (exclusive).
83
- * @returns {number} A random float.
279
+ * @param {number} [min=0]
280
+ * @param {number} [max=1]
281
+ * @returns {number}
84
282
  */
85
283
  export function random(min?: number, max?: number): number;
86
284
  /**
87
- * Returns a random integer in `[min, max]` (both inclusive).
285
+ * A random integer from `min` to `max`, both included. Not for security.
88
286
  *
89
287
  * @example
90
- * nodeComfort.num.randomInt(1, 6); // dice roll
288
+ * num.randomInt(1, 6); // a dice roll
91
289
  *
92
- * @param {number} min - Lower bound (inclusive).
93
- * @param {number} max - Upper bound (inclusive).
94
- * @returns {number} A random integer.
290
+ * @param {number} min
291
+ * @param {number} max
292
+ * @returns {number}
95
293
  */
96
294
  export function randomInt(min: number, max: number): number;
97
295
  /**
98
- * Sums all numbers in an array.
296
+ * Adds up numbers, without the drift of a naive loop.
297
+ *
298
+ * @example
299
+ * num.sum([1, 2, 3]); // 6
300
+ * num.sum([0.1, 0.2, 0.3]); // 0.6, where a plain loop gives 0.6000000000000001
99
301
  *
100
- * @param {number[]} values - Array of numbers.
101
- * @returns {number} The sum (0 for an empty array).
302
+ * @param {Iterable<number>} values
303
+ * @returns {number}
102
304
  */
103
- export function sum(values: number[]): number;
305
+ export function sum(values: Iterable<number>): number;
104
306
  /**
105
- * Returns the arithmetic mean (average) of an array of numbers.
307
+ * Multiplies numbers. An empty list gives `1`.
106
308
  *
107
- * @param {number[]} values - Array of numbers.
108
- * @returns {number} The average (0 for an empty array).
309
+ * @example
310
+ * num.product([2, 3, 4]); // 24
311
+ *
312
+ * @param {Iterable<number>} values
313
+ * @returns {number}
109
314
  */
110
- export function average(values: number[]): number;
315
+ export function product(values: Iterable<number>): number;
111
316
  /**
112
- * Returns the median value of an array of numbers.
317
+ * The mean, or `0` for an empty list.
318
+ *
319
+ * @example
320
+ * num.average([2, 4, 9]); // 5
113
321
  *
114
- * @param {number[]} values - Array of numbers.
115
- * @returns {number} The median (0 for an empty array).
322
+ * @param {Iterable<number>} values
323
+ * @returns {number}
116
324
  */
117
- export function median(values: number[]): number;
325
+ export function average(values: Iterable<number>): number;
118
326
  /**
119
- * Returns the smallest number in an array.
327
+ * The middle value once sorted, or `0` for an empty list.
120
328
  *
121
- * @param {number[]} values - Array of numbers.
122
- * @returns {number|undefined} The minimum, or undefined if empty.
329
+ * @example
330
+ * num.median([3, 1, 2]); // 2
331
+ * num.median([1, 2, 3, 4]); // 2.5
332
+ *
333
+ * @param {Iterable<number>} values
334
+ * @returns {number}
123
335
  */
124
- export function min(values: number[]): number | undefined;
336
+ export function median(values: Iterable<number>): number;
125
337
  /**
126
- * Returns the largest number in an array.
338
+ * The most frequent values.
339
+ *
340
+ * @example
341
+ * num.mode([1, 1, 2, 2, 3]); // [1, 2]
127
342
  *
128
- * @param {number[]} values - Array of numbers.
129
- * @returns {number|undefined} The maximum, or undefined if empty.
343
+ * @param {Iterable<number>} values
344
+ * @returns {number[]}
130
345
  */
131
- export function max(values: number[]): number | undefined;
346
+ export function mode(values: Iterable<number>): number[];
132
347
  /**
133
- * Computes what percentage `value` is of `total`.
348
+ * The variance: the average squared distance from the mean.
134
349
  *
135
350
  * @example
136
- * nodeComfort.num.percent(25, 200); // 12.5
351
+ * num.variance([2, 4, 4, 4, 5, 5, 7, 9]); // 4
137
352
  *
138
- * @param {number} value - Partial value.
139
- * @param {number} total - Total value.
140
- * @param {number} [decimals=2] - Decimal places to keep.
141
- * @returns {number} The percentage.
353
+ * @param {Iterable<number>} values
354
+ * @param {VarianceOptions} [options]
355
+ * @returns {number}
142
356
  */
143
- export function percent(value: number, total: number, decimals?: number): number;
357
+ export function variance(values: Iterable<number>, options?: VarianceOptions): number;
144
358
  /**
145
- * Formats a byte count into a human-readable string (KB, MB, GB, ...).
359
+ * The standard deviation.
146
360
  *
147
- * By default uses binary sizing (base 1024) with familiar `KB`/`MB` labels.
148
- * Set `binary: false` for SI sizing (base 1000), or `iec: true` for
149
- * strict `KiB`/`MiB` labels.
361
+ * @example
362
+ * num.stdDev([2, 4, 4, 4, 5, 5, 7, 9]); // 2
363
+ *
364
+ * @param {Iterable<number>} values
365
+ * @param {VarianceOptions} [options]
366
+ * @returns {number}
367
+ */
368
+ export function stdDev(values: Iterable<number>, options?: VarianceOptions): number;
369
+ /**
370
+ * The value under which `p` percent of the values fall, interpolated like
371
+ * Excel's `PERCENTILE.INC`.
150
372
  *
151
373
  * @example
152
- * nodeComfort.num.formatBytes(1536); // "1.5 KB"
153
- * nodeComfort.num.formatBytes(1073741824); // "1 GB"
154
- * nodeComfort.num.formatBytes(1000, { binary: false }); // "1 KB"
155
- * nodeComfort.num.formatBytes(1024, { iec: true }); // "1 KiB"
374
+ * num.percentile([1, 2, 3, 4, 5], 90); // 4.6
375
+ * num.percentile(responseTimes, 95); // p95 latency
156
376
  *
157
- * @param {number} bytes - Number of bytes.
158
- * @param {{ decimals?: number, binary?: boolean, iec?: boolean }} [options] - Formatting options.
159
- * @returns {string} The human-readable size.
377
+ * @param {Iterable<number>} values
378
+ * @param {number} p From 0 to 100.
379
+ * @returns {number} `NaN` for an empty list.
160
380
  */
161
- export function formatBytes(bytes: number, options?: {
162
- decimals?: number;
163
- binary?: boolean;
164
- iec?: boolean;
165
- }): string;
381
+ export function percentile(values: Iterable<number>, p: number): number;
166
382
  /**
167
- * Formats a large number with a compact suffix (K, M, B, T).
383
+ * The smallest number. Unlike `Math.min(...array)`, huge arrays are fine.
384
+ * Like `Math.min`, a `NaN` in the list gives `NaN`.
385
+ *
386
+ * @param {Iterable<number>} values
387
+ * @returns {number | undefined} `undefined` for an empty list.
388
+ */
389
+ export function min(values: Iterable<number>): number | undefined;
390
+ /**
391
+ * The largest number. Unlike `Math.max(...array)`, huge arrays are fine.
392
+ * Like `Math.max`, a `NaN` in the list gives `NaN`.
393
+ *
394
+ * @param {Iterable<number>} values
395
+ * @returns {number | undefined} `undefined` for an empty list.
396
+ */
397
+ export function max(values: Iterable<number>): number | undefined;
398
+ /**
399
+ * What percentage `value` is of `total`. Returns `0` when `total` is `0`.
168
400
  *
169
401
  * @example
170
- * nodeComfort.num.abbreviate(1500); // "1.5K"
171
- * nodeComfort.num.abbreviate(2_400_000); // "2.4M"
402
+ * num.percent(25, 200); // 12.5
403
+ * num.percent(1, 3, 1); // 33.3
172
404
  *
173
- * @param {number} value - Number to abbreviate.
174
- * @param {number} [decimals=1] - Decimal places.
175
- * @returns {string} The abbreviated number.
405
+ * @param {number} value
406
+ * @param {number} total
407
+ * @param {number} [decimals=2]
408
+ * @returns {number}
176
409
  */
177
- export function abbreviate(value: number, decimals?: number): string;
410
+ export function percent(value: number, total: number, decimals?: number): number;
411
+ /**
412
+ * How much a value changed, in percent. Going from `0` to anything else is
413
+ * an infinite change.
414
+ *
415
+ * @example
416
+ * num.percentChange(80, 100); // 25
417
+ * num.percentChange(100, 80); // -20
418
+ *
419
+ * @param {number} from
420
+ * @param {number} to
421
+ * @param {number} [decimals=2]
422
+ * @returns {number}
423
+ */
424
+ export function percentChange(from: number, to: number, decimals?: number): number;
178
425
  /**
179
- * Inserts thousands separators into a number.
426
+ * Greatest common divisor.
180
427
  *
181
428
  * @example
182
- * nodeComfort.num.thousands(1234567); // "1,234,567"
183
- * nodeComfort.num.thousands(1234.5, " "); // "1 234.5"
429
+ * num.gcd(12, 18, 27); // 3
184
430
  *
185
- * @param {number} value - Number to format.
186
- * @param {string} [separator=","] - Thousands separator.
187
- * @returns {string} The formatted number.
431
+ * @param {...number} values
432
+ * @returns {number}
188
433
  */
189
- export function thousands(value: number, separator?: string): string;
434
+ export function gcd(...values: number[]): number;
190
435
  /**
191
- * Returns the English ordinal suffix for a number ("st", "nd", "rd", "th").
436
+ * Least common multiple.
192
437
  *
193
438
  * @example
194
- * nodeComfort.num.ordinal(1); // "1st"
195
- * nodeComfort.num.ordinal(22); // "22nd"
439
+ * num.lcm(2, 3, 4); // 12
196
440
  *
197
- * @param {number} value - The number.
198
- * @returns {string} The number with its ordinal suffix.
441
+ * @param {...number} values
442
+ * @returns {number}
199
443
  */
200
- export function ordinal(value: number): string;
444
+ export function lcm(...values: number[]): number;
201
445
  /**
202
- * Parses a value into a number, returning a fallback when it isn't numeric.
446
+ * Is it a prime number?
203
447
  *
204
448
  * @example
205
- * nodeComfort.num.parse("42px"); // 42
206
- * nodeComfort.num.parse("nope", 0); // 0
449
+ * num.isPrime(7); // true
450
+ * num.isPrime(1); // false
207
451
  *
208
- * @param {*} value - Value to parse.
209
- * @param {number} [fallback=NaN] - Value returned when parsing fails.
210
- * @returns {number} The parsed number or the fallback.
452
+ * @param {number} value
453
+ * @returns {boolean}
211
454
  */
212
- export function parse(value: any, fallback?: number): number;
455
+ export function isPrime(value: number): boolean;
213
456
  /**
214
- * Checks whether a number is even.
215
- * @param {number} value - Number to check.
216
- * @returns {boolean} True if even.
457
+ * `n!`. Pass `true` to get an exact bigint, since numbers lose precision
458
+ * past 18!.
459
+ *
460
+ * @example
461
+ * num.factorial(5); // 120
462
+ * num.factorial(25, true); // 15511210043330985984000000n
463
+ *
464
+ * @param {number} n
465
+ * @param {boolean} [asBigInt=false]
466
+ * @returns {number | bigint}
467
+ * @throws {RangeError} If `n` is negative or not an integer.
468
+ */
469
+ export function factorial(n: number, asBigInt?: boolean): number | bigint;
470
+ /**
471
+ * Is it even?
472
+ *
473
+ * @param {number} value
474
+ * @returns {boolean}
217
475
  */
218
476
  export function isEven(value: number): boolean;
219
477
  /**
220
- * Checks whether a number is odd.
221
- * @param {number} value - Number to check.
222
- * @returns {boolean} True if odd.
478
+ * Is it odd? Negative numbers work too.
479
+ *
480
+ * @param {number} value
481
+ * @returns {boolean}
223
482
  */
224
483
  export function isOdd(value: number): boolean;
225
484
  /**
226
- * Returns an array of numbers from `start` to `end`.
485
+ * Numbers from `start` up to `end` (excluded). With one argument, counts
486
+ * from 0. Goes down when `end` is smaller.
227
487
  *
228
- * `end` is exclusive. Supports a custom step and descending ranges.
488
+ * @example
489
+ * num.range(4); // [0, 1, 2, 3]
490
+ * num.range(0, 10, 2); // [0, 2, 4, 6, 8]
491
+ * num.range(5, 0); // [5, 4, 3, 2, 1]
492
+ *
493
+ * @param {number} start
494
+ * @param {number} [end]
495
+ * @param {number} [step] Defaults to `1`, or `-1` when counting down.
496
+ * @returns {number[]}
497
+ */
498
+ export function range(start: number, end?: number, step?: number): number[];
499
+ /**
500
+ * Reads a number from anything, ignoring trailing text like units.
229
501
  *
230
502
  * @example
231
- * nodeComfort.num.range(4); // [0, 1, 2, 3]
232
- * nodeComfort.num.range(1, 5); // [1, 2, 3, 4]
233
- * nodeComfort.num.range(0, 10, 2); // [0, 2, 4, 6, 8]
234
- * nodeComfort.num.range(5, 0); // [5, 4, 3, 2, 1]
503
+ * num.parse("42px"); // 42
504
+ * num.parse(" -3.5 kg"); // -3.5
505
+ * num.parse("nope", 0); // 0
235
506
  *
236
- * @param {number} start - Start (or end if it's the only argument).
237
- * @param {number} [end] - End (exclusive).
238
- * @param {number} [step] - Step size (defaults to 1 or -1 based on direction).
239
- * @returns {number[]} The generated range.
507
+ * @param {unknown} value
508
+ * @param {number} [fallback=NaN] Returned when there's no number to read.
509
+ * @returns {number}
240
510
  */
241
- export function range(start: number, end?: number, step?: number): number[];
511
+ export function parse(value: unknown, fallback?: number): number;
512
+ /**
513
+ * Turns a size like `"10 MB"` into bytes. The opposite of `formatBytes()`.
514
+ *
515
+ * @example
516
+ * num.parseBytes("1.5 KB"); // 1536
517
+ * num.parseBytes("2 GiB"); // 2147483648
518
+ * num.parseBytes("1 KB", { binary: false }); // 1000
519
+ *
520
+ * @param {string | number} value A size like `"512kb"` or `"1.5G"`, or a number of bytes.
521
+ * @param {ParseBytesOptions} [options]
522
+ * @returns {number} Bytes, or `NaN` if it can't be read.
523
+ */
524
+ export function parseBytes(value: string | number, options?: ParseBytesOptions): number;
525
+ /**
526
+ * Formats a byte count as a readable size.
527
+ *
528
+ * @example
529
+ * num.formatBytes(1536); // "1.5 KB"
530
+ * num.formatBytes(1000, { binary: false }); // "1 KB"
531
+ * num.formatBytes(1536, { locale: "fr", units: ["o", "Ko", "Mo", "Go"] }); // "1,5 Ko"
532
+ *
533
+ * @param {number} bytes
534
+ * @param {FormatBytesOptions} [options]
535
+ * @returns {string}
536
+ */
537
+ export function formatBytes(bytes: number, options?: FormatBytesOptions): string;
538
+ /**
539
+ * Formats a number for display, with `Intl.NumberFormat` doing the work:
540
+ * separators, decimals, compact notation, percentages, units.
541
+ *
542
+ * @example
543
+ * num.format(1234567.891); // "1,234,567.891"
544
+ * num.format(1234567.891, { locale: "fr" }); // "1 234 567,891"
545
+ * num.format(0.256, { style: "percent" }); // "26%"
546
+ * num.format(1500, { compact: true }); // "1.5K"
547
+ * num.format(3.5, { unit: "kilometer" }); // "3.5 km"
548
+ *
549
+ * @param {number | bigint} value
550
+ * @param {FormatNumberOptions} [options]
551
+ * @returns {string}
552
+ */
553
+ export function format(value: number | bigint, options?: FormatNumberOptions): string;
554
+ /**
555
+ * Formats an amount of money.
556
+ *
557
+ * @example
558
+ * num.currency(1234.5, "USD"); // "$1,234.50"
559
+ * num.currency(1234.5, "EUR", { locale: "fr" }); // "1 234,50 €"
560
+ * num.currency(-5, "USD", { accounting: true }); // "($5.00)"
561
+ *
562
+ * @param {number | bigint} value
563
+ * @param {string} code A currency code like `"EUR"`, `"USD"` or `"JPY"`.
564
+ * @param {CurrencyOptions} [options]
565
+ * @returns {string}
566
+ */
567
+ export function currency(value: number | bigint, code: string, options?: CurrencyOptions): string;
568
+ /**
569
+ * Shortens big numbers with `K`, `M`, `B` or `T`. For other languages, use
570
+ * `format(value, { compact: true, locale })`.
571
+ *
572
+ * @example
573
+ * num.abbreviate(1500); // "1.5K"
574
+ * num.abbreviate(2_400_000); // "2.4M"
575
+ *
576
+ * @param {number} value
577
+ * @param {number} [decimals=1]
578
+ * @returns {string}
579
+ */
580
+ export function abbreviate(value: number, decimals?: number): string;
581
+ /**
582
+ * Adds thousands separators, leaving decimals alone.
583
+ *
584
+ * @example
585
+ * num.thousands(1234567.89, " "); // "1 234 567.89"
586
+ *
587
+ * @param {number | string} value
588
+ * @param {string} [separator=","]
589
+ * @returns {string}
590
+ */
591
+ export function thousands(value: number | string, separator?: string): string;
592
+ /**
593
+ * Pads the integer part with zeros (or another character).
594
+ *
595
+ * @example
596
+ * num.pad(7, 3); // "007"
597
+ * num.pad(-7, 3); // "-007"
598
+ * num.pad(3.5, 2); // "03.5"
599
+ *
600
+ * @param {number} value
601
+ * @param {number} length Digits wanted before the decimal point.
602
+ * @param {string} [char="0"]
603
+ * @returns {string}
604
+ */
605
+ export function pad(value: number, length: number, char?: string): string;
606
+ /**
607
+ * Adds the ordinal suffix: 1st, 2nd, 3rd... in several languages.
608
+ *
609
+ * @example
610
+ * num.ordinal(22); // "22nd"
611
+ * num.ordinal(1, { locale: "fr" }); // "1er"
612
+ * num.ordinal(3, { locale: "de" }); // "3."
613
+ *
614
+ * @param {number} value
615
+ * @param {OrdinalOptions} [options]
616
+ * @returns {string}
617
+ */
618
+ export function ordinal(value: number, options?: OrdinalOptions): string;
242
619
  //# sourceMappingURL=Num.d.ts.map