@recipe-book/core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/{chunk-2WUP3JQY.mjs → chunk-3FFMHRB7.mjs} +3 -2
  2. package/dist/{chunk-IEYO4T4T.mjs → chunk-4EHNJLGI.mjs} +9 -8
  3. package/dist/chunk-4IA5EEKI.mjs +81 -0
  4. package/dist/chunk-4TATADPT.mjs +51 -0
  5. package/dist/chunk-6GI5KLI4.mjs +22 -0
  6. package/dist/chunk-6YYQ4RYZ.mjs +26 -0
  7. package/dist/chunk-7BBUDI2L.mjs +0 -0
  8. package/dist/chunk-7KEMNCV7.mjs +26 -0
  9. package/dist/chunk-7MMJZZ7Z.mjs +75 -0
  10. package/dist/chunk-BES4V7DM.mjs +26 -0
  11. package/dist/{chunk-OBJ5JUVG.mjs → chunk-BRDXRIAH.mjs} +5 -4
  12. package/dist/chunk-CFR2ZBPB.mjs +77 -0
  13. package/dist/chunk-DYMNVFL2.mjs +78 -0
  14. package/dist/{chunk-NJQRYZC2.mjs → chunk-F6AQKXJU.mjs} +7 -4
  15. package/dist/chunk-FW4M2R43.mjs +51 -0
  16. package/dist/chunk-GCCEDUST.mjs +75 -0
  17. package/dist/chunk-GE7KBYZR.mjs +26 -0
  18. package/dist/chunk-GN7ZDGYC.mjs +51 -0
  19. package/dist/chunk-GOO2SCQX.mjs +75 -0
  20. package/dist/chunk-HAVKBQLH.mjs +51 -0
  21. package/dist/chunk-HCBIPANU.mjs +50 -0
  22. package/dist/chunk-IEBAGBS7.mjs +51 -0
  23. package/dist/chunk-IQ6WN2V4.mjs +75 -0
  24. package/dist/chunk-JB4Z2FR7.mjs +77 -0
  25. package/dist/chunk-JMTQOTBM.mjs +75 -0
  26. package/dist/{chunk-JPGZ2MYF.mjs → chunk-JRO6JUES.mjs} +9 -6
  27. package/dist/chunk-KH3SRXET.mjs +52 -0
  28. package/dist/chunk-KNZMCAQZ.mjs +51 -0
  29. package/dist/chunk-LEBGCVCJ.mjs +75 -0
  30. package/dist/chunk-MAHWFCIL.mjs +51 -0
  31. package/dist/chunk-MPH76SLC.mjs +51 -0
  32. package/dist/chunk-MQGMFBJQ.mjs +26 -0
  33. package/dist/chunk-NMIVG7T4.mjs +6 -0
  34. package/dist/chunk-Q3TT3AZ4.mjs +26 -0
  35. package/dist/chunk-QY5HJQIL.mjs +51 -0
  36. package/dist/chunk-RCPLSNKM.mjs +1 -0
  37. package/dist/chunk-UQ3EUYFR.mjs +1 -0
  38. package/dist/chunk-WSW6FMUL.mjs +51 -0
  39. package/dist/chunk-WU55SBIV.mjs +75 -0
  40. package/dist/chunk-XINK45P3.mjs +51 -0
  41. package/dist/chunk-XNOHIWI3.mjs +1 -0
  42. package/dist/chunk-YHBXEVUX.mjs +51 -0
  43. package/dist/chunk-YSZSCEI7.mjs +75 -0
  44. package/dist/const/conversion.d.mts +2 -2
  45. package/dist/const/conversion.d.ts +2 -2
  46. package/dist/index.d.mts +1 -1
  47. package/dist/index.d.ts +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/index.mjs +1 -1
  50. package/dist/lib/ingredient.d.mts +3 -2
  51. package/dist/lib/ingredient.d.ts +3 -2
  52. package/dist/lib/ingredient.js +1 -1
  53. package/dist/lib/ingredient.mjs +1 -1
  54. package/dist/lib/recipe.d.mts +4 -2
  55. package/dist/lib/recipe.d.ts +4 -2
  56. package/dist/lib/recipe.js +1 -1
  57. package/dist/lib/recipe.mjs +1 -1
  58. package/dist/lib/unit.d.mts +5 -4
  59. package/dist/lib/unit.d.ts +5 -4
  60. package/dist/lib/unit.js +1 -1
  61. package/dist/lib/unit.mjs +1 -1
  62. package/dist/types.d.mts +17 -12
  63. package/dist/types.d.ts +17 -12
  64. package/dist/types.js +1 -1
  65. package/package.json +6 -4
  66. package/dist/chunk-4AN32V3Z.mjs +0 -1
  67. package/dist/chunk-5ZCZ6LQB.mjs +0 -1
  68. package/dist/chunk-BOG6H6FE.mjs +0 -1
  69. package/dist/chunk-CEPTOQUR.mjs +0 -1
  70. package/dist/chunk-EKLUF5ED.mjs +0 -1
  71. package/dist/chunk-LLHRB3T7.mjs +0 -1
  72. package/dist/chunk-MUILH2IA.mjs +0 -1
  73. package/dist/chunk-YHBHNGQX.mjs +0 -1
@@ -0,0 +1,75 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (serves) => serves === void 0 || serves > 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ determineMeasurementSystem(config) {
35
+ const { ingredients } = config;
36
+ const hasMetric = ingredients.some(
37
+ (ingredient) => ingredient.amount.unit === "g"
38
+ );
39
+ const hasImperial = ingredients.some(
40
+ (ingredient) => ingredient.amount.unit === "oz" || ingredient.amount.unit === "fl oz" || ingredient.amount.unit === "lb"
41
+ );
42
+ if (hasMetric && hasImperial) {
43
+ return void 0;
44
+ }
45
+ if (hasMetric) {
46
+ return "metric";
47
+ }
48
+ if (hasImperial) {
49
+ return "us-customary";
50
+ }
51
+ return void 0;
52
+ }
53
+ create(config) {
54
+ this.validateConfig(config);
55
+ return {
56
+ name: config.name,
57
+ ingredients: config.ingredients,
58
+ // optional
59
+ thumbnail: config.thumbnail,
60
+ serves: config.serves ?? 1,
61
+ instructions: config.instructions ?? [],
62
+ // computed
63
+ measurements: (
64
+ // if the user has specified a measurement system, use that
65
+ // otherwise, determine the measurement system based on the ingredients
66
+ config.measurements ?? this.determineMeasurementSystem(config)
67
+ )
68
+ };
69
+ }
70
+ };
71
+ var RecipeUtils = new RecipeUtilsImpl();
72
+
73
+ export {
74
+ RecipeUtils
75
+ };
@@ -0,0 +1,26 @@
1
+ import {
2
+ UnitUtils
3
+ } from "./chunk-4EHNJLGI.mjs";
4
+
5
+ // src/lib/ingredient.ts
6
+ var IngredientUtilsImpl = class {
7
+ convert(ingredient, to) {
8
+ const amount = UnitUtils.convert(
9
+ ingredient.amount.value,
10
+ ingredient.amount.unit,
11
+ to
12
+ );
13
+ return {
14
+ ...ingredient,
15
+ amount: {
16
+ value: amount,
17
+ unit: to
18
+ }
19
+ };
20
+ }
21
+ };
22
+ var IngredientUtils = new IngredientUtilsImpl();
23
+
24
+ export {
25
+ IngredientUtils
26
+ };
@@ -0,0 +1,51 @@
1
+ import {
2
+ VOLUME_CONVERSION_TABLE,
3
+ WEIGHT_CONVERSION_TABLE
4
+ } from "./chunk-V26OCCTL.mjs";
5
+ import {
6
+ UNITS
7
+ } from "./chunk-YZB3IG47.mjs";
8
+ import {
9
+ assert
10
+ } from "./chunk-YY3SUQ7P.mjs";
11
+
12
+ // src/lib/unit.ts
13
+ var UnitUtilsImpl = class {
14
+ getUnit(unit) {
15
+ const match = UNITS.find((u) => u.abbreviation === unit || u.name === unit);
16
+ assert(match, (match2) => !!match2, `No unit found for key: ${unit}`);
17
+ return match;
18
+ }
19
+ getConversionRatio(from, to) {
20
+ const { type, abbreviation } = this.getUnit(from);
21
+ const conversionTable = type === "volume" ? VOLUME_CONVERSION_TABLE : WEIGHT_CONVERSION_TABLE;
22
+ const lookupTable = conversionTable[abbreviation];
23
+ const toUnit = to === "metric" ? type === "volume" ? "L" : "g" : to;
24
+ assert(
25
+ lookupTable,
26
+ (lookupTable2) => !!lookupTable2[toUnit],
27
+ `No conversion table available for unit ${from} to ${to}`
28
+ );
29
+ return lookupTable[to];
30
+ }
31
+ /**
32
+ * Converts a number from one unit to another
33
+ *
34
+ * @param amount - The amount to convert
35
+ * @param from - The unit to convert from
36
+ * @param to - The unit to convert to
37
+ * @returns - The converted amount
38
+ */
39
+ convert(amount, from, to) {
40
+ if (from === to) {
41
+ return amount;
42
+ }
43
+ const ratio = this.getConversionRatio(from, to);
44
+ return amount * ratio;
45
+ }
46
+ };
47
+ var UnitUtils = new UnitUtilsImpl();
48
+
49
+ export {
50
+ UnitUtils
51
+ };
@@ -0,0 +1,75 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (serves) => serves === void 0 || serves > 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ determineMeasurementSystem(config) {
35
+ const { ingredients } = config;
36
+ const hasMetric = ingredients.some(
37
+ (ingredient) => ingredient.amount.unit === "g"
38
+ );
39
+ const hasImperial = ingredients.some(
40
+ (ingredient) => ingredient.amount.unit === "oz" || ingredient.amount.unit === "fl oz"
41
+ );
42
+ if (hasMetric && hasImperial) {
43
+ return void 0;
44
+ }
45
+ if (hasMetric) {
46
+ return "metric";
47
+ }
48
+ if (hasImperial) {
49
+ return "us-customary";
50
+ }
51
+ return void 0;
52
+ }
53
+ create(config) {
54
+ this.validateConfig(config);
55
+ return {
56
+ name: config.name,
57
+ ingredients: config.ingredients,
58
+ // optional
59
+ thumbnail: config.thumbnail,
60
+ serves: config.serves ?? 1,
61
+ instructions: config.instructions ?? [],
62
+ // computed
63
+ measurements: (
64
+ // if the user has specified a measurement system, use that
65
+ // otherwise, determine the measurement system based on the ingredients
66
+ config.measurements ?? this.determineMeasurementSystem(config)
67
+ )
68
+ };
69
+ }
70
+ };
71
+ var RecipeUtils = new RecipeUtilsImpl();
72
+
73
+ export {
74
+ RecipeUtils
75
+ };
@@ -0,0 +1,51 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (servings) => servings !== void 0 && servings <= 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ create(config) {
35
+ this.validateConfig(config);
36
+ return {
37
+ name: config.name,
38
+ ingredients: config.ingredients,
39
+ units: config.units,
40
+ // optional
41
+ thumbnail: config.thumbnail,
42
+ serves: config.serves ?? 1,
43
+ instructions: config.instructions ?? []
44
+ };
45
+ }
46
+ };
47
+ var RecipeUtils = new RecipeUtilsImpl();
48
+
49
+ export {
50
+ RecipeUtils
51
+ };
@@ -0,0 +1,50 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (serves) => serves === void 0 || serves > 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ create(config) {
35
+ this.validateConfig(config);
36
+ return {
37
+ name: config.name,
38
+ ingredients: config.ingredients,
39
+ // optional
40
+ thumbnail: config.thumbnail,
41
+ serves: config.serves ?? 1,
42
+ instructions: config.instructions ?? []
43
+ };
44
+ }
45
+ };
46
+ var RecipeUtils = new RecipeUtilsImpl();
47
+
48
+ export {
49
+ RecipeUtils
50
+ };
@@ -0,0 +1,51 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ static scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ static validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.servings,
25
+ (servings) => servings !== void 0 && servings <= 0,
26
+ msg("Recipe has less than one serving")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ static create(config) {
35
+ this.validateConfig(config);
36
+ return {
37
+ name: config.name,
38
+ ingredients: config.ingredients,
39
+ units: config.units,
40
+ // optional
41
+ thumbnail: config.thumbnail,
42
+ servings: config.servings ?? 1,
43
+ instructions: config.instructions ?? []
44
+ };
45
+ }
46
+ };
47
+ var RecipeUtils = new RecipeUtilsImpl();
48
+
49
+ export {
50
+ RecipeUtils
51
+ };
@@ -0,0 +1,75 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (serves) => serves === void 0 || serves > 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ determineMeasurementSystem(config) {
35
+ const { ingredients } = config;
36
+ const hasMetric = ingredients.some(
37
+ (ingredient) => ingredient.amount.unit === "g"
38
+ );
39
+ const hasImperial = ingredients.some(
40
+ (ingredient) => ingredient.amount.unit === "oz" || ingredient.amount.unit === "fl oz" || ingredient.amount.unit === "lb" || ingredient.amount.unit === "cup"
41
+ );
42
+ if (hasMetric && hasImperial) {
43
+ return void 0;
44
+ }
45
+ if (hasMetric) {
46
+ return "metric";
47
+ }
48
+ if (hasImperial) {
49
+ return "us-customary";
50
+ }
51
+ return void 0;
52
+ }
53
+ create(config) {
54
+ this.validateConfig(config);
55
+ return {
56
+ name: config.name,
57
+ ingredients: config.ingredients,
58
+ // optional
59
+ thumbnail: config.thumbnail,
60
+ serves: config.serves ?? 1,
61
+ instructions: config.instructions ?? [],
62
+ // computed
63
+ measurements: (
64
+ // if the user has specified a measurement system, use that
65
+ // otherwise, determine the measurement system based on the ingredients
66
+ config.measurements ?? this.determineMeasurementSystem(config)
67
+ )
68
+ };
69
+ }
70
+ };
71
+ var RecipeUtils = new RecipeUtilsImpl();
72
+
73
+ export {
74
+ RecipeUtils
75
+ };
@@ -0,0 +1,77 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (serves) => serves === void 0 || serves > 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ determineMeasurementSystem(config) {
35
+ const { ingredients } = config;
36
+ const hasMetric = ingredients.some(
37
+ (ingredient) => {
38
+ var _a;
39
+ return (_a = ingredient.conversion) == null ? void 0 : _a.metric;
40
+ }
41
+ );
42
+ const hasImperial = ingredients.some(
43
+ (ingredient) => {
44
+ var _a;
45
+ return (_a = ingredient.conversion) == null ? void 0 : _a["us-customary"];
46
+ }
47
+ );
48
+ if (hasMetric && hasImperial) {
49
+ return void 0;
50
+ }
51
+ if (hasMetric) {
52
+ return "metric";
53
+ }
54
+ if (hasImperial) {
55
+ return "us-customary";
56
+ }
57
+ return void 0;
58
+ }
59
+ create(config) {
60
+ this.validateConfig(config);
61
+ return {
62
+ name: config.name,
63
+ ingredients: config.ingredients,
64
+ // optional
65
+ thumbnail: config.thumbnail,
66
+ serves: config.serves ?? 1,
67
+ instructions: config.instructions ?? [],
68
+ // computed
69
+ measurements: config.measurements ?? this.determineMeasurementSystem(config)
70
+ };
71
+ }
72
+ };
73
+ var RecipeUtils = new RecipeUtilsImpl();
74
+
75
+ export {
76
+ RecipeUtils
77
+ };
@@ -0,0 +1,75 @@
1
+ import {
2
+ warn
3
+ } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
+
8
+ // src/lib/recipe.ts
9
+ var RecipeUtilsImpl = class {
10
+ scopedMessageFactory(recipe) {
11
+ return (message) => `${recipe.name}: ${message}`;
12
+ }
13
+ validateConfig(config) {
14
+ if (!IS_DEV) {
15
+ return;
16
+ }
17
+ const msg = this.scopedMessageFactory(config);
18
+ warn(
19
+ config.instructions,
20
+ (instructions) => instructions.length > 0,
21
+ msg("Recipe has no instructions")
22
+ );
23
+ warn(
24
+ config.serves,
25
+ (serves) => serves === void 0 || serves > 0,
26
+ msg("Recipe serves less than 1 person")
27
+ );
28
+ warn(
29
+ config.ingredients,
30
+ (ingredients) => ingredients.length > 0,
31
+ msg("Recipe has no ingredients")
32
+ );
33
+ }
34
+ determineMeasurementSystem(config) {
35
+ const { ingredients } = config;
36
+ const hasMetric = ingredients.some(
37
+ (ingredient) => {
38
+ var _a;
39
+ return (_a = ingredient.conversion) == null ? void 0 : _a.metric;
40
+ }
41
+ );
42
+ const hasImperial = ingredients.some(
43
+ (ingredient) => {
44
+ var _a;
45
+ return (_a = ingredient.conversion) == null ? void 0 : _a["us-customary"];
46
+ }
47
+ );
48
+ if (hasMetric && hasImperial) {
49
+ return "both";
50
+ }
51
+ if (hasMetric) {
52
+ return "metric";
53
+ }
54
+ if (hasImperial) {
55
+ return "us-customary";
56
+ }
57
+ return "none";
58
+ }
59
+ create(config) {
60
+ this.validateConfig(config);
61
+ return {
62
+ name: config.name,
63
+ ingredients: config.ingredients,
64
+ // optional
65
+ thumbnail: config.thumbnail,
66
+ serves: config.serves ?? 1,
67
+ instructions: config.instructions ?? []
68
+ };
69
+ }
70
+ };
71
+ var RecipeUtils = new RecipeUtilsImpl();
72
+
73
+ export {
74
+ RecipeUtils
75
+ };
@@ -1,12 +1,12 @@
1
- import {
2
- IS_DEV
3
- } from "./chunk-XV4QN4LA.mjs";
4
1
  import {
5
2
  warn
6
3
  } from "./chunk-YY3SUQ7P.mjs";
4
+ import {
5
+ IS_DEV
6
+ } from "./chunk-XV4QN4LA.mjs";
7
7
 
8
8
  // src/lib/recipe.ts
9
- var RecipeUtils = class {
9
+ var RecipeUtilsImpl = class {
10
10
  scopedMessageFactory(recipe) {
11
11
  return (message) => `${recipe.name}: ${message}`;
12
12
  }
@@ -36,12 +36,15 @@ var RecipeUtils = class {
36
36
  return {
37
37
  name: config.name,
38
38
  ingredients: config.ingredients,
39
+ units: config.units,
40
+ // optional
41
+ thumbnail: config.thumbnail,
39
42
  servings: config.servings ?? 1,
40
- instructions: config.instructions ?? [],
41
- units: config.units
43
+ instructions: config.instructions ?? []
42
44
  };
43
45
  }
44
46
  };
47
+ var RecipeUtils = new RecipeUtilsImpl();
45
48
 
46
49
  export {
47
50
  RecipeUtils
@@ -0,0 +1,52 @@
1
+ import {
2
+ VOLUME_CONVERSION_TABLE,
3
+ WEIGHT_CONVERSION_TABLE
4
+ } from "./chunk-V26OCCTL.mjs";
5
+ import {
6
+ UNITS
7
+ } from "./chunk-YZB3IG47.mjs";
8
+ import {
9
+ assert
10
+ } from "./chunk-YY3SUQ7P.mjs";
11
+
12
+ // src/lib/unit.ts
13
+ var UnitUtilsImpl = class {
14
+ getUnit(unit) {
15
+ const match = UNITS.find((u) => u.abbreviation === unit || u.name === unit);
16
+ assert(match, (match2) => !!match2, `No unit found for key: ${unit}`);
17
+ return match;
18
+ }
19
+ getConversionRatio(from, to) {
20
+ const { type, abbreviation } = this.getUnit(from);
21
+ const conversionTable = type === "volume" ? VOLUME_CONVERSION_TABLE : WEIGHT_CONVERSION_TABLE;
22
+ const lookupTable = conversionTable[abbreviation];
23
+ const toUnit = to === "metric" ? type === "volume" ? "L" : "g" : to;
24
+ assert(
25
+ lookupTable,
26
+ (lookupTable2) => !!lookupTable2[toUnit],
27
+ `No conversion table available for unit ${from} to ${to}`
28
+ );
29
+ return lookupTable[toUnit];
30
+ }
31
+ /**
32
+ * Converts a number from one unit to another
33
+ *
34
+ * @param amount - The amount to convert
35
+ * @param from - The unit to convert from
36
+ * @param to - The unit to convert to
37
+ * @returns - The converted amount
38
+ */
39
+ convert(amount, from, to) {
40
+ if (from === to) {
41
+ return amount;
42
+ }
43
+ const ratio = this.getConversionRatio(from, to);
44
+ const conversion = amount * ratio;
45
+ return Math.round(conversion * 100) / 100;
46
+ }
47
+ };
48
+ var UnitUtils = new UnitUtilsImpl();
49
+
50
+ export {
51
+ UnitUtils
52
+ };