From cb399fb923c8a92800001c046a296a79a669b1b9 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 12:23:32 -0500 Subject: [PATCH 01/11] initial commit --- candy.sqlite3 | Bin 0 -> 16384 bytes package-lock.json | 1777 +++++++++++++++++++++++++++ package.json | 3 +- public/css/myStyle.css | 7 + public/images/reeses-miniatures.jpg | Bin 0 -> 1421 bytes server.mjs | 216 ++++ templates/chocolate.html | 31 + templates/fruity.html | 30 + templates/index.html | 16 + templates/lowSugar.html | 33 + 10 files changed, 2111 insertions(+), 2 deletions(-) create mode 100644 candy.sqlite3 create mode 100644 package-lock.json create mode 100644 public/css/myStyle.css create mode 100644 public/images/reeses-miniatures.jpg create mode 100644 server.mjs create mode 100644 templates/chocolate.html create mode 100644 templates/fruity.html create mode 100644 templates/index.html create mode 100644 templates/lowSugar.html diff --git a/candy.sqlite3 b/candy.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..d23161b4b063946e6ee0d473af0c2340c78efd88 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..169ccdf --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1777 @@ +{ + "name": "dynamic_server", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dynamic_server", + "version": "1.0.0", + "dependencies": { + "express": "^4.18.2", + "sqlite3": "^5.1.6" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "optional": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "optional": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "optional": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "optional": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "optional": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "optional": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "optional": true + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "optional": true + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "optional": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "optional": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "optional": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "optional": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "optional": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "optional": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "optional": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "optional": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/node-gyp/node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "optional": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "optional": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "optional": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "optional": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "optional": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "optional": true + }, + "node_modules/sqlite3": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", + "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^4.2.0", + "tar": "^6.1.11" + }, + "optionalDependencies": { + "node-gyp": "8.x" + }, + "peerDependencies": { + "node-gyp": "8.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "optional": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "optional": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "optional": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/package.json b/package.json index 9e11b28..deb5cc0 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,7 @@ "name": "", "email": "" }, - "contributors": [ - ], + "contributors": [], "repository": {}, "dependencies": { "express": "^4.18.2", diff --git a/public/css/myStyle.css b/public/css/myStyle.css new file mode 100644 index 0000000..e2e48d7 --- /dev/null +++ b/public/css/myStyle.css @@ -0,0 +1,7 @@ +body { + background-color: orange; +} + +td, th { + text-align: center; +} \ No newline at end of file diff --git a/public/images/reeses-miniatures.jpg b/public/images/reeses-miniatures.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4991a9c74b01bf7980a03d10202c77463ded03c7 GIT binary patch literal 1421 zcmex=^lOiET&UP@Y7ModgWM?qOlT~kX_QeM|USHnP6LsJ7}2qQZ?I~NC+Fc+7w zhLo6;2Fc+60R}-126YB?W=16jCP7AKLB{__7~~lk7+Ha?1vwZB7@3%X?q%oT?FU=d^$QZ#gA6AnydS1J@SYMi)`L)mHLLD8U#A5@H! zikdjN#Ka{erBv0_H8izMOwG(KEUlbfT;1F~JiUTLLc_u%BBPR1Qq$5iGP89XZ3R<7E#dCS&q+js2Tb?ESsqsNY)IC<*Q z$4JmvhiTDb~+oiN?n;jh*r$HL|J&axgom)4^g@mT9n z*d3d*D|-)_#2!AAWOTT(Py6w{-Cd!!vscvq&9V%W6DVG`Uc2`0%{%hlRyY1LOy}mQ z-|?T}PiV&RkILZ{mwb0=1TE}HPdNOPUE=Qh{uQRjSM)t}?6c$+-rRBfeY$jE-%g2N zA7j2PE)eHU=h@D8WKl~@%IEw0?<(6GSzTY>a^`7k^S6)R=9O>lmo`3Suw&=3h^$wW zyhHc?XAr)8{>a_%b1q`Hiks(5;VW!%v-`fSt|c%g{qWZI*pGbkg%~cLe3sg;+>$r9 z; zovhLJNS$w8cp3N6CWrHZ`<3tT@fLi_dY_QKt?7!^(Oem}h$Ww%+}v}*(r8^JyS2N0 zkoM*uZ}ZFcY3$m$$y5Hc$K0z{57yZ)E&L_6W>UsywUtYqi*BBbyqwcecF=Y|bDU|G z&DN)uk<0!wgeTvel9^Pn<+}d9#j-VP|1+>`l**@eoV>$>y9+4}B}Nw30tl_TD`WC@ota%gT4Ck(<0Z~U6i?`wAjWdS4CgB&;4ag%YF8o z)AGt;I|5&-B>rbuv8e0i>ZXOE_X;gF(q`&KeK<7_L={e zZ%tH<%;iPN&tHY}NxaL~WlI07)}>{?dBgSn`j7rIoVohE;&t@=5AjdR=1G58HuK@L o^2?JPl^68Ry|2=E`Bs<4x*bjiF&o3&=Z39$?LBYtZu|c?0ZPPV?f?J) literal 0 HcmV?d00001 diff --git a/server.mjs b/server.mjs new file mode 100644 index 0000000..dafc8e0 --- /dev/null +++ b/server.mjs @@ -0,0 +1,216 @@ +import * as fs from 'node:fs' +import * as path from 'node:path'; +import * as http from 'node:http'; +import * as url from 'node:url'; +import {default as express} from 'express'; +import {default as sqlite3} from 'sqlite3'; + +const port=8000; +const __dirname= path.dirname(url.fileURLToPath(import.meta.url)); +const root=path.join(__dirname,'public'); +const template = path.join(__dirname,'templates'); + +let app=express(); +app.use(express.static(root)); + +const db = new sqlite3.Database(path.join(__dirname,'candy.sqlite3'),sqlite3.OPEN_READONLY, (err)=>{ + if(err){ + console.log('Error connecting to database'); + } + else{ + console.log('Successfully connected to database'); + }}); + +function dbSelect(query,params){ + let p = new Promise((resolve, reject)=>{ + db.all(query, params, (err,rows)=>{ + if (err){ + reject(err); + } + else{ + resolve(rows); + } + }); + }); + return p; +} + +let query1="SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY sugarpercent" +let query2="SELECT * FROM candy WHERE chocolate == 1 AND winpercent > 0.7 ORDER BY winpercent DESC" +let query3="SELECT * FROM candy WHERE fruity == 1 AND winpercent > 0.7 ORDER BY winpercent DESC" + +app.get('/home', (req, res) => { + // Send the index.html file when the homepage is accessed + res.sendFile(path.join(template, 'index.html'), 'utf-8'); +}); + +//function to convert 1 and 0 to yes and no for table data displayed on web page +function convertToYesNo(value) { + return value === 1 ? 'Yes' : 'No'; +} + +//for making candy names able to be read as fils +function slugify(text) { + return text.toString().toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .trim(); // Trim - from start of text + } + + +//SUGAR PERCENT +app.get('/lowSugar', (req, res) => { + // You don't need to perform a query with the candy name here since your queries don't use it. + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); + let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); + let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); + let p4 = fs.promises.readFile(path.join(template, 'lowSugar.html'), 'utf-8'); + + Promise.all([p1, p2, p3, p4]).then(results => { + // This is where you read the template and insert the data + let template = results[3]; // This is your HTML template as a string. + let response = template.replace('$$CANDY_NAME$$', req.params.name); // Replace placeholder with candy name from URL. + + // Now, insert the data from the database into the template. + // Assuming you want to display the results from p1 in a table. + let table_body = results[0].map(candy => { // Use map to transform each row into an HTML row. + const imageName = slugify(candy.competitorname) + '.jpg'; + const imagePath = `/images/${imageName}`; + return ` + ${candy.competitorname} + ${parseFloat(candy.winpercent).toFixed(0)+'%'} + ${parseFloat(candy.sugarpercent).toFixed(2)} + ${convertToYesNo(candy.chocolate)} + ${convertToYesNo(candy.fruity)} + ${convertToYesNo(candy.peanutyalmondy)} + ${convertToYesNo(candy.hard)} + ${convertToYesNo(candy.pluribus)} + Image of ${imagePath} + `; + }).join(''); // Join all the strings into one big string. + + response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. + + res.status(200).type('html').send(response); // Send the response. + }).catch((error) => { + console.error(error); + res.status(500).send("An error occurred on the server."); + }); +}); + + +//CHOCOLATE +app.get('/chocolate', (req, res) => { + // You don't need to perform a query with the candy name here since your queries don't use it. + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); + let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); + let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); + let p4 = fs.promises.readFile(path.join(template, 'chocolate.html'), 'utf-8'); + + Promise.all([p1, p2, p3, p4]).then(results => { + // This is where you read the template and insert the data + let template = results[3]; // This is your HTML template as a string. + let response = template.replace('$$CANDY_NAME$$', req.params.name); // Replace placeholder with candy name from URL. + + // Now, insert the data from the database into the template. + // Assuming you want to display the results from p1 in a table. + let table_body = results[1].map(candy => { // Use map to transform each row into an HTML row. + return ` + ${candy.competitorname} + ${parseFloat(candy.winpercent).toFixed(0)+'%'} + ${convertToYesNo(candy.peanutyalmondy)} + ${convertToYesNo(candy.nougat)} + ${convertToYesNo(candy.bar)} + ${convertToYesNo(candy.pluribus)} + `; + }).join(''); // Join all the strings into one big string. + + response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. + + res.status(200).type('html').send(response); // Send the response. + }).catch((error) => { + console.error(error); + res.status(500).send("An error occurred on the server."); + }); +}); + + +//FRUITY +app.get('/fruity', (req, res) => { + // You don't need to perform a query with the candy name here since your queries don't use it. + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); + let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); + let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); + let p4 = fs.promises.readFile(path.join(template, 'fruity.html'), 'utf-8'); + + Promise.all([p1, p2, p3, p4]).then(results => { + // This is where you read the template and insert the data + let template = results[3]; // This is your HTML template as a string. + let response = template.replace('$$CANDY_NAME$$', req.params.name); // Replace placeholder with candy name from URL. + + // Now, insert the data from the database into the template. + // Assuming you want to display the results from p1 in a table. + let table_body = results[2].map(candy => { // Use map to transform each row into an HTML row. + return ` + ${candy.competitorname} + ${parseFloat(candy.winpercent).toFixed(0)+'%'} + ${convertToYesNo(candy.hard)} + ${convertToYesNo(candy.bar)} + ${convertToYesNo(candy.pluribus)} + `; + }).join(''); // Join all the strings into one big string. + + response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. + + res.status(200).type('html').send(response); // Send the response. + }).catch((error) => { + console.error(error); + res.status(500).send("An error occurred on the server."); + }); +}); + +db.all(query1,(err,rows)=>{ + if ((err)=>{ + console.log(err) + }); + else{ //res.json(rows) + // rows.forEach(row => console.log(`${row.mfr} is ${row.name} `)) + data1=rows; + if(data1 !==null && data2 !==null && data3 !==null){ + finishAndSend(); + } + }; +}); + +db.all(query2,(err,rows)=>{ + if ((err)=>{ + console.log(err) + }); + else{ //res.json(rows) + // rows.forEach(row => console.log(`${row.mfr} is ${row.name} `)) + data2=rows; + if(data1 !==null && data2 !==null && data3 !==null){ + finishAndSend(); + } + }; +}); + +db.all(query3,(err,rows)=>{ + if ((err)=>{ + console.log(err) + }); + else{ //res.json(rows) + // rows.forEach(row => console.log(`${row.mfr} is ${row.name} `)) + data3=rows; + if(data1 !==null && data2 !==null && data3 !==null){ + finishAndSend(); + } + }; +}); + + + +app.listen(port, () =>{ + console.log('Now listening on port'+port); +}); \ No newline at end of file diff --git a/templates/chocolate.html b/templates/chocolate.html new file mode 100644 index 0000000..5e023ba --- /dev/null +++ b/templates/chocolate.html @@ -0,0 +1,31 @@ + + + + + + Page Title + + + +

Chocolate Candies

+ Low Sugar + Chocolate + Fruity + Home + + + + + + + + + + + + + $$TABLE_BODY$$ + +
Candy NameWin PercentageNuttyNougatBarPacks of Many
+ + diff --git a/templates/fruity.html b/templates/fruity.html new file mode 100644 index 0000000..6fe22d2 --- /dev/null +++ b/templates/fruity.html @@ -0,0 +1,30 @@ + + + + + + Page Title + + + +

Fruity Candies

+ Low Sugar + Chocolate + Fruity + Home + + + + + + + + + + + + $$TABLE_BODY$$ + +
Candy NameWin PercentageHardBarPacks of Many
+ + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..451d943 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,16 @@ + + + + + + Homepage + + +

Welcome to the Candy Data Website!

+

Data is provided on the top 10 most liked low sugar, chocolate, and fruity candies.

+ Low Sugar + Chocolate + Fruity + Home + + \ No newline at end of file diff --git a/templates/lowSugar.html b/templates/lowSugar.html new file mode 100644 index 0000000..b2a1640 --- /dev/null +++ b/templates/lowSugar.html @@ -0,0 +1,33 @@ + + + + + + Page Title + + + +

Low Sugar Candies

+ Low Sugar + Chocolate + Fruity + Home + + + + + + + + + + + + + + + $$TABLE_BODY$$ + +
Candy NameWin PercentageSugar PercentageChocolateFruityNuttyHardPacks of Many
+ + From 8d9bff109080e60617fe7bb6f0cea28ccdf5c856 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 13:06:22 -0500 Subject: [PATCH 02/11] fixed home route --- dynamic_server.mjs | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 dynamic_server.mjs diff --git a/dynamic_server.mjs b/dynamic_server.mjs deleted file mode 100644 index 9f943b9..0000000 --- a/dynamic_server.mjs +++ /dev/null @@ -1,19 +0,0 @@ -import * as fs from 'node:fs'; -import * as path from 'node:path'; -import * as url from 'node:url'; - -import { default as express } from 'express'; -import { default as sqlite3 } from 'sqlite3'; - -const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); - -const port = 8000; -const root = path.join(__dirname, 'public'); -const template = path.join(__dirname, 'templates'); - -let app = express(); -app.use(express.static(root)); - -app.listen(port, () => { - console.log('Now listening on port ' + port); -}); From 1734d2b873c834c6f363842d664de18713070049 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 13:10:53 -0500 Subject: [PATCH 03/11] /home route try 2 --- server.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.mjs b/server.mjs index dafc8e0..446bcd7 100644 --- a/server.mjs +++ b/server.mjs @@ -39,7 +39,7 @@ let query1="SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY sugarpercent" let query2="SELECT * FROM candy WHERE chocolate == 1 AND winpercent > 0.7 ORDER BY winpercent DESC" let query3="SELECT * FROM candy WHERE fruity == 1 AND winpercent > 0.7 ORDER BY winpercent DESC" -app.get('/home', (req, res) => { +app.get('/', (req, res) => { // Send the index.html file when the homepage is accessed res.sendFile(path.join(template, 'index.html'), 'utf-8'); }); From e685636963b257b7177879f6509a573dd53904b9 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 15:52:25 -0500 Subject: [PATCH 04/11] to show noah what I have so far --- server.mjs | 71 ++++++++++++------- templates/index.html | 8 +-- .../{chocolate.html => pricepercent.html} | 17 ++--- templates/{fruity.html => sugarpercent.html} | 21 +++--- templates/temp.html | 10 --- templates/{lowSugar.html => winpercent.html} | 10 +-- 6 files changed, 75 insertions(+), 62 deletions(-) rename templates/{chocolate.html => pricepercent.html} (60%) rename templates/{fruity.html => sugarpercent.html} (50%) delete mode 100644 templates/temp.html rename templates/{lowSugar.html => winpercent.html} (71%) diff --git a/server.mjs b/server.mjs index 446bcd7..25991b4 100644 --- a/server.mjs +++ b/server.mjs @@ -60,17 +60,39 @@ function slugify(text) { //SUGAR PERCENT -app.get('/lowSugar', (req, res) => { +app.get('/sugarpercent/:category', (req, res) => { + + let category = req.params.category; + let sugarMin; + let sugarMax; + + switch (category) { + case 'low': + sugarMin = 0; + sugarMax = 0.1; // Assuming 'low' is sugarpercent < 0.1 + break; + case 'medium': + sugarMin = 0.1 + sugarMax = 0.3; // Assuming 'medium' is sugarpercent < 0.3 + break; + case 'high': + sugarMin = 0.3 + sugarMax = 10; // Assuming 'high' is sugarpercent < 0.5 + break; + default: + // Handle unknown category or set a default + sugarMin = 0; + sugarMax = 0.1; + break; + } // You don't need to perform a query with the candy name here since your queries don't use it. - let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); - let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); - let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); - let p4 = fs.promises.readFile(path.join(template, 'lowSugar.html'), 'utf-8'); + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[sugarMax],[sugarMin]); + let p2 = fs.promises.readFile(path.join(template, 'sugarpercent.html'), 'utf-8'); - Promise.all([p1, p2, p3, p4]).then(results => { + Promise.all([p1, p2]).then(results => { // This is where you read the template and insert the data - let template = results[3]; // This is your HTML template as a string. - let response = template.replace('$$CANDY_NAME$$', req.params.name); // Replace placeholder with candy name from URL. + let template = results[1]; // This is your HTML template as a string. + let response = template.replace('$$CATEGORY_NAME$$', category); // Replace placeholder with candy name from URL. // Now, insert the data from the database into the template. // Assuming you want to display the results from p1 in a table. @@ -79,17 +101,15 @@ app.get('/lowSugar', (req, res) => { const imagePath = `/images/${imageName}`; return ` ${candy.competitorname} - ${parseFloat(candy.winpercent).toFixed(0)+'%'} - ${parseFloat(candy.sugarpercent).toFixed(2)} + ${parseFloat(candy.sugarpercent).toFixed(2)+'%'} ${convertToYesNo(candy.chocolate)} ${convertToYesNo(candy.fruity)} ${convertToYesNo(candy.peanutyalmondy)} - ${convertToYesNo(candy.hard)} + ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)} Image of ${imagePath} `; }).join(''); // Join all the strings into one big string. - response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. res.status(200).type('html').send(response); // Send the response. @@ -100,13 +120,13 @@ app.get('/lowSugar', (req, res) => { }); -//CHOCOLATE -app.get('/chocolate', (req, res) => { +//WIN PERCENT +app.get('/winpercent', (req, res) => { // You don't need to perform a query with the candy name here since your queries don't use it. let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); - let p4 = fs.promises.readFile(path.join(template, 'chocolate.html'), 'utf-8'); + let p4 = fs.promises.readFile(path.join(template, 'winpercent.html'), 'utf-8'); Promise.all([p1, p2, p3, p4]).then(results => { // This is where you read the template and insert the data @@ -118,10 +138,11 @@ app.get('/chocolate', (req, res) => { let table_body = results[1].map(candy => { // Use map to transform each row into an HTML row. return ` ${candy.competitorname} - ${parseFloat(candy.winpercent).toFixed(0)+'%'} + ${parseFloat(candy.winpercent).toFixed(1)+'%'} + ${convertToYesNo(candy.chocolate)} + ${convertToYesNo(candy.fruity)} ${convertToYesNo(candy.peanutyalmondy)} - ${convertToYesNo(candy.nougat)} - ${convertToYesNo(candy.bar)} + ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)} `; }).join(''); // Join all the strings into one big string. @@ -136,13 +157,13 @@ app.get('/chocolate', (req, res) => { }); -//FRUITY -app.get('/fruity', (req, res) => { +//PRICE PERCENT +app.get('/pricepercent', (req, res) => { // You don't need to perform a query with the candy name here since your queries don't use it. let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); - let p4 = fs.promises.readFile(path.join(template, 'fruity.html'), 'utf-8'); + let p4 = fs.promises.readFile(path.join(template, 'pricepercent.html'), 'utf-8'); Promise.all([p1, p2, p3, p4]).then(results => { // This is where you read the template and insert the data @@ -154,9 +175,11 @@ app.get('/fruity', (req, res) => { let table_body = results[2].map(candy => { // Use map to transform each row into an HTML row. return ` ${candy.competitorname} - ${parseFloat(candy.winpercent).toFixed(0)+'%'} - ${convertToYesNo(candy.hard)} - ${convertToYesNo(candy.bar)} + ${parseFloat(candy.pricepercent).toFixed(2)+'%'} + ${convertToYesNo(candy.chocolate)} + ${convertToYesNo(candy.fruity)} + ${convertToYesNo(candy.peanutyalmondy)} + ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)} `; }).join(''); // Join all the strings into one big string. diff --git a/templates/index.html b/templates/index.html index 451d943..1de099b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,9 +8,9 @@

Welcome to the Candy Data Website!

Data is provided on the top 10 most liked low sugar, chocolate, and fruity candies.

- Low Sugar - Chocolate - Fruity - Home + Win Percentage + Sugar Percentage + Price Percentage + Home \ No newline at end of file diff --git a/templates/chocolate.html b/templates/pricepercent.html similarity index 60% rename from templates/chocolate.html rename to templates/pricepercent.html index 5e023ba..e6cafb1 100644 --- a/templates/chocolate.html +++ b/templates/pricepercent.html @@ -7,19 +7,20 @@ -

Chocolate Candies

- Low Sugar - Chocolate - Fruity - Home +

Price Percent

+ Win Percentage + Sugar Percentage + Price Percentage + Home - + + + - - + diff --git a/templates/fruity.html b/templates/sugarpercent.html similarity index 50% rename from templates/fruity.html rename to templates/sugarpercent.html index 6fe22d2..26184ae 100644 --- a/templates/fruity.html +++ b/templates/sugarpercent.html @@ -7,19 +7,22 @@ -

Fruity Candies

- Low Sugar - Chocolate - Fruity - Home +

Sugar Percentage

+

Showing results for: $$CATEGORY_NAME$$

+ Win Percentage + Sugar Percentage + Price Percentage + Home
Candy NameWin PercentagePrice PercentageChocolateFruity NuttyNougatBarCaramel Packs of Many
- - - - + + + + + + diff --git a/templates/temp.html b/templates/temp.html deleted file mode 100644 index 0de6a22..0000000 --- a/templates/temp.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - TEMP - - - - diff --git a/templates/lowSugar.html b/templates/winpercent.html similarity index 71% rename from templates/lowSugar.html rename to templates/winpercent.html index b2a1640..1981a4e 100644 --- a/templates/lowSugar.html +++ b/templates/winpercent.html @@ -7,21 +7,17 @@ -

Low Sugar Candies

- Low Sugar - Chocolate - Fruity - Home +

Win Percentage

+ v
Candy NameWin PercentageHardBarPacks of ManySugar PercentChocolateFruityNuttyCaramelPacks of Many
- - + From 34c9eb4c26ca82f71da90dfe2d9e27ef5e52b302 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 16:03:58 -0500 Subject: [PATCH 05/11] links fixed --- templates/index.html | 4 ++-- templates/pricepercent.html | 4 ++-- templates/winpercent.html | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/templates/index.html b/templates/index.html index 1de099b..b947238 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,9 +8,9 @@

Welcome to the Candy Data Website!

Data is provided on the top 10 most liked low sugar, chocolate, and fruity candies.

- Win Percentage + Win Percentage Sugar Percentage - Price Percentage + Price Percentage Home \ No newline at end of file diff --git a/templates/pricepercent.html b/templates/pricepercent.html index e6cafb1..8dea6b6 100644 --- a/templates/pricepercent.html +++ b/templates/pricepercent.html @@ -8,9 +8,9 @@

Price Percent

- Win Percentage + Win Percentage Sugar Percentage - Price Percentage + Price Percentage Home
Candy Name Win PercentageSugar Percentage Chocolate Fruity NuttyHardCaramel Packs of Many
diff --git a/templates/winpercent.html b/templates/winpercent.html index 1981a4e..50c7781 100644 --- a/templates/winpercent.html +++ b/templates/winpercent.html @@ -8,7 +8,10 @@

Win Percentage

- v + Win Percentage + Sugar Percentage + Price Percentage + Home
From fb867380a2f2c4bc93e16d96f6516eba6807b9db Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 16:13:10 -0500 Subject: [PATCH 06/11] low medium high links added for sugar --- server.mjs | 2 +- templates/sugarpercent.html | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/server.mjs b/server.mjs index 25991b4..ff6c5a9 100644 --- a/server.mjs +++ b/server.mjs @@ -86,7 +86,7 @@ app.get('/sugarpercent/:category', (req, res) => { break; } // You don't need to perform a query with the candy name here since your queries don't use it. - let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[sugarMax],[sugarMin]); + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[sugarMax,sugarMin]); let p2 = fs.promises.readFile(path.join(template, 'sugarpercent.html'), 'utf-8'); Promise.all([p1, p2]).then(results => { diff --git a/templates/sugarpercent.html b/templates/sugarpercent.html index 26184ae..571e9ba 100644 --- a/templates/sugarpercent.html +++ b/templates/sugarpercent.html @@ -8,11 +8,14 @@

Sugar Percentage

-

Showing results for: $$CATEGORY_NAME$$

Win Percentage Sugar Percentage Price Percentage Home +

Showing results for: $$CATEGORY_NAME$$

+ low + medium + high
From 8e106534cc1aa84c0ec6758bd498e0b1c9121862 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 17:18:49 -0500 Subject: [PATCH 07/11] commit before tutoring --- public/css/myStyle.css | 20 ++++-- public/images/one-dime.jpg | Bin 0 -> 14460 bytes server.mjs | 117 +++++++++++++++++++++++++++--------- templates/index.html | 3 +- templates/pricepercent.html | 6 ++ templates/sugarpercent.html | 4 ++ templates/winpercent.html | 6 ++ 7 files changed, 121 insertions(+), 35 deletions(-) create mode 100644 public/images/one-dime.jpg diff --git a/public/css/myStyle.css b/public/css/myStyle.css index e2e48d7..60a7036 100644 --- a/public/css/myStyle.css +++ b/public/css/myStyle.css @@ -1,7 +1,19 @@ body { - background-color: orange; + background-color: rgb(249, 235, 145); } -td, th { - text-align: center; -} \ No newline at end of file + +table { + border-collapse: collapse; /* This ensures that the border doesn't double up */ + width: 50%; /* This sets the table to take up the full width of its container */ + } + + th, td { + border: 1px solid black; /* This adds a black border around every cell */ + padding: 1px; /* This adds some space between the cell content and the borders */ + text-align: center; /* This centers the text in the cells */ + } + + th { + background-color: lightblue; /* This gives a grey background to the header cells */ + } \ No newline at end of file diff --git a/public/images/one-dime.jpg b/public/images/one-dime.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47702ec567a21a28ed7b4747191d4dae366b8b83 GIT binary patch literal 14460 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 L@IM6ezVhDy3pg91 literal 0 HcmV?d00001 diff --git a/server.mjs b/server.mjs index ff6c5a9..f1fa819 100644 --- a/server.mjs +++ b/server.mjs @@ -69,20 +69,20 @@ app.get('/sugarpercent/:category', (req, res) => { switch (category) { case 'low': sugarMin = 0; - sugarMax = 0.1; // Assuming 'low' is sugarpercent < 0.1 + sugarMax = 0.3; // Assuming 'low' is sugarpercent < 0.1 break; case 'medium': - sugarMin = 0.1 - sugarMax = 0.3; // Assuming 'medium' is sugarpercent < 0.3 + sugarMin = 0.3 + sugarMax = 0.6; // Assuming 'medium' is sugarpercent < 0.3 break; case 'high': - sugarMin = 0.3 - sugarMax = 10; // Assuming 'high' is sugarpercent < 0.5 + sugarMin = 0.6 + sugarMax = 1; // Assuming 'high' is sugarpercent < 0.5 break; default: // Handle unknown category or set a default sugarMin = 0; - sugarMax = 0.1; + sugarMax = 0.3; break; } // You don't need to perform a query with the candy name here since your queries don't use it. @@ -96,9 +96,11 @@ app.get('/sugarpercent/:category', (req, res) => { // Now, insert the data from the database into the template. // Assuming you want to display the results from p1 in a table. - let table_body = results[0].map(candy => { // Use map to transform each row into an HTML row. + let table_body = results[0].map((candy,index) => { // Use map to transform each row into an HTML row. const imageName = slugify(candy.competitorname) + '.jpg'; const imagePath = `/images/${imageName}`; + const imageTag = index === 0 ? `${imageName}` : ''; + response = response.replace('$$FEATURED_IMAGE$$', imageTag); return ` @@ -107,10 +109,11 @@ app.get('/sugarpercent/:category', (req, res) => { - + `; }).join(''); // Join all the strings into one big string. response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. + // response = response.replace('$$FEATURED_IMAGE$$', imageTag); res.status(200).type('html').send(response); // Send the response. }).catch((error) => { @@ -121,21 +124,47 @@ app.get('/sugarpercent/:category', (req, res) => { //WIN PERCENT -app.get('/winpercent', (req, res) => { +app.get('/winpercent/:category', (req, res) => { + + let category = req.params.category; + let winMin; + let winMax; + + switch (category) { + case 'low': + winMin = 0; + winMax = 33; // Assuming 'low' is sugarpercent < 0.1 + break; + case 'medium': + winMin = 33 + winMax = 66; // Assuming 'medium' is sugarpercent < 0.3 + break; + case 'high': + winMin = 66 + winMax = 100; // Assuming 'high' is sugarpercent < 0.5 + break; + default: + // Handle unknown category or set a default + winMin = 66; + winMax = 100; + break; + } // You don't need to perform a query with the candy name here since your queries don't use it. - let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); - let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); - let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); - let p4 = fs.promises.readFile(path.join(template, 'winpercent.html'), 'utf-8'); + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[winMax,winMin]); + let p2 = fs.promises.readFile(path.join(template, 'winpercent.html'), 'utf-8'); - Promise.all([p1, p2, p3, p4]).then(results => { + Promise.all([p1, p2]).then(results => { // This is where you read the template and insert the data - let template = results[3]; // This is your HTML template as a string. - let response = template.replace('$$CANDY_NAME$$', req.params.name); // Replace placeholder with candy name from URL. - + let template = results[1]; // This is your HTML template as a string. + let response = template.replace('$$CATEGORY_NAME$$', category); // Replace placeholder with candy name from URL. + // Now, insert the data from the database into the template. // Assuming you want to display the results from p1 in a table. - let table_body = results[1].map(candy => { // Use map to transform each row into an HTML row. + let table_body = results[0].map((candy,index) => { // Use map to transform each row into an HTML row. + const imageName = slugify(candy.competitorname) + '.jpg'; + const imagePath = `/images/${imageName}`; + const imageTag = index === 0 ? `${imageName}` : ''; + response = response.replace('$$FEATURED_IMAGE$$', imageTag); return ` @@ -144,10 +173,11 @@ app.get('/winpercent', (req, res) => { + `; }).join(''); // Join all the strings into one big string. - response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. + // response = response.replace('$$FEATURED_IMAGE$$', imageTag); res.status(200).type('html').send(response); // Send the response. }).catch((error) => { @@ -158,21 +188,47 @@ app.get('/winpercent', (req, res) => { //PRICE PERCENT -app.get('/pricepercent', (req, res) => { +app.get('/pricepercent/:category', (req, res) => { + + let category = req.params.category; + let priceMin; + let priceMax; + + switch (category) { + case 'low': + priceMin = 0; + priceMax = 0.3; // Assuming 'low' is sugarpercent < 0.1 + break; + case 'medium': + priceMin = 0.3 + priceMax = 0.6; // Assuming 'medium' is sugarpercent < 0.3 + break; + case 'high': + priceMin = 0.6 + priceMax = 1; // Assuming 'high' is sugarpercent < 0.5 + break; + default: + // Handle unknown category or set a default + priceMin = 0; + priceMax = 0.3; + break; + } // You don't need to perform a query with the candy name here since your queries don't use it. - let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < 0.25 ORDER BY winpercent DESC LIMIT 10'); - let p2 = dbSelect('SELECT * FROM candy WHERE chocolate == 1 ORDER BY winpercent DESC LIMIT 10'); - let p3 = dbSelect('SELECT * FROM candy WHERE fruity == 1 ORDER BY winpercent DESC LIMIT 10'); - let p4 = fs.promises.readFile(path.join(template, 'pricepercent.html'), 'utf-8'); + let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[priceMax,priceMin]); + let p2 = fs.promises.readFile(path.join(template, 'pricepercent.html'), 'utf-8'); - Promise.all([p1, p2, p3, p4]).then(results => { + Promise.all([p1, p2]).then(results => { // This is where you read the template and insert the data - let template = results[3]; // This is your HTML template as a string. - let response = template.replace('$$CANDY_NAME$$', req.params.name); // Replace placeholder with candy name from URL. - + let template = results[1]; // This is your HTML template as a string. + let response = template.replace('$$CATEGORY_NAME$$', category); // Replace placeholder with candy name from URL. + // Now, insert the data from the database into the template. // Assuming you want to display the results from p1 in a table. - let table_body = results[2].map(candy => { // Use map to transform each row into an HTML row. + let table_body = results[0].map((candy,index) => { // Use map to transform each row into an HTML row. + const imageName = slugify(candy.competitorname) + '.jpg'; + const imagePath = `/images/${imageName}`; + const imageTag = index === 0 ? `${imageName}` : ''; + response = response.replace('$$FEATURED_IMAGE$$', imageTag); return ` @@ -181,10 +237,11 @@ app.get('/pricepercent', (req, res) => { + `; }).join(''); // Join all the strings into one big string. - response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. + // response = response.replace('$$FEATURED_IMAGE$$', imageTag); res.status(200).type('html').send(response); // Send the response. }).catch((error) => { diff --git a/templates/index.html b/templates/index.html index b947238..8a65551 100644 --- a/templates/index.html +++ b/templates/index.html @@ -3,12 +3,13 @@ + Homepage

Welcome to the Candy Data Website!

Data is provided on the top 10 most liked low sugar, chocolate, and fruity candies.

- Win Percentage + Win Percentage Sugar Percentage Price Percentage Home diff --git a/templates/pricepercent.html b/templates/pricepercent.html index 8dea6b6..0ab4cb2 100644 --- a/templates/pricepercent.html +++ b/templates/pricepercent.html @@ -12,6 +12,12 @@

Price Percent

Sugar Percentage Price Percentage Home +

Showing results for: $$CATEGORY_NAME$$

+ low + medium + high +
${candy.competitorname} ${parseFloat(candy.sugarpercent).toFixed(2)+'%'}${convertToYesNo(candy.peanutyalmondy)} ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)}Image of ${imagePath}${imageName}
${candy.competitorname} ${parseFloat(candy.winpercent).toFixed(1)+'%'}${convertToYesNo(candy.peanutyalmondy)} ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)}${imageName}
${candy.competitorname} ${parseFloat(candy.pricepercent).toFixed(2)+'%'}${convertToYesNo(candy.peanutyalmondy)} ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)}${imageName}
diff --git a/templates/sugarpercent.html b/templates/sugarpercent.html index 571e9ba..ad94d68 100644 --- a/templates/sugarpercent.html +++ b/templates/sugarpercent.html @@ -16,6 +16,9 @@

Showing results for: $$CATEGORY_NAME$$

low medium high +
@@ -26,6 +29,7 @@

Showing results for: $$CATEGORY_NAME$$

+ diff --git a/templates/winpercent.html b/templates/winpercent.html index 50c7781..0e9bc4d 100644 --- a/templates/winpercent.html +++ b/templates/winpercent.html @@ -12,6 +12,12 @@

Win Percentage

Sugar Percentage Price Percentage Home +

Showing results for: $$CATEGORY_NAME$$

+ high + medium + low +
Nutty Caramel Packs of ManyImage
From f86ab3bb574c94c81162aeb2429d3774cb6adb53 Mon Sep 17 00:00:00 2001 From: isaiahgiebel Date: Thu, 2 Nov 2023 20:21:05 -0500 Subject: [PATCH 08/11] some formatting --- public/css/myStyle.css | 52 ++++++++++++++++++++++++++++++++++++- server.mjs | 20 +++++++------- templates/index.html | 14 +++++----- templates/pricepercent.html | 25 ++++++++++++------ templates/sugarpercent.html | 27 ++++++++++++------- templates/winpercent.html | 26 ++++++++++++------- 6 files changed, 119 insertions(+), 45 deletions(-) diff --git a/public/css/myStyle.css b/public/css/myStyle.css index 60a7036..20b6dbb 100644 --- a/public/css/myStyle.css +++ b/public/css/myStyle.css @@ -16,4 +16,54 @@ table { th { background-color: lightblue; /* This gives a grey background to the header cells */ - } \ No newline at end of file + } + .navbar a { + text-decoration: none; + list-style-type: none; + text-align: center; + + color: white; + padding-left: 5rem; + padding-right: 5rem; + padding-top: .5rem; + padding-bottom: .5rem; + background-color: #173860; + border: .5rem; + border-color:#000000; + border-radius: 10%; + } + + .navbar a:hover { + background-color: #5090dd; + } + + .navbar div{ + text-decoration: none; + list-style-type: none; + + } + .navbar li { + margin: .2rem; + display: inline-flex; + float: center; + +} + +h1 { + text-align: center; + font-size: 3.5rem; +} +h2 { + text-align: center; + font-size: 1.5rem; +} + +.prevNext{ + display: flex; + justify-content: center; /* Centers content horizontally */ + align-items: center; /* Centers content vertically if the container has a specific height */ +} + +.prevNext a{ + padding: 0.5rem; +} diff --git a/server.mjs b/server.mjs index f1fa819..df8d4e7 100644 --- a/server.mjs +++ b/server.mjs @@ -99,8 +99,9 @@ app.get('/sugarpercent/:category', (req, res) => { let table_body = results[0].map((candy,index) => { // Use map to transform each row into an HTML row. const imageName = slugify(candy.competitorname) + '.jpg'; const imagePath = `/images/${imageName}`; - const imageTag = index === 0 ? `${imageName}` : ''; + const imageTag = index === 0 ? `Image of ${candy.competitorname}` : ''; response = response.replace('$$FEATURED_IMAGE$$', imageTag); + response = response.replace('$$IMAGE_CAPTION$$', candy.competitorname); return ` @@ -109,7 +110,6 @@ app.get('/sugarpercent/:category', (req, res) => { - `; }).join(''); // Join all the strings into one big string. response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. @@ -133,24 +133,24 @@ app.get('/winpercent/:category', (req, res) => { switch (category) { case 'low': winMin = 0; - winMax = 33; // Assuming 'low' is sugarpercent < 0.1 + winMax = 40; // Assuming 'low' is sugarpercent < 0.1 break; case 'medium': - winMin = 33 - winMax = 66; // Assuming 'medium' is sugarpercent < 0.3 + winMin = 40 + winMax = 60; // Assuming 'medium' is sugarpercent < 0.3 break; case 'high': - winMin = 66 + winMin = 60 winMax = 100; // Assuming 'high' is sugarpercent < 0.5 break; default: // Handle unknown category or set a default - winMin = 66; + winMin = 60; winMax = 100; break; } // You don't need to perform a query with the candy name here since your queries don't use it. - let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[winMax,winMin]); + let p1 = dbSelect('SELECT * FROM candy WHERE winpercent < ? AND winpercent >= ? ORDER BY winpercent DESC',[winMax,winMin]); let p2 = fs.promises.readFile(path.join(template, 'winpercent.html'), 'utf-8'); Promise.all([p1, p2]).then(results => { @@ -173,7 +173,6 @@ app.get('/winpercent/:category', (req, res) => { - `; }).join(''); // Join all the strings into one big string. response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. @@ -214,7 +213,7 @@ app.get('/pricepercent/:category', (req, res) => { break; } // You don't need to perform a query with the candy name here since your queries don't use it. - let p1 = dbSelect('SELECT * FROM candy WHERE sugarpercent < ? AND sugarpercent >= ? ORDER BY sugarpercent',[priceMax,priceMin]); + let p1 = dbSelect('SELECT * FROM candy WHERE pricepercent < ? AND pricepercent >= ? ORDER BY pricepercent',[priceMax,priceMin]); let p2 = fs.promises.readFile(path.join(template, 'pricepercent.html'), 'utf-8'); Promise.all([p1, p2]).then(results => { @@ -237,7 +236,6 @@ app.get('/pricepercent/:category', (req, res) => { - `; }).join(''); // Join all the strings into one big string. response = response.replace('$$TABLE_BODY$$', table_body); // Replace the table body placeholder. diff --git a/templates/index.html b/templates/index.html index 8a65551..8550ec8 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,11 +7,13 @@ Homepage -

Welcome to the Candy Data Website!

-

Data is provided on the top 10 most liked low sugar, chocolate, and fruity candies.

- Win Percentage - Sugar Percentage - Price Percentage - Home + +

Welcome to the Candy Data Website!

+

Data is provided on well-known candies by popularity, sugar content, and price.

\ No newline at end of file diff --git a/templates/pricepercent.html b/templates/pricepercent.html index 0ab4cb2..e58c2ac 100644 --- a/templates/pricepercent.html +++ b/templates/pricepercent.html @@ -7,17 +7,26 @@ +

Price Percent

- Win Percentage - Sugar Percentage - Price Percentage - Home -

Showing results for: $$CATEGORY_NAME$$

- low - medium - high + +

Results for $$CATEGORY_NAME$$ price

+
+ low + medium + high +
+
+ $$IMAGE_CAPTION$$ +
${candy.competitorname} ${parseFloat(candy.sugarpercent).toFixed(2)+'%'}${convertToYesNo(candy.peanutyalmondy)} ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)}${imageName}
${convertToYesNo(candy.peanutyalmondy)} ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)}${imageName}
${convertToYesNo(candy.peanutyalmondy)} ${convertToYesNo(candy.caramel)} ${convertToYesNo(candy.pluribus)}${imageName}
diff --git a/templates/sugarpercent.html b/templates/sugarpercent.html index ad94d68..51b4771 100644 --- a/templates/sugarpercent.html +++ b/templates/sugarpercent.html @@ -7,18 +7,26 @@ -

Sugar Percentage

- Win Percentage - Sugar Percentage - Price Percentage - Home -

Showing results for: $$CATEGORY_NAME$$

- low - medium - high + +

Sugar Percent

+ +

Results for $$CATEGORY_NAME$$ sugar

+
+ low + medium + high +
div> +
+ $$IMAGE_CAPTION$$ +
@@ -29,7 +37,6 @@

Showing results for: $$CATEGORY_NAME$$

- diff --git a/templates/winpercent.html b/templates/winpercent.html index 0e9bc4d..5ae79c7 100644 --- a/templates/winpercent.html +++ b/templates/winpercent.html @@ -7,17 +7,25 @@ -

Win Percentage

- Win Percentage - Sugar Percentage - Price Percentage - Home -

Showing results for: $$CATEGORY_NAME$$

- high - medium - low + +

Popularity

+

Results for $$CATEGORY_NAME$$ popularity

+
+ low + medium + high +
+
+ $$IMAGE_CAPTION$$ +
Nutty Caramel Packs of ManyImage
From 0dfeb8f34cc15e4b8ab682d8a4e82ec4d5e24532 Mon Sep 17 00:00:00 2001 From: Noah Kruse Date: Thu, 2 Nov 2023 22:06:31 -0500 Subject: [PATCH 09/11] added dynamic buttons but doesnt replace text for some reason. added in few error codes, however database querys are interesting.lookat fixed few visual aspects --- public/css/myStyle.css | 15 +++++++++++++++ server.mjs | 3 +++ templates/index.html | 2 +- templates/pricepercent.html | 6 +++++- templates/sugarpercent.html | 6 +++++- templates/winpercent.html | 6 +++++- 6 files changed, 34 insertions(+), 4 deletions(-) diff --git a/public/css/myStyle.css b/public/css/myStyle.css index 20b6dbb..8cf370f 100644 --- a/public/css/myStyle.css +++ b/public/css/myStyle.css @@ -67,3 +67,18 @@ h2 { .prevNext a{ padding: 0.5rem; } +button{ + text-decoration: none; + list-style-type: none; + text-align: center; + + color: white; + padding-left: 5rem; + padding-right: 5rem; + padding-top: .5rem; + padding-bottom: .5rem; + background-color: #173860; + border: .5rem; + border-color:#000000; + border-radius: 10%; +} diff --git a/server.mjs b/server.mjs index df8d4e7..ffc6a87 100644 --- a/server.mjs +++ b/server.mjs @@ -251,6 +251,7 @@ app.get('/pricepercent/:category', (req, res) => { db.all(query1,(err,rows)=>{ if ((err)=>{ console.log(err) + res.status(404).send("Error finding correct chocolate") }); else{ //res.json(rows) // rows.forEach(row => console.log(`${row.mfr} is ${row.name} `)) @@ -264,6 +265,7 @@ db.all(query1,(err,rows)=>{ db.all(query2,(err,rows)=>{ if ((err)=>{ console.log(err) + res.status(404).send("Error finding correct chocolate") }); else{ //res.json(rows) // rows.forEach(row => console.log(`${row.mfr} is ${row.name} `)) @@ -277,6 +279,7 @@ db.all(query2,(err,rows)=>{ db.all(query3,(err,rows)=>{ if ((err)=>{ console.log(err) + res.status(404).send("Error finding correct chocolate") }); else{ //res.json(rows) // rows.forEach(row => console.log(`${row.mfr} is ${row.name} `)) diff --git a/templates/index.html b/templates/index.html index 8550ec8..4185826 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,7 +7,7 @@ Homepage -
+
+ + +
diff --git a/templates/sugarpercent.html b/templates/sugarpercent.html index 51b4771..33c3ef4 100644 --- a/templates/sugarpercent.html +++ b/templates/sugarpercent.html @@ -7,7 +7,7 @@ -