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 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
- HEIGHT = "height",
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, { fromUnits, toUnits, roundTo }: ConvertOptions) => 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, ImperialUnits, MeasurementType, MetricUnits, UnitSystem, type Units, convert, height, round };
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
- HEIGHT = "height",
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, { fromUnits, toUnits, roundTo }: ConvertOptions) => 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, ImperialUnits, MeasurementType, MetricUnits, UnitSystem, type Units, convert, height, round };
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
- getFactor
208
+ convertDefault,
209
+ ensureSameDimension
134
210
  };
135
211
  var convert_utils_default = convertUtils;
136
212
 
137
213
  // src/utils/convert/convert.ts
138
- var { getFactor: getFactor2 } = convert_utils_default;
139
- var convert = (value, { fromUnits, toUnits, roundTo }) => {
140
- const factor = getFactor2(fromUnits, toUnits);
141
- return round(value * factor, roundTo);
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 / 12);
187
- const inches = round(totalInches - feet * 12, roundTo);
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 * 12 + inches;
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
- getFactor
176
+ convertDefault,
177
+ ensureSameDimension
101
178
  };
102
179
  var convert_utils_default = convertUtils;
103
180
 
104
181
  // src/utils/convert/convert.ts
105
- var { getFactor: getFactor2 } = convert_utils_default;
106
- var convert = (value, { fromUnits, toUnits, roundTo }) => {
107
- const factor = getFactor2(fromUnits, toUnits);
108
- return round(value * factor, roundTo);
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 / 12);
154
- const inches = round(totalInches - feet * 12, roundTo);
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 * 12 + inches;
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,
@@ -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.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": ["dist"],
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
- "test": "echo \"Error: no test specified\" && exit 1"
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"