├── .gitignore ├── README.md ├── fetch.js ├── index.js ├── now.json ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .vercel 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unofficial Vocabulary.com API 2 | 3 | ## Update 4 | 5 | 👉🏼 Added new endpoint /words-full 6 | 7 | It is now live here https://vocabulary.vercel.app 8 | 9 | Used this as backend to https://dictionary.surge.sh 10 | 11 | note: initial load may take some time as now.sh starts it up from sleep 12 | 13 | 14 | ## get explanation of a single word 15 | 16 | https://vocabulary.vercel.app/word/google 17 | 18 | ## get list of matching words 19 | 20 | https://vocabulary.vercel.app/words/goo 21 | 22 | supports query param pageOffset for pagination (ex: ?pageOffset=20) 23 | 24 | ## get list of matching words with full data 25 | 26 | https://vocabulary.vercel.app/words-full/cat 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /fetch.js: -------------------------------------------------------------------------------- 1 | const { parse } = require("node-html-parser"); 2 | const execSync = require('child_process').execSync; 3 | 4 | // Constants 5 | const TIMEOUT_MS = 10000; 6 | const BASE_URL = 'https://www.vocabulary.com/dictionary'; 7 | 8 | // Validation 9 | function validateWord(word) { 10 | if (!word || typeof word !== 'string') { 11 | throw new Error('Invalid word parameter'); 12 | } 13 | if (word.length > 100) { 14 | throw new Error('Word parameter too long'); 15 | } 16 | return word.trim(); 17 | } 18 | 19 | // Utility function for making curl requests 20 | async function fetchWithCurl(url) { 21 | const curlCommand = `curl '${url}' \ 22 | -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ 23 | -H 'accept-language: en-GB,en-US;q=0.9,en;q=0.8' \ 24 | -H 'cache-control: no-cache' \ 25 | -H 'pragma: no-cache' \ 26 | -H 'priority: u=0, i' \ 27 | -H 'sec-ch-ua: "Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"' \ 28 | -H 'sec-ch-ua-mobile: ?1' \ 29 | -H 'sec-ch-ua-platform: "Android"' \ 30 | -H 'sec-fetch-dest: document' \ 31 | -H 'sec-fetch-mode: navigate' \ 32 | -H 'sec-fetch-site: none' \ 33 | -H 'sec-fetch-user: ?1' \ 34 | -H 'upgrade-insecure-requests: 1' \ 35 | -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36' \ 36 | --max-time ${TIMEOUT_MS / 1000}`; 37 | 38 | try { 39 | const response = await new Promise((resolve, reject) => { 40 | try { 41 | const result = execSync(curlCommand); 42 | resolve(result.toString()); 43 | } catch (error) { 44 | reject(new Error(`Curl request failed: ${error.message}`)); 45 | } 46 | }); 47 | return response; 48 | } catch (error) { 49 | throw new Error(`Request failed: ${error.message}`); 50 | } 51 | } 52 | 53 | // Error handler wrapper 54 | const asyncHandler = (fn) => (req, res) => { 55 | Promise.resolve(fn(req, res)).catch((error) => { 56 | console.error(`API Error: ${error.message}`); 57 | res.status(500).json({ 58 | success: false, 59 | error: error.message 60 | }); 61 | }); 62 | }; 63 | 64 | // API Endpoints 65 | exports.fetchSingleWord = asyncHandler(async (req, res) => { 66 | const word = validateWord(req.params.word); 67 | const data = await fetchWithCurl( 68 | `${BASE_URL}/definition.ajax?search=${encodeURIComponent(word)}&lang=en` 69 | ); 70 | 71 | const root = parse(data); 72 | let definition; 73 | 74 | try { 75 | definition = root.querySelector(".short")?.rawText || 76 | root.querySelector(".long")?.rawText; 77 | 78 | if (!definition) { 79 | throw new Error('Definition not found'); 80 | } 81 | 82 | res.json({ 83 | success: true, 84 | data: definition 85 | }); 86 | } catch (error) { 87 | throw new Error(`Failed to parse definition: ${error.message}`); 88 | } 89 | }); 90 | 91 | exports.fetchWords = asyncHandler(async (req, res) => { 92 | const text = validateWord(req.params.text); 93 | const pageOffset = parseInt(req.query.pageOffset) || 0; 94 | 95 | if (pageOffset < 0 || pageOffset > 1000) { 96 | throw new Error('Invalid page offset'); 97 | } 98 | 99 | const data = await fetchWithCurl( 100 | `${BASE_URL}/autocomplete?search=${encodeURIComponent(text)}&startOffset=${pageOffset}` 101 | ); 102 | 103 | try { 104 | const root = parse(data); 105 | const results = Array.from(root.querySelectorAll("li")).map(el => ({ 106 | word: el.querySelector(".word")?.rawText, 107 | description: el.querySelector(".definition")?.rawText 108 | })).filter(item => item.word && item.description); 109 | 110 | res.json({ 111 | success: true, 112 | data: results 113 | }); 114 | } catch (error) { 115 | throw new Error(`Failed to parse results: ${error.message}`); 116 | } 117 | }); 118 | 119 | exports.fetchWordsFull = asyncHandler(async (req, res) => { 120 | const text = validateWord(req.params.text); 121 | 122 | const data = await fetchWithCurl( 123 | `${BASE_URL}/definition.ajax?search=${encodeURIComponent(text)}&lang=en` 124 | ); 125 | 126 | try { 127 | const root = parse(data); 128 | const results = Array.from(root.querySelectorAll("ol li")).map((el) => { 129 | const definition = el.querySelector(".definition")?.rawText 130 | .split("\n") 131 | .map(el => el.trim()) 132 | .filter(Boolean); 133 | 134 | if (!definition || definition.length < 2) { 135 | return null; 136 | } 137 | 138 | const properties = {}; 139 | Array.from(el.querySelectorAll(".defContent dl")).forEach((el) => { 140 | const detailEl = el.querySelector(".detail"); 141 | if (!detailEl) return; 142 | 143 | const key = detailEl.rawText 144 | .slice(0, -1) 145 | .toLowerCase() 146 | .split(" ") 147 | .join("_"); 148 | 149 | const less = Array.from(el.querySelectorAll("dd")); 150 | if (!less.length) { 151 | const terms = Array.from(el.querySelectorAll(".word")) 152 | .map((el) => el.rawText) 153 | .filter(Boolean); 154 | if (terms.length) { 155 | properties[key] = terms; 156 | } 157 | } else { 158 | const kvPairs = less 159 | .map((el) => ({ 160 | def: el.querySelector(".definition")?.rawText || "", 161 | terms: Array.from(el.querySelectorAll(".word")) 162 | .map((el) => el.rawText) 163 | .filter(Boolean) 164 | })) 165 | .filter(el => el.terms.length); 166 | 167 | if (kvPairs.length) { 168 | properties[key] = kvPairs; 169 | } 170 | } 171 | }); 172 | 173 | return { 174 | pos: definition[0], 175 | def: definition[1], 176 | ...properties, 177 | }; 178 | }).filter(Boolean); 179 | 180 | res.json({ 181 | success: true, 182 | data: results 183 | }); 184 | } catch (error) { 185 | throw new Error(`Failed to parse full results: ${error.message}`); 186 | } 187 | }); -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const app = express(); 3 | app.set('json spaces', 2) 4 | const port = process.env.PORT || 80; 5 | const cors = require('cors'); 6 | const { fetchSingleWord, fetchWords, fetchWordsFull } = require("./fetch"); 7 | 8 | app.use(cors()); 9 | app.get("/", (req, res) => { 10 | res.json({ 11 | name: "unofficial vocabulary.com api - test", 12 | status: "working" 13 | }) 14 | }); 15 | app.get("/word/:word", fetchSingleWord); 16 | app.get("/words/:text", fetchWords); 17 | app.get("/words-full/:text", fetchWordsFull); 18 | 19 | app.listen(port, () => console.log(`Example app listening on port ${port}!`)); 20 | -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vocabulary-api", 3 | "alias": ["vocabulary"], 4 | "version": 2, 5 | "builds": [ 6 | { 7 | "src": "index.js", 8 | "use": "@vercel/node" 9 | } 10 | ], 11 | "routes": [ 12 | { 13 | "headers": { 14 | "Access-Control-Allow-Origin": "*", 15 | "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", 16 | "Access-Control-Allow-Headers": "X-Requested-With, Content-Type, Accept" 17 | }, 18 | "src": "/.*", 19 | "dest": "/index.js" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unofficial-vocabulary.com-api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "unofficial-vocabulary.com-api", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "express": "^4.16.4", 14 | "node-fetch": "^2.6.1", 15 | "node-html-parser": "^1.1.14" 16 | }, 17 | "devDependencies": { 18 | "prettier": "^1.16.4" 19 | }, 20 | "engines": { 21 | "node": "20.x" 22 | } 23 | }, 24 | "node_modules/accepts": { 25 | "version": "1.3.5", 26 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 27 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 28 | "dependencies": { 29 | "mime-types": "~2.1.18", 30 | "negotiator": "0.6.1" 31 | }, 32 | "engines": { 33 | "node": ">= 0.6" 34 | } 35 | }, 36 | "node_modules/array-flatten": { 37 | "version": "1.1.1", 38 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 39 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 40 | }, 41 | "node_modules/body-parser": { 42 | "version": "1.18.3", 43 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 44 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 45 | "dependencies": { 46 | "bytes": "3.0.0", 47 | "content-type": "~1.0.4", 48 | "debug": "2.6.9", 49 | "depd": "~1.1.2", 50 | "http-errors": "~1.6.3", 51 | "iconv-lite": "0.4.23", 52 | "on-finished": "~2.3.0", 53 | "qs": "6.5.2", 54 | "raw-body": "2.3.3", 55 | "type-is": "~1.6.16" 56 | }, 57 | "engines": { 58 | "node": ">= 0.8" 59 | } 60 | }, 61 | "node_modules/bytes": { 62 | "version": "3.0.0", 63 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 64 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", 65 | "engines": { 66 | "node": ">= 0.8" 67 | } 68 | }, 69 | "node_modules/content-disposition": { 70 | "version": "0.5.2", 71 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 72 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", 73 | "engines": { 74 | "node": ">= 0.6" 75 | } 76 | }, 77 | "node_modules/content-type": { 78 | "version": "1.0.4", 79 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 80 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 81 | "engines": { 82 | "node": ">= 0.6" 83 | } 84 | }, 85 | "node_modules/cookie": { 86 | "version": "0.3.1", 87 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 88 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", 89 | "engines": { 90 | "node": ">= 0.6" 91 | } 92 | }, 93 | "node_modules/cookie-signature": { 94 | "version": "1.0.6", 95 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 96 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 97 | }, 98 | "node_modules/cors": { 99 | "version": "2.8.5", 100 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 101 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 102 | "dependencies": { 103 | "object-assign": "^4", 104 | "vary": "^1" 105 | }, 106 | "engines": { 107 | "node": ">= 0.10" 108 | } 109 | }, 110 | "node_modules/debug": { 111 | "version": "2.6.9", 112 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 113 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 114 | "dependencies": { 115 | "ms": "2.0.0" 116 | } 117 | }, 118 | "node_modules/depd": { 119 | "version": "1.1.2", 120 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 121 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 122 | "engines": { 123 | "node": ">= 0.6" 124 | } 125 | }, 126 | "node_modules/destroy": { 127 | "version": "1.0.4", 128 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 129 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 130 | }, 131 | "node_modules/ee-first": { 132 | "version": "1.1.1", 133 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 134 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 135 | }, 136 | "node_modules/encodeurl": { 137 | "version": "1.0.2", 138 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 139 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 140 | "engines": { 141 | "node": ">= 0.8" 142 | } 143 | }, 144 | "node_modules/escape-html": { 145 | "version": "1.0.3", 146 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 147 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 148 | }, 149 | "node_modules/etag": { 150 | "version": "1.8.1", 151 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 152 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 153 | "engines": { 154 | "node": ">= 0.6" 155 | } 156 | }, 157 | "node_modules/express": { 158 | "version": "4.16.4", 159 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 160 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 161 | "dependencies": { 162 | "accepts": "~1.3.5", 163 | "array-flatten": "1.1.1", 164 | "body-parser": "1.18.3", 165 | "content-disposition": "0.5.2", 166 | "content-type": "~1.0.4", 167 | "cookie": "0.3.1", 168 | "cookie-signature": "1.0.6", 169 | "debug": "2.6.9", 170 | "depd": "~1.1.2", 171 | "encodeurl": "~1.0.2", 172 | "escape-html": "~1.0.3", 173 | "etag": "~1.8.1", 174 | "finalhandler": "1.1.1", 175 | "fresh": "0.5.2", 176 | "merge-descriptors": "1.0.1", 177 | "methods": "~1.1.2", 178 | "on-finished": "~2.3.0", 179 | "parseurl": "~1.3.2", 180 | "path-to-regexp": "0.1.7", 181 | "proxy-addr": "~2.0.4", 182 | "qs": "6.5.2", 183 | "range-parser": "~1.2.0", 184 | "safe-buffer": "5.1.2", 185 | "send": "0.16.2", 186 | "serve-static": "1.13.2", 187 | "setprototypeof": "1.1.0", 188 | "statuses": "~1.4.0", 189 | "type-is": "~1.6.16", 190 | "utils-merge": "1.0.1", 191 | "vary": "~1.1.2" 192 | }, 193 | "engines": { 194 | "node": ">= 0.10.0" 195 | } 196 | }, 197 | "node_modules/finalhandler": { 198 | "version": "1.1.1", 199 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 200 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 201 | "dependencies": { 202 | "debug": "2.6.9", 203 | "encodeurl": "~1.0.2", 204 | "escape-html": "~1.0.3", 205 | "on-finished": "~2.3.0", 206 | "parseurl": "~1.3.2", 207 | "statuses": "~1.4.0", 208 | "unpipe": "~1.0.0" 209 | }, 210 | "engines": { 211 | "node": ">= 0.8" 212 | } 213 | }, 214 | "node_modules/forwarded": { 215 | "version": "0.1.2", 216 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 217 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 218 | "engines": { 219 | "node": ">= 0.6" 220 | } 221 | }, 222 | "node_modules/fresh": { 223 | "version": "0.5.2", 224 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 225 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 226 | "engines": { 227 | "node": ">= 0.6" 228 | } 229 | }, 230 | "node_modules/he": { 231 | "version": "1.1.1", 232 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 233 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 234 | "bin": { 235 | "he": "bin/he" 236 | } 237 | }, 238 | "node_modules/http-errors": { 239 | "version": "1.6.3", 240 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 241 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 242 | "dependencies": { 243 | "depd": "~1.1.2", 244 | "inherits": "2.0.3", 245 | "setprototypeof": "1.1.0", 246 | "statuses": ">= 1.4.0 < 2" 247 | }, 248 | "engines": { 249 | "node": ">= 0.6" 250 | } 251 | }, 252 | "node_modules/iconv-lite": { 253 | "version": "0.4.23", 254 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 255 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 256 | "dependencies": { 257 | "safer-buffer": ">= 2.1.2 < 3" 258 | }, 259 | "engines": { 260 | "node": ">=0.10.0" 261 | } 262 | }, 263 | "node_modules/inherits": { 264 | "version": "2.0.3", 265 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 266 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 267 | }, 268 | "node_modules/ipaddr.js": { 269 | "version": "1.8.0", 270 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 271 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", 272 | "engines": { 273 | "node": ">= 0.10" 274 | } 275 | }, 276 | "node_modules/media-typer": { 277 | "version": "0.3.0", 278 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 279 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 280 | "engines": { 281 | "node": ">= 0.6" 282 | } 283 | }, 284 | "node_modules/merge-descriptors": { 285 | "version": "1.0.1", 286 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 287 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 288 | }, 289 | "node_modules/methods": { 290 | "version": "1.1.2", 291 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 292 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 293 | "engines": { 294 | "node": ">= 0.6" 295 | } 296 | }, 297 | "node_modules/mime": { 298 | "version": "1.4.1", 299 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 300 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", 301 | "bin": { 302 | "mime": "cli.js" 303 | } 304 | }, 305 | "node_modules/mime-db": { 306 | "version": "1.38.0", 307 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 308 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", 309 | "engines": { 310 | "node": ">= 0.6" 311 | } 312 | }, 313 | "node_modules/mime-types": { 314 | "version": "2.1.22", 315 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 316 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 317 | "dependencies": { 318 | "mime-db": "~1.38.0" 319 | }, 320 | "engines": { 321 | "node": ">= 0.6" 322 | } 323 | }, 324 | "node_modules/ms": { 325 | "version": "2.0.0", 326 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 327 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 328 | }, 329 | "node_modules/negotiator": { 330 | "version": "0.6.1", 331 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 332 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", 333 | "engines": { 334 | "node": ">= 0.6" 335 | } 336 | }, 337 | "node_modules/node-fetch": { 338 | "version": "2.6.1", 339 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 340 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", 341 | "engines": { 342 | "node": "4.x || >=6.0.0" 343 | } 344 | }, 345 | "node_modules/node-html-parser": { 346 | "version": "1.1.14", 347 | "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.1.14.tgz", 348 | "integrity": "sha512-UcvX5vo3vqlDUpOVvy67Qdp8um0cYc30blTI1yLArF7g8SD3Ci1xomIkPBg1+AKZ8LgrYixvOQ9G2PkOFk2AEg==", 349 | "dependencies": { 350 | "he": "1.1.1" 351 | } 352 | }, 353 | "node_modules/object-assign": { 354 | "version": "4.1.1", 355 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 356 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 357 | "engines": { 358 | "node": ">=0.10.0" 359 | } 360 | }, 361 | "node_modules/on-finished": { 362 | "version": "2.3.0", 363 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 364 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 365 | "dependencies": { 366 | "ee-first": "1.1.1" 367 | }, 368 | "engines": { 369 | "node": ">= 0.8" 370 | } 371 | }, 372 | "node_modules/parseurl": { 373 | "version": "1.3.2", 374 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 375 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 376 | "engines": { 377 | "node": ">= 0.8" 378 | } 379 | }, 380 | "node_modules/path-to-regexp": { 381 | "version": "0.1.7", 382 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 383 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 384 | }, 385 | "node_modules/prettier": { 386 | "version": "1.16.4", 387 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", 388 | "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", 389 | "dev": true, 390 | "bin": { 391 | "prettier": "bin-prettier.js" 392 | }, 393 | "engines": { 394 | "node": ">=4" 395 | } 396 | }, 397 | "node_modules/proxy-addr": { 398 | "version": "2.0.4", 399 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 400 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 401 | "dependencies": { 402 | "forwarded": "~0.1.2", 403 | "ipaddr.js": "1.8.0" 404 | }, 405 | "engines": { 406 | "node": ">= 0.10" 407 | } 408 | }, 409 | "node_modules/qs": { 410 | "version": "6.5.2", 411 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 412 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 413 | "engines": { 414 | "node": ">=0.6" 415 | } 416 | }, 417 | "node_modules/range-parser": { 418 | "version": "1.2.0", 419 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 420 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", 421 | "engines": { 422 | "node": ">= 0.6" 423 | } 424 | }, 425 | "node_modules/raw-body": { 426 | "version": "2.3.3", 427 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 428 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 429 | "dependencies": { 430 | "bytes": "3.0.0", 431 | "http-errors": "1.6.3", 432 | "iconv-lite": "0.4.23", 433 | "unpipe": "1.0.0" 434 | }, 435 | "engines": { 436 | "node": ">= 0.8" 437 | } 438 | }, 439 | "node_modules/safe-buffer": { 440 | "version": "5.1.2", 441 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 442 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 443 | }, 444 | "node_modules/safer-buffer": { 445 | "version": "2.1.2", 446 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 447 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 448 | }, 449 | "node_modules/send": { 450 | "version": "0.16.2", 451 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 452 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 453 | "dependencies": { 454 | "debug": "2.6.9", 455 | "depd": "~1.1.2", 456 | "destroy": "~1.0.4", 457 | "encodeurl": "~1.0.2", 458 | "escape-html": "~1.0.3", 459 | "etag": "~1.8.1", 460 | "fresh": "0.5.2", 461 | "http-errors": "~1.6.2", 462 | "mime": "1.4.1", 463 | "ms": "2.0.0", 464 | "on-finished": "~2.3.0", 465 | "range-parser": "~1.2.0", 466 | "statuses": "~1.4.0" 467 | }, 468 | "engines": { 469 | "node": ">= 0.8.0" 470 | } 471 | }, 472 | "node_modules/serve-static": { 473 | "version": "1.13.2", 474 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 475 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 476 | "dependencies": { 477 | "encodeurl": "~1.0.2", 478 | "escape-html": "~1.0.3", 479 | "parseurl": "~1.3.2", 480 | "send": "0.16.2" 481 | }, 482 | "engines": { 483 | "node": ">= 0.8.0" 484 | } 485 | }, 486 | "node_modules/setprototypeof": { 487 | "version": "1.1.0", 488 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 489 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 490 | }, 491 | "node_modules/statuses": { 492 | "version": "1.4.0", 493 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 494 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 495 | "engines": { 496 | "node": ">= 0.6" 497 | } 498 | }, 499 | "node_modules/type-is": { 500 | "version": "1.6.16", 501 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 502 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 503 | "dependencies": { 504 | "media-typer": "0.3.0", 505 | "mime-types": "~2.1.18" 506 | }, 507 | "engines": { 508 | "node": ">= 0.6" 509 | } 510 | }, 511 | "node_modules/unpipe": { 512 | "version": "1.0.0", 513 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 514 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 515 | "engines": { 516 | "node": ">= 0.8" 517 | } 518 | }, 519 | "node_modules/utils-merge": { 520 | "version": "1.0.1", 521 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 522 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 523 | "engines": { 524 | "node": ">= 0.4.0" 525 | } 526 | }, 527 | "node_modules/vary": { 528 | "version": "1.1.2", 529 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 530 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 531 | "engines": { 532 | "node": ">= 0.8" 533 | } 534 | } 535 | }, 536 | "dependencies": { 537 | "accepts": { 538 | "version": "1.3.5", 539 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 540 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 541 | "requires": { 542 | "mime-types": "~2.1.18", 543 | "negotiator": "0.6.1" 544 | } 545 | }, 546 | "array-flatten": { 547 | "version": "1.1.1", 548 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 549 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 550 | }, 551 | "body-parser": { 552 | "version": "1.18.3", 553 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 554 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 555 | "requires": { 556 | "bytes": "3.0.0", 557 | "content-type": "~1.0.4", 558 | "debug": "2.6.9", 559 | "depd": "~1.1.2", 560 | "http-errors": "~1.6.3", 561 | "iconv-lite": "0.4.23", 562 | "on-finished": "~2.3.0", 563 | "qs": "6.5.2", 564 | "raw-body": "2.3.3", 565 | "type-is": "~1.6.16" 566 | } 567 | }, 568 | "bytes": { 569 | "version": "3.0.0", 570 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 571 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 572 | }, 573 | "content-disposition": { 574 | "version": "0.5.2", 575 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 576 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 577 | }, 578 | "content-type": { 579 | "version": "1.0.4", 580 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 581 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 582 | }, 583 | "cookie": { 584 | "version": "0.3.1", 585 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 586 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 587 | }, 588 | "cookie-signature": { 589 | "version": "1.0.6", 590 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 591 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 592 | }, 593 | "cors": { 594 | "version": "2.8.5", 595 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 596 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 597 | "requires": { 598 | "object-assign": "^4", 599 | "vary": "^1" 600 | } 601 | }, 602 | "debug": { 603 | "version": "2.6.9", 604 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 605 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 606 | "requires": { 607 | "ms": "2.0.0" 608 | } 609 | }, 610 | "depd": { 611 | "version": "1.1.2", 612 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 613 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 614 | }, 615 | "destroy": { 616 | "version": "1.0.4", 617 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 618 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 619 | }, 620 | "ee-first": { 621 | "version": "1.1.1", 622 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 623 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 624 | }, 625 | "encodeurl": { 626 | "version": "1.0.2", 627 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 628 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 629 | }, 630 | "escape-html": { 631 | "version": "1.0.3", 632 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 633 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 634 | }, 635 | "etag": { 636 | "version": "1.8.1", 637 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 638 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 639 | }, 640 | "express": { 641 | "version": "4.16.4", 642 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 643 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 644 | "requires": { 645 | "accepts": "~1.3.5", 646 | "array-flatten": "1.1.1", 647 | "body-parser": "1.18.3", 648 | "content-disposition": "0.5.2", 649 | "content-type": "~1.0.4", 650 | "cookie": "0.3.1", 651 | "cookie-signature": "1.0.6", 652 | "debug": "2.6.9", 653 | "depd": "~1.1.2", 654 | "encodeurl": "~1.0.2", 655 | "escape-html": "~1.0.3", 656 | "etag": "~1.8.1", 657 | "finalhandler": "1.1.1", 658 | "fresh": "0.5.2", 659 | "merge-descriptors": "1.0.1", 660 | "methods": "~1.1.2", 661 | "on-finished": "~2.3.0", 662 | "parseurl": "~1.3.2", 663 | "path-to-regexp": "0.1.7", 664 | "proxy-addr": "~2.0.4", 665 | "qs": "6.5.2", 666 | "range-parser": "~1.2.0", 667 | "safe-buffer": "5.1.2", 668 | "send": "0.16.2", 669 | "serve-static": "1.13.2", 670 | "setprototypeof": "1.1.0", 671 | "statuses": "~1.4.0", 672 | "type-is": "~1.6.16", 673 | "utils-merge": "1.0.1", 674 | "vary": "~1.1.2" 675 | } 676 | }, 677 | "finalhandler": { 678 | "version": "1.1.1", 679 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 680 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 681 | "requires": { 682 | "debug": "2.6.9", 683 | "encodeurl": "~1.0.2", 684 | "escape-html": "~1.0.3", 685 | "on-finished": "~2.3.0", 686 | "parseurl": "~1.3.2", 687 | "statuses": "~1.4.0", 688 | "unpipe": "~1.0.0" 689 | } 690 | }, 691 | "forwarded": { 692 | "version": "0.1.2", 693 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 694 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 695 | }, 696 | "fresh": { 697 | "version": "0.5.2", 698 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 699 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 700 | }, 701 | "he": { 702 | "version": "1.1.1", 703 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 704 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" 705 | }, 706 | "http-errors": { 707 | "version": "1.6.3", 708 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 709 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 710 | "requires": { 711 | "depd": "~1.1.2", 712 | "inherits": "2.0.3", 713 | "setprototypeof": "1.1.0", 714 | "statuses": ">= 1.4.0 < 2" 715 | } 716 | }, 717 | "iconv-lite": { 718 | "version": "0.4.23", 719 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 720 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 721 | "requires": { 722 | "safer-buffer": ">= 2.1.2 < 3" 723 | } 724 | }, 725 | "inherits": { 726 | "version": "2.0.3", 727 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 728 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 729 | }, 730 | "ipaddr.js": { 731 | "version": "1.8.0", 732 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 733 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 734 | }, 735 | "media-typer": { 736 | "version": "0.3.0", 737 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 738 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 739 | }, 740 | "merge-descriptors": { 741 | "version": "1.0.1", 742 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 743 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 744 | }, 745 | "methods": { 746 | "version": "1.1.2", 747 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 748 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 749 | }, 750 | "mime": { 751 | "version": "1.4.1", 752 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 753 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 754 | }, 755 | "mime-db": { 756 | "version": "1.38.0", 757 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 758 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 759 | }, 760 | "mime-types": { 761 | "version": "2.1.22", 762 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 763 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 764 | "requires": { 765 | "mime-db": "~1.38.0" 766 | } 767 | }, 768 | "ms": { 769 | "version": "2.0.0", 770 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 771 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 772 | }, 773 | "negotiator": { 774 | "version": "0.6.1", 775 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 776 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 777 | }, 778 | "node-fetch": { 779 | "version": "2.6.1", 780 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 781 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 782 | }, 783 | "node-html-parser": { 784 | "version": "1.1.14", 785 | "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.1.14.tgz", 786 | "integrity": "sha512-UcvX5vo3vqlDUpOVvy67Qdp8um0cYc30blTI1yLArF7g8SD3Ci1xomIkPBg1+AKZ8LgrYixvOQ9G2PkOFk2AEg==", 787 | "requires": { 788 | "he": "1.1.1" 789 | } 790 | }, 791 | "object-assign": { 792 | "version": "4.1.1", 793 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 794 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 795 | }, 796 | "on-finished": { 797 | "version": "2.3.0", 798 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 799 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 800 | "requires": { 801 | "ee-first": "1.1.1" 802 | } 803 | }, 804 | "parseurl": { 805 | "version": "1.3.2", 806 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 807 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 808 | }, 809 | "path-to-regexp": { 810 | "version": "0.1.7", 811 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 812 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 813 | }, 814 | "prettier": { 815 | "version": "1.16.4", 816 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", 817 | "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", 818 | "dev": true 819 | }, 820 | "proxy-addr": { 821 | "version": "2.0.4", 822 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", 823 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", 824 | "requires": { 825 | "forwarded": "~0.1.2", 826 | "ipaddr.js": "1.8.0" 827 | } 828 | }, 829 | "qs": { 830 | "version": "6.5.2", 831 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 832 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 833 | }, 834 | "range-parser": { 835 | "version": "1.2.0", 836 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 837 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 838 | }, 839 | "raw-body": { 840 | "version": "2.3.3", 841 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 842 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 843 | "requires": { 844 | "bytes": "3.0.0", 845 | "http-errors": "1.6.3", 846 | "iconv-lite": "0.4.23", 847 | "unpipe": "1.0.0" 848 | } 849 | }, 850 | "safe-buffer": { 851 | "version": "5.1.2", 852 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 853 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 854 | }, 855 | "safer-buffer": { 856 | "version": "2.1.2", 857 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 858 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 859 | }, 860 | "send": { 861 | "version": "0.16.2", 862 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 863 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 864 | "requires": { 865 | "debug": "2.6.9", 866 | "depd": "~1.1.2", 867 | "destroy": "~1.0.4", 868 | "encodeurl": "~1.0.2", 869 | "escape-html": "~1.0.3", 870 | "etag": "~1.8.1", 871 | "fresh": "0.5.2", 872 | "http-errors": "~1.6.2", 873 | "mime": "1.4.1", 874 | "ms": "2.0.0", 875 | "on-finished": "~2.3.0", 876 | "range-parser": "~1.2.0", 877 | "statuses": "~1.4.0" 878 | } 879 | }, 880 | "serve-static": { 881 | "version": "1.13.2", 882 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 883 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 884 | "requires": { 885 | "encodeurl": "~1.0.2", 886 | "escape-html": "~1.0.3", 887 | "parseurl": "~1.3.2", 888 | "send": "0.16.2" 889 | } 890 | }, 891 | "setprototypeof": { 892 | "version": "1.1.0", 893 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 894 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 895 | }, 896 | "statuses": { 897 | "version": "1.4.0", 898 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 899 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 900 | }, 901 | "type-is": { 902 | "version": "1.6.16", 903 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 904 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 905 | "requires": { 906 | "media-typer": "0.3.0", 907 | "mime-types": "~2.1.18" 908 | } 909 | }, 910 | "unpipe": { 911 | "version": "1.0.0", 912 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 913 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 914 | }, 915 | "utils-merge": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 918 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 919 | }, 920 | "vary": { 921 | "version": "1.1.2", 922 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 923 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 924 | } 925 | } 926 | } 927 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unofficial-vocabulary.com-api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node index.js" 9 | }, 10 | "engines": { 11 | "node": "20.x" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+ssh://git@github.com/umeshgmrl/Unofficial-Vocabulary.com-API.git" 16 | }, 17 | "keywords": [ 18 | "API", 19 | "vocabulary", 20 | "unofficial" 21 | ], 22 | "author": "Bhumesh Domala", 23 | "license": "ISC", 24 | "bugs": { 25 | "url": "https://github.com/umeshgmrl/Unofficial-Vocabulary.com-API/issues" 26 | }, 27 | "homepage": "https://github.com/umeshgmrl/Unofficial-Vocabulary.com-API#readme", 28 | "dependencies": { 29 | "cors": "^2.8.5", 30 | "express": "^4.16.4", 31 | "node-fetch": "^2.6.1", 32 | "node-html-parser": "^1.1.14" 33 | }, 34 | "devDependencies": { 35 | "prettier": "^1.16.4" 36 | } 37 | } 38 | --------------------------------------------------------------------------------