uconvert 0.1.1 → 0.1.3
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 +198 -0
- package/dist/index.d.mts +19 -11
- package/dist/index.d.ts +19 -11
- package/dist/index.js +114 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +114 -26
- package/dist/index.mjs.map +1 -1
- package/package.json +43 -4
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# uconvert
|
|
2
|
+
|
|
3
|
+
Lightweight utility for converting common measurement units.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install uconvert
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### `convert(value, options)`
|
|
14
|
+
|
|
15
|
+
Converts a numeric value from one unit to another.
|
|
16
|
+
|
|
17
|
+
**Parameters:**
|
|
18
|
+
|
|
19
|
+
- `value` (number) — The value in the source unit.
|
|
20
|
+
- `options` (object):
|
|
21
|
+
- `fromUnits` — Source unit (use `MetricUnits` or `ImperialUnits`).
|
|
22
|
+
- `toUnits` — Target unit. Must be the same dimension as `fromUnits` (e.g. length ↔ length), or an error is thrown.
|
|
23
|
+
- `roundTo` (optional) — Number of decimal places to round the result. Omit to return the unrounded value.
|
|
24
|
+
|
|
25
|
+
**Returns:** The value in the target unit (optionally rounded).
|
|
26
|
+
|
|
27
|
+
**Example:**
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { convert, MetricUnits, ImperialUnits } from "uconvert";
|
|
31
|
+
|
|
32
|
+
// 5 feet to meters, rounded to 2 decimals
|
|
33
|
+
convert(5, {
|
|
34
|
+
fromUnits: ImperialUnits.FT,
|
|
35
|
+
toUnits: MetricUnits.M,
|
|
36
|
+
roundTo: 2,
|
|
37
|
+
});
|
|
38
|
+
// => 1.52
|
|
39
|
+
|
|
40
|
+
// Same unit: returns value unchanged
|
|
41
|
+
convert(100, { fromUnits: MetricUnits.CM, toUnits: MetricUnits.CM });
|
|
42
|
+
// => 100
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### `round(value, decimalPlaces?)`
|
|
46
|
+
|
|
47
|
+
Rounds a number to a given number of decimal places.
|
|
48
|
+
|
|
49
|
+
**Parameters:**
|
|
50
|
+
|
|
51
|
+
- `value` (number) — The number to round.
|
|
52
|
+
- `decimalPlaces` (optional) — Number of digits after the decimal point. Omit to return the value unchanged.
|
|
53
|
+
|
|
54
|
+
**Returns:** The rounded number (or the original number if `decimalPlaces` is omitted).
|
|
55
|
+
|
|
56
|
+
**Example:**
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { round } from "uconvert";
|
|
60
|
+
|
|
61
|
+
round(1.2345, 2); // => 1.23
|
|
62
|
+
round(1.2345); // => 1.2345
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Supported units
|
|
66
|
+
|
|
67
|
+
Units are grouped by dimension. Use the **Code** value with `convert()`.
|
|
68
|
+
|
|
69
|
+
### Length
|
|
70
|
+
|
|
71
|
+
| Unit | Code | System |
|
|
72
|
+
| ---- | ------------------ | -------- |
|
|
73
|
+
| mm | `MetricUnits.MM` | Metric |
|
|
74
|
+
| cm | `MetricUnits.CM` | Metric |
|
|
75
|
+
| m | `MetricUnits.M` | Metric |
|
|
76
|
+
| km | `MetricUnits.KM` | Metric |
|
|
77
|
+
| in | `ImperialUnits.IN` | Imperial |
|
|
78
|
+
| ft | `ImperialUnits.FT` | Imperial |
|
|
79
|
+
| yd | `ImperialUnits.YD` | Imperial |
|
|
80
|
+
| mi | `ImperialUnits.MI` | Imperial |
|
|
81
|
+
|
|
82
|
+
### Weight
|
|
83
|
+
|
|
84
|
+
| Unit | Code | System |
|
|
85
|
+
| ---- | ------------------- | -------- |
|
|
86
|
+
| g | `MetricUnits.G` | Metric |
|
|
87
|
+
| kg | `MetricUnits.KG` | Metric |
|
|
88
|
+
| t | `MetricUnits.TONNE` | Metric |
|
|
89
|
+
| oz | `ImperialUnits.OZ` | Imperial |
|
|
90
|
+
| lb | `ImperialUnits.LB` | Imperial |
|
|
91
|
+
| st | `ImperialUnits.ST` | Imperial |
|
|
92
|
+
|
|
93
|
+
### Speed
|
|
94
|
+
|
|
95
|
+
| Unit | Code | System |
|
|
96
|
+
| ---- | -------------------- | -------- |
|
|
97
|
+
| m/s | `MetricUnits.M_S` | Metric |
|
|
98
|
+
| km/h | `MetricUnits.KM_H` | Metric |
|
|
99
|
+
| ft/s | `ImperialUnits.FT_S` | Imperial |
|
|
100
|
+
| mph | `ImperialUnits.MPH` | Imperial |
|
|
101
|
+
|
|
102
|
+
### Temperature
|
|
103
|
+
|
|
104
|
+
| Unit | Code | System |
|
|
105
|
+
| ------ | -------------------------- | -------- |
|
|
106
|
+
| °C (C) | `MetricUnits.CELSIUS` | Metric |
|
|
107
|
+
| K | `MetricUnits.KELVIN` | Metric |
|
|
108
|
+
| °F (F) | `ImperialUnits.FAHRENHEIT` | Imperial |
|
|
109
|
+
|
|
110
|
+
## Exported types and enums
|
|
111
|
+
|
|
112
|
+
Use these with `convert` for type-safe unit arguments:
|
|
113
|
+
|
|
114
|
+
| Export | Description |
|
|
115
|
+
| ---------------- | ------------------------------------------------------------------------------------ |
|
|
116
|
+
| `ConvertOptions` | Options object for `convert`: `{ fromUnits, toUnits, roundTo? }`. |
|
|
117
|
+
| `Units` | Union type: `MetricUnits \| ImperialUnits`. |
|
|
118
|
+
| `MetricUnits` | Enum: `MM`, `CM`, `M`, `KM`, `G`, `KG`, `TONNE`, `CELSIUS`, `KELVIN`, `M_S`, `KM_H`. |
|
|
119
|
+
| `ImperialUnits` | Enum: `IN`, `FT`, `YD`, `MI`, `OZ`, `LB`, `ST`, `FAHRENHEIT`, `FT_S`, `MPH`. |
|
|
120
|
+
| `UnitSystem` | Enum: `METRIC`, `IMPERIAL`. |
|
|
121
|
+
| `Dimension` | Enum: `LENGTH`, `WEIGHT`, `SPEED`, `TEMPERATURE`. |
|
|
122
|
+
|
|
123
|
+
`fromUnits` and `toUnits` must use the same dimension (e.g. both length, or both weight); otherwise `convert` throws.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Height utility
|
|
128
|
+
|
|
129
|
+
The `height` object provides helpers for converting between centimeters and feet–inches and for parsing feet–inches strings.
|
|
130
|
+
|
|
131
|
+
**Import:**
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
import { height } from "uconvert";
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### `height.toFeetInches(valueInCm, roundTo?)`
|
|
138
|
+
|
|
139
|
+
Converts a height in centimeters to feet and inches.
|
|
140
|
+
|
|
141
|
+
**Parameters:**
|
|
142
|
+
|
|
143
|
+
- `valueInCm` (number) — Height in centimeters.
|
|
144
|
+
- `roundTo` (optional) — Number of decimal places for the inches part. Omit for unrounded.
|
|
145
|
+
|
|
146
|
+
**Returns:** A `FeetInches` tuple `[feet, inches]`.
|
|
147
|
+
|
|
148
|
+
**Example:**
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
height.toFeetInches(170); // => [5, 6.93...]
|
|
152
|
+
height.toFeetInches(170, 1); // => [5, 6.9]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### `height.toCentimeters(feetInches)`
|
|
156
|
+
|
|
157
|
+
Converts a feet–inches tuple to centimeters.
|
|
158
|
+
|
|
159
|
+
**Parameters:**
|
|
160
|
+
|
|
161
|
+
- `feetInches` — A `FeetInches` tuple `[feet, inches]` (e.g. from `toFeetInches` or `parseFeetInches`).
|
|
162
|
+
|
|
163
|
+
**Returns:** Height in centimeters (number).
|
|
164
|
+
|
|
165
|
+
**Example:**
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
height.toCentimeters([5, 10]); // => 177.8
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### `height.parseFeetInches(input)`
|
|
172
|
+
|
|
173
|
+
Parses a string into a `[feet, inches]` tuple. Accepts formats like `"5 ft 10 in"`, `"5'10\""`, `"5 10"`, and variations with "feet"/"foot"/"inches"/"inch".
|
|
174
|
+
|
|
175
|
+
**Parameters:**
|
|
176
|
+
|
|
177
|
+
- `input` (string) — String to parse.
|
|
178
|
+
|
|
179
|
+
**Returns:** A `FeetInches` tuple `[feet, inches]`. Returns `[0, 0]` if parsing fails or input is not a string.
|
|
180
|
+
|
|
181
|
+
**Example:**
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
height.parseFeetInches("5 ft 10 in"); // => [5, 10]
|
|
185
|
+
height.parseFeetInches("5'10\""); // => [5, 10]
|
|
186
|
+
height.parseFeetInches("6 2"); // => [6, 2]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `FeetInches` type
|
|
190
|
+
|
|
191
|
+
Tuple type `[number, number]`: first element is feet, second is inches. Use it when passing or receiving values from `toFeetInches`, `toCentimeters`, and `parseFeetInches`.
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
import { height, type FeetInches } from "uconvert";
|
|
195
|
+
|
|
196
|
+
const fi: FeetInches = height.toFeetInches(170);
|
|
197
|
+
height.toCentimeters(fi);
|
|
198
|
+
```
|
package/dist/index.d.mts
CHANGED
|
@@ -3,30 +3,40 @@ declare enum UnitSystem {
|
|
|
3
3
|
IMPERIAL = "Imperial"
|
|
4
4
|
}
|
|
5
5
|
declare enum Dimension {
|
|
6
|
-
LENGTH = "length",
|
|
7
|
-
WEIGHT = "weight",
|
|
8
|
-
SPEED = "speed"
|
|
9
|
-
}
|
|
10
|
-
declare enum MeasurementType {
|
|
11
6
|
LENGTH = "length",
|
|
12
7
|
WEIGHT = "weight",
|
|
13
8
|
SPEED = "speed",
|
|
14
|
-
|
|
15
|
-
LENGTH_FEET = "length_feet"
|
|
9
|
+
TEMPERATURE = "temperature"
|
|
16
10
|
}
|
|
17
11
|
declare enum MetricUnits {
|
|
12
|
+
MM = "mm",
|
|
18
13
|
CM = "cm",
|
|
19
14
|
M = "m",
|
|
15
|
+
KM = "km",
|
|
16
|
+
G = "g",
|
|
20
17
|
KG = "kg",
|
|
18
|
+
TONNE = "t",
|
|
19
|
+
CELSIUS = "C",
|
|
20
|
+
KELVIN = "K",
|
|
21
|
+
M_S = "m/s",
|
|
21
22
|
KM_H = "km/h"
|
|
22
23
|
}
|
|
23
24
|
declare enum ImperialUnits {
|
|
24
25
|
IN = "in",
|
|
25
26
|
FT = "ft",
|
|
27
|
+
YD = "yd",
|
|
28
|
+
MI = "mi",
|
|
29
|
+
OZ = "oz",
|
|
26
30
|
LB = "lb",
|
|
31
|
+
ST = "st",
|
|
32
|
+
FAHRENHEIT = "F",
|
|
33
|
+
FT_S = "ft/s",
|
|
27
34
|
MPH = "mph"
|
|
28
35
|
}
|
|
29
36
|
type Units = MetricUnits | ImperialUnits;
|
|
37
|
+
type TemperatureUnits = MetricUnits.CELSIUS | MetricUnits.KELVIN | ImperialUnits.FAHRENHEIT;
|
|
38
|
+
|
|
39
|
+
type FeetInches = [number, number];
|
|
30
40
|
|
|
31
41
|
interface ConvertOptions {
|
|
32
42
|
fromUnits: Units;
|
|
@@ -34,12 +44,10 @@ interface ConvertOptions {
|
|
|
34
44
|
roundTo?: number;
|
|
35
45
|
}
|
|
36
46
|
|
|
37
|
-
declare const convert: (value: number,
|
|
47
|
+
declare const convert: (value: number, options: ConvertOptions) => number;
|
|
38
48
|
|
|
39
49
|
declare const round: (value: number, decimalPlaces?: number) => number;
|
|
40
50
|
|
|
41
|
-
type FeetInches = [number, number];
|
|
42
|
-
|
|
43
51
|
declare class Height {
|
|
44
52
|
toFeetInches(valueInCm: number, roundTo?: number): FeetInches;
|
|
45
53
|
toCentimeters([feet, inches]: FeetInches): number;
|
|
@@ -47,4 +55,4 @@ declare class Height {
|
|
|
47
55
|
}
|
|
48
56
|
declare const height: Height;
|
|
49
57
|
|
|
50
|
-
export { type ConvertOptions, Dimension,
|
|
58
|
+
export { type ConvertOptions, Dimension, type FeetInches, ImperialUnits, MetricUnits, type TemperatureUnits, UnitSystem, type Units, convert, height, round };
|
package/dist/index.d.ts
CHANGED
|
@@ -3,30 +3,40 @@ declare enum UnitSystem {
|
|
|
3
3
|
IMPERIAL = "Imperial"
|
|
4
4
|
}
|
|
5
5
|
declare enum Dimension {
|
|
6
|
-
LENGTH = "length",
|
|
7
|
-
WEIGHT = "weight",
|
|
8
|
-
SPEED = "speed"
|
|
9
|
-
}
|
|
10
|
-
declare enum MeasurementType {
|
|
11
6
|
LENGTH = "length",
|
|
12
7
|
WEIGHT = "weight",
|
|
13
8
|
SPEED = "speed",
|
|
14
|
-
|
|
15
|
-
LENGTH_FEET = "length_feet"
|
|
9
|
+
TEMPERATURE = "temperature"
|
|
16
10
|
}
|
|
17
11
|
declare enum MetricUnits {
|
|
12
|
+
MM = "mm",
|
|
18
13
|
CM = "cm",
|
|
19
14
|
M = "m",
|
|
15
|
+
KM = "km",
|
|
16
|
+
G = "g",
|
|
20
17
|
KG = "kg",
|
|
18
|
+
TONNE = "t",
|
|
19
|
+
CELSIUS = "C",
|
|
20
|
+
KELVIN = "K",
|
|
21
|
+
M_S = "m/s",
|
|
21
22
|
KM_H = "km/h"
|
|
22
23
|
}
|
|
23
24
|
declare enum ImperialUnits {
|
|
24
25
|
IN = "in",
|
|
25
26
|
FT = "ft",
|
|
27
|
+
YD = "yd",
|
|
28
|
+
MI = "mi",
|
|
29
|
+
OZ = "oz",
|
|
26
30
|
LB = "lb",
|
|
31
|
+
ST = "st",
|
|
32
|
+
FAHRENHEIT = "F",
|
|
33
|
+
FT_S = "ft/s",
|
|
27
34
|
MPH = "mph"
|
|
28
35
|
}
|
|
29
36
|
type Units = MetricUnits | ImperialUnits;
|
|
37
|
+
type TemperatureUnits = MetricUnits.CELSIUS | MetricUnits.KELVIN | ImperialUnits.FAHRENHEIT;
|
|
38
|
+
|
|
39
|
+
type FeetInches = [number, number];
|
|
30
40
|
|
|
31
41
|
interface ConvertOptions {
|
|
32
42
|
fromUnits: Units;
|
|
@@ -34,12 +44,10 @@ interface ConvertOptions {
|
|
|
34
44
|
roundTo?: number;
|
|
35
45
|
}
|
|
36
46
|
|
|
37
|
-
declare const convert: (value: number,
|
|
47
|
+
declare const convert: (value: number, options: ConvertOptions) => number;
|
|
38
48
|
|
|
39
49
|
declare const round: (value: number, decimalPlaces?: number) => number;
|
|
40
50
|
|
|
41
|
-
type FeetInches = [number, number];
|
|
42
|
-
|
|
43
51
|
declare class Height {
|
|
44
52
|
toFeetInches(valueInCm: number, roundTo?: number): FeetInches;
|
|
45
53
|
toCentimeters([feet, inches]: FeetInches): number;
|
|
@@ -47,4 +55,4 @@ declare class Height {
|
|
|
47
55
|
}
|
|
48
56
|
declare const height: Height;
|
|
49
57
|
|
|
50
|
-
export { type ConvertOptions, Dimension,
|
|
58
|
+
export { type ConvertOptions, Dimension, type FeetInches, ImperialUnits, MetricUnits, type TemperatureUnits, UnitSystem, type Units, convert, height, round };
|
package/dist/index.js
CHANGED
|
@@ -22,7 +22,6 @@ var index_exports = {};
|
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
Dimension: () => Dimension,
|
|
24
24
|
ImperialUnits: () => ImperialUnits,
|
|
25
|
-
MeasurementType: () => MeasurementType,
|
|
26
25
|
MetricUnits: () => MetricUnits,
|
|
27
26
|
UnitSystem: () => UnitSystem,
|
|
28
27
|
convert: () => convert,
|
|
@@ -41,59 +40,129 @@ var Dimension = /* @__PURE__ */ ((Dimension2) => {
|
|
|
41
40
|
Dimension2["LENGTH"] = "length";
|
|
42
41
|
Dimension2["WEIGHT"] = "weight";
|
|
43
42
|
Dimension2["SPEED"] = "speed";
|
|
43
|
+
Dimension2["TEMPERATURE"] = "temperature";
|
|
44
44
|
return Dimension2;
|
|
45
45
|
})(Dimension || {});
|
|
46
|
-
var MeasurementType = /* @__PURE__ */ ((MeasurementType2) => {
|
|
47
|
-
MeasurementType2["LENGTH"] = "length";
|
|
48
|
-
MeasurementType2["WEIGHT"] = "weight";
|
|
49
|
-
MeasurementType2["SPEED"] = "speed";
|
|
50
|
-
MeasurementType2["HEIGHT"] = "height";
|
|
51
|
-
MeasurementType2["LENGTH_FEET"] = "length_feet";
|
|
52
|
-
return MeasurementType2;
|
|
53
|
-
})(MeasurementType || {});
|
|
54
46
|
var MetricUnits = /* @__PURE__ */ ((MetricUnits2) => {
|
|
47
|
+
MetricUnits2["MM"] = "mm";
|
|
55
48
|
MetricUnits2["CM"] = "cm";
|
|
56
49
|
MetricUnits2["M"] = "m";
|
|
50
|
+
MetricUnits2["KM"] = "km";
|
|
51
|
+
MetricUnits2["G"] = "g";
|
|
57
52
|
MetricUnits2["KG"] = "kg";
|
|
53
|
+
MetricUnits2["TONNE"] = "t";
|
|
54
|
+
MetricUnits2["CELSIUS"] = "C";
|
|
55
|
+
MetricUnits2["KELVIN"] = "K";
|
|
56
|
+
MetricUnits2["M_S"] = "m/s";
|
|
58
57
|
MetricUnits2["KM_H"] = "km/h";
|
|
59
58
|
return MetricUnits2;
|
|
60
59
|
})(MetricUnits || {});
|
|
61
60
|
var ImperialUnits = /* @__PURE__ */ ((ImperialUnits2) => {
|
|
62
61
|
ImperialUnits2["IN"] = "in";
|
|
63
62
|
ImperialUnits2["FT"] = "ft";
|
|
63
|
+
ImperialUnits2["YD"] = "yd";
|
|
64
|
+
ImperialUnits2["MI"] = "mi";
|
|
65
|
+
ImperialUnits2["OZ"] = "oz";
|
|
64
66
|
ImperialUnits2["LB"] = "lb";
|
|
67
|
+
ImperialUnits2["ST"] = "st";
|
|
68
|
+
ImperialUnits2["FAHRENHEIT"] = "F";
|
|
69
|
+
ImperialUnits2["FT_S"] = "ft/s";
|
|
65
70
|
ImperialUnits2["MPH"] = "mph";
|
|
66
71
|
return ImperialUnits2;
|
|
67
72
|
})(ImperialUnits || {});
|
|
68
73
|
|
|
69
|
-
// src/utils/math/math.ts
|
|
70
|
-
var round = (value, decimalPlaces) => {
|
|
71
|
-
if (decimalPlaces === void 0) return value;
|
|
72
|
-
return parseFloat(value.toFixed(decimalPlaces));
|
|
73
|
-
};
|
|
74
|
-
|
|
75
74
|
// src/constants/conversion/conversion.constants.ts
|
|
76
75
|
var UNIT_TO_CANONICAL = {
|
|
76
|
+
["mm" /* MM */]: 0.1,
|
|
77
77
|
["cm" /* CM */]: 1,
|
|
78
78
|
["m" /* M */]: 100,
|
|
79
|
+
["km" /* KM */]: 1e5,
|
|
79
80
|
["in" /* IN */]: 2.54,
|
|
80
81
|
["ft" /* FT */]: 30.48,
|
|
82
|
+
["yd" /* YD */]: 91.44,
|
|
83
|
+
["mi" /* MI */]: 160934.4,
|
|
84
|
+
["g" /* G */]: 1e-3,
|
|
81
85
|
["kg" /* KG */]: 1,
|
|
86
|
+
["t" /* TONNE */]: 1e3,
|
|
87
|
+
["C" /* CELSIUS */]: 1,
|
|
88
|
+
["K" /* KELVIN */]: 1,
|
|
89
|
+
["F" /* FAHRENHEIT */]: 1,
|
|
90
|
+
["oz" /* OZ */]: 0.028349523125,
|
|
82
91
|
["lb" /* LB */]: 0.45359237,
|
|
92
|
+
["st" /* ST */]: 6.35029318,
|
|
93
|
+
["m/s" /* M_S */]: 3.6,
|
|
83
94
|
["km/h" /* KM_H */]: 1,
|
|
95
|
+
["ft/s" /* FT_S */]: 1.09728,
|
|
84
96
|
["mph" /* MPH */]: 1.609344
|
|
85
97
|
};
|
|
86
98
|
var UNIT_DIMENSION = {
|
|
99
|
+
["mm" /* MM */]: "length" /* LENGTH */,
|
|
87
100
|
["cm" /* CM */]: "length" /* LENGTH */,
|
|
88
101
|
["m" /* M */]: "length" /* LENGTH */,
|
|
102
|
+
["km" /* KM */]: "length" /* LENGTH */,
|
|
89
103
|
["in" /* IN */]: "length" /* LENGTH */,
|
|
90
104
|
["ft" /* FT */]: "length" /* LENGTH */,
|
|
105
|
+
["yd" /* YD */]: "length" /* LENGTH */,
|
|
106
|
+
["mi" /* MI */]: "length" /* LENGTH */,
|
|
107
|
+
["g" /* G */]: "weight" /* WEIGHT */,
|
|
91
108
|
["kg" /* KG */]: "weight" /* WEIGHT */,
|
|
109
|
+
["t" /* TONNE */]: "weight" /* WEIGHT */,
|
|
110
|
+
["C" /* CELSIUS */]: "temperature" /* TEMPERATURE */,
|
|
111
|
+
["K" /* KELVIN */]: "temperature" /* TEMPERATURE */,
|
|
112
|
+
["F" /* FAHRENHEIT */]: "temperature" /* TEMPERATURE */,
|
|
113
|
+
["oz" /* OZ */]: "weight" /* WEIGHT */,
|
|
92
114
|
["lb" /* LB */]: "weight" /* WEIGHT */,
|
|
115
|
+
["st" /* ST */]: "weight" /* WEIGHT */,
|
|
116
|
+
["m/s" /* M_S */]: "speed" /* SPEED */,
|
|
93
117
|
["km/h" /* KM_H */]: "speed" /* SPEED */,
|
|
118
|
+
["ft/s" /* FT_S */]: "speed" /* SPEED */,
|
|
94
119
|
["mph" /* MPH */]: "speed" /* SPEED */
|
|
95
120
|
};
|
|
96
121
|
|
|
122
|
+
// src/constants/temperature/temperature.ts
|
|
123
|
+
var TEMPERATURE_TO_KELVIN_SCALE = {
|
|
124
|
+
["C" /* CELSIUS */]: 1,
|
|
125
|
+
["K" /* KELVIN */]: 1,
|
|
126
|
+
["F" /* FAHRENHEIT */]: 5 / 9
|
|
127
|
+
};
|
|
128
|
+
var TEMPERATURE_TO_KELVIN_OFFSET = {
|
|
129
|
+
["C" /* CELSIUS */]: 273.15,
|
|
130
|
+
["K" /* KELVIN */]: 0,
|
|
131
|
+
["F" /* FAHRENHEIT */]: 273.15 - 32 * 5 / 9
|
|
132
|
+
};
|
|
133
|
+
var TEMPERATURE_FROM_KELVIN_SCALE = {
|
|
134
|
+
["C" /* CELSIUS */]: 1,
|
|
135
|
+
["K" /* KELVIN */]: 1,
|
|
136
|
+
["F" /* FAHRENHEIT */]: 9 / 5
|
|
137
|
+
};
|
|
138
|
+
var TEMPERATURE_FROM_KELVIN_OFFSET = {
|
|
139
|
+
["C" /* CELSIUS */]: -273.15,
|
|
140
|
+
["K" /* KELVIN */]: 0,
|
|
141
|
+
["F" /* FAHRENHEIT */]: -459.67
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// src/utils/math/math.ts
|
|
145
|
+
var round = (value, decimalPlaces) => {
|
|
146
|
+
if (decimalPlaces === void 0) return value;
|
|
147
|
+
return parseFloat(value.toFixed(decimalPlaces));
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// src/utils/temperature/temperature.utils.ts
|
|
151
|
+
var isTemperature = ({ fromUnits }) => UNIT_DIMENSION[fromUnits] === "temperature" /* TEMPERATURE */;
|
|
152
|
+
var toKelvin = (value, units) => value * TEMPERATURE_TO_KELVIN_SCALE[units] + TEMPERATURE_TO_KELVIN_OFFSET[units];
|
|
153
|
+
var fromKelvin = (value, units) => value * TEMPERATURE_FROM_KELVIN_SCALE[units] + TEMPERATURE_FROM_KELVIN_OFFSET[units];
|
|
154
|
+
var convertTemperature = (value, { fromUnits, toUnits, roundTo }) => {
|
|
155
|
+
if (fromUnits === toUnits) return round(value, roundTo);
|
|
156
|
+
const valueInKelvin = toKelvin(value, fromUnits);
|
|
157
|
+
const result = fromKelvin(valueInKelvin, toUnits);
|
|
158
|
+
return round(result, roundTo);
|
|
159
|
+
};
|
|
160
|
+
var temperatureUtils = {
|
|
161
|
+
isTemperature,
|
|
162
|
+
convertTemperature
|
|
163
|
+
};
|
|
164
|
+
var temperature_utils_default = temperatureUtils;
|
|
165
|
+
|
|
97
166
|
// src/constants/strings/strings.ts
|
|
98
167
|
var strings = {
|
|
99
168
|
convertDimensionMismatch: "Cannot convert between different dimensions: {0} ({1}) and {2} ({3})"
|
|
@@ -122,24 +191,42 @@ var throwConversionError = ({ fromUnits, toUnits }) => {
|
|
|
122
191
|
};
|
|
123
192
|
var getFactor = (fromUnits, toUnits) => {
|
|
124
193
|
if (fromUnits === toUnits) return 1;
|
|
125
|
-
const fromDim = UNIT_DIMENSION[fromUnits];
|
|
126
|
-
const toDim = UNIT_DIMENSION[toUnits];
|
|
127
|
-
if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });
|
|
128
194
|
const toCanonicalFrom = UNIT_TO_CANONICAL[fromUnits];
|
|
129
195
|
const toCanonicalTo = UNIT_TO_CANONICAL[toUnits];
|
|
130
196
|
return toCanonicalFrom / toCanonicalTo;
|
|
131
197
|
};
|
|
198
|
+
var ensureSameDimension = ({ fromUnits, toUnits }) => {
|
|
199
|
+
const fromDim = UNIT_DIMENSION[fromUnits];
|
|
200
|
+
const toDim = UNIT_DIMENSION[toUnits];
|
|
201
|
+
if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });
|
|
202
|
+
};
|
|
203
|
+
var convertDefault = (value, { fromUnits, toUnits, roundTo }) => {
|
|
204
|
+
const factor = getFactor(fromUnits, toUnits);
|
|
205
|
+
return round(value * factor, roundTo);
|
|
206
|
+
};
|
|
132
207
|
var convertUtils = {
|
|
133
|
-
|
|
208
|
+
convertDefault,
|
|
209
|
+
ensureSameDimension
|
|
134
210
|
};
|
|
135
211
|
var convert_utils_default = convertUtils;
|
|
136
212
|
|
|
137
213
|
// src/utils/convert/convert.ts
|
|
138
|
-
var {
|
|
139
|
-
var
|
|
140
|
-
|
|
141
|
-
|
|
214
|
+
var { convertDefault: convertDefault2, ensureSameDimension: ensureSameDimension2 } = convert_utils_default;
|
|
215
|
+
var { isTemperature: isTemperature2, convertTemperature: convertTemperature2 } = temperature_utils_default;
|
|
216
|
+
var convert = (value, options) => {
|
|
217
|
+
ensureSameDimension2(options);
|
|
218
|
+
if (isTemperature2(options)) {
|
|
219
|
+
return convertTemperature2(value, options);
|
|
220
|
+
}
|
|
221
|
+
return convertDefault2(value, options);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
// src/services/height/height.constants.ts
|
|
225
|
+
var inchesPerFoot = 12;
|
|
226
|
+
var heightConstants = {
|
|
227
|
+
inchesPerFoot
|
|
142
228
|
};
|
|
229
|
+
var height_constants_default = heightConstants;
|
|
143
230
|
|
|
144
231
|
// src/services/height/height.utils.ts
|
|
145
232
|
var parseFeetInches = (input) => {
|
|
@@ -176,6 +263,7 @@ var height_utils_default = heightUtils;
|
|
|
176
263
|
|
|
177
264
|
// src/services/height/height.ts
|
|
178
265
|
var { parseFeetInches: parseFeetInches2 } = height_utils_default;
|
|
266
|
+
var { inchesPerFoot: inchesPerFoot2 } = height_constants_default;
|
|
179
267
|
var Height = class {
|
|
180
268
|
toFeetInches(valueInCm, roundTo) {
|
|
181
269
|
const totalInches = convert(valueInCm, {
|
|
@@ -183,12 +271,12 @@ var Height = class {
|
|
|
183
271
|
toUnits: "in" /* IN */,
|
|
184
272
|
roundTo
|
|
185
273
|
});
|
|
186
|
-
const feet = Math.floor(totalInches /
|
|
187
|
-
const inches = round(totalInches - feet *
|
|
274
|
+
const feet = Math.floor(totalInches / inchesPerFoot2);
|
|
275
|
+
const inches = round(totalInches - feet * inchesPerFoot2, roundTo);
|
|
188
276
|
return [feet, inches];
|
|
189
277
|
}
|
|
190
278
|
toCentimeters([feet, inches]) {
|
|
191
|
-
const totalInches = feet *
|
|
279
|
+
const totalInches = feet * inchesPerFoot2 + inches;
|
|
192
280
|
return convert(totalInches, {
|
|
193
281
|
fromUnits: "in" /* IN */,
|
|
194
282
|
toUnits: "cm" /* CM */
|
|
@@ -204,7 +292,6 @@ var height_default = height;
|
|
|
204
292
|
0 && (module.exports = {
|
|
205
293
|
Dimension,
|
|
206
294
|
ImperialUnits,
|
|
207
|
-
MeasurementType,
|
|
208
295
|
MetricUnits,
|
|
209
296
|
UnitSystem,
|
|
210
297
|
convert,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants/common/common.constants.ts","../src/utils/math/math.ts","../src/constants/conversion/conversion.constants.ts","../src/constants/strings/strings.ts","../src/utils/strings/strings.utils.ts","../src/utils/convert/convert.utils.ts","../src/utils/convert/convert.ts","../src/services/height/height.utils.ts","../src/services/height/height.ts"],"sourcesContent":["export * from \"./constants/common/common.constants\";\nexport * from \"./utils/convert/convert\";\nexport * from \"./utils/convert/convert.types\";\nexport * from \"./utils/math/math\";\n\nexport { default as height } from \"./services/height/height\";\n","export enum UnitSystem {\n METRIC = \"Si\",\n IMPERIAL = \"Imperial\",\n}\n\nexport enum Dimension {\n LENGTH = \"length\",\n WEIGHT = \"weight\",\n SPEED = \"speed\",\n}\n\nexport enum MeasurementType {\n LENGTH = \"length\",\n WEIGHT = \"weight\",\n SPEED = \"speed\",\n HEIGHT = \"height\",\n LENGTH_FEET = \"length_feet\",\n}\n\nexport enum MetricUnits {\n CM = \"cm\",\n M = \"m\",\n KG = \"kg\",\n KM_H = \"km/h\",\n}\n\nexport enum ImperialUnits {\n IN = \"in\",\n FT = \"ft\",\n LB = \"lb\",\n MPH = \"mph\",\n}\n\nexport type Units = MetricUnits | ImperialUnits;\n","export const round = (value: number, decimalPlaces?: number) => {\n if (decimalPlaces === undefined) return value;\n\n return parseFloat(value.toFixed(decimalPlaces));\n};\n","import {\n Dimension,\n ImperialUnits,\n MetricUnits,\n Units,\n} from \"../common/common.constants\";\n\n/** Factor to multiply value by to get value in canonical unit for that dimension. */\nexport const UNIT_TO_CANONICAL: Record<Units, number> = {\n [MetricUnits.CM]: 1,\n [MetricUnits.M]: 100,\n [ImperialUnits.IN]: 2.54,\n [ImperialUnits.FT]: 30.48,\n [MetricUnits.KG]: 1,\n [ImperialUnits.LB]: 0.45359237,\n [MetricUnits.KM_H]: 1,\n [ImperialUnits.MPH]: 1.609344,\n};\n\nexport const UNIT_DIMENSION: Record<Units, Dimension> = {\n [MetricUnits.CM]: Dimension.LENGTH,\n [MetricUnits.M]: Dimension.LENGTH,\n [ImperialUnits.IN]: Dimension.LENGTH,\n [ImperialUnits.FT]: Dimension.LENGTH,\n [MetricUnits.KG]: Dimension.WEIGHT,\n [ImperialUnits.LB]: Dimension.WEIGHT,\n [MetricUnits.KM_H]: Dimension.SPEED,\n [ImperialUnits.MPH]: Dimension.SPEED,\n};\n","const strings = {\n convertDimensionMismatch:\n \"Cannot convert between different dimensions: {0} ({1}) and {2} ({3})\",\n};\n\nexport default strings;\n","export const formatMessage = (message: string, ...args: any[]) =>\n message.replace(/{(\\d+)}/g, (match, number) =>\n args[number] !== undefined ? args[number] : match,\n );\n","import { Units } from \"../../constants/common/common.constants\";\nimport {\n UNIT_DIMENSION,\n UNIT_TO_CANONICAL,\n} from \"../../constants/conversion/conversion.constants\";\nimport strings from \"../../constants/strings/strings\";\nimport { round } from \"../math/math\";\nimport { formatMessage } from \"../strings/strings.utils\";\nimport { ConvertOptions } from \"./convert.types\";\n\nconst throwConversionError = ({ fromUnits, toUnits }: ConvertOptions) => {\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n throw new Error(\n formatMessage(\n strings.convertDimensionMismatch,\n fromUnits,\n fromDim,\n toUnits,\n toDim,\n ),\n );\n};\n\nconst getFactor = (fromUnits: Units, toUnits: Units) => {\n if (fromUnits === toUnits) return 1;\n\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });\n\n const toCanonicalFrom = UNIT_TO_CANONICAL[fromUnits];\n const toCanonicalTo = UNIT_TO_CANONICAL[toUnits];\n return toCanonicalFrom / toCanonicalTo;\n};\n\nconst convertUtils = {\n getFactor,\n};\n\nexport default convertUtils;\n","import { round } from \"../math/math\";\nimport { ConvertOptions } from \"./convert.types\";\nimport utils from \"./convert.utils\";\n\nconst { getFactor } = utils;\n\nexport const convert = (\n value: number,\n { fromUnits, toUnits, roundTo }: ConvertOptions,\n) => {\n const factor = getFactor(fromUnits, toUnits);\n\n return round(value * factor, roundTo);\n};\n","import { FeetInches } from \"./height.types\";\n\nconst parseFeetInches = (input: string): FeetInches => {\n // NOTE: this function is AI generated, but it's well tested and works as expected. And it's covered by unit tests.\n if (typeof input !== \"string\") return [0, 0];\n\n const normalized = input\n .toLowerCase()\n .replace(/[\"\"]/g, \"in\")\n .replace(/[''′]+/g, \"ft\")\n .replace(/(feet|foot)/g, \"ft\")\n .replace(/(inches|inch)/g, \"in\")\n .replace(/[\\s]+/g, \" \")\n .trim();\n\n const parseNumber = (value: string | undefined): number =>\n parseFloat(value || \"0\");\n\n const ftMatch = normalized.match(/([\\d.]+)\\s*ft/);\n const inMatch = normalized.match(/([\\d.]+)\\s*in/);\n\n const feet = parseNumber(ftMatch?.[1]);\n const inches = parseNumber(inMatch?.[1]);\n\n if (ftMatch && inMatch) {\n return [feet, inches];\n }\n\n const [firstNumberString, secondNumberString] = normalized.match(\n /[\\d.]+/g,\n ) || [\"0\", \"0\"];\n\n const firstNumber = parseNumber(firstNumberString);\n const secondNumber = parseNumber(secondNumberString);\n\n if (!ftMatch && !inMatch) {\n return [firstNumber, secondNumber];\n }\n\n if (ftMatch && !inMatch) {\n return [feet, secondNumber];\n }\n\n if (!ftMatch && inMatch) {\n return [0, inches];\n }\n\n return [0, 0];\n};\n\nconst heightUtils = {\n parseFeetInches,\n};\n\nexport default heightUtils;\n","import {\n ImperialUnits,\n MetricUnits,\n} from \"../../constants/common/common.constants\";\nimport { convert } from \"../../utils/convert/convert\";\nimport { round } from \"../../utils/math/math\";\nimport { FeetInches } from \"./height.types\";\nimport utils from \"./height.utils\";\n\nconst { parseFeetInches } = utils;\n\nclass Height {\n toFeetInches(valueInCm: number, roundTo?: number): FeetInches {\n const totalInches = convert(valueInCm, {\n fromUnits: MetricUnits.CM,\n toUnits: ImperialUnits.IN,\n roundTo,\n });\n\n const feet = Math.floor(totalInches / 12);\n const inches = round(totalInches - feet * 12, roundTo);\n\n return [feet, inches];\n }\n\n toCentimeters([feet, inches]: FeetInches): number {\n const totalInches = feet * 12 + inches;\n\n return convert(totalInches, {\n fromUnits: ImperialUnits.IN,\n toUnits: MetricUnits.CM,\n });\n }\n\n parseFeetInches(input: string): FeetInches {\n return parseFeetInches(input);\n }\n}\n\nconst height = new Height();\n\nexport default height;\n"],"mappings":"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","names":["UnitSystem","Dimension","MeasurementType","MetricUnits","ImperialUnits","getFactor","parseFeetInches"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants/common/common.constants.ts","../src/constants/conversion/conversion.constants.ts","../src/constants/temperature/temperature.ts","../src/utils/math/math.ts","../src/utils/temperature/temperature.utils.ts","../src/constants/strings/strings.ts","../src/utils/strings/strings.utils.ts","../src/utils/convert/convert.utils.ts","../src/utils/convert/convert.ts","../src/services/height/height.constants.ts","../src/services/height/height.utils.ts","../src/services/height/height.ts"],"sourcesContent":["export * from \"./constants/common/common.constants\";\nexport * from \"./services/height/height.types\";\nexport * from \"./utils/convert/convert\";\nexport * from \"./utils/convert/convert.types\";\nexport * from \"./utils/math/math\";\n\nexport { default as height } from \"./services/height/height\";\n","export enum UnitSystem {\n METRIC = \"Si\",\n IMPERIAL = \"Imperial\",\n}\n\nexport enum Dimension {\n LENGTH = \"length\",\n WEIGHT = \"weight\",\n SPEED = \"speed\",\n TEMPERATURE = \"temperature\",\n}\n\nexport enum MetricUnits {\n MM = \"mm\",\n CM = \"cm\",\n M = \"m\",\n KM = \"km\",\n G = \"g\",\n KG = \"kg\",\n TONNE = \"t\",\n CELSIUS = \"C\",\n KELVIN = \"K\",\n M_S = \"m/s\",\n KM_H = \"km/h\",\n}\n\nexport enum ImperialUnits {\n IN = \"in\",\n FT = \"ft\",\n YD = \"yd\",\n MI = \"mi\",\n OZ = \"oz\",\n LB = \"lb\",\n ST = \"st\",\n FAHRENHEIT = \"F\",\n FT_S = \"ft/s\",\n MPH = \"mph\",\n}\n\nexport type Units = MetricUnits | ImperialUnits;\n\nexport type TemperatureUnits =\n | MetricUnits.CELSIUS\n | MetricUnits.KELVIN\n | ImperialUnits.FAHRENHEIT;\n","import {\n Dimension,\n ImperialUnits,\n MetricUnits,\n Units,\n} from \"../common/common.constants\";\n\n/** Factor to multiply value by to get value in canonical unit for that dimension. */\nexport const UNIT_TO_CANONICAL: Record<Units, number> = {\n [MetricUnits.MM]: 0.1,\n [MetricUnits.CM]: 1,\n [MetricUnits.M]: 100,\n [MetricUnits.KM]: 100_000,\n [ImperialUnits.IN]: 2.54,\n [ImperialUnits.FT]: 30.48,\n [ImperialUnits.YD]: 91.44,\n [ImperialUnits.MI]: 160934.4,\n [MetricUnits.G]: 0.001,\n [MetricUnits.KG]: 1,\n [MetricUnits.TONNE]: 1000,\n [MetricUnits.CELSIUS]: 1,\n [MetricUnits.KELVIN]: 1,\n [ImperialUnits.FAHRENHEIT]: 1,\n [ImperialUnits.OZ]: 0.028349523125,\n [ImperialUnits.LB]: 0.45359237,\n [ImperialUnits.ST]: 6.35029318,\n [MetricUnits.M_S]: 3.6,\n [MetricUnits.KM_H]: 1,\n [ImperialUnits.FT_S]: 1.09728,\n [ImperialUnits.MPH]: 1.609344,\n};\n\nexport const UNIT_DIMENSION: Record<Units, Dimension> = {\n [MetricUnits.MM]: Dimension.LENGTH,\n [MetricUnits.CM]: Dimension.LENGTH,\n [MetricUnits.M]: Dimension.LENGTH,\n [MetricUnits.KM]: Dimension.LENGTH,\n [ImperialUnits.IN]: Dimension.LENGTH,\n [ImperialUnits.FT]: Dimension.LENGTH,\n [ImperialUnits.YD]: Dimension.LENGTH,\n [ImperialUnits.MI]: Dimension.LENGTH,\n [MetricUnits.G]: Dimension.WEIGHT,\n [MetricUnits.KG]: Dimension.WEIGHT,\n [MetricUnits.TONNE]: Dimension.WEIGHT,\n [MetricUnits.CELSIUS]: Dimension.TEMPERATURE,\n [MetricUnits.KELVIN]: Dimension.TEMPERATURE,\n [ImperialUnits.FAHRENHEIT]: Dimension.TEMPERATURE,\n [ImperialUnits.OZ]: Dimension.WEIGHT,\n [ImperialUnits.LB]: Dimension.WEIGHT,\n [ImperialUnits.ST]: Dimension.WEIGHT,\n [MetricUnits.M_S]: Dimension.SPEED,\n [MetricUnits.KM_H]: Dimension.SPEED,\n [ImperialUnits.FT_S]: Dimension.SPEED,\n [ImperialUnits.MPH]: Dimension.SPEED,\n};\n","import {\n ImperialUnits,\n MetricUnits,\n TemperatureUnits,\n} from \"../common/common.constants\";\n\n/** Temperature: value in Kelvin = value * scale + offset */\nexport const TEMPERATURE_TO_KELVIN_SCALE: Record<TemperatureUnits, number> = {\n [MetricUnits.CELSIUS]: 1,\n [MetricUnits.KELVIN]: 1,\n [ImperialUnits.FAHRENHEIT]: 5 / 9,\n};\nexport const TEMPERATURE_TO_KELVIN_OFFSET: Record<TemperatureUnits, number> = {\n [MetricUnits.CELSIUS]: 273.15,\n [MetricUnits.KELVIN]: 0,\n [ImperialUnits.FAHRENHEIT]: 273.15 - (32 * 5) / 9,\n};\n\n/** Temperature: value in unit = value_K * scale + offset */\nexport const TEMPERATURE_FROM_KELVIN_SCALE: Record<TemperatureUnits, number> = {\n [MetricUnits.CELSIUS]: 1,\n [MetricUnits.KELVIN]: 1,\n [ImperialUnits.FAHRENHEIT]: 9 / 5,\n};\n\nexport const TEMPERATURE_FROM_KELVIN_OFFSET: Record<TemperatureUnits, number> =\n {\n [MetricUnits.CELSIUS]: -273.15,\n [MetricUnits.KELVIN]: 0,\n [ImperialUnits.FAHRENHEIT]: -459.67,\n };\n","export const round = (value: number, decimalPlaces?: number) => {\n if (decimalPlaces === undefined) return value;\n\n return parseFloat(value.toFixed(decimalPlaces));\n};\n","import {\n Dimension,\n TemperatureUnits,\n} from \"../../constants/common/common.constants\";\nimport { UNIT_DIMENSION } from \"../../constants/conversion/conversion.constants\";\nimport {\n TEMPERATURE_FROM_KELVIN_OFFSET,\n TEMPERATURE_FROM_KELVIN_SCALE,\n TEMPERATURE_TO_KELVIN_OFFSET,\n TEMPERATURE_TO_KELVIN_SCALE,\n} from \"../../constants/temperature/temperature\";\nimport { ConvertOptions } from \"../convert/convert.types\";\nimport { round } from \"../math/math\";\n\nconst isTemperature = ({ fromUnits }: ConvertOptions): boolean =>\n UNIT_DIMENSION[fromUnits] === Dimension.TEMPERATURE;\n\nconst toKelvin = (value: number, units: TemperatureUnits): number =>\n value * TEMPERATURE_TO_KELVIN_SCALE[units] +\n TEMPERATURE_TO_KELVIN_OFFSET[units];\n\nconst fromKelvin = (value: number, units: TemperatureUnits): number =>\n value * TEMPERATURE_FROM_KELVIN_SCALE[units] +\n TEMPERATURE_FROM_KELVIN_OFFSET[units];\n\nconst convertTemperature = (\n value: number,\n { fromUnits, toUnits, roundTo }: ConvertOptions,\n): number => {\n if (fromUnits === toUnits) return round(value, roundTo);\n\n const valueInKelvin = toKelvin(value, fromUnits as TemperatureUnits);\n\n const result = fromKelvin(valueInKelvin, toUnits as TemperatureUnits);\n\n return round(result, roundTo);\n};\n\nconst temperatureUtils = {\n isTemperature,\n convertTemperature,\n};\n\nexport default temperatureUtils;\n","const strings = {\n convertDimensionMismatch:\n \"Cannot convert between different dimensions: {0} ({1}) and {2} ({3})\",\n};\n\nexport default strings;\n","export const formatMessage = (message: string, ...args: any[]) =>\n message.replace(/{(\\d+)}/g, (match, number) =>\n args[number] !== undefined ? args[number] : match,\n );\n","import { Units } from \"../../constants/common/common.constants\";\nimport {\n UNIT_DIMENSION,\n UNIT_TO_CANONICAL,\n} from \"../../constants/conversion/conversion.constants\";\nimport strings from \"../../constants/strings/strings\";\nimport { round } from \"../math/math\";\nimport { formatMessage } from \"../strings/strings.utils\";\nimport { ConvertOptions } from \"./convert.types\";\n\nconst throwConversionError = ({ fromUnits, toUnits }: ConvertOptions) => {\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n throw new Error(\n formatMessage(\n strings.convertDimensionMismatch,\n fromUnits,\n fromDim,\n toUnits,\n toDim,\n ),\n );\n};\n\nconst getFactor = (fromUnits: Units, toUnits: Units) => {\n if (fromUnits === toUnits) return 1;\n\n const toCanonicalFrom = UNIT_TO_CANONICAL[fromUnits];\n const toCanonicalTo = UNIT_TO_CANONICAL[toUnits];\n return toCanonicalFrom / toCanonicalTo;\n};\n\nconst ensureSameDimension = ({ fromUnits, toUnits }: ConvertOptions) => {\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });\n};\n\nconst convertDefault = (\n value: number,\n { fromUnits, toUnits, roundTo }: ConvertOptions,\n): number => {\n const factor = getFactor(fromUnits, toUnits);\n\n return round(value * factor, roundTo);\n};\n\nconst convertUtils = {\n convertDefault,\n ensureSameDimension,\n};\n\nexport default convertUtils;\n","import temperatureUtils from \"../temperature/temperature.utils\";\nimport { ConvertOptions } from \"./convert.types\";\nimport utils from \"./convert.utils\";\n\nconst { convertDefault, ensureSameDimension } = utils;\nconst { isTemperature, convertTemperature } = temperatureUtils;\n\nexport const convert = (value: number, options: ConvertOptions) => {\n ensureSameDimension(options);\n\n if (isTemperature(options)) {\n return convertTemperature(value, options);\n }\n\n return convertDefault(value, options);\n};\n","const inchesPerFoot = 12;\n\nconst heightConstants = {\n inchesPerFoot,\n};\n\nexport default heightConstants;\n","import { FeetInches } from \"./height.types\";\n\nconst parseFeetInches = (input: string): FeetInches => {\n // NOTE: this function is AI generated, but it's well tested and works as expected. And it's covered by unit tests.\n if (typeof input !== \"string\") return [0, 0];\n\n const normalized = input\n .toLowerCase()\n .replace(/[\"\"]/g, \"in\")\n .replace(/[''′]+/g, \"ft\")\n .replace(/(feet|foot)/g, \"ft\")\n .replace(/(inches|inch)/g, \"in\")\n .replace(/[\\s]+/g, \" \")\n .trim();\n\n const parseNumber = (value: string | undefined): number =>\n parseFloat(value || \"0\");\n\n const ftMatch = normalized.match(/([\\d.]+)\\s*ft/);\n const inMatch = normalized.match(/([\\d.]+)\\s*in/);\n\n const feet = parseNumber(ftMatch?.[1]);\n const inches = parseNumber(inMatch?.[1]);\n\n if (ftMatch && inMatch) {\n return [feet, inches];\n }\n\n const [firstNumberString, secondNumberString] = normalized.match(\n /[\\d.]+/g,\n ) || [\"0\", \"0\"];\n\n const firstNumber = parseNumber(firstNumberString);\n const secondNumber = parseNumber(secondNumberString);\n\n if (!ftMatch && !inMatch) {\n return [firstNumber, secondNumber];\n }\n\n if (ftMatch && !inMatch) {\n return [feet, secondNumber];\n }\n\n if (!ftMatch && inMatch) {\n return [0, inches];\n }\n\n return [0, 0];\n};\n\nconst heightUtils = {\n parseFeetInches,\n};\n\nexport default heightUtils;\n","import {\n ImperialUnits,\n MetricUnits,\n} from \"../../constants/common/common.constants\";\nimport { convert } from \"../../utils/convert/convert\";\nimport { round } from \"../../utils/math/math\";\nimport constants from \"./height.constants\";\nimport { FeetInches } from \"./height.types\";\nimport utils from \"./height.utils\";\n\nconst { parseFeetInches } = utils;\nconst { inchesPerFoot } = constants;\n\nclass Height {\n toFeetInches(valueInCm: number, roundTo?: number): FeetInches {\n const totalInches = convert(valueInCm, {\n fromUnits: MetricUnits.CM,\n toUnits: ImperialUnits.IN,\n roundTo,\n });\n\n const feet = Math.floor(totalInches / inchesPerFoot);\n const inches = round(totalInches - feet * inchesPerFoot, roundTo);\n\n return [feet, inches];\n }\n\n toCentimeters([feet, inches]: FeetInches): number {\n const totalInches = feet * inchesPerFoot + inches;\n\n return convert(totalInches, {\n fromUnits: ImperialUnits.IN,\n toUnits: MetricUnits.CM,\n });\n }\n\n parseFeetInches(input: string): FeetInches {\n return parseFeetInches(input);\n }\n}\n\nconst height = new Height();\n\nexport default height;\n"],"mappings":"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","names":["UnitSystem","Dimension","MetricUnits","ImperialUnits","convertDefault","ensureSameDimension","isTemperature","convertTemperature","parseFeetInches","inchesPerFoot"]}
|
package/dist/index.mjs
CHANGED
|
@@ -8,59 +8,129 @@ var Dimension = /* @__PURE__ */ ((Dimension2) => {
|
|
|
8
8
|
Dimension2["LENGTH"] = "length";
|
|
9
9
|
Dimension2["WEIGHT"] = "weight";
|
|
10
10
|
Dimension2["SPEED"] = "speed";
|
|
11
|
+
Dimension2["TEMPERATURE"] = "temperature";
|
|
11
12
|
return Dimension2;
|
|
12
13
|
})(Dimension || {});
|
|
13
|
-
var MeasurementType = /* @__PURE__ */ ((MeasurementType2) => {
|
|
14
|
-
MeasurementType2["LENGTH"] = "length";
|
|
15
|
-
MeasurementType2["WEIGHT"] = "weight";
|
|
16
|
-
MeasurementType2["SPEED"] = "speed";
|
|
17
|
-
MeasurementType2["HEIGHT"] = "height";
|
|
18
|
-
MeasurementType2["LENGTH_FEET"] = "length_feet";
|
|
19
|
-
return MeasurementType2;
|
|
20
|
-
})(MeasurementType || {});
|
|
21
14
|
var MetricUnits = /* @__PURE__ */ ((MetricUnits2) => {
|
|
15
|
+
MetricUnits2["MM"] = "mm";
|
|
22
16
|
MetricUnits2["CM"] = "cm";
|
|
23
17
|
MetricUnits2["M"] = "m";
|
|
18
|
+
MetricUnits2["KM"] = "km";
|
|
19
|
+
MetricUnits2["G"] = "g";
|
|
24
20
|
MetricUnits2["KG"] = "kg";
|
|
21
|
+
MetricUnits2["TONNE"] = "t";
|
|
22
|
+
MetricUnits2["CELSIUS"] = "C";
|
|
23
|
+
MetricUnits2["KELVIN"] = "K";
|
|
24
|
+
MetricUnits2["M_S"] = "m/s";
|
|
25
25
|
MetricUnits2["KM_H"] = "km/h";
|
|
26
26
|
return MetricUnits2;
|
|
27
27
|
})(MetricUnits || {});
|
|
28
28
|
var ImperialUnits = /* @__PURE__ */ ((ImperialUnits2) => {
|
|
29
29
|
ImperialUnits2["IN"] = "in";
|
|
30
30
|
ImperialUnits2["FT"] = "ft";
|
|
31
|
+
ImperialUnits2["YD"] = "yd";
|
|
32
|
+
ImperialUnits2["MI"] = "mi";
|
|
33
|
+
ImperialUnits2["OZ"] = "oz";
|
|
31
34
|
ImperialUnits2["LB"] = "lb";
|
|
35
|
+
ImperialUnits2["ST"] = "st";
|
|
36
|
+
ImperialUnits2["FAHRENHEIT"] = "F";
|
|
37
|
+
ImperialUnits2["FT_S"] = "ft/s";
|
|
32
38
|
ImperialUnits2["MPH"] = "mph";
|
|
33
39
|
return ImperialUnits2;
|
|
34
40
|
})(ImperialUnits || {});
|
|
35
41
|
|
|
36
|
-
// src/utils/math/math.ts
|
|
37
|
-
var round = (value, decimalPlaces) => {
|
|
38
|
-
if (decimalPlaces === void 0) return value;
|
|
39
|
-
return parseFloat(value.toFixed(decimalPlaces));
|
|
40
|
-
};
|
|
41
|
-
|
|
42
42
|
// src/constants/conversion/conversion.constants.ts
|
|
43
43
|
var UNIT_TO_CANONICAL = {
|
|
44
|
+
["mm" /* MM */]: 0.1,
|
|
44
45
|
["cm" /* CM */]: 1,
|
|
45
46
|
["m" /* M */]: 100,
|
|
47
|
+
["km" /* KM */]: 1e5,
|
|
46
48
|
["in" /* IN */]: 2.54,
|
|
47
49
|
["ft" /* FT */]: 30.48,
|
|
50
|
+
["yd" /* YD */]: 91.44,
|
|
51
|
+
["mi" /* MI */]: 160934.4,
|
|
52
|
+
["g" /* G */]: 1e-3,
|
|
48
53
|
["kg" /* KG */]: 1,
|
|
54
|
+
["t" /* TONNE */]: 1e3,
|
|
55
|
+
["C" /* CELSIUS */]: 1,
|
|
56
|
+
["K" /* KELVIN */]: 1,
|
|
57
|
+
["F" /* FAHRENHEIT */]: 1,
|
|
58
|
+
["oz" /* OZ */]: 0.028349523125,
|
|
49
59
|
["lb" /* LB */]: 0.45359237,
|
|
60
|
+
["st" /* ST */]: 6.35029318,
|
|
61
|
+
["m/s" /* M_S */]: 3.6,
|
|
50
62
|
["km/h" /* KM_H */]: 1,
|
|
63
|
+
["ft/s" /* FT_S */]: 1.09728,
|
|
51
64
|
["mph" /* MPH */]: 1.609344
|
|
52
65
|
};
|
|
53
66
|
var UNIT_DIMENSION = {
|
|
67
|
+
["mm" /* MM */]: "length" /* LENGTH */,
|
|
54
68
|
["cm" /* CM */]: "length" /* LENGTH */,
|
|
55
69
|
["m" /* M */]: "length" /* LENGTH */,
|
|
70
|
+
["km" /* KM */]: "length" /* LENGTH */,
|
|
56
71
|
["in" /* IN */]: "length" /* LENGTH */,
|
|
57
72
|
["ft" /* FT */]: "length" /* LENGTH */,
|
|
73
|
+
["yd" /* YD */]: "length" /* LENGTH */,
|
|
74
|
+
["mi" /* MI */]: "length" /* LENGTH */,
|
|
75
|
+
["g" /* G */]: "weight" /* WEIGHT */,
|
|
58
76
|
["kg" /* KG */]: "weight" /* WEIGHT */,
|
|
77
|
+
["t" /* TONNE */]: "weight" /* WEIGHT */,
|
|
78
|
+
["C" /* CELSIUS */]: "temperature" /* TEMPERATURE */,
|
|
79
|
+
["K" /* KELVIN */]: "temperature" /* TEMPERATURE */,
|
|
80
|
+
["F" /* FAHRENHEIT */]: "temperature" /* TEMPERATURE */,
|
|
81
|
+
["oz" /* OZ */]: "weight" /* WEIGHT */,
|
|
59
82
|
["lb" /* LB */]: "weight" /* WEIGHT */,
|
|
83
|
+
["st" /* ST */]: "weight" /* WEIGHT */,
|
|
84
|
+
["m/s" /* M_S */]: "speed" /* SPEED */,
|
|
60
85
|
["km/h" /* KM_H */]: "speed" /* SPEED */,
|
|
86
|
+
["ft/s" /* FT_S */]: "speed" /* SPEED */,
|
|
61
87
|
["mph" /* MPH */]: "speed" /* SPEED */
|
|
62
88
|
};
|
|
63
89
|
|
|
90
|
+
// src/constants/temperature/temperature.ts
|
|
91
|
+
var TEMPERATURE_TO_KELVIN_SCALE = {
|
|
92
|
+
["C" /* CELSIUS */]: 1,
|
|
93
|
+
["K" /* KELVIN */]: 1,
|
|
94
|
+
["F" /* FAHRENHEIT */]: 5 / 9
|
|
95
|
+
};
|
|
96
|
+
var TEMPERATURE_TO_KELVIN_OFFSET = {
|
|
97
|
+
["C" /* CELSIUS */]: 273.15,
|
|
98
|
+
["K" /* KELVIN */]: 0,
|
|
99
|
+
["F" /* FAHRENHEIT */]: 273.15 - 32 * 5 / 9
|
|
100
|
+
};
|
|
101
|
+
var TEMPERATURE_FROM_KELVIN_SCALE = {
|
|
102
|
+
["C" /* CELSIUS */]: 1,
|
|
103
|
+
["K" /* KELVIN */]: 1,
|
|
104
|
+
["F" /* FAHRENHEIT */]: 9 / 5
|
|
105
|
+
};
|
|
106
|
+
var TEMPERATURE_FROM_KELVIN_OFFSET = {
|
|
107
|
+
["C" /* CELSIUS */]: -273.15,
|
|
108
|
+
["K" /* KELVIN */]: 0,
|
|
109
|
+
["F" /* FAHRENHEIT */]: -459.67
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// src/utils/math/math.ts
|
|
113
|
+
var round = (value, decimalPlaces) => {
|
|
114
|
+
if (decimalPlaces === void 0) return value;
|
|
115
|
+
return parseFloat(value.toFixed(decimalPlaces));
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// src/utils/temperature/temperature.utils.ts
|
|
119
|
+
var isTemperature = ({ fromUnits }) => UNIT_DIMENSION[fromUnits] === "temperature" /* TEMPERATURE */;
|
|
120
|
+
var toKelvin = (value, units) => value * TEMPERATURE_TO_KELVIN_SCALE[units] + TEMPERATURE_TO_KELVIN_OFFSET[units];
|
|
121
|
+
var fromKelvin = (value, units) => value * TEMPERATURE_FROM_KELVIN_SCALE[units] + TEMPERATURE_FROM_KELVIN_OFFSET[units];
|
|
122
|
+
var convertTemperature = (value, { fromUnits, toUnits, roundTo }) => {
|
|
123
|
+
if (fromUnits === toUnits) return round(value, roundTo);
|
|
124
|
+
const valueInKelvin = toKelvin(value, fromUnits);
|
|
125
|
+
const result = fromKelvin(valueInKelvin, toUnits);
|
|
126
|
+
return round(result, roundTo);
|
|
127
|
+
};
|
|
128
|
+
var temperatureUtils = {
|
|
129
|
+
isTemperature,
|
|
130
|
+
convertTemperature
|
|
131
|
+
};
|
|
132
|
+
var temperature_utils_default = temperatureUtils;
|
|
133
|
+
|
|
64
134
|
// src/constants/strings/strings.ts
|
|
65
135
|
var strings = {
|
|
66
136
|
convertDimensionMismatch: "Cannot convert between different dimensions: {0} ({1}) and {2} ({3})"
|
|
@@ -89,24 +159,42 @@ var throwConversionError = ({ fromUnits, toUnits }) => {
|
|
|
89
159
|
};
|
|
90
160
|
var getFactor = (fromUnits, toUnits) => {
|
|
91
161
|
if (fromUnits === toUnits) return 1;
|
|
92
|
-
const fromDim = UNIT_DIMENSION[fromUnits];
|
|
93
|
-
const toDim = UNIT_DIMENSION[toUnits];
|
|
94
|
-
if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });
|
|
95
162
|
const toCanonicalFrom = UNIT_TO_CANONICAL[fromUnits];
|
|
96
163
|
const toCanonicalTo = UNIT_TO_CANONICAL[toUnits];
|
|
97
164
|
return toCanonicalFrom / toCanonicalTo;
|
|
98
165
|
};
|
|
166
|
+
var ensureSameDimension = ({ fromUnits, toUnits }) => {
|
|
167
|
+
const fromDim = UNIT_DIMENSION[fromUnits];
|
|
168
|
+
const toDim = UNIT_DIMENSION[toUnits];
|
|
169
|
+
if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });
|
|
170
|
+
};
|
|
171
|
+
var convertDefault = (value, { fromUnits, toUnits, roundTo }) => {
|
|
172
|
+
const factor = getFactor(fromUnits, toUnits);
|
|
173
|
+
return round(value * factor, roundTo);
|
|
174
|
+
};
|
|
99
175
|
var convertUtils = {
|
|
100
|
-
|
|
176
|
+
convertDefault,
|
|
177
|
+
ensureSameDimension
|
|
101
178
|
};
|
|
102
179
|
var convert_utils_default = convertUtils;
|
|
103
180
|
|
|
104
181
|
// src/utils/convert/convert.ts
|
|
105
|
-
var {
|
|
106
|
-
var
|
|
107
|
-
|
|
108
|
-
|
|
182
|
+
var { convertDefault: convertDefault2, ensureSameDimension: ensureSameDimension2 } = convert_utils_default;
|
|
183
|
+
var { isTemperature: isTemperature2, convertTemperature: convertTemperature2 } = temperature_utils_default;
|
|
184
|
+
var convert = (value, options) => {
|
|
185
|
+
ensureSameDimension2(options);
|
|
186
|
+
if (isTemperature2(options)) {
|
|
187
|
+
return convertTemperature2(value, options);
|
|
188
|
+
}
|
|
189
|
+
return convertDefault2(value, options);
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// src/services/height/height.constants.ts
|
|
193
|
+
var inchesPerFoot = 12;
|
|
194
|
+
var heightConstants = {
|
|
195
|
+
inchesPerFoot
|
|
109
196
|
};
|
|
197
|
+
var height_constants_default = heightConstants;
|
|
110
198
|
|
|
111
199
|
// src/services/height/height.utils.ts
|
|
112
200
|
var parseFeetInches = (input) => {
|
|
@@ -143,6 +231,7 @@ var height_utils_default = heightUtils;
|
|
|
143
231
|
|
|
144
232
|
// src/services/height/height.ts
|
|
145
233
|
var { parseFeetInches: parseFeetInches2 } = height_utils_default;
|
|
234
|
+
var { inchesPerFoot: inchesPerFoot2 } = height_constants_default;
|
|
146
235
|
var Height = class {
|
|
147
236
|
toFeetInches(valueInCm, roundTo) {
|
|
148
237
|
const totalInches = convert(valueInCm, {
|
|
@@ -150,12 +239,12 @@ var Height = class {
|
|
|
150
239
|
toUnits: "in" /* IN */,
|
|
151
240
|
roundTo
|
|
152
241
|
});
|
|
153
|
-
const feet = Math.floor(totalInches /
|
|
154
|
-
const inches = round(totalInches - feet *
|
|
242
|
+
const feet = Math.floor(totalInches / inchesPerFoot2);
|
|
243
|
+
const inches = round(totalInches - feet * inchesPerFoot2, roundTo);
|
|
155
244
|
return [feet, inches];
|
|
156
245
|
}
|
|
157
246
|
toCentimeters([feet, inches]) {
|
|
158
|
-
const totalInches = feet *
|
|
247
|
+
const totalInches = feet * inchesPerFoot2 + inches;
|
|
159
248
|
return convert(totalInches, {
|
|
160
249
|
fromUnits: "in" /* IN */,
|
|
161
250
|
toUnits: "cm" /* CM */
|
|
@@ -170,7 +259,6 @@ var height_default = height;
|
|
|
170
259
|
export {
|
|
171
260
|
Dimension,
|
|
172
261
|
ImperialUnits,
|
|
173
|
-
MeasurementType,
|
|
174
262
|
MetricUnits,
|
|
175
263
|
UnitSystem,
|
|
176
264
|
convert,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants/common/common.constants.ts","../src/utils/math/math.ts","../src/constants/conversion/conversion.constants.ts","../src/constants/strings/strings.ts","../src/utils/strings/strings.utils.ts","../src/utils/convert/convert.utils.ts","../src/utils/convert/convert.ts","../src/services/height/height.utils.ts","../src/services/height/height.ts"],"sourcesContent":["export enum UnitSystem {\n METRIC = \"Si\",\n IMPERIAL = \"Imperial\",\n}\n\nexport enum Dimension {\n LENGTH = \"length\",\n WEIGHT = \"weight\",\n SPEED = \"speed\",\n}\n\nexport enum MeasurementType {\n LENGTH = \"length\",\n WEIGHT = \"weight\",\n SPEED = \"speed\",\n HEIGHT = \"height\",\n LENGTH_FEET = \"length_feet\",\n}\n\nexport enum MetricUnits {\n CM = \"cm\",\n M = \"m\",\n KG = \"kg\",\n KM_H = \"km/h\",\n}\n\nexport enum ImperialUnits {\n IN = \"in\",\n FT = \"ft\",\n LB = \"lb\",\n MPH = \"mph\",\n}\n\nexport type Units = MetricUnits | ImperialUnits;\n","export const round = (value: number, decimalPlaces?: number) => {\n if (decimalPlaces === undefined) return value;\n\n return parseFloat(value.toFixed(decimalPlaces));\n};\n","import {\n Dimension,\n ImperialUnits,\n MetricUnits,\n Units,\n} from \"../common/common.constants\";\n\n/** Factor to multiply value by to get value in canonical unit for that dimension. */\nexport const UNIT_TO_CANONICAL: Record<Units, number> = {\n [MetricUnits.CM]: 1,\n [MetricUnits.M]: 100,\n [ImperialUnits.IN]: 2.54,\n [ImperialUnits.FT]: 30.48,\n [MetricUnits.KG]: 1,\n [ImperialUnits.LB]: 0.45359237,\n [MetricUnits.KM_H]: 1,\n [ImperialUnits.MPH]: 1.609344,\n};\n\nexport const UNIT_DIMENSION: Record<Units, Dimension> = {\n [MetricUnits.CM]: Dimension.LENGTH,\n [MetricUnits.M]: Dimension.LENGTH,\n [ImperialUnits.IN]: Dimension.LENGTH,\n [ImperialUnits.FT]: Dimension.LENGTH,\n [MetricUnits.KG]: Dimension.WEIGHT,\n [ImperialUnits.LB]: Dimension.WEIGHT,\n [MetricUnits.KM_H]: Dimension.SPEED,\n [ImperialUnits.MPH]: Dimension.SPEED,\n};\n","const strings = {\n convertDimensionMismatch:\n \"Cannot convert between different dimensions: {0} ({1}) and {2} ({3})\",\n};\n\nexport default strings;\n","export const formatMessage = (message: string, ...args: any[]) =>\n message.replace(/{(\\d+)}/g, (match, number) =>\n args[number] !== undefined ? args[number] : match,\n );\n","import { Units } from \"../../constants/common/common.constants\";\nimport {\n UNIT_DIMENSION,\n UNIT_TO_CANONICAL,\n} from \"../../constants/conversion/conversion.constants\";\nimport strings from \"../../constants/strings/strings\";\nimport { round } from \"../math/math\";\nimport { formatMessage } from \"../strings/strings.utils\";\nimport { ConvertOptions } from \"./convert.types\";\n\nconst throwConversionError = ({ fromUnits, toUnits }: ConvertOptions) => {\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n throw new Error(\n formatMessage(\n strings.convertDimensionMismatch,\n fromUnits,\n fromDim,\n toUnits,\n toDim,\n ),\n );\n};\n\nconst getFactor = (fromUnits: Units, toUnits: Units) => {\n if (fromUnits === toUnits) return 1;\n\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });\n\n const toCanonicalFrom = UNIT_TO_CANONICAL[fromUnits];\n const toCanonicalTo = UNIT_TO_CANONICAL[toUnits];\n return toCanonicalFrom / toCanonicalTo;\n};\n\nconst convertUtils = {\n getFactor,\n};\n\nexport default convertUtils;\n","import { round } from \"../math/math\";\nimport { ConvertOptions } from \"./convert.types\";\nimport utils from \"./convert.utils\";\n\nconst { getFactor } = utils;\n\nexport const convert = (\n value: number,\n { fromUnits, toUnits, roundTo }: ConvertOptions,\n) => {\n const factor = getFactor(fromUnits, toUnits);\n\n return round(value * factor, roundTo);\n};\n","import { FeetInches } from \"./height.types\";\n\nconst parseFeetInches = (input: string): FeetInches => {\n // NOTE: this function is AI generated, but it's well tested and works as expected. And it's covered by unit tests.\n if (typeof input !== \"string\") return [0, 0];\n\n const normalized = input\n .toLowerCase()\n .replace(/[\"\"]/g, \"in\")\n .replace(/[''′]+/g, \"ft\")\n .replace(/(feet|foot)/g, \"ft\")\n .replace(/(inches|inch)/g, \"in\")\n .replace(/[\\s]+/g, \" \")\n .trim();\n\n const parseNumber = (value: string | undefined): number =>\n parseFloat(value || \"0\");\n\n const ftMatch = normalized.match(/([\\d.]+)\\s*ft/);\n const inMatch = normalized.match(/([\\d.]+)\\s*in/);\n\n const feet = parseNumber(ftMatch?.[1]);\n const inches = parseNumber(inMatch?.[1]);\n\n if (ftMatch && inMatch) {\n return [feet, inches];\n }\n\n const [firstNumberString, secondNumberString] = normalized.match(\n /[\\d.]+/g,\n ) || [\"0\", \"0\"];\n\n const firstNumber = parseNumber(firstNumberString);\n const secondNumber = parseNumber(secondNumberString);\n\n if (!ftMatch && !inMatch) {\n return [firstNumber, secondNumber];\n }\n\n if (ftMatch && !inMatch) {\n return [feet, secondNumber];\n }\n\n if (!ftMatch && inMatch) {\n return [0, inches];\n }\n\n return [0, 0];\n};\n\nconst heightUtils = {\n parseFeetInches,\n};\n\nexport default heightUtils;\n","import {\n ImperialUnits,\n MetricUnits,\n} from \"../../constants/common/common.constants\";\nimport { convert } from \"../../utils/convert/convert\";\nimport { round } from \"../../utils/math/math\";\nimport { FeetInches } from \"./height.types\";\nimport utils from \"./height.utils\";\n\nconst { parseFeetInches } = utils;\n\nclass Height {\n toFeetInches(valueInCm: number, roundTo?: number): FeetInches {\n const totalInches = convert(valueInCm, {\n fromUnits: MetricUnits.CM,\n toUnits: ImperialUnits.IN,\n roundTo,\n });\n\n const feet = Math.floor(totalInches / 12);\n const inches = round(totalInches - feet * 12, roundTo);\n\n return [feet, inches];\n }\n\n toCentimeters([feet, inches]: FeetInches): number {\n const totalInches = feet * 12 + inches;\n\n return convert(totalInches, {\n fromUnits: ImperialUnits.IN,\n toUnits: MetricUnits.CM,\n });\n }\n\n parseFeetInches(input: string): FeetInches {\n return parseFeetInches(input);\n }\n}\n\nconst height = new Height();\n\nexport default height;\n"],"mappings":"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","names":["UnitSystem","Dimension","MeasurementType","MetricUnits","ImperialUnits","getFactor","parseFeetInches"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants/common/common.constants.ts","../src/constants/conversion/conversion.constants.ts","../src/constants/temperature/temperature.ts","../src/utils/math/math.ts","../src/utils/temperature/temperature.utils.ts","../src/constants/strings/strings.ts","../src/utils/strings/strings.utils.ts","../src/utils/convert/convert.utils.ts","../src/utils/convert/convert.ts","../src/services/height/height.constants.ts","../src/services/height/height.utils.ts","../src/services/height/height.ts"],"sourcesContent":["export enum UnitSystem {\n METRIC = \"Si\",\n IMPERIAL = \"Imperial\",\n}\n\nexport enum Dimension {\n LENGTH = \"length\",\n WEIGHT = \"weight\",\n SPEED = \"speed\",\n TEMPERATURE = \"temperature\",\n}\n\nexport enum MetricUnits {\n MM = \"mm\",\n CM = \"cm\",\n M = \"m\",\n KM = \"km\",\n G = \"g\",\n KG = \"kg\",\n TONNE = \"t\",\n CELSIUS = \"C\",\n KELVIN = \"K\",\n M_S = \"m/s\",\n KM_H = \"km/h\",\n}\n\nexport enum ImperialUnits {\n IN = \"in\",\n FT = \"ft\",\n YD = \"yd\",\n MI = \"mi\",\n OZ = \"oz\",\n LB = \"lb\",\n ST = \"st\",\n FAHRENHEIT = \"F\",\n FT_S = \"ft/s\",\n MPH = \"mph\",\n}\n\nexport type Units = MetricUnits | ImperialUnits;\n\nexport type TemperatureUnits =\n | MetricUnits.CELSIUS\n | MetricUnits.KELVIN\n | ImperialUnits.FAHRENHEIT;\n","import {\n Dimension,\n ImperialUnits,\n MetricUnits,\n Units,\n} from \"../common/common.constants\";\n\n/** Factor to multiply value by to get value in canonical unit for that dimension. */\nexport const UNIT_TO_CANONICAL: Record<Units, number> = {\n [MetricUnits.MM]: 0.1,\n [MetricUnits.CM]: 1,\n [MetricUnits.M]: 100,\n [MetricUnits.KM]: 100_000,\n [ImperialUnits.IN]: 2.54,\n [ImperialUnits.FT]: 30.48,\n [ImperialUnits.YD]: 91.44,\n [ImperialUnits.MI]: 160934.4,\n [MetricUnits.G]: 0.001,\n [MetricUnits.KG]: 1,\n [MetricUnits.TONNE]: 1000,\n [MetricUnits.CELSIUS]: 1,\n [MetricUnits.KELVIN]: 1,\n [ImperialUnits.FAHRENHEIT]: 1,\n [ImperialUnits.OZ]: 0.028349523125,\n [ImperialUnits.LB]: 0.45359237,\n [ImperialUnits.ST]: 6.35029318,\n [MetricUnits.M_S]: 3.6,\n [MetricUnits.KM_H]: 1,\n [ImperialUnits.FT_S]: 1.09728,\n [ImperialUnits.MPH]: 1.609344,\n};\n\nexport const UNIT_DIMENSION: Record<Units, Dimension> = {\n [MetricUnits.MM]: Dimension.LENGTH,\n [MetricUnits.CM]: Dimension.LENGTH,\n [MetricUnits.M]: Dimension.LENGTH,\n [MetricUnits.KM]: Dimension.LENGTH,\n [ImperialUnits.IN]: Dimension.LENGTH,\n [ImperialUnits.FT]: Dimension.LENGTH,\n [ImperialUnits.YD]: Dimension.LENGTH,\n [ImperialUnits.MI]: Dimension.LENGTH,\n [MetricUnits.G]: Dimension.WEIGHT,\n [MetricUnits.KG]: Dimension.WEIGHT,\n [MetricUnits.TONNE]: Dimension.WEIGHT,\n [MetricUnits.CELSIUS]: Dimension.TEMPERATURE,\n [MetricUnits.KELVIN]: Dimension.TEMPERATURE,\n [ImperialUnits.FAHRENHEIT]: Dimension.TEMPERATURE,\n [ImperialUnits.OZ]: Dimension.WEIGHT,\n [ImperialUnits.LB]: Dimension.WEIGHT,\n [ImperialUnits.ST]: Dimension.WEIGHT,\n [MetricUnits.M_S]: Dimension.SPEED,\n [MetricUnits.KM_H]: Dimension.SPEED,\n [ImperialUnits.FT_S]: Dimension.SPEED,\n [ImperialUnits.MPH]: Dimension.SPEED,\n};\n","import {\n ImperialUnits,\n MetricUnits,\n TemperatureUnits,\n} from \"../common/common.constants\";\n\n/** Temperature: value in Kelvin = value * scale + offset */\nexport const TEMPERATURE_TO_KELVIN_SCALE: Record<TemperatureUnits, number> = {\n [MetricUnits.CELSIUS]: 1,\n [MetricUnits.KELVIN]: 1,\n [ImperialUnits.FAHRENHEIT]: 5 / 9,\n};\nexport const TEMPERATURE_TO_KELVIN_OFFSET: Record<TemperatureUnits, number> = {\n [MetricUnits.CELSIUS]: 273.15,\n [MetricUnits.KELVIN]: 0,\n [ImperialUnits.FAHRENHEIT]: 273.15 - (32 * 5) / 9,\n};\n\n/** Temperature: value in unit = value_K * scale + offset */\nexport const TEMPERATURE_FROM_KELVIN_SCALE: Record<TemperatureUnits, number> = {\n [MetricUnits.CELSIUS]: 1,\n [MetricUnits.KELVIN]: 1,\n [ImperialUnits.FAHRENHEIT]: 9 / 5,\n};\n\nexport const TEMPERATURE_FROM_KELVIN_OFFSET: Record<TemperatureUnits, number> =\n {\n [MetricUnits.CELSIUS]: -273.15,\n [MetricUnits.KELVIN]: 0,\n [ImperialUnits.FAHRENHEIT]: -459.67,\n };\n","export const round = (value: number, decimalPlaces?: number) => {\n if (decimalPlaces === undefined) return value;\n\n return parseFloat(value.toFixed(decimalPlaces));\n};\n","import {\n Dimension,\n TemperatureUnits,\n} from \"../../constants/common/common.constants\";\nimport { UNIT_DIMENSION } from \"../../constants/conversion/conversion.constants\";\nimport {\n TEMPERATURE_FROM_KELVIN_OFFSET,\n TEMPERATURE_FROM_KELVIN_SCALE,\n TEMPERATURE_TO_KELVIN_OFFSET,\n TEMPERATURE_TO_KELVIN_SCALE,\n} from \"../../constants/temperature/temperature\";\nimport { ConvertOptions } from \"../convert/convert.types\";\nimport { round } from \"../math/math\";\n\nconst isTemperature = ({ fromUnits }: ConvertOptions): boolean =>\n UNIT_DIMENSION[fromUnits] === Dimension.TEMPERATURE;\n\nconst toKelvin = (value: number, units: TemperatureUnits): number =>\n value * TEMPERATURE_TO_KELVIN_SCALE[units] +\n TEMPERATURE_TO_KELVIN_OFFSET[units];\n\nconst fromKelvin = (value: number, units: TemperatureUnits): number =>\n value * TEMPERATURE_FROM_KELVIN_SCALE[units] +\n TEMPERATURE_FROM_KELVIN_OFFSET[units];\n\nconst convertTemperature = (\n value: number,\n { fromUnits, toUnits, roundTo }: ConvertOptions,\n): number => {\n if (fromUnits === toUnits) return round(value, roundTo);\n\n const valueInKelvin = toKelvin(value, fromUnits as TemperatureUnits);\n\n const result = fromKelvin(valueInKelvin, toUnits as TemperatureUnits);\n\n return round(result, roundTo);\n};\n\nconst temperatureUtils = {\n isTemperature,\n convertTemperature,\n};\n\nexport default temperatureUtils;\n","const strings = {\n convertDimensionMismatch:\n \"Cannot convert between different dimensions: {0} ({1}) and {2} ({3})\",\n};\n\nexport default strings;\n","export const formatMessage = (message: string, ...args: any[]) =>\n message.replace(/{(\\d+)}/g, (match, number) =>\n args[number] !== undefined ? args[number] : match,\n );\n","import { Units } from \"../../constants/common/common.constants\";\nimport {\n UNIT_DIMENSION,\n UNIT_TO_CANONICAL,\n} from \"../../constants/conversion/conversion.constants\";\nimport strings from \"../../constants/strings/strings\";\nimport { round } from \"../math/math\";\nimport { formatMessage } from \"../strings/strings.utils\";\nimport { ConvertOptions } from \"./convert.types\";\n\nconst throwConversionError = ({ fromUnits, toUnits }: ConvertOptions) => {\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n throw new Error(\n formatMessage(\n strings.convertDimensionMismatch,\n fromUnits,\n fromDim,\n toUnits,\n toDim,\n ),\n );\n};\n\nconst getFactor = (fromUnits: Units, toUnits: Units) => {\n if (fromUnits === toUnits) return 1;\n\n const toCanonicalFrom = UNIT_TO_CANONICAL[fromUnits];\n const toCanonicalTo = UNIT_TO_CANONICAL[toUnits];\n return toCanonicalFrom / toCanonicalTo;\n};\n\nconst ensureSameDimension = ({ fromUnits, toUnits }: ConvertOptions) => {\n const fromDim = UNIT_DIMENSION[fromUnits];\n const toDim = UNIT_DIMENSION[toUnits];\n\n if (fromDim !== toDim) throwConversionError({ fromUnits, toUnits });\n};\n\nconst convertDefault = (\n value: number,\n { fromUnits, toUnits, roundTo }: ConvertOptions,\n): number => {\n const factor = getFactor(fromUnits, toUnits);\n\n return round(value * factor, roundTo);\n};\n\nconst convertUtils = {\n convertDefault,\n ensureSameDimension,\n};\n\nexport default convertUtils;\n","import temperatureUtils from \"../temperature/temperature.utils\";\nimport { ConvertOptions } from \"./convert.types\";\nimport utils from \"./convert.utils\";\n\nconst { convertDefault, ensureSameDimension } = utils;\nconst { isTemperature, convertTemperature } = temperatureUtils;\n\nexport const convert = (value: number, options: ConvertOptions) => {\n ensureSameDimension(options);\n\n if (isTemperature(options)) {\n return convertTemperature(value, options);\n }\n\n return convertDefault(value, options);\n};\n","const inchesPerFoot = 12;\n\nconst heightConstants = {\n inchesPerFoot,\n};\n\nexport default heightConstants;\n","import { FeetInches } from \"./height.types\";\n\nconst parseFeetInches = (input: string): FeetInches => {\n // NOTE: this function is AI generated, but it's well tested and works as expected. And it's covered by unit tests.\n if (typeof input !== \"string\") return [0, 0];\n\n const normalized = input\n .toLowerCase()\n .replace(/[\"\"]/g, \"in\")\n .replace(/[''′]+/g, \"ft\")\n .replace(/(feet|foot)/g, \"ft\")\n .replace(/(inches|inch)/g, \"in\")\n .replace(/[\\s]+/g, \" \")\n .trim();\n\n const parseNumber = (value: string | undefined): number =>\n parseFloat(value || \"0\");\n\n const ftMatch = normalized.match(/([\\d.]+)\\s*ft/);\n const inMatch = normalized.match(/([\\d.]+)\\s*in/);\n\n const feet = parseNumber(ftMatch?.[1]);\n const inches = parseNumber(inMatch?.[1]);\n\n if (ftMatch && inMatch) {\n return [feet, inches];\n }\n\n const [firstNumberString, secondNumberString] = normalized.match(\n /[\\d.]+/g,\n ) || [\"0\", \"0\"];\n\n const firstNumber = parseNumber(firstNumberString);\n const secondNumber = parseNumber(secondNumberString);\n\n if (!ftMatch && !inMatch) {\n return [firstNumber, secondNumber];\n }\n\n if (ftMatch && !inMatch) {\n return [feet, secondNumber];\n }\n\n if (!ftMatch && inMatch) {\n return [0, inches];\n }\n\n return [0, 0];\n};\n\nconst heightUtils = {\n parseFeetInches,\n};\n\nexport default heightUtils;\n","import {\n ImperialUnits,\n MetricUnits,\n} from \"../../constants/common/common.constants\";\nimport { convert } from \"../../utils/convert/convert\";\nimport { round } from \"../../utils/math/math\";\nimport constants from \"./height.constants\";\nimport { FeetInches } from \"./height.types\";\nimport utils from \"./height.utils\";\n\nconst { parseFeetInches } = utils;\nconst { inchesPerFoot } = constants;\n\nclass Height {\n toFeetInches(valueInCm: number, roundTo?: number): FeetInches {\n const totalInches = convert(valueInCm, {\n fromUnits: MetricUnits.CM,\n toUnits: ImperialUnits.IN,\n roundTo,\n });\n\n const feet = Math.floor(totalInches / inchesPerFoot);\n const inches = round(totalInches - feet * inchesPerFoot, roundTo);\n\n return [feet, inches];\n }\n\n toCentimeters([feet, inches]: FeetInches): number {\n const totalInches = feet * inchesPerFoot + inches;\n\n return convert(totalInches, {\n fromUnits: ImperialUnits.IN,\n toUnits: MetricUnits.CM,\n });\n }\n\n parseFeetInches(input: string): FeetInches {\n return parseFeetInches(input);\n }\n}\n\nconst height = new Height();\n\nexport default height;\n"],"mappings":"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","names":["UnitSystem","Dimension","MetricUnits","ImperialUnits","convertDefault","ensureSameDimension","isTemperature","convertTemperature","parseFeetInches","inchesPerFoot"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uconvert",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -12,20 +12,52 @@
|
|
|
12
12
|
"require": "./dist/index.js"
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
|
-
"files": [
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
16
18
|
"scripts": {
|
|
17
19
|
"build": "tsup",
|
|
18
20
|
"dev": "tsup --watch",
|
|
19
21
|
"example": "npm run build && node example/run.mjs",
|
|
20
22
|
"example:cjs": "node example/run.cjs",
|
|
21
23
|
"format": "prettier --write .",
|
|
22
|
-
"
|
|
24
|
+
"postinstall": "husky",
|
|
25
|
+
"test": "jest"
|
|
23
26
|
},
|
|
24
27
|
"repository": {
|
|
25
28
|
"type": "git",
|
|
26
29
|
"url": "git+https://github.com/AndrewTkachuk42/uconvert.git"
|
|
27
30
|
},
|
|
28
|
-
"keywords": [
|
|
31
|
+
"keywords": [
|
|
32
|
+
"unit-conversion",
|
|
33
|
+
"unit-converter",
|
|
34
|
+
"convert-units",
|
|
35
|
+
"measurement",
|
|
36
|
+
"measurements",
|
|
37
|
+
"unit-system",
|
|
38
|
+
"metric",
|
|
39
|
+
"imperial",
|
|
40
|
+
"si-units",
|
|
41
|
+
"length",
|
|
42
|
+
"distance",
|
|
43
|
+
"height",
|
|
44
|
+
"weight",
|
|
45
|
+
"mass",
|
|
46
|
+
"speed",
|
|
47
|
+
"feet",
|
|
48
|
+
"inches",
|
|
49
|
+
"feet-inches",
|
|
50
|
+
"centimeters",
|
|
51
|
+
"meters",
|
|
52
|
+
"kilometers",
|
|
53
|
+
"miles",
|
|
54
|
+
"typescript",
|
|
55
|
+
"javascript",
|
|
56
|
+
"utility",
|
|
57
|
+
"math",
|
|
58
|
+
"precision",
|
|
59
|
+
"cross-units"
|
|
60
|
+
],
|
|
29
61
|
"author": "",
|
|
30
62
|
"license": "MIT",
|
|
31
63
|
"type": "commonjs",
|
|
@@ -33,8 +65,15 @@
|
|
|
33
65
|
"url": "https://github.com/AndrewTkachuk42/uconvert/issues"
|
|
34
66
|
},
|
|
35
67
|
"homepage": "https://github.com/AndrewTkachuk42/uconvert#readme",
|
|
68
|
+
"overrides": {
|
|
69
|
+
"minimatch": "^10.2.2"
|
|
70
|
+
},
|
|
36
71
|
"devDependencies": {
|
|
72
|
+
"@types/jest": "^29.5.14",
|
|
73
|
+
"husky": "^9.1.7",
|
|
74
|
+
"jest": "^30.2.0",
|
|
37
75
|
"prettier": "^3.4.2",
|
|
76
|
+
"ts-jest": "^29.4.6",
|
|
38
77
|
"prettier-plugin-organize-imports": "^4.1.0",
|
|
39
78
|
"tsup": "^8.5.1",
|
|
40
79
|
"typescript": "^5.9.3"
|