@jclind/ingredient-parser 1.0.2 → 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.2",
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/http-common.ts DELETED
@@ -1,16 +0,0 @@
1
- const axios = require('axios')
2
-
3
- const mongoHttp = axios.create({
4
- baseURL:
5
- 'https://us-east-1.aws.data.mongodb-api.com/app/prepify-ixumn/endpoint',
6
- headers: {
7
- 'Content-type': 'application/json',
8
- },
9
- })
10
- const spoonacularHttp = axios.create({
11
- baseURL: 'https://api.spoonacular.com/food/ingredients/',
12
- headers: {
13
- 'Content-type': 'application/json',
14
- },
15
- })
16
- module.exports = { mongoHttp, spoonacularHttp }
package/index.js DELETED
@@ -1,87 +0,0 @@
1
- const { mongoHttp, spoonacularHttp } = require('./http-common.ts')
2
- const { parse } = require('recipe-ingredient-parser-v3')
3
-
4
- const ingredientParser = async (ingrString, spoonacularAPIKey) => {
5
- const parsedIngr = parse(ingrString, 'eng')
6
- const formattedIngr = parsedIngr.ingredient
7
- .trim()
8
- .replace(/\s{2,}/g, ' ')
9
- .replace(/,/g, '')
10
- .replace(/^(fluid )/, '')
11
- .replace(/^(fl )/, '')
12
- .replace(/^(oz )/, '')
13
- .trim()
14
- if (formattedIngr) {
15
- const ingrData = await getIngredientInfo(formattedIngr, spoonacularAPIKey)
16
- return ingrData
17
- } else {
18
- return null
19
- }
20
- }
21
-
22
- async function getIngredientInfo(ingrName, spoonacularAPIKey) {
23
- const ingrNameLower = ingrName.toLowerCase()
24
- if (!ingrNameLower) return
25
- const mongoIngrData = await checkIngredient(ingrNameLower)
26
- if (!mongoIngrData.data) {
27
- const ingrData = await getSpoonacularIngrData(
28
- ingrNameLower,
29
- spoonacularAPIKey
30
- )
31
- return ingrData
32
- } else {
33
- return mongoIngrData.data
34
- }
35
- }
36
-
37
- async function checkIngredient(name) {
38
- return await mongoHttp.get(`checkIngredient?name=${name}`)
39
- }
40
- async function getSpoonacularIngrData(name, spoonacularAPIKey) {
41
- let searchedIngr = null
42
- try {
43
- searchedIngr = await spoonacularHttp.get(
44
- `search?query=${name}&number=1&apiKey=${spoonacularAPIKey}`
45
- )
46
- } catch (error) {
47
- const res = error.response.data
48
- if (res.code === 401) {
49
- return { errorMsg: 'API Key Not Valid', error }
50
- } else {
51
- return { errorMsg: 'Error Occurred, Please Try Again', error }
52
- }
53
- }
54
-
55
- if (
56
- !searchedIngr.data ||
57
- !searchedIngr.data.results ||
58
- searchedIngr.data.results.length <= 0
59
- ) {
60
- return null
61
- }
62
-
63
- const ingrId = searchedIngr.data.results[0].id
64
-
65
- let ingrData = null
66
- try {
67
- ingrData = await spoonacularHttp.get(
68
- `${ingrId}/information?amount=1&apiKey=${process.env.SPOONACULAR_API_KEY}`
69
- )
70
- } catch (error) {
71
- if (res.code === 401) {
72
- return { errorMsg: 'API Key Not Valid', error }
73
- } else {
74
- return { errorMsg: 'Error Occurred, Please Try Again', error }
75
- }
76
- }
77
- const mongoDBIngrData = { ...ingrData.data, name }
78
- setMongoDBIngrData(mongoDBIngrData)
79
- return mongoDBIngrData
80
- }
81
-
82
- async function setMongoDBIngrData(data) {
83
- await mongoHttp.post(`addIngredient`, data)
84
- return data
85
- }
86
-
87
- module.exports = ingredientParser