diff --git a/bakery_website/.gitignore b/bakery_website/.gitignore new file mode 100644 index 0000000..399faa4 --- /dev/null +++ b/bakery_website/.gitignore @@ -0,0 +1,4 @@ +.env +node_modules/* +public/images/* +public/video/* \ No newline at end of file diff --git a/bakery_website/package-lock.json b/bakery_website/package-lock.json new file mode 100755 index 0000000..83ceff5 --- /dev/null +++ b/bakery_website/package-lock.json @@ -0,0 +1,1881 @@ +{ + "name": "bakery_website", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "bakery_website", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^16.3.1", + "express.js": "^1.0.0", + "stripe": "^14.10.0" + }, + "devDependencies": { + "nodemon": "^3.1.4" + } + }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "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==", + "dev": true + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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/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/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "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/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/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/express.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express.js/-/express.js-1.0.0.tgz", + "integrity": "sha512-zwgAG41IaAIxIHIp4dYZVasTF4GgMlUOxA0f+PpJNIcednzDaFo6pY86PXOnoEhAq1i5ooXYRw650Iggb+tkWQ==", + "dependencies": { + "express": "^4.13.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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/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-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/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-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/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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "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/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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.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==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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==", + "dev": true + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "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/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-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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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==", + "dev": true, + "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-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/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "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/stripe": { + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.10.0.tgz", + "integrity": "sha512-zI6yxYVFJtjibgb06Xn08KsJy1Zq+KE3jLkhZ8bJOTrxNVi2CtCreQdUn+NjXN5lTEdiNhxIqL0NmuSza+rOGw==", + "dependencies": { + "@types/node": ">=8.1.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=12.*" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "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/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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, + "dependencies": { + "@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "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==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "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==", + "requires": { + "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" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "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==", + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "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==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "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==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "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==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "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" + } + }, + "express.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/express.js/-/express.js-1.0.0.tgz", + "integrity": "sha512-zwgAG41IaAIxIHIp4dYZVasTF4GgMlUOxA0f+PpJNIcednzDaFo6pY86PXOnoEhAq1i5ooXYRw650Iggb+tkWQ==", + "requires": { + "express": "^4.13.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "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" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "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==", + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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==", + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "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==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "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==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "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==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "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==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "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==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "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==" + }, + "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==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "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==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "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" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "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==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "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==", + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stripe": { + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.10.0.tgz", + "integrity": "sha512-zI6yxYVFJtjibgb06Xn08KsJy1Zq+KE3jLkhZ8bJOTrxNVi2CtCreQdUn+NjXN5lTEdiNhxIqL0NmuSza+rOGw==", + "requires": { + "@types/node": ">=8.1.0", + "qs": "^6.11.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "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==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/bakery_website/package.json b/bakery_website/package.json new file mode 100755 index 0000000..25bc643 --- /dev/null +++ b/bakery_website/package.json @@ -0,0 +1,21 @@ +{ + "name": "bakery_website", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "start": "nodemon server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "dotenv": "^16.3.1", + "express.js": "^1.0.0", + "stripe": "^14.10.0" + }, + "devDependencies": { + "nodemon": "^3.1.4" + } +} diff --git a/bakery_website/public/about.html b/bakery_website/public/about.html new file mode 100755 index 0000000..4897fb0 --- /dev/null +++ b/bakery_website/public/about.html @@ -0,0 +1,60 @@ + + + + + + + About | Sweet Bake - European style Bakery + + + + + + +
+ Sweet Bake + + +
+ +
+
+ +
+

About

+

Sweet Bake

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. + Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+
+
+
+ +
+

Sweet Bake

+
+ + + + +
+
+ Policy + FAQ +
+
+ + + + + + \ No newline at end of file diff --git a/bakery_website/public/cart.js b/bakery_website/public/cart.js new file mode 100755 index 0000000..527fc68 --- /dev/null +++ b/bakery_website/public/cart.js @@ -0,0 +1,17 @@ +const payBtn = document.querySelector('.btn-buy'); + +payBtn.addEventListener('click',() => { + fetch('/stripe-checkout', { + method: 'post', + headers: new Headers({'Content-Type': 'application/Json'}), + body: JSON.stringify({ + items: JSON.parse(localStorage.getItem('cartItems')), + }), + }) + .then((res) => res.json()) + .then((url) => { + location.href = url; + clearCart(); + }) + .catch((err) => console.log(err)); +}); \ No newline at end of file diff --git a/bakery_website/public/contact.html b/bakery_website/public/contact.html new file mode 100755 index 0000000..403747a --- /dev/null +++ b/bakery_website/public/contact.html @@ -0,0 +1,111 @@ + + + + + + + Contact Us | Sweet Bake - European style Bakery + + + + + + +
+ Sweet Bake + + +
+ +
+
+

Contact Us

+
+
+
+

Delivery: We do not deliver, all order are in-house pickup.

+

Cake Design: We can do color changes and topping changes for cakes, but we do not stray from our original cake designs

+
+
+
+
+ First Name + +
+
+ Last Name + +
+
+ +
+
+ Email + +
+
+ Phone Number + +
+
+ +
+
+ Message + +
+
+
+
+ +
+
+
+
+
+
+

Hours/Location/Number

+
+
+

Monday - Saturday 10:00am - 4:00pm

+

Sundays 11:00am - 4:00pm

+

1234 N Lincoln Park W
Chicago, IL 606060

+

(123) 456-7890

+
+
+
+
+ +
+
+
+ +
+

Sweet Bake

+
+ + + + +
+
+ Policy + FAQ +
+
+ + + + + + + \ No newline at end of file diff --git a/bakery_website/public/extension.js b/bakery_website/public/extension.js new file mode 100755 index 0000000..09e2e66 --- /dev/null +++ b/bakery_website/public/extension.js @@ -0,0 +1,177 @@ +//shopping-cart +let cartIcon = document.querySelector('#cart-icon'); +let cart = document.querySelector('.cart'); +let closeCart = document.querySelector('#close-cart'); + +cartIcon.onclick = () =>{ + cart.classList.add("active"); +}; +closeCart.onclick = () =>{ + cart.classList.remove("active"); +}; + +//-------------------- add/remove items from the cart -------------------- +if (document.readyState == 'loading'){ + document.addEventListener('DOMContentLoaded', ready); +} +else{ + ready(); +} +function ready(){ + //remove item from the cart + var removeCartBtn = document.getElementsByClassName('cart-remove'); + for(var i = 0; i < removeCartBtn.length; i++){ + var button = removeCartBtn[i]; + button.addEventListener('click', removeCartItem); + } + //quantity + var quantityInput = document.getElementsByClassName('cart-quantity'); + for(var i = 0; i < quantityInput.length; i++){ + var input = quantityInput[i]; + input.addEventListener('change', quantityChange); + } + //add cart + var addCart = document.getElementsByClassName('add-cart'); + for(var i = 0; i < addCart.length; i++){ + var button = addCart[i]; + button.addEventListener('click', addCartClick); + } + loadCartItems(); +} +//remove item +function removeCartItem(event){ + var buttonClicked = event.target; + buttonClicked.parentElement.remove(); + updateTotal(); + saveCartItem(); +} +//quantity change +function quantityChange(event){ + var input = event.target; + if(isNaN(input.value) || input.value <= 0){ + input.value = 1; + } + updateTotal(); + saveCartItem(); + updateCartIcon(); +} +//add item to cart +function addCartClick(event){ + var button = event.target; + var shopProduct = button.parentElement; + var title = shopProduct.getElementsByClassName('product-title')[0].innerText; + var price = shopProduct.getElementsByClassName('price')[0].innerText; + var productImg = shopProduct.getElementsByClassName('product-img')[0].src; + addProductToCart(title, price, productImg); + updateTotal(); + saveCartItem(); + updateCartIcon(); +} +function addProductToCart(title, price, productImg){ + var cartShopBox = document.createElement('div'); + cartShopBox.classList.add('cart-box'); + var cartItems = document.getElementsByClassName('cart-content')[0]; + var cartItemName = cartItems.getElementsByClassName('cart-product-title'); + for (var i = 0; i < cartItemName.length; i++){ + if (cartItemName[i].innerText == title){ + alert('You have already added this item to your cart'); + return; + } + } + var cartBoxContent = ` +
+
${title}
+
${price}
+ +
+ `; + cartShopBox.innerHTML = cartBoxContent; + cartItems.append(cartShopBox); + cartShopBox.getElementsByClassName('cart-remove')[0].addEventListener('click', removeCartItem); + cartShopBox.getElementsByClassName('cart-quantity')[0].addEventListener('change', quantityChange); + saveCartItem(); + updateCartIcon(); +} +//price total +function updateTotal(){ + var cartContent = document.getElementsByClassName('cart-content')[0]; + var cartBoxes = cartContent.getElementsByClassName('cart-box'); + var total =0; + for(var i = 0; i < cartBoxes.length; i++){ + var cartBox = cartBoxes[i]; + var priceElement = cartBox.getElementsByClassName('cart-price')[0]; + var quantityElement = cartBox.getElementsByClassName('cart-quantity')[0]; + var price = parseFloat(priceElement.innerText.replace('$', '')) + var quantity = quantityElement.value; + total += price*quantity; + } + total = Math.round(total * 100)/100; + document.getElementsByClassName('total-price')[0].innerText = '$' + total; + //save total + localStorage.setItem('cartTotal', total); +} +//item in cart +function saveCartItem(){ + var cartContent = document.getElementsByClassName('cart-content')[0]; + var cartBoxes = cartContent.getElementsByClassName('cart-box'); + var cartItems = []; + + for (var i = 0; i < cartBoxes.length; i++){ + cartBox = cartBoxes[i]; + var titleElement = cartBox.getElementsByClassName('cart-product-title')[0]; + var priceElement = cart.getElementsByClassName('cart-price')[0]; + var quantityElement = cartBox.getElementsByClassName('cart-quantity')[0]; + var productImg = cartBox.getElementsByClassName('cart-img')[0].src; + + var item = { + title: titleElement.innerText, + price: priceElement.innerText, + quantity: quantityElement.value, + productImg: productImg, + }; + cartItems.push(item); + } + localStorage.setItem('cartItems', JSON.stringify(cartItems)); +} +//load in cart +function loadCartItems(){ + var cartItems = localStorage.getItem('cartItems'); + if (cartItems){ + cartItems = JSON.parse(cartItems); + + for (var i = 0; i < cartItems.length; i++){ + var item = cartItems[i]; + addProductToCart(item.title, item.price, item.productImg); + + var cartBoxes = document.getElementsByClassName('cart-box'); + var cartBox = cartBoxes[cartBoxes.length - 1]; + var quantityElement = cartBox.getElementsByClassName('cart-quantity')[0]; + quantityElement.value = item.quantity; + } + } + var cartTotal = localStorage.getItem('cartTotal'); + if(cartTotal){ + document.getElementsByClassName('total-price')[0].innerText = '$' + cartTotal; + } + updateCartIcon(); +} +//quantity in cart icon +function updateCartIcon(){ + var cartBoxes = document.getElementsByClassName('cart-box'); + var quantity = 0; + + for (var i = 0; i < cartBoxes.length; i++){ + var cartBox = cartBoxes[i]; + var quantityElement = cartBox.getElementsByClassName('cart-quantity')[0]; + quantity += parseInt(quantityElement.value); + } + var cartIcon = document.querySelector('#cart-icon'); + cartIcon.setAttribute('data-quantity', quantity); +} +//clear cart after making a payment +function clearCart(){ + var cartContent = document.getElementsByClassName('cart-content')[0]; + cartContent.innerHTML = ''; + updateTotal(); + localStorage.removeItem('cartItems'); +} diff --git a/bakery_website/public/gallery.html b/bakery_website/public/gallery.html new file mode 100755 index 0000000..a9b7b0c --- /dev/null +++ b/bakery_website/public/gallery.html @@ -0,0 +1,123 @@ + + + + + + + Home | Sweet Bake - European style Bakery + + + + + + +
+ Sweet Bake + + +
+ +
+
+ + + +
+
+ +
+
+

Business hours

+

Mon - Sat 10:00am - 4:00pm

+

Sun 11:00am - 4:00pm

+
+
+ +
+ + + +
+
+ Image Category:

+ +
+
+
+
+ + +
+

Sweet Bake

+
+ + + + +
+
+ Policy + FAQ +
+
+ + + + + + \ No newline at end of file diff --git a/bakery_website/public/index.html b/bakery_website/public/index.html new file mode 100755 index 0000000..b00d8e0 --- /dev/null +++ b/bakery_website/public/index.html @@ -0,0 +1,191 @@ + + + + + + + Home | Sweet Bake - European style Bakery + + + + + + +
+ Sweet Bake + + +
+ + +
+ + +
+

We bake the world a better place

+

We are delighted to present to you daily, an irresistible selection of fresh ingredients

+ Our Menu +
+
+

Celebrate your holiday with us

+

Enhance your holiday with our delightful array of freshly baked goods
and aromatic brewed beverages.

+ Order Now +
+
+ + +
+
+ + + +
+

Best Selling

+
+
+
+
+ +
+

Macarons

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

+ +
+
+
+ +
+

Cream Puffs

+

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ +
+
+
+ +
+

Cheesecake

+

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

+ +
+
+
+
+
+
+ +
+
+
+
+
+

current hours

+
+
+

Business Hours

+

Monday - Saturday 10:00am - 4:00pm

+

Sundays 11:00am - 4:00pm

+
+
+
+
+
+
+ +
+

Looking to inquire or ready to make an order?

+ +

Sweet Bake

+
+ + + + +
+
+ Policy + FAQ +
+
+ + + + + + \ No newline at end of file diff --git a/bakery_website/public/main.js b/bakery_website/public/main.js new file mode 100755 index 0000000..30ccda7 --- /dev/null +++ b/bakery_website/public/main.js @@ -0,0 +1,164 @@ +//navbar +const menuBtn = document.querySelector(".menu-btn"); +const navi = document.querySelector(".nav"); + +menuBtn.addEventListener("click", ()=>{ + menuBtn.classList.toggle("active"); + navi.classList.toggle("active"); +}); + +//video +const videoBtn = document.querySelectorAll(".nav-btn"); +const slides = document.querySelectorAll(".video-slide"); +const contents = document.querySelectorAll(".content"); + +var sliderNav = function(manual){ + videoBtn.forEach((btn)=>{ + btn.classList.remove("active"); + }); + + slides.forEach((slide)=>{ + slide.classList.remove("active"); + }); + contents.forEach((content)=>{ + content.classList.remove("active"); + }); + + videoBtn[manual].classList.add("active"); + slides[manual].classList.add("active"); + contents[manual].classList.add("active"); +} +videoBtn.forEach((btn, i)=>{ + btn.addEventListener("click", ()=>{ + sliderNav(i); + }); +}); + +//carousel +const carousel = document.querySelector(".carousel"), +firstImg = carousel.querySelectorAll("img")[0], +arrowIcons = document.querySelectorAll(".wrapper i"); + +let isDragStart = false, isDragging = false, prevPageX, prevScrollLeft, positionDiff; + +const showHideIcons = () => { + // showing and hiding prev/next icon according to carousel scroll left value + let scrollWidth = carousel.scrollWidth - carousel.clientWidth; // getting max scrollable width + arrowIcons[0].style.display = carousel.scrollLeft == 0 ? "none" : "block"; + arrowIcons[1].style.display = carousel.scrollLeft == scrollWidth ? "none" : "block"; +} + +arrowIcons.forEach(icon => { + icon.addEventListener("click", () => { + let firstImgWidth = firstImg.clientWidth + 14; // getting first img width & adding 14 margin value + // if clicked icon is left, reduce width value from the carousel scroll left else add to it + carousel.scrollLeft += icon.id == "left" ? -firstImgWidth : firstImgWidth; + setTimeout(() => showHideIcons(), 60); // calling showHideIcons after 60ms + }); +}); + +const autoSlide = () => { + // if there is no image left to scroll then return from here + if(carousel.scrollLeft - (carousel.scrollWidth - carousel.clientWidth) > -1 || carousel.scrollLeft <= 0) return; + + positionDiff = Math.abs(positionDiff); // making positionDiff value to positive + let firstImgWidth = firstImg.clientWidth + 14; + // getting difference value that needs to add or reduce from carousel left to take middle img center + let valDifference = firstImgWidth - positionDiff; + + if(carousel.scrollLeft > prevScrollLeft) { // if user is scrolling to the right + return carousel.scrollLeft += positionDiff > firstImgWidth / 3 ? valDifference : -positionDiff; + } + // if user is scrolling to the left + carousel.scrollLeft -= positionDiff > firstImgWidth / 3 ? valDifference : -positionDiff; +} + +const dragStart = (e) => { + // updatating global variables value on mouse down event + isDragStart = true; + prevPageX = e.pageX || e.touches[0].pageX; + prevScrollLeft = carousel.scrollLeft; +} + +const dragging = (e) => { + // scrolling images/carousel to left according to mouse pointer + if(!isDragStart) return; + e.preventDefault(); + isDragging = true; + carousel.classList.add("dragging"); + positionDiff = (e.pageX || e.touches[0].pageX) - prevPageX; + carousel.scrollLeft = prevScrollLeft - positionDiff; + showHideIcons(); +} + +const dragStop = () => { + isDragStart = false; + carousel.classList.remove("dragging"); + + if(!isDragging) return; + isDragging = false; + autoSlide(); +} + +carousel.addEventListener("mousedown", dragStart); +carousel.addEventListener("touchstart", dragStart); + +document.addEventListener("mousemove", dragging); +carousel.addEventListener("touchmove", dragging); + +document.addEventListener("mouseup", dragStop); +carousel.addEventListener("touchend", dragStop); + +//gallery-tab +//selecting all required elements +const filterItem = document.querySelector(".gallery-items"); +const filterImg = document.querySelectorAll(".gallery .image-gal"); + +window.onload = ()=>{ //after window loaded + filterItem.onclick = (selectedItem)=>{ //if user click on filterItem div + if(selectedItem.target.classList.contains("item-gallery")){ //if user selected item has .item class + filterItem.querySelector(".active").classList.remove("active"); //remove the active class which is in first item + selectedItem.target.classList.add("active"); //add that active class on user selected item + let filterName = selectedItem.target.getAttribute("data-name"); //getting data-name value of user selected item and store in a filtername variable + filterImg.forEach((image) => { + let filterImges = image.getAttribute("data-name"); //getting image data-name value + //if user selected item data-name value is equal to images data-name value + //or user selected item data-name value is equal to "all" + if((filterImges == filterName) || (filterName == "all")){ + image.classList.remove("hide"); //first remove the hide class from the image + image.classList.add("show"); //add show class in image + }else{ + image.classList.add("hide"); //add hide class in image + image.classList.remove("show"); //remove show class from the image + } + }); + } + } + for (let i = 0; i < filterImg.length; i++) { + filterImg[i].setAttribute("onclick", "preview(this)"); //adding onclick attribute in all available images + } +} + +//fullscreen image preview function +//selecting all required elements +const previewBox = document.querySelector(".preview-box"), +categoryName = previewBox.querySelector(".title-gal p"), +previewImg = previewBox.querySelector("img"), +closeIcon = previewBox.querySelector(".icon-gal"), +shadow = document.querySelector(".shadow"); + +function preview(element){ + //once user click on any image then remove the scroll bar of the body, so user can't scroll up or down + document.querySelector("body").style.overflow = "hidden"; + let selectedPrevImg = element.querySelector("img").src; //getting user clicked image source link and stored in a variable + let selectedImgCategory = element.getAttribute("data-name"); //getting user clicked image data-name value + previewImg.src = selectedPrevImg; //passing the user clicked image source in preview image source + categoryName.textContent = selectedImgCategory; //passing user clicked data-name value in category name + previewBox.classList.add("show"); //show the preview image box + shadow.classList.add("show"); //show the light grey background + closeIcon.onclick = ()=>{ //if user click on close icon of preview box + previewBox.classList.remove("show"); //hide the preview box + shadow.classList.remove("show"); //hide the light grey background + document.querySelector("body").style.overflow = "auto"; //show the scroll bar on body + } +} diff --git a/bakery_website/public/menu.html b/bakery_website/public/menu.html new file mode 100755 index 0000000..fb3a292 --- /dev/null +++ b/bakery_website/public/menu.html @@ -0,0 +1,225 @@ + + + + + + + Menu | Sweet Bake - European style Bakery + + + + + + +
+ +
+ +
+

Cakes

+
+
+ +

Ice cream cake

+ $24.99 (1 lb) + +
+ +
+ +

Chocolate cake

+ $19.99 (1 lb) + +
+ +
+ +

Red velvet cake

+ $19.99 (1 lb) + +
+ +
+ +

Cheesecake

+ $19.99 (1 lb) + +
+ +
+ +

Orange Cake

+ $15.99 (1 lb) + +
+ +
+ +

Carrot cake

+ $13.99 (1 lb) + +
+
+ +




Pastries

+
+
+ +

Passion fruit panna cotta

+ $7.99 (1 ea) + +
+ +
+ +

Tiramisu

+ $6.99 (1 ea) + +
+ +
+ +

Cream puff

+ $6.99 (1 ea) + +
+ +
+ +

Matcha Swiss roll

+ $5.99 (1 ea) + +
+ +
+ +

strawberry swiss roll

+ $5.99 (1 ea) + +
+ +
+ +

Paris brest

+ $5.99 (1 ea) + +
+ +
+ +

Crème brûlée

+ $5.99 (1 ea) + +
+ +
+ +

Pastéis De Nata

+ $4.99 (1 ea) + +
+ +
+ +

corissant

+ $3.99 (1 ea) + +
+ +
+ +

Nutella Puff

+ $2.99 (1 ea) + +
+
+ +




Macarons

+
+
+ +

Rose Lychee Macaron

+ $2.99 (1 ea) + +
+ +
+ +

Chocolate macaron

+ $2.99 (1 ea) + +
+ +
+ +

Vanilla macaron

+ $2.99 (1 ea) + +
+ +
+ +

Strawberry Macaron

+ $2.99 (1 ea) + +
+ +
+ +

Lemon Macaron

+ $2.99 (1 ea) + +
+ +
+ +

Pistachio Macaron

+ $2.99 (1 ea) + +
+ +
+ +

Salted Caramel Macaron

+ $2.99 (1 ea) + +
+ +
+ +

Hazelnut Praline Macaron

+ $2.99 (1 ea) + +
+
+
+ + + + + + + \ No newline at end of file diff --git a/bakery_website/public/style.css b/bakery_website/public/style.css new file mode 100755 index 0000000..0af1fe7 --- /dev/null +++ b/bakery_website/public/style.css @@ -0,0 +1,1083 @@ +@import url('https://fonts.googleapis.com/css2?family=Cormorant:wght@300;400;500;600;700&family=Waterfall&display=swap'); +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Cormorant', serif; +} +/*---------- header ----------*/ +header{ + z-index: 999; + display: flex; + position: absolute; + top: 0; + left: 0; + width: 100%; + justify-content: space-between; + align-items: center; + padding: 15px 200px; + transition: 0.5s ease; +} +header .brand{ + color: white; + font-size: 60px; + font-weight: 500; + letter-spacing: 2px; + font-family: 'Waterfall'; + text-decoration: none; +} +header .nav{ + position: relative; +} +header .nav .nav-items a{ + position: relative; + color: whitesmoke; + font-size: 16px; + letter-spacing: 2px; + text-transform: uppercase; + text-decoration: none; + margin-left: 30px; + transition: 0.3 ease; +} +header .nav .nav-items a:before{ + content: ''; + position: absolute; + background: black; + width: 0; + height: 2px; + bottom: 0; + left: 0; + transition: 0.3s ease; +} +header .nav .nav-items a:hover:before{ + width: 100%; +} +/*---------- landing page ----------*/ +section{ + padding: 100px 200px; +} +.home{ + position: relative; + width: 100%; + min-height: 90vh; + display: flex; + justify-content: center; + flex-direction: column; + background-color: aliceblue; +} +.home:before{ + z-index: 777; + content: ''; + position: absolute; + background: rgba(1, 1, 1, 0.5); + width: 100%; + height: 100%; + top: 0; + left: 0; +} +.home .content{ + z-index: 888; + width: 100%; + margin-top: 50px; + text-align: center; + align-items: center; + justify-content: center; + display: none; +} +.home .content.active{ + display: block; +} +.home .content h1{ + font-size: 54px; + font-weight: 800; + letter-spacing: 5px; + line-height: 70px; + margin-bottom: 50px; + color: white; + text-transform: uppercase; +} +.home .content p{ + margin-bottom: 100px; + font-size: 22px; + letter-spacing: 2px; + color: white; +} +.home .content a{ + background: rgba(1,1,1,0.2); + backdrop-filter: blur(10px); + padding: 15px 35px; + font-size: 12px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 4px; + text-decoration: none; + color: white; +} +.home video{ + z-index: 000; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} +.slider-nav{ + z-index: 888; + position: relative; + display: flex; + justify-content: center; + align-items: center; + transform: translateY(150px); + margin-bottom: 10px; +} +.slider-nav .nav-btn{ + width: 12px; + height: 12px; + background: white; + border-radius: 50%; + cursor: pointer; + box-shadow: 0 0 2px rgba(255, 255, 255, 0.5); + transition: 0.3s ease; +} +.slider-nav .nav-btn.active{ + background-color: #6C5F5B; +} +.slider-nav .nav-btn:not(:last-child){ + margin-right: 20px; +} +.slider-nav .nav-btn:hover{ + transform: scale(1.2); +} +.video-slide{ + position: absolute; + width: 100%; + clip-path: circle(0% at 0 50%); +} +.video-slide.active{ + clip-path: circle(150% at 0 50%); + transition: 2s ease; + transition-property: clip-path; +} +/*---------- content-1 ----------*/ +.tab{ + display: flex; + justify-content: center; + flex-wrap: wrap; + margin-top: 30px; +} +.tab-label{ + padding: 10px 16px; + font-size: 12px; + font-weight: 600; + letter-spacing: 1px; + text-transform: uppercase; + color: gray; + cursor: pointer; +} +.tab-radio{ + display: none; +} +.tab-content, .post-gallery{ + order:1; + width: 100%; + display: none; +} +.tab-radio:checked + .tab-label{ + font-weight: bold; + color: black; +} +.tab-radio:checked + .tab-label + .tab-content{ + display: initial; +} +.note .container{ + max-width: 100%; + background-color: #F3EEEA; +} +.note-detail{ + display: grid; + grid-template-columns: repeat(2, 1fr); + text-align: center; + margin-top: 25px; + margin-bottom: 50px; +} +.note-img img{ + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; +} +.note-text, .note-text-1{ + padding: 0 100px; + margin-top: 100px; +} +.note-text-title{ + height: 80px; + width: 80px; + background-color: #765827; + border-radius: 50%; + display: inline-block; +} +.note-text-title h2{ + margin-top: 30px; + font-size: 20px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 2px; + color: white; +} +.note-text h1{ + margin-top: 80px; + color: #776b5d; +} +.note-text p{ + margin-top: 30px; + font-size: 20px; + color: #3F4E4F; +} +.order-btn{ + margin-top: 80px; +} +.order-btn a{ + font-size: 26px; + font-weight: 700; + text-decoration: underline solid 2px #EAC696; + color: #765827; + letter-spacing: 2px; +} +.order-btn a:hover{ + color: #3F4E4F; + text-decoration: underline solid 2px rgb(103, 103, 103); +} +.order-btn-1{ + margin-top: 80px; +} +.note-text-title-1{ + height: 80px; + width: 80px; + background-color: #AA3A3A; + border-radius: 50%; + display: inline-block; +} +.note-text-title-1 h2{ + margin-top: 30px; + font-size: 16px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 2px; + color: white; +} +.note-text-1 h1{ + margin-top: 80px; + color: #1B4242; +} +.note-text-1 span{ + font-size: 46px; + letter-spacing: 2px; + color: #AA3A3A; +} +.note-text-1 p{ + margin-top: 30px; + font-size: 20px; + color: #5C8374; +} +.order-btn-1 a{ + font-size: 26px; + font-weight: 700; + text-decoration: underline solid 2px #656e57; + color: #691919; + letter-spacing: 2px; +} +.order-btn-1 a:hover{ + color: #AA3A3A; + text-decoration: underline solid 2px #A4B787; +} +/*---------- content-2 ----------*/ +.content-2{ + display: block; + justify-content: center; + text-align: center; + align-items: center; +} +.content-2 h1{ + margin-top: 30px; + margin-bottom: 80px; + font-size: 46px; + font-weight: 400; + text-transform: uppercase; + letter-spacing: 4px; +} +.con-2 .container{ + max-width: 95%; + display: block; + margin-left: auto; + margin-right: auto +} +.con-2-detail{ + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-gap: 50px; + text-align: center; + margin-top: 25px; + margin-bottom: 50px; +} +.con-2-img img{ + width: 100%; + height: 70%; + object-fit: cover; + object-position: center; +} +.con-2-text{ + margin-top: 30px; + text-align: left; +} +.con-2-text h3{ + margin-bottom: 30px; + text-transform: uppercase; +} +.con-2-text p{ + margin-bottom: 30px; + font-size: 18px; +} +.con-2-btn{ + padding: 10px 12px; + outline: 2px solid black; + background-color: transparent; + border: none; +} +.con-2-btn:hover{ + background-color: black; +} +.con-2-btn a{ + text-decoration: none; + color: black; +} +.con-2-btn a:hover{ + color: white; +} +/*---------- content-3 ----------*/ +.content-3{ + display: block; +} +.con-3 .container{ + max-width: 90%; +} +.con-3-detail{ + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-gap: 50px; + text-align: center; + margin-top: 25px; + margin-bottom: 25px; +} +.con-3-img img{ + width: 100%; + height: 650px; + object-fit: cover; + object-position: center; +} +.con-3-text h1{ + text-transform: uppercase; + letter-spacing: 2px; + font-weight: 400; + margin: 10px; +} +.con-3-text-detail{ + text-align: left; + margin: 10px; +} +.con-3-text-detail h3{ + margin-bottom: 10px; + font-size: 22px; +} +.con-3-text-detail p{ + margin-bottom: 10px; + font-size: 18px; +} +/*---------- content-4 ----------*/ +.content-4{ + margin: 100px; + justify-content: center; + align-items: center; + text-align: center; +} +.content-4 h2{ + text-transform: uppercase; + font-size: 20px; + letter-spacing: 2px; +} +.content-4 h3{ + margin-top: 150px; + font-size: 66px; + font-weight: 500; + letter-spacing: 2px; + font-family: 'Waterfall'; +} +.content-4 .con-2-btn{ + margin-top: 50px; +} +.con-4-social{ + margin-top: 25px; + margin-bottom: 50px; +} +.con-4-social i{ + font-size: 22px; + color: black; + margin: 5px; +} +.con-4-social i:hover{ + color: #3F4E4F; +} +.content-4 .con-text-4 a{ + text-decoration: none; + color: black; + margin: 5px; + font-size: 14px; +} +.content-4 .con-text-4 a:hover{ + color: #3F4E4F; +} +footer{ + position: relative; + text-align: center; + align-items: center; + justify-content: center; + margin-top: -50px; +} +footer .content-4 p{ + position: absolute; + padding-bottom: 2.5rem; + bottom: 0; +} +/*------------------------------------------------------------ gallery ------------------------------------------------------------*/ +#brand-1{ + color: black; +} +#nav-items-1 a{ + color: black; +} +/*---------- landing page ----------*/ +.bakery{ + display: flex; + align-items: center; + justify-content: center; + min-height: 80vh; +} +.wrapper{ + display: flex; + max-width: 100%; + position: relative; +} +.wrapper i{ + top: 50%; + height: 44px; + width: 44px; + color: #343F4F; + cursor: pointer; + font-size: 1.15rem; + position: absolute; + text-align: center; + line-height: 44px; + background: #fff; + border-radius: 50%; + transform: translateY(-50%); + transition: transform 0.1s linear; +} +.wrapper i:active{ + transform: translateY(-50%) scale(0.9); +} +.wrapper i:hover{ + background: #f2f2f2; +} +.wrapper i:first-child{ + left: 20px; + display: none; +} +.wrapper i:last-child{ + right: 20px; +} +.wrapper .carousel{ + font-size: 0px; + cursor: pointer; + overflow: hidden; + white-space: nowrap; + scroll-behavior: smooth; + margin-top: 30px; +} +.carousel.dragging{ + cursor: grab; + scroll-behavior: auto; +} +.carousel.dragging img{ + pointer-events: none; +} +.carousel img{ + margin-top: 100px; + height: 750px; + object-fit: cover; + user-select: none; + margin-left: 14px; + width: calc(100% / 3); +} +.carousel img:first-child{ + margin-left: 0px; +} +/*---------- hour ----------*/ +.hour-bakery{ + display: grid; + position: relative; + place-items: center; + align-items: center; + justify-content: center; + text-align: center; +} +.hour-baker-detail{ + position: absolute; + width: 500px; + height: 250px; + background-color: white; + margin-top: -100px; + z-index: 2; +} +.hour-baker-detail h2{ + margin: 50px; + font-size: 18px; + text-transform: uppercase; + letter-spacing: 2px; +} +.hour-baker-detail p{ + font-size: 32px; + margin-bottom: 10px; +} +.line{ + border-bottom: 1px solid lightgray; + margin-top: 120px; +} +/*---------- gallery ----------*/ +.our-gal{ + display: grid; + justify-content: center; + text-align: center; + margin-bottom: 100px; +} +.our-gal h2{ + font-size: 36px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 4px; +} +.wrapper-gallery{ + margin: 100px auto; + max-width: 80%; +} +.wrapper-gallery nav{ + display: flex; + justify-content: center; +} +.wrapper-gallery .gallery-items{ + display: flex; + max-width: 720px; + width: 100%; + justify-content: space-between; +} +.gallery-items span{ + padding: 7px 25px; + font-size: 18px; + font-weight: 500; + cursor: pointer; + color: black; + border-radius: 10px; + border: 2px solid black; + transition: all 0.3s ease; +} +.gallery-items span.active, +.gallery-items span:hover{ + color: #fff; + background: black; +} +.gallery{ + display: flex; + flex-wrap: wrap; + margin-top: 30px; +} + .gallery .image-gal{ + width: calc(100% / 4); + padding: 7px; +} +.gallery .image-gal span{ + display: flex; + width: 100%; + overflow: hidden; +} +.gallery .image-gal img{ + width: 100%; + vertical-align: middle; + transition: all 0.3s ease; +} +.gallery .image-gal:hover img{ + transform: scale(1.1); +} +.gallery .image-gal.hide{ + display: none; +} +.gallery .image-gal.show{ + animation: animate 0.4s ease; +} +@keyframes animate { + 0%{ + transform: scale(0.5); + } + 100%{ + transform: scale(1); + } +} +.preview-box{ + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) scale(0.9); + background: #fff; + max-width: 700px; + width: 100%; + z-index: 5; + opacity: 0; + pointer-events: none; + border-radius: 3px; + padding: 0 5px 5px 5px; + box-shadow: 0px 0px 15px rgba(0,0,0,0.2); +} +.preview-box.show{ + opacity: 1; + pointer-events: auto; + transform: translate(-50%, -50%) scale(1); + transition: all 0.3s ease; +} +.preview-box .details-gal{ + padding: 13px 15px 13px 10px; + display: flex; + align-items: center; + justify-content: space-between; +} +.details-gal .title-gal{ + display: flex; + font-size: 18px; + font-weight: 400; +} +.details-gal .title-gal p{ + font-weight: 500; + margin-left: 5px; +} +.details-gal .icon-gal{ + color: black; + font-style: 22px; + cursor: pointer; +} +.preview-box .image-box-gal{ + width: 100%; + display: flex; +} +.image-box-gal img{ + width: 100%; + height: 850px; + object-position: center; + object-fit: cover; + border-radius: 0 0 3px 3px; +} +.shadow{ + position: fixed; + left: 0; + top: 0; + height: 100%; + width: 100%; + z-index: 2; + display: none; + background: rgba(0,0,0,0.4); +} +.shadow.show{ + display: block; +} +/*------------------------------------------------------------ about ------------------------------------------------------------*/ +.about{ + width: 100%; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; +} +.main-about{ + max-width: 80%; + width: 1290px; + margin-top: 100px; + display: flex; + flex-wrap: wrap; + justify-content: space-around; + align-items: center; +} +.about .main-about img{ + width: 580px; + height: auto; + max-width: 100%; + padding: 0 10px; +} +.all-text{ + width: 600px; + padding: 0 10px; + max-width: 100%; +} +.all-text h4{ + font-size: 20px; + font-weight: 400; + letter-spacing: 2px; + text-transform: uppercase; + margin-bottom: 10px; +} +.all-text h2{ + font-size: 42px; + font-weight: 700; + letter-spacing: 2px; + text-transform: uppercase; + margin-bottom: 20px; + color: #765827; +} +.all-text p{ + font-size: 20px; + line-height: 30px; +} +/*------------------------------------------------------------ contact ------------------------------------------------------------*/ +.contact-form{ + position: relative; + width: 100%; + padding: 40px 50px; + margin-top: 100px; +} +.contact-title{ + display: flex; + justify-content: center; + align-items: center; +} +.contact-title h2{ + font-size: 30px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 4px; +} +.contact-box{ + position: relative; + display: grid; + grid-template-columns: 2fr 1fr; + grid-template-rows: 4fr 5fr; + grid-template-areas: "form info" "form map"; + grid-gap: 20px; + margin-top: 50px; +} +.contact{ + padding: 40px; + background: white; +} +.contact p{ + font-weight: bolder; + font-size: 22px; + line-height: 40px; +} +.contact span{ + font-weight: normal; + font-size: 20px; +} +.form{ + grid-area: form; +} +.info{ + grid-area: info; +} +.map{ + grid-area: map; +} +.formbox{ + position: relative; + width: 100%; + margin-top: 50px; +} +.formbox .row{ + display: flex; + gap: 20px; +} +.inputbox{ + display: flex; + flex-direction: column; + margin-bottom: 10px; + width: 50%; +} +.formbox .row1 .inputbox{ + width: 100%; +} +.inputbox span{ + font-size: 20px; + font-weight: 500; + margin-bottom: 5px; +} +.inputbox input, .inputbox textarea{ + padding: 10px; + font-size: 20; + outline: none; + border: 1px solid lightgray; +} +.inputbox textarea{ + min-height: 220px; + resize: none; + margin-bottom: 10px; +} +.inputbox input[type="submit"]{ + border: 1px solid black; + background: transparent; + font-size: 20px; + font-weight: 700; + max-width: 120px; + padding: 14px 15px; + cursor: pointer; +} +.info h3{ + font-size: 22px; + margin-bottom: 20px; +} +.info .infobox div p{ + font-weight: normal; + font-size: 20px; +} +.map{ + padding: 0; +} +.map iframe{ + width: 100%; + height: 100%; +} +/*------------------------------------------------------------ respondsive design ------------------------------------------------------------*/ +@media (max-width:1200px){ + header{ + padding: 20px 20px; + } + section{ + padding: 100px 20px; + } + .menu-btn{ + background: url(images/menu.png) no-repeat; + background-size: 30px; + background-position: center; + width: 40px; + height: 40px; + cursor: pointer; + transition: 0.3s ease; + } + header .nav{ + display: none; + } + header .nav.active{ + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; + background: rgba(1, 1, 1, 0.1); + } + header .nav.active .nav-items{ + background-color: white; + width: 600px; + max-width: 600px; + margin: 20px; + padding: 40px; + display: flex; + flex-direction: column; + align-items: center; + box-shadow: 0 5px 25px rgb(1 1 1 1/ 10%); + } + header .nav .nav-items a{ + color: black; + font-size: 22px; + margin: 20px; + } + header .nav .nav-items a::before{ + background: black; + height: 3px; + } + .menu-btn{ + display: block; + font-size: 30px; + color: black; + transition: 0.3s ease; + } + .menu-btn i{ + color: black; + } + .menu-btn.active{ + z-index: 999; + background: url(images/close.png) no-repeat; + background-size: 25px; + background-position: center; + transition: 0.3s ease; + } + .con-2-detail{ + grid-gap: 25px; + } + .con-2-img img{ + height: 60%; + } + .con-3-detail{ + grid-template-columns: repeat(2, 1fr); + } + .con-3-img img{ + height: 50%; + } +/*---------- (gallery)----------*/ + .gallery .image-gal{ + width: calc(100% / 3); + } +/*---------- (about)----------*/ + .about{ + padding: 50px 0; + } + .all-text{ + text-align: center; + margin-top: 50px; + } +} +@media (width < 900px) { +/*---------- landing page (gallery)----------*/ + .carousel img{ + height: 650px; + width: calc(100% / 2); + } + .contact-form{ + padding: 20px; + } + .contact-box{ + grid-template-columns:1fr; + grid-template-rows: auto; + grid-template-areas: "form" "info" "map"; + grid-gap: 20px; + margin-top: 50px; + } + .formbox .row{ + gap: 0; + flex-direction: column; + } + .inputbox{ + width: 100%; + } + .map{ + min-height: 300px; + padding: 0; + } +} +@media (width < 850px){ + .slider-nav .nav-btn{ + margin-top: -100px; + } + .note-detail{ + grid-template-columns: repeat(1, 1fr); + } + .note-text, .note-text-1{ + padding: 0 50px; + margin-top: -25px; + } + .note-text p, .note-text p{ + margin-top: 50px; + } + .note-text h1, .note-text-1 h1{ + margin-top: 40px; + } + .note-text p, .note-text-1 p{ + margin-top: 20px; + } + .order-btn, .order-btn-1{ + margin-top: 40px; + margin-bottom:20px ; + } + .note .container{ + background-color: transparent; + } + .note-img img{ + margin-top: 10px; + } + .content-2{ + background-color: whitesmoke; + } + .content-2 h1{ + margin-top: -10px; + } + .con-2-detail{ + grid-template-columns: repeat(2, 1fr); + } +/*---------- (gallery)----------*/ + .wrapper-gallery nav .gallery-items{ + max-width: 600px; + } + nav .gallery-items span{ + padding: 7px 15px; + } + .gallery .image-gal{ + width: calc(100% / 2); + } +} +@media (width < 550px){ + .slider-nav .nav-btn{ + margin-top: -150px; + } + .con-2-detail{ + grid-template-columns: repeat(1, 1fr); + } + .con-3-detail{ + grid-template-columns: repeat(1, 1fr); + } + .con-3-img img{ + height: 40%; + } + .con-3-text h1{ + text-align: center; + margin-left: 20px; + } + .con-3-text-detail h3{ + text-align: center; + } + .con-3-text-detail p{ + text-align: center; + } + .content-4 h2{ + font-size: 16px; + } + .content-4 h3{ + font-size: 46px; + } +/*---------- landing page (gallery)----------*/ + .carousel img{ + height: 550px; + width: 100%; + } + .hour-baker-detail{ + width: 320px; + height: 160px; + } + .hour-baker-detail h2{ + font-size: 16px; + } + .hour-baker-detail p{ + font-size: 26px; + } + .wrapper-gallery{ + margin: 30px auto; + } + .wrapper-gallery nav .gallery-items{ + flex-wrap: wrap; + justify-content: center; + } + nav .gallery-items span{ + margin: 5px; + } + .gallery .image-gal{ + width: 100%; + } + .all-text h2{ + font-size: 38px; + } +} \ No newline at end of file diff --git a/bakery_website/public/style_extension.css b/bakery_website/public/style_extension.css new file mode 100755 index 0000000..93250a3 --- /dev/null +++ b/bakery_website/public/style_extension.css @@ -0,0 +1,311 @@ +@import url('https://fonts.googleapis.com/css2?family=Cormorant:wght@300;400;500;600;700&family=Waterfall&display=swap'); +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Cormorant', serif; +} +img{ + width: 100%; +} +header{ + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 100; + background-color: white; + box-shadow: 0 1px 4px hsla(0, 0%, 98%, 0.3); +} +.nav-menu{ + display: flex; + align-items: center; + justify-content: space-between; + padding: 20px 0; +} +.container-menu{ + max-width: 80%; + margin: auto; + width: 100%; +} +.menu-logo{ + color: black; + font-size: 66px; + font-weight: 500; + letter-spacing: 2px; + font-family: 'Waterfall'; + text-decoration: none; +} +#cart-icon{ + position: relative; + font-size: 26px; + color: black; + cursor: pointer; +} +#cart-icon[data-quantity='0']::after{ + contain: ''; +} +#cart-icon[data-quantity]::after{ + content: attr(data-quantity); + position: absolute; + top: 0; + right: -12px; + width: 20px; + height: 20px; + background-color: white; + border: 1px solid black; + border-radius: 50%; + color: black; + font-size: 12px; + font-weight: 500; + display: flex; + justify-content: center; + align-items: center; +} +.cart{ + position: fixed; + top: 0; + right: -100%; + width: 360px; + min-height: 100vh; + padding: 50px; + background-color: whitesmoke; + box-shadow: -2px 0 4px hsl(0, 4%, 15% / 10%); + transition: 0.3 cubic-bezier(0.075, 0.82, 0.165, 1); +} +.cart.active{ + right: 0; + transition: 0.3 cubic-bezier(0.075, 0.82, 0.165, 1); +} +.cart-title{ + text-align: center; + font-size: 24px; + margin-top: 20px; +} +.total{ + display: flex; + justify-content: flex-end; + margin-top: 30px; + border-top: 1px solid #B0A695; +} +.total-title{ + font-size: 18px; + margin-top: 22px; +} +.total-price{ + font-size: 20px; + margin: 20px 0 0 20px; +} +.btn-buy{ + display: flex; + justify-content: center; + margin: 30px auto 0 auto; + padding: 8px 10px; + width: 50%; + text-align: center; + border: 1px solid black; + background-color: transparent; + font-size: 18px; + font-weight: 500; + cursor: pointer; +} +#close-cart{ + position: absolute; + top: 20px; + right: 20px; + font-size: 30px; + cursor: pointer; +} +.cart-box{ + display: grid; + grid-template-columns: 35% 40% 15%; + align-items: center; + gap: 20px; + margin-top: 30px; +} +.cart-img{ + width: 90px; + height: 90px; + object-fit: contain; + object-position: center; + padding: 10px; +} +.detail-box{ + display: grid; + row-gap: 10px; +} +.cart-product-title{ + font-size: 16px; + text-transform: capitalize; +} +.cart-price{ + font-weight: 600; +} +.cart-quantity{ + border: 1px solid black; + outline-color: black; + width: 50px; + text-align: center; + font-size: 18px; + border-radius: 5px; +} +.cart-remove{ + font-size: 20px; + color: #6C5F5B; + cursor: pointer; +} +/*-------------------- product --------------------*/ +.shop{ + margin-top: 50px; + padding: 4rem 0 3rem ; +} +.container-shop{ + max-width: 60%; + margin: auto; + width: 100%; + margin-top: 100px; +} +.section-title{ + font-size: 26px; + font-weight: 600; + text-align: center; + text-transform: uppercase; + letter-spacing: 4px; + margin-bottom: 50px; +} +.shop-content{ + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, auto)); + gap: 20px; +} +.product-box{ + position: relative; + background-color: white; + padding: 10px; + border-radius: 5px; + transition: 0.4s cubic-bezier(0.075, 0.82, 0.165, 1); +} +.product-box:hover{ + border: 1px solid black; + box-shadow: 0 8px 32px hsla(0.75, 0.82, 0.165, 1); + transition: 0.3s cubic-bezier(0.075, 0.82, 0.165, 1); +} +.product-img{ + width: 100%; + height: 70%; + object-fit: cover; + margin-bottom: 10px; +} +.product-title{ + font-size: 18px; + font-weight: 600; + text-transform: capitalize; + margin-bottom: 10px; +} +.price{ + font-weight: 500; +} +.add-cart{ + position: absolute; + bottom: 10px; + right: 10px; + background-color: white; + border: 1px solid black; + color: black; + padding: 10px; + font-size: 16px; + border-radius: 50%; + cursor: pointer; +} +.add-cart:hover{ + background-color: black; + color: white; +} +/*-------------------- payment successful --------------------*/ +.sc-container{ + width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} +.sc-container img{ + width: 200px; + margin: 50px 0; +} +.sc-container h1{ + font-size: 38px; + margin-bottom: 20px; +} +.sc-container p{ + font-size: 18px; + max-width: 600px; + text-align: center; + margin: 10px; +} +.sc-btn{ + padding: 12px 20px; + background-color: lightgrey; + border: 1px solid grey; + font-size: 20px; + font-weight: 600; + text-transform: uppercase; + text-decoration: none; + color: black; +} + + + + + + + + +@media (width < 1380px) { + .container-shop{ + max-width: 80%; + } +} + +@media (width < 950px) { + .container-shop{ + max-width: 70%; + } +} + +@media (width < 750px) { + .container-shop{ + max-width: 90%; + } +} + +@media (width < 590px) { + .container-shop{ + max-width: 50%; + } + .shop-content{ + grid-template-columns: repeat(auto-fit, minmax(220px, auto)); + } + .menu-logo{ + font-size: 48px; + } + .cart{ + width: 320px; + } +} + +@media (width < 390px) { + .container-shop{ + max-width: 60%; + } + .shop-content{ + grid-template-columns: repeat(auto-fit, minmax(220px, auto)); + } + .menu-logo{ + font-size: 48px; + } + .cart{ + width: 100%; + } +} \ No newline at end of file diff --git a/bakery_website/public/success.html b/bakery_website/public/success.html new file mode 100755 index 0000000..9f23a7c --- /dev/null +++ b/bakery_website/public/success.html @@ -0,0 +1,20 @@ + + + + + + + Payment Successful + + + + + +
+

Payment Successful

+

You have completed your payment

+ + Back +
+ + \ No newline at end of file diff --git a/bakery_website/public/unsuccess.html b/bakery_website/public/unsuccess.html new file mode 100755 index 0000000..fd2d5bd --- /dev/null +++ b/bakery_website/public/unsuccess.html @@ -0,0 +1,21 @@ + + + + + + + Payment Unsuccessful + + + + + +
+

Payment Unsuccessful

+

Oops! Something went wrong. Please try again or contact us for any support at

+

help@example.com

+ + Back +
+ + \ No newline at end of file diff --git a/bakery_website/server.js b/bakery_website/server.js new file mode 100755 index 0000000..6e4e4b1 --- /dev/null +++ b/bakery_website/server.js @@ -0,0 +1,65 @@ +import express from 'express'; +import dotenv from 'dotenv' +import stripe from 'stripe'; + +//load variable +dotenv.config(); + +//start server +const app = express(); + +app.use(express.static('public')); +app.use(express.json()); + + +//Home Route +app.get('/', (req, res) => { + res.sendFile('menu.html', {root: 'public'}); +}); +//success +app.get('/success', (req, res) => { + res.sendFile('success.html', {root: 'public'}); +}); +//unsuccess +app.get('/unsuccess', (req, res) => { + res.sendFile('unsuccess.html', {root: 'public'}); +}); +//stripe +let stripeGateway = stripe(process.env.stripe_api); +let DOMAIN = process.env.DOMAIN; + +app.post('/stripe-checkout', async (req, res) => { + const lineItems = req.body.items.map((item) => { + const unitAmount = parseInt(item.price.replace(/[^0-9.-]+/g, '') * 100); + console.log('item-price:', item.price); + console.log('unitAmount:', unitAmount); + return { + price_data:{ + currency: 'usd', + product_data: { + name: item.title, + images: [item.productImg] + }, + unit_amount: unitAmount, + }, + quantity: item.quantity, + }; + }); + console.log('lineItems:', lineItems); + +//craete checkout + const session = await stripeGateway.checkout.sessions.create({ + payment_method_types: ['card'], + mode: 'payment', + success_url: `${DOMAIN}/success`, + cancel_url: `${DOMAIN}/unsuccess`, + line_items: lineItems, + //asking address in stripe checkout + billing_address_collection: 'required' + }); + res.json(session.url); +}); + +app.listen(3005, ()=>{ + console.log('listening on port 3005;'); +});