@jclind/ingredient-parser 1.0.3 → 1.0.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.
@@ -0,0 +1,14 @@
1
+ import axios from 'axios';
2
+ export const mongoHttp = axios.create({
3
+ baseURL: 'https://us-east-1.aws.data.mongodb-api.com/app/prepify-ixumn/endpoint',
4
+ headers: {
5
+ 'Content-type': 'application/json',
6
+ },
7
+ });
8
+ export const spoonacularHttp = axios.create({
9
+ baseURL: 'https://api.spoonacular.com/food/ingredients/',
10
+ headers: {
11
+ 'Content-type': 'application/json',
12
+ },
13
+ });
14
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/api/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IACpC,OAAO,EACL,uEAAuE;IACzE,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAA;AACF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,+CAA+C;IACxD,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { mongoHttp, spoonacularHttp } from './http.js';
2
+ export const checkIngredient = async (name) => {
3
+ return await mongoHttp.get(`checkIngredient?name=${name}`);
4
+ };
5
+ export const searchIngredient = async (name, spoonacularAPIKey) => {
6
+ let searchedIngr;
7
+ try {
8
+ searchedIngr = await spoonacularHttp.get(`search?query=${name}&number=1&apiKey=${spoonacularAPIKey}`);
9
+ }
10
+ catch (error) {
11
+ const res = error.response.data;
12
+ if (res.code === 401) {
13
+ return { errorMsg: 'API Key Not Valid', error };
14
+ }
15
+ else {
16
+ return { errorMsg: 'Error Occurred, Please Try Again', error };
17
+ }
18
+ }
19
+ return searchedIngr;
20
+ };
21
+ export const getIngredientInformation = async (ingrId, spoonacularAPIKey) => {
22
+ let ingrData;
23
+ try {
24
+ ingrData = await spoonacularHttp.get(`${ingrId}/information?amount=1&apiKey=${spoonacularAPIKey}`);
25
+ }
26
+ catch (error) {
27
+ const res = error.response.data;
28
+ if (res.code === 401) {
29
+ return { errorMsg: 'API Key Not Valid', error };
30
+ }
31
+ else {
32
+ return { errorMsg: 'Error Occurred, Please Try Again', error };
33
+ }
34
+ }
35
+ return ingrData;
36
+ };
37
+ export const setMongoDBIngrData = async (data) => {
38
+ await mongoHttp.post(`addIngredient`, data);
39
+ };
40
+ //# sourceMappingURL=requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/api/requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEtD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IACpD,OAAO,MAAM,SAAS,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAA;AAC5D,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAY,EAAE,iBAAiB,EAAE,EAAE;IACxE,IAAI,YAAiB,CAAA;IACrB,IAAI;QACF,YAAY,GAAG,MAAM,eAAe,CAAC,GAAG,CACtC,gBAAgB,IAAI,oBAAoB,iBAAiB,EAAE,CAC5D,CAAA;KACF;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,GAAG,GAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAA;QACpC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YACpB,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAA;SAChD;aAAM;YACL,OAAO,EAAE,QAAQ,EAAE,kCAAkC,EAAE,KAAK,EAAE,CAAA;SAC/D;KACF;IACD,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,MAAc,EACd,iBAAiB,EACjB,EAAE;IACF,IAAI,QAAa,CAAA;IACjB,IAAI;QACF,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAClC,GAAG,MAAM,gCAAgC,iBAAiB,EAAE,CAC7D,CAAA;KACF;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,GAAG,GAAQ,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAA;QACpC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YACpB,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAA;SAChD;aAAM;YACL,OAAO,EAAE,QAAQ,EAAE,kCAAkC,EAAE,KAAK,EAAE,CAAA;SAC/D;KACF;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAC,IAAI,EAAC,EAAE;IAC7C,MAAM,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { checkIngredient } from '../api/requests.js';
2
+ import { getSpoonacularIngrData } from './getSpoonacularIngrData.js';
3
+ export async function getIngredientInfo(ingrName, spoonacularAPIKey) {
4
+ const ingrNameLower = ingrName.toLowerCase();
5
+ if (!ingrNameLower)
6
+ return;
7
+ const mongoIngrData = await checkIngredient(ingrNameLower);
8
+ if (!mongoIngrData.data) {
9
+ const ingrData = await getSpoonacularIngrData(ingrNameLower, spoonacularAPIKey);
10
+ return ingrData;
11
+ }
12
+ else {
13
+ return mongoIngrData.data;
14
+ }
15
+ }
16
+ //# sourceMappingURL=getIngredientInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getIngredientInfo.js","sourceRoot":"","sources":["../../src/funcs/getIngredientInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAEpE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,iBAAyB;IAEzB,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IAC5C,IAAI,CAAC,aAAa;QAAE,OAAM;IAC1B,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAA;IAC1D,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;QACvB,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAC3C,aAAa,EACb,iBAAiB,CAClB,CAAA;QACD,OAAO,QAAQ,CAAA;KAChB;SAAM;QACL,OAAO,aAAa,CAAC,IAAI,CAAA;KAC1B;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { getIngredientInformation, searchIngredient, setMongoDBIngrData, } from '../api/requests.js';
2
+ export async function getSpoonacularIngrData(name, spoonacularAPIKey) {
3
+ const searchedIngr = await searchIngredient(name, spoonacularAPIKey);
4
+ if (searchedIngr.error)
5
+ return searchedIngr;
6
+ const ingrId = searchedIngr?.data?.results[0]?.id ?? null;
7
+ if (!ingrId)
8
+ return { error: 'No Data Found', errorMsg: 'No Data Found' };
9
+ const ingrData = await getIngredientInformation(ingrId, spoonacularAPIKey);
10
+ if (ingrData.error)
11
+ return ingrData;
12
+ const mongoDBIngrData = { ...ingrData.data, name };
13
+ setMongoDBIngrData(mongoDBIngrData);
14
+ return mongoDBIngrData;
15
+ }
16
+ //# sourceMappingURL=getSpoonacularIngrData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSpoonacularIngrData.js","sourceRoot":"","sources":["../../src/funcs/getSpoonacularIngrData.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,iBAAyB;IAEzB,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;IACpE,IAAI,YAAY,CAAC,KAAK;QAAE,OAAO,YAAY,CAAA;IAC3C,MAAM,MAAM,GAAG,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAA;IAEzD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAA;IAEzE,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC1E,IAAI,QAAQ,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAA;IAEnC,MAAM,eAAe,GAAG,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAA;IAClD,kBAAkB,CAAC,eAAe,CAAC,CAAA;IACnC,OAAO,eAAe,CAAA;AACxB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { parse } from 'recipe-ingredient-parser-v3';
2
+ import { getIngredientInfo } from './getIngredientInfo.js';
3
+ const editIngredientString = (ingrStr) => {
4
+ // Get string after first comment in ingredient string
5
+ let ingr = ingrStr.split(',')[0]?.trim() ?? ingrStr;
6
+ let comment = ingrStr.split(',')[1]?.trim() ?? null;
7
+ const formattedIngrName = ingr
8
+ .trim()
9
+ .replace(/\s{2,}/g, ' ')
10
+ .replace(/,/g, '')
11
+ .replace(/^(fluid )/, '')
12
+ .replace(/^(fl )/, '')
13
+ .replace(/^(oz )/, '')
14
+ .trim();
15
+ return { formattedIngrName, comment };
16
+ };
17
+ const ingredientParser = async (ingrString, spoonacularAPIKey) => {
18
+ const parsedIngr = parse(ingrString, 'eng');
19
+ const formattedIngr = editIngredientString(parsedIngr.ingredient);
20
+ const { formattedIngrName, comment } = formattedIngr;
21
+ const updatedParsedIngr = {
22
+ ...parsedIngr,
23
+ ingredient: formattedIngrName,
24
+ comment,
25
+ };
26
+ if (formattedIngr) {
27
+ const ingrData = await getIngredientInfo(formattedIngrName, spoonacularAPIKey);
28
+ return { ...ingrData, parsedIngredient: updatedParsedIngr };
29
+ }
30
+ else {
31
+ return {
32
+ error: 'Ingredient not formatted correctly. Please pass ingredient comments/instructions after a comma',
33
+ parsedIngredient: updatedParsedIngr,
34
+ };
35
+ }
36
+ };
37
+ export default ingredientParser;
38
+ //# sourceMappingURL=ingredientParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingredientParser.js","sourceRoot":"","sources":["../../src/funcs/ingredientParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC/C,sDAAsD;IACtD,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAA;IACnD,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IAEnD,MAAM,iBAAiB,GAAG,IAAI;SAC3B,IAAI,EAAE;SACN,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,IAAI,EAAE,CAAA;IAET,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,KAAK,EAC5B,UAAkB,EAClB,iBAAyB,EACX,EAAE;IAChB,MAAM,UAAU,GAAqB,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IAC7D,MAAM,aAAa,GAAG,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IACjE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,aAAa,CAAA;IAEpD,MAAM,iBAAiB,GAAG;QACxB,GAAG,UAAU;QACb,UAAU,EAAE,iBAAiB;QAC7B,OAAO;KACR,CAAA;IACD,IAAI,aAAa,EAAE;QACjB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CACtC,iBAAiB,EACjB,iBAAiB,CAClB,CAAA;QACD,OAAO,EAAE,GAAG,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAA;KAC5D;SAAM;QACL,OAAO;YACL,KAAK,EACH,gGAAgG;YAClG,gBAAgB,EAAE,iBAAiB;SACpC,CAAA;KACF;AACH,CAAC,CAAA;AAED,eAAe,gBAAgB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import ingredientParser from './funcs/ingredientParser.js';
2
+ export default ingredientParser;
3
+ // export { default as ingredientParser } from './funcs/ingredientParser.js'
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,6BAA6B,CAAA;AAC1D,eAAe,gBAAgB,CAAA;AAC/B,4EAA4E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,10 +1,15 @@
1
1
  {
2
2
  "name": "@jclind/ingredient-parser",
3
- "version": "1.0.3",
4
- "description": "Parses given sentence including ingredient information and attemps to return quantity, measurement and ingredient",
5
- "main": "index.js",
3
+ "version": "1.0.4",
4
+ "description": "Parses given sentence including ingredient information and attemps to return quantity, measurement and ingredient data",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist"
10
+ ],
6
11
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
12
+ "build": "tsc"
8
13
  },
9
14
  "repository": {
10
15
  "type": "git",
@@ -17,8 +22,10 @@
17
22
  },
18
23
  "homepage": "https://github.com/jclind/ingredient-parser#readme",
19
24
  "dependencies": {
25
+ "@types/axios": "^0.14.0",
20
26
  "dotenv": "^16.0.3",
21
27
  "parse-ingredient": "^0.6.0",
22
- "recipe-ingredient-parser-v3": "^1.2.18"
28
+ "recipe-ingredient-parser-v3": "^1.2.18",
29
+ "typescript": "^4.9.4"
23
30
  }
24
31
  }
package/index.js DELETED
@@ -1,101 +0,0 @@
1
- const { parse } = require('recipe-ingredient-parser-v3')
2
- const axios = require('axios')
3
-
4
- const mongoHttp = axios.create({
5
- baseURL:
6
- 'https://us-east-1.aws.data.mongodb-api.com/app/prepify-ixumn/endpoint',
7
- headers: {
8
- 'Content-type': 'application/json',
9
- },
10
- })
11
- const spoonacularHttp = axios.create({
12
- baseURL: 'https://api.spoonacular.com/food/ingredients/',
13
- headers: {
14
- 'Content-type': 'application/json',
15
- },
16
- })
17
-
18
- const ingredientParser = async (ingrString, spoonacularAPIKey) => {
19
- const parsedIngr = parse(ingrString, 'eng')
20
- const formattedIngr = parsedIngr.ingredient
21
- .trim()
22
- .replace(/\s{2,}/g, ' ')
23
- .replace(/,/g, '')
24
- .replace(/^(fluid )/, '')
25
- .replace(/^(fl )/, '')
26
- .replace(/^(oz )/, '')
27
- .trim()
28
- if (formattedIngr) {
29
- const ingrData = await getIngredientInfo(formattedIngr, spoonacularAPIKey)
30
- return ingrData
31
- } else {
32
- return null
33
- }
34
- }
35
-
36
- async function getIngredientInfo(ingrName, spoonacularAPIKey) {
37
- const ingrNameLower = ingrName.toLowerCase()
38
- if (!ingrNameLower) return
39
- const mongoIngrData = await checkIngredient(ingrNameLower)
40
- if (!mongoIngrData.data) {
41
- const ingrData = await getSpoonacularIngrData(
42
- ingrNameLower,
43
- spoonacularAPIKey
44
- )
45
- return ingrData
46
- } else {
47
- return mongoIngrData.data
48
- }
49
- }
50
-
51
- async function checkIngredient(name) {
52
- return await mongoHttp.get(`checkIngredient?name=${name}`)
53
- }
54
- async function getSpoonacularIngrData(name, spoonacularAPIKey) {
55
- let searchedIngr = null
56
- try {
57
- searchedIngr = await spoonacularHttp.get(
58
- `search?query=${name}&number=1&apiKey=${spoonacularAPIKey}`
59
- )
60
- } catch (error) {
61
- const res = error.response.data
62
- if (res.code === 401) {
63
- return { errorMsg: 'API Key Not Valid', error }
64
- } else {
65
- return { errorMsg: 'Error Occurred, Please Try Again', error }
66
- }
67
- }
68
-
69
- if (
70
- !searchedIngr.data ||
71
- !searchedIngr.data.results ||
72
- searchedIngr.data.results.length <= 0
73
- ) {
74
- return null
75
- }
76
-
77
- const ingrId = searchedIngr.data.results[0].id
78
-
79
- let ingrData = null
80
- try {
81
- ingrData = await spoonacularHttp.get(
82
- `${ingrId}/information?amount=1&apiKey=${process.env.SPOONACULAR_API_KEY}`
83
- )
84
- } catch (error) {
85
- if (res.code === 401) {
86
- return { errorMsg: 'API Key Not Valid', error }
87
- } else {
88
- return { errorMsg: 'Error Occurred, Please Try Again', error }
89
- }
90
- }
91
- const mongoDBIngrData = { ...ingrData.data, name }
92
- setMongoDBIngrData(mongoDBIngrData)
93
- return mongoDBIngrData
94
- }
95
-
96
- async function setMongoDBIngrData(data) {
97
- await mongoHttp.post(`addIngredient`, data)
98
- return data
99
- }
100
-
101
- module.exports = ingredientParser