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