uconvert 0.1.2 → 0.1.4

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 CHANGED
@@ -1,6 +1,9 @@
1
1
  # uconvert
2
2
 
3
- Unit conversion utilities.
3
+ Lightweight utility for converting common measurement units.
4
+
5
+
6
+
4
7
 
5
8
  ## Installation
6
9
 
@@ -8,8 +11,14 @@ Unit conversion utilities.
8
11
  npm install uconvert
9
12
  ```
10
13
 
14
+
15
+
16
+
11
17
  ## Usage
12
18
 
19
+
20
+
21
+
13
22
  ### `convert(value, options)`
14
23
 
15
24
  Converts a numeric value from one unit to another.
@@ -42,6 +51,9 @@ convert(100, { fromUnits: MetricUnits.CM, toUnits: MetricUnits.CM });
42
51
  // => 100
43
52
  ```
44
53
 
54
+
55
+
56
+
45
57
  ### `round(value, decimalPlaces?)`
46
58
 
47
59
  Rounds a number to a given number of decimal places.
@@ -59,26 +71,92 @@ Rounds a number to a given number of decimal places.
59
71
  import { round } from "uconvert";
60
72
 
61
73
  round(1.2345, 2); // => 1.23
62
- round(1.2345); // => 1.2345
74
+ round(1.2345); // => 1.2345
63
75
  ```
64
76
 
77
+
78
+
79
+
80
+ ## Supported units
81
+
82
+ Units are grouped by dimension. Use the **Code** value with `convert()`.
83
+
84
+
85
+
86
+
87
+ ### Length
88
+
89
+ | Unit | Code | System |
90
+ | ---- | ------------------ | -------- |
91
+ | mm | `MetricUnits.MM` | Metric |
92
+ | cm | `MetricUnits.CM` | Metric |
93
+ | m | `MetricUnits.M` | Metric |
94
+ | km | `MetricUnits.KM` | Metric |
95
+ | in | `ImperialUnits.IN` | Imperial |
96
+ | ft | `ImperialUnits.FT` | Imperial |
97
+ | yd | `ImperialUnits.YD` | Imperial |
98
+ | mi | `ImperialUnits.MI` | Imperial |
99
+
100
+
101
+
102
+
103
+ ### Weight
104
+
105
+ | Unit | Code | System |
106
+ | ---- | ------------------- | -------- |
107
+ | g | `MetricUnits.G` | Metric |
108
+ | kg | `MetricUnits.KG` | Metric |
109
+ | t | `MetricUnits.TONNE` | Metric |
110
+ | oz | `ImperialUnits.OZ` | Imperial |
111
+ | lb | `ImperialUnits.LB` | Imperial |
112
+ | st | `ImperialUnits.ST` | Imperial |
113
+
114
+
115
+
116
+
117
+ ### Speed
118
+
119
+ | Unit | Code | System |
120
+ | ---- | -------------------- | -------- |
121
+ | m/s | `MetricUnits.M_S` | Metric |
122
+ | km/h | `MetricUnits.KM_H` | Metric |
123
+ | ft/s | `ImperialUnits.FT_S` | Imperial |
124
+ | mph | `ImperialUnits.MPH` | Imperial |
125
+
126
+
127
+
128
+
129
+ ### Temperature
130
+
131
+ | Unit | Code | System |
132
+ | ------ | -------------------------- | -------- |
133
+ | °C (C) | `MetricUnits.CELSIUS` | Metric |
134
+ | K | `MetricUnits.KELVIN` | Metric |
135
+ | °F (F) | `ImperialUnits.FAHRENHEIT` | Imperial |
136
+
137
+
138
+
139
+
65
140
  ## Exported types and enums
66
141
 
67
142
  Use these with `convert` for type-safe unit arguments:
68
143
 
69
- | Export | Description |
70
- |--------|-------------|
71
- | `ConvertOptions` | Options object for `convert`: `{ fromUnits, toUnits, roundTo? }`. |
72
- | `Units` | Union type: `MetricUnits \| ImperialUnits`. |
73
- | `MetricUnits` | Enum: `CM`, `M`, `KG`, `KM_H`. |
74
- | `ImperialUnits` | Enum: `IN`, `FT`, `LB`, `MPH`. |
75
- | `UnitSystem` | Enum: `METRIC`, `IMPERIAL`. |
76
- | `Dimension` | Enum: `LENGTH`, `WEIGHT`, `SPEED`. |
144
+ | Export | Description |
145
+ | ---------------- | ------------------------------------------------------------------------------------ |
146
+ | `ConvertOptions` | Options object for `convert`: `{ fromUnits, toUnits, roundTo? }`. |
147
+ | `Units` | Union type: `MetricUnits \| ImperialUnits`. |
148
+ | `MetricUnits` | Enum: `MM`, `CM`, `M`, `KM`, `G`, `KG`, `TONNE`, `CELSIUS`, `KELVIN`, `M_S`, `KM_H`. |
149
+ | `ImperialUnits` | Enum: `IN`, `FT`, `YD`, `MI`, `OZ`, `LB`, `ST`, `FAHRENHEIT`, `FT_S`, `MPH`. |
150
+ | `UnitSystem` | Enum: `METRIC`, `IMPERIAL`. |
151
+ | `Dimension` | Enum: `LENGTH`, `WEIGHT`, `SPEED`, `TEMPERATURE`. |
77
152
 
78
153
  `fromUnits` and `toUnits` must use the same dimension (e.g. both length, or both weight); otherwise `convert` throws.
79
154
 
80
155
  ---
81
156
 
157
+
158
+
159
+
82
160
  ## Height utility
83
161
 
84
162
  The `height` object provides helpers for converting between centimeters and feet–inches and for parsing feet–inches strings.
@@ -89,6 +167,9 @@ The `height` object provides helpers for converting between centimeters and feet
89
167
  import { height } from "uconvert";
90
168
  ```
91
169
 
170
+
171
+
172
+
92
173
  ### `height.toFeetInches(valueInCm, roundTo?)`
93
174
 
94
175
  Converts a height in centimeters to feet and inches.
@@ -103,10 +184,13 @@ Converts a height in centimeters to feet and inches.
103
184
  **Example:**
104
185
 
105
186
  ```ts
106
- height.toFeetInches(170); // => [5, 6.93...]
107
- height.toFeetInches(170, 1); // => [5, 6.9]
187
+ height.toFeetInches(170); // => [5, 6.93...]
188
+ height.toFeetInches(170, 1); // => [5, 6.9]
108
189
  ```
109
190
 
191
+
192
+
193
+
110
194
  ### `height.toCentimeters(feetInches)`
111
195
 
112
196
  Converts a feet–inches tuple to centimeters.
@@ -120,9 +204,12 @@ Converts a feet–inches tuple to centimeters.
120
204
  **Example:**
121
205
 
122
206
  ```ts
123
- height.toCentimeters([5, 10]); // => 177.8
207
+ height.toCentimeters([5, 10]); // => 177.8
124
208
  ```
125
209
 
210
+
211
+
212
+
126
213
  ### `height.parseFeetInches(input)`
127
214
 
128
215
  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".
@@ -136,11 +223,14 @@ Parses a string into a `[feet, inches]` tuple. Accepts formats like `"5 ft 10 in
136
223
  **Example:**
137
224
 
138
225
  ```ts
139
- height.parseFeetInches("5 ft 10 in"); // => [5, 10]
140
- height.parseFeetInches("5'10\""); // => [5, 10]
141
- height.parseFeetInches("6 2"); // => [6, 2]
226
+ height.parseFeetInches("5 ft 10 in"); // => [5, 10]
227
+ height.parseFeetInches("5'10\""); // => [5, 10]
228
+ height.parseFeetInches("6 2"); // => [6, 2]
142
229
  ```
143
230
 
231
+
232
+
233
+
144
234
  ### `FeetInches` type
145
235
 
146
236
  Tuple type `[number, number]`: first element is feet, second is inches. Use it when passing or receiving values from `toFeetInches`, `toCentimeters`, and `parseFeetInches`.
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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,YAAA,YAAS;AACT,EAAAA,YAAA,cAAW;AAFD,SAAAA;AAAA,GAAA;AAKL,IAAK,YAAL,kBAAKC,eAAL;AACL,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,iBAAc;AAJJ,SAAAA;AAAA,GAAA;AAOL,IAAK,cAAL,kBAAKC,iBAAL;AACL,EAAAA,aAAA,QAAK;AACL,EAAAA,aAAA,QAAK;AACL,EAAAA,aAAA,OAAI;AACJ,EAAAA,aAAA,QAAK;AACL,EAAAA,aAAA,OAAI;AACJ,EAAAA,aAAA,QAAK;AACL,EAAAA,aAAA,WAAQ;AACR,EAAAA,aAAA,aAAU;AACV,EAAAA,aAAA,YAAS;AACT,EAAAA,aAAA,SAAM;AACN,EAAAA,aAAA,UAAO;AAXG,SAAAA;AAAA,GAAA;AAcL,IAAK,gBAAL,kBAAKC,mBAAL;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,QAAK;AACL,EAAAA,eAAA,gBAAa;AACb,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,SAAM;AAVI,SAAAA;AAAA,GAAA;;;AClBL,IAAM,oBAA2C;AAAA,EACtD,cAAe,GAAG;AAAA,EAClB,cAAe,GAAG;AAAA,EAClB,YAAc,GAAG;AAAA,EACjB,cAAe,GAAG;AAAA,EAClB,cAAiB,GAAG;AAAA,EACpB,cAAiB,GAAG;AAAA,EACpB,cAAiB,GAAG;AAAA,EACpB,cAAiB,GAAG;AAAA,EACpB,YAAc,GAAG;AAAA,EACjB,cAAe,GAAG;AAAA,EAClB,gBAAkB,GAAG;AAAA,EACrB,kBAAoB,GAAG;AAAA,EACvB,iBAAmB,GAAG;AAAA,EACtB,qBAAyB,GAAG;AAAA,EAC5B,cAAiB,GAAG;AAAA,EACpB,cAAiB,GAAG;AAAA,EACpB,cAAiB,GAAG;AAAA,EACpB,gBAAgB,GAAG;AAAA,EACnB,kBAAiB,GAAG;AAAA,EACpB,kBAAmB,GAAG;AAAA,EACtB,gBAAkB,GAAG;AACvB;AAEO,IAAM,iBAA2C;AAAA,EACtD,cAAe;AAAA,EACf,cAAe;AAAA,EACf,YAAc;AAAA,EACd,cAAe;AAAA,EACf,cAAiB;AAAA,EACjB,cAAiB;AAAA,EACjB,cAAiB;AAAA,EACjB,cAAiB;AAAA,EACjB,YAAc;AAAA,EACd,cAAe;AAAA,EACf,gBAAkB;AAAA,EAClB,kBAAoB;AAAA,EACpB,iBAAmB;AAAA,EACnB,qBAAyB;AAAA,EACzB,cAAiB;AAAA,EACjB,cAAiB;AAAA,EACjB,cAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,kBAAiB;AAAA,EACjB,kBAAmB;AAAA,EACnB,gBAAkB;AACpB;;;AC/CO,IAAM,8BAAgE;AAAA,EAC3E,kBAAoB,GAAG;AAAA,EACvB,iBAAmB,GAAG;AAAA,EACtB,qBAAyB,GAAG,IAAI;AAClC;AACO,IAAM,+BAAiE;AAAA,EAC5E,kBAAoB,GAAG;AAAA,EACvB,iBAAmB,GAAG;AAAA,EACtB,qBAAyB,GAAG,SAAU,KAAK,IAAK;AAClD;AAGO,IAAM,gCAAkE;AAAA,EAC7E,kBAAoB,GAAG;AAAA,EACvB,iBAAmB,GAAG;AAAA,EACtB,qBAAyB,GAAG,IAAI;AAClC;AAEO,IAAM,iCACX;AAAA,EACE,kBAAoB,GAAG;AAAA,EACvB,iBAAmB,GAAG;AAAA,EACtB,qBAAyB,GAAG;AAC9B;;;AC9BK,IAAM,QAAQ,CAAC,OAAe,kBAA2B;AAC9D,MAAI,kBAAkB,OAAW,QAAO;AAExC,SAAO,WAAW,MAAM,QAAQ,aAAa,CAAC;AAChD;;;ACUA,IAAM,gBAAgB,CAAC,EAAE,UAAU,MACjC,eAAe,SAAS;AAE1B,IAAM,WAAW,CAAC,OAAe,UAC/B,QAAQ,4BAA4B,KAAK,IACzC,6BAA6B,KAAK;AAEpC,IAAM,aAAa,CAAC,OAAe,UACjC,QAAQ,8BAA8B,KAAK,IAC3C,+BAA+B,KAAK;AAEtC,IAAM,qBAAqB,CACzB,OACA,EAAE,WAAW,SAAS,QAAQ,MACnB;AACX,MAAI,cAAc,QAAS,QAAO,MAAM,OAAO,OAAO;AAEtD,QAAM,gBAAgB,SAAS,OAAO,SAA6B;AAEnE,QAAM,SAAS,WAAW,eAAe,OAA2B;AAEpE,SAAO,MAAM,QAAQ,OAAO;AAC9B;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AACF;AAEA,IAAO,4BAAQ;;;AC3Cf,IAAM,UAAU;AAAA,EACd,0BACE;AACJ;AAEA,IAAO,kBAAQ;;;ACLR,IAAM,gBAAgB,CAAC,YAAoB,SAChD,QAAQ;AAAA,EAAQ;AAAA,EAAY,CAAC,OAAO,WAClC,KAAK,MAAM,MAAM,SAAY,KAAK,MAAM,IAAI;AAC9C;;;ACOF,IAAM,uBAAuB,CAAC,EAAE,WAAW,QAAQ,MAAsB;AACvE,QAAM,UAAU,eAAe,SAAS;AACxC,QAAM,QAAQ,eAAe,OAAO;AAEpC,QAAM,IAAI;AAAA,IACR;AAAA,MACE,gBAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,YAAY,CAAC,WAAkB,YAAmB;AACtD,MAAI,cAAc,QAAS,QAAO;AAElC,QAAM,kBAAkB,kBAAkB,SAAS;AACnD,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,SAAO,kBAAkB;AAC3B;AAEA,IAAM,sBAAsB,CAAC,EAAE,WAAW,QAAQ,MAAsB;AACtE,QAAM,UAAU,eAAe,SAAS;AACxC,QAAM,QAAQ,eAAe,OAAO;AAEpC,MAAI,YAAY,MAAO,sBAAqB,EAAE,WAAW,QAAQ,CAAC;AACpE;AAEA,IAAM,iBAAiB,CACrB,OACA,EAAE,WAAW,SAAS,QAAQ,MACnB;AACX,QAAM,SAAS,UAAU,WAAW,OAAO;AAE3C,SAAO,MAAM,QAAQ,QAAQ,OAAO;AACtC;AAEA,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AACF;AAEA,IAAO,wBAAQ;;;AClDf,IAAM,EAAE,gBAAAC,iBAAgB,qBAAAC,qBAAoB,IAAI;AAChD,IAAM,EAAE,eAAAC,gBAAe,oBAAAC,oBAAmB,IAAI;AAEvC,IAAM,UAAU,CAAC,OAAe,YAA4B;AACjE,EAAAF,qBAAoB,OAAO;AAE3B,MAAIC,eAAc,OAAO,GAAG;AAC1B,WAAOC,oBAAmB,OAAO,OAAO;AAAA,EAC1C;AAEA,SAAOH,gBAAe,OAAO,OAAO;AACtC;;;ACfA,IAAM,gBAAgB;AAEtB,IAAM,kBAAkB;AAAA,EACtB;AACF;AAEA,IAAO,2BAAQ;;;ACJf,IAAM,kBAAkB,CAAC,UAA8B;AAErD,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,GAAG,CAAC;AAE3C,QAAM,aAAa,MAChB,YAAY,EACZ,QAAQ,SAAS,IAAI,EACrB,QAAQ,WAAW,IAAI,EACvB,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,kBAAkB,IAAI,EAC9B,QAAQ,UAAU,GAAG,EACrB,KAAK;AAER,QAAM,cAAc,CAAC,UACnB,WAAW,SAAS,GAAG;AAEzB,QAAM,UAAU,WAAW,MAAM,eAAe;AAChD,QAAM,UAAU,WAAW,MAAM,eAAe;AAEhD,QAAM,OAAO,YAAY,UAAU,CAAC,CAAC;AACrC,QAAM,SAAS,YAAY,UAAU,CAAC,CAAC;AAEvC,MAAI,WAAW,SAAS;AACtB,WAAO,CAAC,MAAM,MAAM;AAAA,EACtB;AAEA,QAAM,CAAC,mBAAmB,kBAAkB,IAAI,WAAW;AAAA,IACzD;AAAA,EACF,KAAK,CAAC,KAAK,GAAG;AAEd,QAAM,cAAc,YAAY,iBAAiB;AACjD,QAAM,eAAe,YAAY,kBAAkB;AAEnD,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,WAAO,CAAC,aAAa,YAAY;AAAA,EACnC;AAEA,MAAI,WAAW,CAAC,SAAS;AACvB,WAAO,CAAC,MAAM,YAAY;AAAA,EAC5B;AAEA,MAAI,CAAC,WAAW,SAAS;AACvB,WAAO,CAAC,GAAG,MAAM;AAAA,EACnB;AAEA,SAAO,CAAC,GAAG,CAAC;AACd;AAEA,IAAM,cAAc;AAAA,EAClB;AACF;AAEA,IAAO,uBAAQ;;;AC5Cf,IAAM,EAAE,iBAAAI,iBAAgB,IAAI;AAC5B,IAAM,EAAE,eAAAC,eAAc,IAAI;AAE1B,IAAM,SAAN,MAAa;AAAA,EACX,aAAa,WAAmB,SAA8B;AAC5D,UAAM,cAAc,QAAQ,WAAW;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,OAAO,KAAK,MAAM,cAAcA,cAAa;AACnD,UAAM,SAAS,MAAM,cAAc,OAAOA,gBAAe,OAAO;AAEhE,WAAO,CAAC,MAAM,MAAM;AAAA,EACtB;AAAA,EAEA,cAAc,CAAC,MAAM,MAAM,GAAuB;AAChD,UAAM,cAAc,OAAOA,iBAAgB;AAE3C,WAAO,QAAQ,aAAa;AAAA,MAC1B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,OAA2B;AACzC,WAAOD,iBAAgB,KAAK;AAAA,EAC9B;AACF;AAEA,IAAM,SAAS,IAAI,OAAO;AAE1B,IAAO,iBAAQ;","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.2",
3
+ "version": "0.1.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -12,7 +12,9 @@
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",
@@ -26,7 +28,36 @@
26
28
  "type": "git",
27
29
  "url": "git+https://github.com/AndrewTkachuk42/uconvert.git"
28
30
  },
29
- "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
+ ],
30
61
  "author": "",
31
62
  "license": "MIT",
32
63
  "type": "commonjs",