From 3c3f6c4e3ae9fa5a7b8cdeabb8e891b42e438d09 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Fri, 30 May 2025 15:15:29 -0400 Subject: [PATCH 01/27] setup(routes): Modify to ES6 import syntax. Setup file structure for routes. Add .gitignore for /node_modules. Add additional required API routes in products.js and reviews.js. --- .gitignore | 2 + app.js | 31 ++ models/product.js | 14 + package-lock.json | 1040 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 30 ++ routes/index.js | 27 ++ routes/products.js | 33 ++ routes/reviews.js | 6 + 8 files changed, 1183 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 models/product.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 routes/index.js create mode 100644 routes/products.js create mode 100644 routes/reviews.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..dc150eb5da --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/node_modules +.env diff --git a/app.js b/app.js new file mode 100644 index 0000000000..5e7fb9c7e6 --- /dev/null +++ b/app.js @@ -0,0 +1,31 @@ +import express from 'express'; +import mongoose from 'mongoose'; +import bodyParser from 'body-parser'; +import apiRoutes from '#root/routes/index.js'; + +mongoose.connect('mongodb://localhost/products', { + useNewUrlParser: true, + useUnifiedTopology: true, +}); + +const app = express(); + +app.use(bodyParser.json()); +app.use( + bodyParser.urlencoded({ + extended: true, + }) +); + +//Import API routes, mount all under /api +app.use('/api', apiRoutes); + +//Middleware handling errors +app.use((err, req, res, next) => { + console.error(err.message, err.stack); + res.status(500).json({ error: err.message }); +}); + +app.listen(8000, () => { + console.log('Node.js listening on port ' + 8000); +}); diff --git a/models/product.js b/models/product.js new file mode 100644 index 0000000000..6a5c6304ff --- /dev/null +++ b/models/product.js @@ -0,0 +1,14 @@ +import mongoose from 'mongoose'; +const { Schema } = mongoose; + +const ProductSchema = new Schema( + { + category: String, + name: String, + price: Number, + image: String, + }, + { timestamps: true } +); + +export default mongoose.model('Product', ProductSchema); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..826414a4b1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1040 @@ +{ + "name": "clear", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "clear", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@faker-js/faker": "^9.8.0", + "body-parser": "^2.2.0", + "express": "^5.1.0", + "mongoose": "^8.15.1" + } + }, + "node_modules/@faker-js/faker": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.8.0.tgz", + "integrity": "sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", + "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bson": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "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==", + "license": "MIT", + "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.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mongodb": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", + "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.15.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", + "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.3", + "kareem": "2.6.3", + "mongodb": "~6.16.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "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==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..58b380093e --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "clear", + "version": "1.0.0", + "description": "This project has been created by a student at Parsity, an online software engineering course. The work in this repository is wholly of the student based on a sample starter project that can be accessed by looking at the repository that this project forks.", + "homepage": "https://github.com/tomwinskell/product-list#readme", + "bugs": { + "url": "https://github.com/tomwinskell/product-list/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tomwinskell/product-list.git" + }, + "license": "ISC", + "author": "", + "type": "module", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node app.js" + }, + "dependencies": { + "@faker-js/faker": "^9.8.0", + "body-parser": "^2.2.0", + "express": "^5.1.0", + "mongoose": "^8.15.1" + }, + "imports": { + "#root/*": "./*" + } +} diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000000..655d3caa74 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,27 @@ +import express from 'express'; +import { faker } from '@faker-js/faker'; +import Product from '#root/models/product.js'; +const router = express.Router(); +import productRoutes from '#root/routes/products.js'; +import reviewRoutes from '#root/routes/reviews.js'; + +router.use('/products', productRoutes); +router.use('/reviews', reviewRoutes); + +router.get('/generate-fake-data', (req, res, next) => { + for (let i = 0; i < 90; i++) { + let product = new Product(); + + product.category = faker.commerce.department(); + product.name = faker.commerce.productName(); + product.price = faker.commerce.price(); + product.image = 'https://via.placeholder.com/250?text=Product+Image'; + + product.save().then((res, err) => { + if (err) throw err; + }); + } + res.end(); +}); + +export default router; diff --git a/routes/products.js b/routes/products.js new file mode 100644 index 0000000000..33d0c25675 --- /dev/null +++ b/routes/products.js @@ -0,0 +1,33 @@ +import express from 'express'; +import Product from '#root/models/product.js'; +const router = express.Router(); + +router.get('/', async (req, res, next) => { + try { + let page = parseInt(req.query.page) || 1; + let limit = parseInt(req.query.limit) || 10; + let category = req.query.category; + + const products = await Product.find({}) + .skip(limit * (page - 1)) + .limit(limit) + .sort({ createdAt: -1 }); + + const count = await Product.countDocuments(); + + return res.status(200).json({ + products, + totalPages: Math.ceil(count / limit), + currentPage: page, + }); + } catch (err) { + next(err); + } +}); +router.get('/:productId', async (req, res) => {}); +router.get('/:productId/reviews', async (req, res) => {}); +router.post('/', async (req, res) => {}); +router.post('/:productId/reviews', async (req, res) => {}); +router.delete('/:productId', async (req, res) => {}); + +export default router; \ No newline at end of file diff --git a/routes/reviews.js b/routes/reviews.js new file mode 100644 index 0000000000..d682ac0b6a --- /dev/null +++ b/routes/reviews.js @@ -0,0 +1,6 @@ +import express from 'express'; +const router = express.Router(); + +router.delete('/:reviewId', async (req, res) => {}); + +export default router; From a01c0a10e2d44e2652d504fceda47846304c6333 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Fri, 30 May 2025 16:24:53 -0400 Subject: [PATCH 02/27] refactor(typescript): Refactored project for TypeScript. --- app.js => app.ts | 11 +- models/{product.js => product.ts} | 5 +- package-lock.json | 332 ++++++++++++++++++++++++++++ package.json | 13 +- routes/{index.js => index.ts} | 9 +- routes/{products.js => products.ts} | 20 +- routes/{reviews.js => reviews.ts} | 0 tsconfig.json | 115 ++++++++++ 8 files changed, 481 insertions(+), 24 deletions(-) rename app.js => app.ts (68%) rename models/{product.js => product.ts} (60%) rename routes/{index.js => index.ts} (79%) rename routes/{products.js => products.ts} (57%) rename routes/{reviews.js => reviews.ts} (100%) create mode 100644 tsconfig.json diff --git a/app.js b/app.ts similarity index 68% rename from app.js rename to app.ts index 5e7fb9c7e6..979787ab95 100644 --- a/app.js +++ b/app.ts @@ -1,12 +1,9 @@ -import express from 'express'; -import mongoose from 'mongoose'; +import express, { NextFunction, Request, Response } from 'express'; +import { connect } from 'mongoose'; import bodyParser from 'body-parser'; import apiRoutes from '#root/routes/index.js'; -mongoose.connect('mongodb://localhost/products', { - useNewUrlParser: true, - useUnifiedTopology: true, -}); +connect('mongodb://localhost/products'); const app = express(); @@ -21,7 +18,7 @@ app.use( app.use('/api', apiRoutes); //Middleware handling errors -app.use((err, req, res, next) => { +app.use((err: Error, req: Request, res: Response, next: NextFunction) => { console.error(err.message, err.stack); res.status(500).json({ error: err.message }); }); diff --git a/models/product.js b/models/product.ts similarity index 60% rename from models/product.js rename to models/product.ts index 6a5c6304ff..95931e2a40 100644 --- a/models/product.js +++ b/models/product.ts @@ -1,6 +1,7 @@ import mongoose from 'mongoose'; -const { Schema } = mongoose; +const { Schema, model } = mongoose; +//This is the Product Schema const ProductSchema = new Schema( { category: String, @@ -11,4 +12,4 @@ const ProductSchema = new Schema( { timestamps: true } ); -export default mongoose.model('Product', ProductSchema); +export const Product = model('Product', ProductSchema); diff --git a/package-lock.json b/package-lock.json index 826414a4b1..1759508394 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,26 @@ "body-parser": "^2.2.0", "express": "^5.1.0", "mongoose": "^8.15.1" + }, + "devDependencies": { + "@types/express": "^5.0.2", + "@types/mongoose": "^5.11.96", + "@types/node": "^22.15.29", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, "node_modules/@faker-js/faker": { @@ -31,6 +51,34 @@ "npm": ">=9.0.0" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", @@ -40,6 +88,151 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz", + "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mongoose": { + "version": "5.11.96", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.96.tgz", + "integrity": "sha512-keiY22ljJtXyM7osgScmZOHV6eL5VFUD5tQumlu+hjS++HND5nM8jNEdj5CSWfKIJpVwQfPuwQ2SfBqUnCAVRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mongoose": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", + "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -68,6 +261,39 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -174,6 +400,13 @@ "node": ">=6.6.0" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -200,6 +433,16 @@ "node": ">= 0.8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -491,6 +734,13 @@ "node": ">=12.0.0" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -976,6 +1226,50 @@ "node": ">=18" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -990,6 +1284,27 @@ "node": ">= 0.6" } }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -999,6 +1314,13 @@ "node": ">= 0.8" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1035,6 +1357,16 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } } } } diff --git a/package.json b/package.json index 58b380093e..cb654e6742 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,12 @@ "license": "ISC", "author": "", "type": "module", - "main": "app.js", + "main": "app.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "node app.js" + "dev": "node --loader ts-node/esm app.ts", + "build": "tsc", + "start": "node dist/app.js" }, "dependencies": { "@faker-js/faker": "^9.8.0", @@ -26,5 +28,12 @@ }, "imports": { "#root/*": "./*" + }, + "devDependencies": { + "@types/express": "^5.0.2", + "@types/mongoose": "^5.11.96", + "@types/node": "^22.15.29", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" } } diff --git a/routes/index.js b/routes/index.ts similarity index 79% rename from routes/index.js rename to routes/index.ts index 655d3caa74..520efa5ee3 100644 --- a/routes/index.js +++ b/routes/index.ts @@ -1,10 +1,11 @@ import express from 'express'; import { faker } from '@faker-js/faker'; -import Product from '#root/models/product.js'; +import { Product } from '#root/models/product.js'; const router = express.Router(); import productRoutes from '#root/routes/products.js'; import reviewRoutes from '#root/routes/reviews.js'; +//Mounting /products and /reviews routes router.use('/products', productRoutes); router.use('/reviews', reviewRoutes); @@ -14,12 +15,10 @@ router.get('/generate-fake-data', (req, res, next) => { product.category = faker.commerce.department(); product.name = faker.commerce.productName(); - product.price = faker.commerce.price(); + product.price = parseFloat(faker.commerce.price()); product.image = 'https://via.placeholder.com/250?text=Product+Image'; - product.save().then((res, err) => { - if (err) throw err; - }); + product.save(); } res.end(); }); diff --git a/routes/products.js b/routes/products.ts similarity index 57% rename from routes/products.js rename to routes/products.ts index 33d0c25675..929c270353 100644 --- a/routes/products.js +++ b/routes/products.ts @@ -1,11 +1,15 @@ -import express from 'express'; -import Product from '#root/models/product.js'; -const router = express.Router(); +import { Router, Response, Request, NextFunction } from 'express'; +import { Product } from '#root/models/product.js'; +const router = Router(); -router.get('/', async (req, res, next) => { +router.get('/', async (req: Request, res: Response, next: NextFunction) => { try { - let page = parseInt(req.query.page) || 1; - let limit = parseInt(req.query.limit) || 10; + let page = parseInt( + typeof req.query.page === 'string' ? req.query.page : '1' + ); + let limit = parseInt( + typeof req.query.limit === 'string' ? req.query.limit : '10' + ); let category = req.query.category; const products = await Product.find({}) @@ -15,7 +19,7 @@ router.get('/', async (req, res, next) => { const count = await Product.countDocuments(); - return res.status(200).json({ + res.status(200).json({ products, totalPages: Math.ceil(count / limit), currentPage: page, @@ -30,4 +34,4 @@ router.post('/', async (req, res) => {}); router.post('/:productId/reviews', async (req, res) => {}); router.delete('/:productId', async (req, res) => {}); -export default router; \ No newline at end of file +export default router; diff --git a/routes/reviews.js b/routes/reviews.ts similarity index 100% rename from routes/reviews.js rename to routes/reviews.ts diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..33fa0aeb67 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,115 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "libReplacement": true, /* Enable lib replacement. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "NodeNext" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "nodenext" /* Specify how TypeScript looks up a file from a given module specifier. */, + "baseUrl": "." /* Specify the base directory to resolve non-relative module names. */, + "paths": { + "#root/*": ["./*"] + } /* Specify a set of entries that re-map imports to additional lookup locations. */, + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From a2610bd9cd575f395e4ae2c0a2631f893a10c1a6 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Sun, 1 Jun 2025 22:07:34 -0400 Subject: [PATCH 03/27] feat(tsoa-swagger): - switch to yarn package manager; - install tsoa to build swagger file with decorators; - refactor with service, controller, entity and dto. --- .npmrc | 1 + app.ts | 28 - build/routes.ts | 117 ++ build/src/app.js | 53 + build/src/products/productModel.js | 16 + build/src/products/productsController.js | 38 + build/src/products/productsService.js | 40 + build/src/products/productsTypes.js | 2 + build/src/server.js | 5 + build/swagger.json | 206 ++ build/tsconfig.tsbuildinfo | 1 + package-lock.json | 1372 ------------ package.json | 8 +- routes/index.ts | 26 - routes/products.ts | 37 - routes/reviews.ts | 6 - src/app.ts | 21 + .../products/productModel.ts | 8 +- src/products/productsController.ts | 18 + src/products/productsService.ts | 34 + src/products/productsTypes.ts | 21 + src/server.ts | 7 + tsconfig.json | 38 +- tsoa.json | 12 + yarn.lock | 1832 +++++++++++++++++ 25 files changed, 2453 insertions(+), 1494 deletions(-) create mode 100644 .npmrc delete mode 100644 app.ts create mode 100644 build/routes.ts create mode 100644 build/src/app.js create mode 100644 build/src/products/productModel.js create mode 100644 build/src/products/productsController.js create mode 100644 build/src/products/productsService.js create mode 100644 build/src/products/productsTypes.js create mode 100644 build/src/server.js create mode 100644 build/swagger.json create mode 100644 build/tsconfig.tsbuildinfo delete mode 100644 package-lock.json delete mode 100644 routes/index.ts delete mode 100644 routes/products.ts delete mode 100644 routes/reviews.ts create mode 100644 src/app.ts rename models/product.ts => src/products/productModel.ts (55%) create mode 100644 src/products/productsController.ts create mode 100644 src/products/productsService.ts create mode 100644 src/products/productsTypes.ts create mode 100644 src/server.ts create mode 100644 tsoa.json create mode 100644 yarn.lock diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000000..43c97e719a --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/app.ts b/app.ts deleted file mode 100644 index 979787ab95..0000000000 --- a/app.ts +++ /dev/null @@ -1,28 +0,0 @@ -import express, { NextFunction, Request, Response } from 'express'; -import { connect } from 'mongoose'; -import bodyParser from 'body-parser'; -import apiRoutes from '#root/routes/index.js'; - -connect('mongodb://localhost/products'); - -const app = express(); - -app.use(bodyParser.json()); -app.use( - bodyParser.urlencoded({ - extended: true, - }) -); - -//Import API routes, mount all under /api -app.use('/api', apiRoutes); - -//Middleware handling errors -app.use((err: Error, req: Request, res: Response, next: NextFunction) => { - console.error(err.message, err.stack); - res.status(500).json({ error: err.message }); -}); - -app.listen(8000, () => { - console.log('Node.js listening on port ' + 8000); -}); diff --git a/build/routes.ts b/build/routes.ts new file mode 100644 index 0000000000..c846ff885c --- /dev/null +++ b/build/routes.ts @@ -0,0 +1,117 @@ +/* tslint:disable */ +/* eslint-disable */ +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +import type { TsoaRoute } from '@tsoa/runtime'; +import { fetchMiddlewares, ExpressTemplateService } from '@tsoa/runtime'; +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +import { ProductsController } from './../src/products/productsController'; +import type { Request as ExRequest, Response as ExResponse, RequestHandler, Router } from 'express'; + + + +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + +const models: TsoaRoute.Models = { + "Pick_ProductEntity.Exclude_keyofProductEntity._id__": { + "dataType": "refAlias", + "type": {"dataType":"nestedObjectLiteral","nestedProperties":{"category":{"dataType":"string","required":true},"name":{"dataType":"string","required":true},"price":{"dataType":"double","required":true},"image":{"dataType":"string","required":true},"createdAt":{"dataType":"datetime","required":true},"updatedAt":{"dataType":"datetime","required":true}},"validators":{}}, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductDto": { + "dataType": "refObject", + "properties": { + "category": {"dataType":"string","required":true}, + "name": {"dataType":"string","required":true}, + "price": {"dataType":"double","required":true}, + "image": {"dataType":"string","required":true}, + "createdAt": {"dataType":"datetime","required":true}, + "updatedAt": {"dataType":"datetime","required":true}, + "_id": {"dataType":"string","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductListResponse": { + "dataType": "refObject", + "properties": { + "products": {"dataType":"array","array":{"dataType":"refObject","ref":"ProductDto"},"required":true}, + "totalPages": {"dataType":"double","required":true}, + "currentPage": {"dataType":"double","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "Error": { + "dataType": "refObject", + "properties": { + "name": {"dataType":"string","required":true}, + "message": {"dataType":"string","required":true}, + "stack": {"dataType":"string"}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "QueryParams": { + "dataType": "refObject", + "properties": { + "page": {"dataType":"string","required":true}, + "limit": {"dataType":"string","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +}; +const templateService = new ExpressTemplateService(models, {"noImplicitAdditionalProperties":"throw-on-extras","bodyCoercion":true}); + +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + + + +export function RegisterRoutes(app: Router) { + + // ########################################################################################################### + // NOTE: If you do not see routes for all of your controllers in this file, then you might not have informed tsoa of where to look + // Please look into the "controllerPathGlobs" config option described in the readme: https://github.com/lukeautry/tsoa + // ########################################################################################################### + + + + const argsProductsController_getAllProducts: Record = { + queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"QueryParams"}, + }; + app.get('/products', + ...(fetchMiddlewares(ProductsController)), + ...(fetchMiddlewares(ProductsController.prototype.getAllProducts)), + + async function ProductsController_getAllProducts(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getAllProducts, request, response }); + + const controller = new ProductsController(); + + await templateService.apiHandler({ + methodName: 'getAllProducts', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +} + +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa diff --git a/build/src/app.js b/build/src/app.js new file mode 100644 index 0000000000..a9a929483f --- /dev/null +++ b/build/src/app.js @@ -0,0 +1,53 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.app = void 0; +const express_1 = __importStar(require("express")); +const routes_1 = require("../build/routes"); +const mongoose_1 = require("mongoose"); +const swagger_ui_express_1 = __importDefault(require("swagger-ui-express")); +const swagger_json_1 = __importDefault(require("../build/swagger.json")); +exports.app = (0, express_1.default)(); +(0, mongoose_1.connect)('mongodb://localhost/products'); +exports.app.use('/api-docs', swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swagger_json_1.default)); +exports.app.use((0, express_1.urlencoded)({ + extended: true, +})); +exports.app.use((0, express_1.json)()); +//Import API routes, mount all under /api +(0, routes_1.RegisterRoutes)(exports.app); diff --git a/build/src/products/productModel.js b/build/src/products/productModel.js new file mode 100644 index 0000000000..ac1a634f61 --- /dev/null +++ b/build/src/products/productModel.js @@ -0,0 +1,16 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Product = void 0; +const mongoose_1 = __importDefault(require("mongoose")); +const { Schema, model } = mongoose_1.default; +//This is the Product Schema +const ProductSchema = new Schema({ + category: { type: String, required: true }, + name: { type: String, required: true }, + price: { type: Number, required: true }, + image: { type: String, required: true }, +}, { timestamps: true }); +exports.Product = model('Product', ProductSchema); diff --git a/build/src/products/productsController.js b/build/src/products/productsController.js new file mode 100644 index 0000000000..22b548c595 --- /dev/null +++ b/build/src/products/productsController.js @@ -0,0 +1,38 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProductsController = void 0; +const tsoa_1 = require("tsoa"); +const productsService_1 = require("./productsService"); +let ProductsController = class ProductsController extends tsoa_1.Controller { + getAllProducts(queryParams) { + return __awaiter(this, void 0, void 0, function* () { + return new productsService_1.ProductsService().getAllProducts(queryParams); + }); + } +}; +exports.ProductsController = ProductsController; +__decorate([ + (0, tsoa_1.Get)(), + __param(0, (0, tsoa_1.Queries)()) +], ProductsController.prototype, "getAllProducts", null); +exports.ProductsController = ProductsController = __decorate([ + (0, tsoa_1.Route)('products') +], ProductsController); diff --git a/build/src/products/productsService.js b/build/src/products/productsService.js new file mode 100644 index 0000000000..118f139af0 --- /dev/null +++ b/build/src/products/productsService.js @@ -0,0 +1,40 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProductsService = void 0; +const productModel_1 = require("./productModel"); +class ProductsService { + getAllProducts(_a) { + return __awaiter(this, arguments, void 0, function* ({ page, limit, }) { + try { + const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + const products = yield productModel_1.Product.find({}) + .skip(limitAsInt * (pageAsInt - 1)) + .limit(limitAsInt) + .sort({ createdAt: -1 }); + const count = yield productModel_1.Product.countDocuments(); + const productsDto = products.map((product) => { + return Object.assign(Object.assign({}, product.toObject()), { _id: product._id.toString() }); + }); + return { + products: productsDto, + totalPages: Math.ceil(count / limitAsInt), + currentPage: pageAsInt, + }; + } + catch (err) { + throw new Error(); + } + }); + } +} +exports.ProductsService = ProductsService; diff --git a/build/src/products/productsTypes.js b/build/src/products/productsTypes.js new file mode 100644 index 0000000000..c8ad2e549b --- /dev/null +++ b/build/src/products/productsTypes.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/build/src/server.js b/build/src/server.js new file mode 100644 index 0000000000..68242ae2ff --- /dev/null +++ b/build/src/server.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const app_1 = require("./app"); +const port = process.env.PORT || 3000; +app_1.app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`)); diff --git a/build/swagger.json b/build/swagger.json new file mode 100644 index 0000000000..e6d55a1c4b --- /dev/null +++ b/build/swagger.json @@ -0,0 +1,206 @@ +{ + "openapi": "3.0.0", + "components": { + "examples": {}, + "headers": {}, + "parameters": {}, + "requestBodies": {}, + "responses": {}, + "schemas": { + "Pick_ProductEntity.Exclude_keyofProductEntity._id__": { + "properties": { + "category": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "category", + "name", + "price", + "image", + "createdAt", + "updatedAt" + ], + "type": "object", + "description": "From T, pick a set of properties whose keys are in the union K" + }, + "ProductDto": { + "properties": { + "category": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "_id": { + "type": "string" + } + }, + "required": [ + "category", + "name", + "price", + "image", + "createdAt", + "updatedAt", + "_id" + ], + "type": "object", + "additionalProperties": false + }, + "ProductListResponse": { + "properties": { + "products": { + "items": { + "$ref": "#/components/schemas/ProductDto" + }, + "type": "array" + }, + "totalPages": { + "type": "number", + "format": "double" + }, + "currentPage": { + "type": "number", + "format": "double" + } + }, + "required": [ + "products", + "totalPages", + "currentPage" + ], + "type": "object", + "additionalProperties": false + }, + "Error": { + "properties": { + "name": { + "type": "string" + }, + "message": { + "type": "string" + }, + "stack": { + "type": "string" + } + }, + "required": [ + "name", + "message" + ], + "type": "object", + "additionalProperties": false + }, + "QueryParams": { + "properties": { + "page": { + "type": "string" + }, + "limit": { + "type": "string" + } + }, + "required": [ + "page", + "limit" + ], + "type": "object", + "additionalProperties": false + } + }, + "securitySchemes": {} + }, + "info": { + "title": "clear", + "version": "1.0.0", + "description": "This project has been created by a student at Parsity, an online software engineering course. The work in this repository is wholly of the student based on a sample starter project that can be accessed by looking at the repository that this project forks.", + "license": { + "name": "ISC" + }, + "contact": {} + }, + "paths": { + "/products": { + "get": { + "operationId": "GetAllProducts", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProductListResponse" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "query", + "name": "page", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + } + }, + "servers": [ + { + "url": "/" + } + ] +} \ No newline at end of file diff --git a/build/tsconfig.tsbuildinfo b/build/tsconfig.tsbuildinfo new file mode 100644 index 0000000000..bd2d403434 --- /dev/null +++ b/build/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../node_modules/typescript/lib/lib.es6.d.ts","../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@tsoa/runtime/dist/decorators/deprecated.d.ts","../node_modules/@tsoa/runtime/dist/decorators/example.d.ts","../node_modules/@tsoa/runtime/dist/decorators/parameter.d.ts","../node_modules/@tsoa/runtime/dist/decorators/methods.d.ts","../node_modules/@tsoa/runtime/dist/decorators/tags.d.ts","../node_modules/@tsoa/runtime/dist/decorators/operationid.d.ts","../node_modules/@tsoa/runtime/dist/decorators/route.d.ts","../node_modules/@tsoa/runtime/dist/decorators/security.d.ts","../node_modules/@tsoa/runtime/dist/decorators/extension.d.ts","../node_modules/@tsoa/runtime/dist/decorators/middlewares.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/controller.d.ts","../node_modules/@tsoa/runtime/dist/utils/isheadertype.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/response.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/iocmodule.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/file.d.ts","../node_modules/@tsoa/runtime/dist/decorators/response.d.ts","../node_modules/@tsoa/runtime/dist/swagger/swagger.d.ts","../node_modules/@tsoa/runtime/dist/metadatageneration/tsoa.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/tsoa-route.d.ts","../node_modules/@types/multer/index.d.ts","../node_modules/@tsoa/runtime/dist/config.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/additionalprops.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templatehelpers.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/templateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/express/expresstemplateservice.d.ts","../node_modules/@hapi/boom/lib/index.d.ts","../node_modules/@hapi/podium/lib/index.d.ts","../node_modules/@hapi/shot/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/utils.d.ts","../node_modules/@hapi/mimos/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/route.d.ts","../node_modules/@hapi/catbox/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/cache.d.ts","../node_modules/@hapi/hapi/lib/types/server/encoders.d.ts","../node_modules/@hapi/hapi/lib/types/server/events.d.ts","../node_modules/@hapi/hapi/lib/types/server/ext.d.ts","../node_modules/@hapi/hapi/lib/types/server/info.d.ts","../node_modules/@hapi/hapi/lib/types/server/inject.d.ts","../node_modules/@hapi/hapi/lib/types/server/methods.d.ts","../node_modules/@hapi/iron/lib/index.d.ts","../node_modules/@hapi/statehood/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/state.d.ts","../node_modules/@hapi/hapi/lib/types/server/options.d.ts","../node_modules/@hapi/hapi/lib/types/server/server.d.ts","../node_modules/@hapi/hapi/lib/types/server/auth.d.ts","../node_modules/@hapi/hapi/lib/types/server/index.d.ts","../node_modules/@hapi/hapi/lib/types/response.d.ts","../node_modules/@hapi/hapi/lib/types/request.d.ts","../node_modules/@hapi/hapi/lib/types/plugin.d.ts","../node_modules/@hapi/hapi/lib/types/index.d.ts","../node_modules/@hapi/hapi/lib/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/hapi/hapitemplateservice.d.ts","../node_modules/@types/accepts/index.d.ts","../node_modules/@types/keygrip/index.d.ts","../node_modules/@types/cookies/index.d.ts","../node_modules/@types/http-assert/index.d.ts","../node_modules/@types/content-disposition/index.d.ts","../node_modules/@types/koa-compose/index.d.ts","../node_modules/@types/koa/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/koa/koatemplateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/index.d.ts","../node_modules/@tsoa/runtime/dist/utils/assertnever.d.ts","../node_modules/@tsoa/runtime/dist/index.d.ts","../node_modules/typescript/lib/typescript.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/routegenerator.d.ts","../node_modules/@tsoa/cli/dist/cli.d.ts","../node_modules/@tsoa/cli/dist/module/generate-spec.d.ts","../node_modules/@tsoa/cli/dist/module/generate-routes.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/defaultroutegenerator.d.ts","../node_modules/@tsoa/cli/dist/index.d.ts","../node_modules/tsoa/dist/index.d.ts","../node_modules/bson/bson.d.ts","../node_modules/mongodb/mongodb.d.ts","../node_modules/mongoose/types/aggregate.d.ts","../node_modules/mongoose/types/callback.d.ts","../node_modules/mongoose/types/collection.d.ts","../node_modules/mongoose/types/connection.d.ts","../node_modules/mongoose/types/cursor.d.ts","../node_modules/mongoose/types/document.d.ts","../node_modules/mongoose/types/error.d.ts","../node_modules/mongoose/types/expressions.d.ts","../node_modules/mongoose/types/helpers.d.ts","../node_modules/kareem/index.d.ts","../node_modules/mongoose/types/middlewares.d.ts","../node_modules/mongoose/types/indexes.d.ts","../node_modules/mongoose/types/models.d.ts","../node_modules/mongoose/types/mongooseoptions.d.ts","../node_modules/mongoose/types/pipelinestage.d.ts","../node_modules/mongoose/types/populate.d.ts","../node_modules/mongoose/types/query.d.ts","../node_modules/mongoose/types/schemaoptions.d.ts","../node_modules/mongoose/types/schematypes.d.ts","../node_modules/mongoose/types/session.d.ts","../node_modules/mongoose/types/types.d.ts","../node_modules/mongoose/types/utility.d.ts","../node_modules/mongoose/types/validation.d.ts","../node_modules/mongoose/types/inferschematype.d.ts","../node_modules/mongoose/types/inferrawdoctype.d.ts","../node_modules/mongoose/types/virtuals.d.ts","../node_modules/mongoose/types/augmentations.d.ts","../node_modules/mongoose/types/index.d.ts","../src/products/productmodel.ts","../src/products/productstypes.ts","../src/products/productsservice.ts","../src/products/productscontroller.ts","./routes.ts","../node_modules/@types/swagger-ui-express/index.d.ts","./swagger.json","../src/app.ts","../src/server.ts","../node_modules/@types/webidl-conversions/index.d.ts","../node_modules/@types/whatwg-url/index.d.ts"],"fileIdsList":[[56,98,158,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,264],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,186,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,209,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,141,185,186,188,190,205,206,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,203,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,191,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,203,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,192,193,194,195,196,197,198,201,202,203,204,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,187,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,189,190,192,201,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,188,189,190,192,193,194,195,196,197,198,201,202,204,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,200,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,115,130,185,187,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,185,199,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,226,227,228,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,223,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,176,179,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,172,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,180,181,182,220,221,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,168,176,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,180,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,178,181,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,170,178,183,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,183,210,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,183,184,211,219,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,183,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,182,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,177,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,158,213,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,148,150,151,152,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,153,155,157,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,113,114,118,124,141,148,154,212,213,214,215,216,217,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,104,110,111,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,100,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[51,52,53,56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,101,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,102,103,111,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,104,106,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,105,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,107,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,108,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,125,130,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,106,110,113,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,113,114,118,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[54,55,56,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,116,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,120,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,121,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,96,97,98,99,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,123,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,124,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,125,126,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,125,127,142,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,130,131,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,132,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,131,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,134,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,118,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,139,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,140,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,124,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,143,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,145,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,112,121,130,133,141,144,146,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,111,130,148,149,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,150,154,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,155,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,138,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,233,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,260],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,260],[56,98,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,260],[56,98,222,229,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,118,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,58,61,64,98,110,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,63,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,86,87,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,61,65,98,133,141,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,86,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,80,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,73,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,64,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,60,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,69,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,68,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,62,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,65,86,98,146,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,265,266,267],[56,98,230,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262,263],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,264],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,268]],"fileInfos":[{"version":"df039a67536fe2acc3affdcbfb645892f842db36fe599e8e652e2f0c640a90d1","impliedFormat":1},{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a4ef5ccfd69b5bc2a2c29896aa07daaff7c5924a12e70cb3d9819145c06897db","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4a1c5b43d4d408cb0df0a6cc82ca7be314553d37e432fc1fd801bae1a9ab2cb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"c6ab0dd29bf74b71a54ff2bbce509eb8ae3c4294d57cc54940f443c01cd1baae","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"86ea91bfa7fef1eeb958056f30f1db4e0680bc9b5132e5e9d6e9cfd773c0c4fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7832b05a98f791dcd408cff8699e95fcab73bbfae26ba9a13af5ec4a60f485d","impliedFormat":1},{"version":"9a9e62acbe3cf36141e3d76efa0eaf33ed21b51a90bc1d39c9f880ff4e0bdf87","impliedFormat":1},{"version":"b2453c7a4fe9e3e77f3a75945caa0dabe76a28ebb6dbffc4aef21309e68f6aa5","impliedFormat":1},{"version":"db09d88a24d5f720614b68a66a866e32643fc92444c0e3fd252263b2606ea10a","impliedFormat":1},{"version":"74a0f20e0b110436f175d6e531ef48120c2adc9702e2ca58b31392d2099071cf","impliedFormat":1},{"version":"70f71f639d94715dcf0577fae64d8b5829e89bf8cda1170473e68b8fdeb44378","impliedFormat":1},{"version":"2aeb069895578bac240d9d7317732b6d0ceb1ee25102bcee4b57c4e39bad965f","impliedFormat":1},{"version":"f6aaa84bca2234a227471cc26972b4cc9422afaab8d7f2d6ef51b8bc636bf58b","impliedFormat":1},{"version":"34d56740fa13eebf2b689742daf0d1834205cb9610db1df58403f6abb9adf919","impliedFormat":1},{"version":"29c621fbfd32afa52882955cf8638014e1039113174676edacc6c5b9228205f6","impliedFormat":1},{"version":"f30edc69b36565d72e55c6ebabf021455226cbf700172309e943b3c0caf326e6","impliedFormat":1},{"version":"950cdd2282ca4b38a5c2eadb727b9e2cdd936fabf0b92e36e72362cac0fd6ec5","impliedFormat":1},{"version":"b374d291655bd46fe2fa5e327586c4069361e8f2608df93e8325def3d86edf0f","impliedFormat":1},{"version":"ce9e81a19499c853c33dd83bff81daebd2931bf61e2399d81d26506573ad5928","impliedFormat":1},{"version":"5a67d052a6e4ff50663c6d5e3d807f46f4d1693ff91f6a1c83d6a557afdf6a82","impliedFormat":1},{"version":"5cb4013b09b175e02ef6c97658def451c2ae7338366af048486e3a57f526e118","impliedFormat":1},{"version":"d87e41029923fb44228d4d396aaa481d3270e0b8cf9595fcd81f187695b72c04","impliedFormat":1},{"version":"2b1dc75f0b51f7363a3fca64f48e20bd09aaf6b21446a042be9111ecb5599641","impliedFormat":1},{"version":"38e4e4bed98e94d700ff89caa521840affb5e6225abc1f1f1d17fcde12ae8e58","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3e78c2d0093f1283766ea1cf413bdb568f6e3fba30ca6979ca9c467dbd77af8","impliedFormat":1},{"version":"e800ed99d20215a12965bf7502f1371e1b46846551466c0ecda7443bc3225c5a","impliedFormat":1},{"version":"98e5b74c90814ada4ebbc8c6150a23e3fd19989f90c8fccd0219e06119c0966b","impliedFormat":1},{"version":"d134613e3638d004eab97a48b925856dcf3314484cbfe3145b148d7acc993b34","impliedFormat":1},{"version":"7ed10b8a09889585e37a93cc3d4d193995518913779650b2fec0f9896d112340","impliedFormat":1},{"version":"42289160bd23270bd10e956093df608f8a91243e2b2cdbd629c79744340a86cd","impliedFormat":1},{"version":"1bdd7e96e94e3ecd6720bc3a57de1e13760003ca03a8c6ee81c9ae9d12400c93","impliedFormat":1},{"version":"e7d3856062ae83e9903cefa63eb6d2b66fc2d084719e4f4c91dff80e1a679ef6","impliedFormat":1},{"version":"32b4066cafeacbba5af922904b0353e9db488e9e34dfa6528c979733fcf18532","impliedFormat":1},{"version":"ac830864d40131ddd4e739c7011a6fa023b9aeb9229367afa85305962321f91f","impliedFormat":1},{"version":"ea7b76d925ebcbbac1f8fc807b711f095b7633d5a08089762d7323569c4077be","impliedFormat":1},{"version":"536ce6090e9826d91d9b73557f27954d3f9b98c1b1c8b8e004d933677f7b0079","impliedFormat":1},{"version":"24923854943027b359d554b2a122a6e5d9360645f7a6354ac0c0534781cee1a0","impliedFormat":1},{"version":"352b4dc64333e91f53a15980fcc0bed2e062303a76c6b9717ec314dfbe29e93a","impliedFormat":1},{"version":"09bbc977cabb5cd49235e60ff89b77289fe6fa42aa2c472a524c845dc5f4c6fc","impliedFormat":1},{"version":"406717fd8feb6645442dff23a4821d3b6431438e047bdb49b5d37d8d84e49885","impliedFormat":1},{"version":"739d28fd2f30200f9147061c2a8928522d161c55335245003fa2db027d44880c","impliedFormat":1},{"version":"5139d33aeb679963a5d6337232c551464ccaca4661dddf2567f6abbf24e9a140","impliedFormat":1},{"version":"1b4ea9bdde8fb36710a1cde149e647c2e4b63a47132b3d404e76aa1469f10250","impliedFormat":1},{"version":"6a9d3a15e3f0679a1552e5b0f7fae3361536d5eac476b29f3d0b65dd2c672621","impliedFormat":1},{"version":"524fa80c39ce5ea4097eff4b21835738099f26c6dbe51f537873a37488b7d65a","impliedFormat":1},{"version":"6da5df3051db43101fbc4b64ab0c22cff1bdcec8f0324f8e8a305018dc4acc5d","impliedFormat":1},{"version":"7b44a75ca0913e8af7775ee46a9138e5a801521a708c4574c75ffd1e722d5aa0","impliedFormat":1},{"version":"11842523b052ea1cb88c81cdca2922244122b1cad318adcce2e465d48e0a52f8","impliedFormat":1},{"version":"622593b400ce3032a71addf4204c41bac042721ab985de7e42d086558b13a337","impliedFormat":1},{"version":"d243e8eb5a04f2044d9379cf27d881e8ba4be6ba38c66d921c409b46f6d78927","impliedFormat":1},{"version":"22a8a4f9138f039c4c8316d555a1c3715e56f047ed635a578027c08e197ada2b","impliedFormat":1},{"version":"0a5504004bb9a28cee0cd9d04a9b475ca33cde579f5148266b2df3cafc95bafc","impliedFormat":1},{"version":"759b043215e42ea84b4dd5950d993ed124c05bad56bd58397a363e25d0ee62de","impliedFormat":1},{"version":"0e495d33df5bad752abb97f26cf261a6db6dd102dc1e689ba477cdb70e411935","impliedFormat":1},{"version":"d5c19655468e29f60c871b21e73af8ebc653f736e7123ade916f22c4a5f80ce5","impliedFormat":1},{"version":"34a413bafdeae24c5b5419609be63b85255c5d56a4e3185b016e2329a8f13ec4","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"2224f3072e3cc07906eeed5c71746779511fba2dd224addc5489bcdb489bdee5","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"c96e47b3fbf3912887565641f4810f585dea9550eb2a31d91b1543c94cb6aed7","impliedFormat":1},{"version":"a03e9f9bf9fc56c6785a8d5b5bb8a99669acb38dd885afcb4d58673c9c7c0286","impliedFormat":1},{"version":"2f1c0d14f39377282b5dbf908502f5e82141b075770a1f3cd673bca11607a846","impliedFormat":1},{"version":"4ae86b01844cfd5116902a40ad3dd7e7659ea449279e21d2917413a2cfb5077c","impliedFormat":1},{"version":"c302df1d6f371c6064cb5f4d0b41165425b682b287a3b8625527b2752eb433ee","impliedFormat":1},{"version":"09762428597d0079f6ac0785ec4a24471a43796c5517bfbd0606aa163d651660","impliedFormat":1},{"version":"dd2d20937dbd382340d7364a6153c5a71a04e222fa33a26d255dc668e21eb196","impliedFormat":1},{"version":"2a8d9c59c5e85f41cec149485aca6481deb5c32b580dd0ea08d499cc9bfc0b2f","impliedFormat":1},{"version":"1ceda047afdd4436db76576b2bfc72d047c08982ebb40c66aab8bcabf195b8e4","impliedFormat":1},{"version":"fdbd67a5466c4f0dd609b37ddfdfe8ffc3955188f7494922ac7e85f83d3cf11c","impliedFormat":1},{"version":"5e9892fdebf7c79987e0d4cb48941f796a35582f8810bb96c89a31e5d396df8b","impliedFormat":1},{"version":"fd550ecb67f4fa6cc8c8f08d84c072afda2645c001aed5825d0be8e767b8e571","impliedFormat":1},{"version":"359e7188a3ad226e902c43443a45f17bd53bf279596aece7761dc72ffa22b30d","impliedFormat":1},{"version":"d8d9529a7f6c742de51ba5eecaa47fdab38f123af1b5280a1a6956de553e5fe9","impliedFormat":1},{"version":"403c4f2906f58407d454a401daf0fa59cbd683824b444b3151075bc3a6714c48","impliedFormat":1},{"version":"0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","impliedFormat":1},{"version":"35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","impliedFormat":1},{"version":"c9604ed0199a5ae1e86f9c17a981d297141bc0b3c4f51d88322859294f77f3ce","impliedFormat":1},{"version":"13a4d931c625360ab1cbf68961b13a60969a17cf3247bd60e18a49fb498b68e5","impliedFormat":1},{"version":"80b2eb4a470b8c3ef6709da5c3f8cd827d3b92b1bc96ec0ae661cc6eb7b213da","impliedFormat":1},{"version":"fe677c6e53f1eddbcc00af336d3ffbada25e6e0aa05a0fb5f10c818b5b6b6aa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"89cbb41c032a8602412a55d89c9fbee8af199ffb3e89e52a0306d42518f491c3","impliedFormat":1},{"version":"3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","impliedFormat":1},{"version":"021fbcae20ddc7ca7bf04cdb02a8c51f0d96afdde6a8462fb73b09ab4136ff7a","impliedFormat":1},{"version":"d2ce9e0d3035ad20bc34eb6177cd4a6ced475367170d8e46860598fe49dd9b3e","impliedFormat":1},{"version":"8443bbb1e167b4cca6d192eab6f9ab94442054f9b1c945f05070c23896396365","impliedFormat":1},{"version":"4e402f9d1887c077981d4668089ee20192bbfa7450b8abb36af3efa100fc1298","impliedFormat":1},{"version":"bbe98bf29952b80a91789cc6a3a3727aa958e652f32b145740229fe4b02f2a0a","impliedFormat":1},{"version":"18e0fa134b9df012b043ee0fc9698d7b1666c7e7df7918bf465a79c89742fbfc","impliedFormat":1},{"version":"3016511eadb560b6874050f8ff2ca671c64a663a48c60a24e3e7ddef92c3b095","impliedFormat":1},{"version":"ab066772d4672b6cfa1196820df536fa225888dbc9bf9cf68ce1173bc03d433b","impliedFormat":1},{"version":"9ee85178017faacec870ca5b75c292d6d1d6d6f4e81d42c79c4cf73b63a303d8","impliedFormat":1},{"version":"788a2d9ffaccf9ce65d321472ff3daaf9ab864504fad41753b978bfbd5e9ea71","impliedFormat":1},{"version":"861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","impliedFormat":1},{"version":"8d35820323a2758d61684679eddc3f1d0cc051c55258b3243aee14b6b8e285c1","impliedFormat":1},{"version":"8c418189bb1daec5e7736b6301345487e6f8f3c8ba49ef538e330e6003a47c87","impliedFormat":1},{"version":"da440f879ec47f7113408fb75f239f437b9ee812fba67562c499f10ef012464a","impliedFormat":1},{"version":"e78e58cf1d0a34668fe7365a0eeef0d85c67d81f15aaf976d9d45999b0baa9d5","impliedFormat":1},{"version":"b8de1c91d357f855aee17e06083abbf345cae76454548d1d112b9bc0d4f35821","impliedFormat":1},{"version":"f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","impliedFormat":1},{"version":"448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702","impliedFormat":1},{"version":"969ce33d76b1de933ab58f84db2936508252babf91875d429a3ce6a9961ec41e","affectsGlobalScope":true,"impliedFormat":1},"baf4e753153aaa14d8eb1dbc5712e419668311763293415b3f6ebf49ca852b83",{"version":"0bbcc0849e11d98f41664c92bcec1be4855b6296d356b9101bfc0c73c32f7475","signature":"f21dd23078502350b38b893a7d5b9ed6ee6f05bf639fde3d15f5cdaae84cf70d"},{"version":"57d2e530a9d993893ded1c05670679d14466eb63e2e063807de772d3e2e5e14e","signature":"26886b3019a8e5e008a52507c1565a974c2576592d4243e0b89305392a7ae9fe"},{"version":"3aa8a5abcc0aed315cc5be0389a0e6df9fa92b6677e58e9bc22beebd9df8a8a0","signature":"ef81cffc3d051763ecd7f40291b362dcbf95079975ab3d3fb84cc853fbc9bc69"},{"version":"20bdf8768b7f5fcef70e42e606202f36dd3731af76243ce1f3fcd1cf776b5606","signature":"7723954343a037ad4914a1dbf8b0ef2a4c266340c49c1e8c9f82aea052493635"},{"version":"85a55229c4d0f20d42c59cec768df0cb83a492f8bb1351ead8524a58f278a005","impliedFormat":1},{"version":"b2169207bf6ae9d0f414b954b6e8c3e3663a4e174df3a80957b86a351c74c06a","signature":"1b15babd7493c406e98e192c49f5c1b3334cd4c20da9886bca81a0c3aaf26bc8"},{"version":"d271d41f616162e1366947fc7a4445e3791475c6d3e847384c84af9447eab554","signature":"5ab0082578d32976c6616ce01e0b4d85859b6f6749be207b2548bb5516623999"},"85175d11bc7d4022fccc100de65ca3bf50dbc5f504576fc2bec5750c3afb71ef",{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1}],"root":[[261,264],268,269],"options":{"alwaysStrict":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":2},"referencedMap":[[265,1],[267,2],[185,2],[191,3],[210,4],[209,5],[208,6],[207,7],[206,8],[190,9],[204,10],[192,11],[193,12],[194,13],[195,14],[205,15],[196,2],[197,16],[198,11],[202,17],[203,18],[201,19],[188,20],[199,2],[189,2],[186,2],[187,21],[200,22],[225,23],[229,24],[227,25],[226,25],[228,26],[224,27],[180,28],[160,2],[161,2],[168,2],[163,2],[169,2],[165,2],[162,2],[175,29],[166,2],[167,2],[164,2],[222,30],[170,31],[174,32],[173,2],[172,33],[177,34],[181,35],[182,36],[184,37],[211,38],[220,39],[219,40],[183,41],[178,42],[176,2],[221,2],[171,2],[212,43],[157,44],[156,43],[216,2],[214,45],[153,46],[158,47],[215,2],[154,2],[213,2],[217,48],[218,49],[149,2],[179,50],[95,51],[96,51],[97,52],[56,53],[98,54],[99,55],[100,56],[51,2],[54,57],[52,2],[53,2],[101,58],[102,59],[103,60],[104,61],[105,62],[106,63],[107,63],[109,2],[108,64],[110,65],[111,66],[112,67],[94,68],[55,2],[113,69],[114,70],[115,71],[148,72],[116,73],[117,74],[118,75],[119,76],[120,77],[121,78],[122,79],[123,80],[124,81],[125,82],[126,82],[127,83],[128,2],[129,2],[130,84],[132,85],[131,86],[133,87],[134,88],[135,89],[136,90],[137,91],[138,92],[139,93],[140,94],[141,95],[142,96],[143,97],[144,98],[145,99],[146,100],[147,101],[151,2],[152,2],[150,102],[155,103],[266,104],[270,2],[271,2],[231,2],[242,2],[232,105],[233,106],[259,107],[234,108],[235,109],[236,110],[237,111],[238,112],[239,113],[240,114],[241,115],[260,116],[244,117],[257,118],[256,2],[243,119],[245,120],[246,121],[247,122],[248,123],[249,124],[250,125],[251,126],[252,127],[253,128],[254,129],[255,130],[258,131],[159,2],[230,132],[49,2],[50,2],[9,2],[10,2],[14,2],[13,2],[3,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[4,2],[23,2],[24,2],[5,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[6,2],[33,2],[34,2],[35,2],[36,2],[7,2],[40,2],[37,2],[38,2],[39,2],[41,2],[8,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[2,2],[1,2],[12,2],[11,2],[223,2],[72,133],[82,134],[71,133],[92,135],[63,136],[62,137],[91,138],[85,139],[90,140],[65,141],[79,142],[64,143],[88,144],[60,145],[59,138],[89,146],[61,147],[66,148],[67,2],[70,148],[57,2],[93,149],[83,150],[74,151],[75,152],[77,153],[73,154],[76,155],[86,138],[68,156],[69,157],[78,158],[58,32],[81,150],[80,148],[84,2],[87,159],[268,160],[261,2],[264,161],[263,162],[262,2],[269,163]],"version":"5.8.3"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 1759508394..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,1372 +0,0 @@ -{ - "name": "clear", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "clear", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@faker-js/faker": "^9.8.0", - "body-parser": "^2.2.0", - "express": "^5.1.0", - "mongoose": "^8.15.1" - }, - "devDependencies": { - "@types/express": "^5.0.2", - "@types/mongoose": "^5.11.96", - "@types/node": "^22.15.29", - "ts-node": "^10.9.2", - "typescript": "^5.8.3" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@faker-js/faker": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.8.0.tgz", - "integrity": "sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/fakerjs" - } - ], - "license": "MIT", - "engines": { - "node": ">=18.0.0", - "npm": ">=9.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", - "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", - "license": "MIT", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz", - "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mongoose": { - "version": "5.11.96", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.96.tgz", - "integrity": "sha512-keiY22ljJtXyM7osgScmZOHV6eL5VFUD5tQumlu+hjS++HND5nM8jNEdj5CSWfKIJpVwQfPuwQ2SfBqUnCAVRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mongoose": "*" - } - }, - "node_modules/@types/node": { - "version": "22.15.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", - "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "license": "MIT" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", - "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", - "license": "MIT", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/bson": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", - "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "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==", - "license": "MIT", - "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.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/kareem": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", - "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mongodb": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", - "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", - "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^14.1.0 || ^13.0.0" - } - }, - "node_modules/mongoose": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", - "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", - "license": "MIT", - "dependencies": { - "bson": "^6.10.3", - "kareem": "2.6.3", - "mongodb": "~6.16.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "17.1.3" - }, - "engines": { - "node": ">=16.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "license": "MIT", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "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==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "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" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", - "license": "MIT" - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/package.json b/package.json index cb654e6742..f5d0381b56 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ }, "license": "ISC", "author": "", - "type": "module", "main": "app.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", @@ -24,7 +23,11 @@ "@faker-js/faker": "^9.8.0", "body-parser": "^2.2.0", "express": "^5.1.0", - "mongoose": "^8.15.1" + "mongoose": "^8.15.1", + "swagger-ui-express": "^5.0.1", + "tsconfig-paths": "^4.2.0", + "tsoa": "^6.6.0", + "zod": "^3.25.46" }, "imports": { "#root/*": "./*" @@ -33,6 +36,7 @@ "@types/express": "^5.0.2", "@types/mongoose": "^5.11.96", "@types/node": "^22.15.29", + "@types/swagger-ui-express": "^4.1.8", "ts-node": "^10.9.2", "typescript": "^5.8.3" } diff --git a/routes/index.ts b/routes/index.ts deleted file mode 100644 index 520efa5ee3..0000000000 --- a/routes/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import express from 'express'; -import { faker } from '@faker-js/faker'; -import { Product } from '#root/models/product.js'; -const router = express.Router(); -import productRoutes from '#root/routes/products.js'; -import reviewRoutes from '#root/routes/reviews.js'; - -//Mounting /products and /reviews routes -router.use('/products', productRoutes); -router.use('/reviews', reviewRoutes); - -router.get('/generate-fake-data', (req, res, next) => { - for (let i = 0; i < 90; i++) { - let product = new Product(); - - product.category = faker.commerce.department(); - product.name = faker.commerce.productName(); - product.price = parseFloat(faker.commerce.price()); - product.image = 'https://via.placeholder.com/250?text=Product+Image'; - - product.save(); - } - res.end(); -}); - -export default router; diff --git a/routes/products.ts b/routes/products.ts deleted file mode 100644 index 929c270353..0000000000 --- a/routes/products.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Router, Response, Request, NextFunction } from 'express'; -import { Product } from '#root/models/product.js'; -const router = Router(); - -router.get('/', async (req: Request, res: Response, next: NextFunction) => { - try { - let page = parseInt( - typeof req.query.page === 'string' ? req.query.page : '1' - ); - let limit = parseInt( - typeof req.query.limit === 'string' ? req.query.limit : '10' - ); - let category = req.query.category; - - const products = await Product.find({}) - .skip(limit * (page - 1)) - .limit(limit) - .sort({ createdAt: -1 }); - - const count = await Product.countDocuments(); - - res.status(200).json({ - products, - totalPages: Math.ceil(count / limit), - currentPage: page, - }); - } catch (err) { - next(err); - } -}); -router.get('/:productId', async (req, res) => {}); -router.get('/:productId/reviews', async (req, res) => {}); -router.post('/', async (req, res) => {}); -router.post('/:productId/reviews', async (req, res) => {}); -router.delete('/:productId', async (req, res) => {}); - -export default router; diff --git a/routes/reviews.ts b/routes/reviews.ts deleted file mode 100644 index d682ac0b6a..0000000000 --- a/routes/reviews.ts +++ /dev/null @@ -1,6 +0,0 @@ -import express from 'express'; -const router = express.Router(); - -router.delete('/:reviewId', async (req, res) => {}); - -export default router; diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000000..c82c85b8d5 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,21 @@ +import express, { json, urlencoded } from 'express'; +import { RegisterRoutes } from '../build/routes'; +import { connect } from 'mongoose'; +import swaggerUi from 'swagger-ui-express'; +import swaggerDocument from '../build/swagger.json'; + +export const app = express(); + +connect('mongodb://localhost/products'); + +app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); + +app.use( + urlencoded({ + extended: true, + }) +); +app.use(json()); + +//Import API routes, mount all under /api +RegisterRoutes(app); diff --git a/models/product.ts b/src/products/productModel.ts similarity index 55% rename from models/product.ts rename to src/products/productModel.ts index 95931e2a40..63bd168b32 100644 --- a/models/product.ts +++ b/src/products/productModel.ts @@ -4,10 +4,10 @@ const { Schema, model } = mongoose; //This is the Product Schema const ProductSchema = new Schema( { - category: String, - name: String, - price: Number, - image: String, + category: { type: String, required: true }, + name: { type: String, required: true }, + price: { type: Number, required: true }, + image: { type: String, required: true }, }, { timestamps: true } ); diff --git a/src/products/productsController.ts b/src/products/productsController.ts new file mode 100644 index 0000000000..1a4953aab7 --- /dev/null +++ b/src/products/productsController.ts @@ -0,0 +1,18 @@ +import { Controller, Get, Queries, Route } from 'tsoa'; +import { ProductsService } from './productsService'; +import { ProductListResponse } from './productsTypes'; + +export interface QueryParams { + page: string; + limit: string; +} + +@Route('products') +export class ProductsController extends Controller { + @Get() + public async getAllProducts( + @Queries() queryParams: QueryParams + ): Promise { + return new ProductsService().getAllProducts(queryParams); + } +} diff --git a/src/products/productsService.ts b/src/products/productsService.ts new file mode 100644 index 0000000000..abd1503200 --- /dev/null +++ b/src/products/productsService.ts @@ -0,0 +1,34 @@ +import { QueryParams } from './productsController'; +import { Product } from './productModel'; +import { ProductListResponse } from './productsTypes'; + +export class ProductsService { + public async getAllProducts({ + page, + limit, + }: QueryParams): Promise { + try { + const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + + const products = await Product.find({}) + .skip(limitAsInt * (pageAsInt - 1)) + .limit(limitAsInt) + .sort({ createdAt: -1 }); + + const count = await Product.countDocuments(); + + const productsDto = products.map((product) => { + return { ...product.toObject(), _id: product._id.toString() }; + }); + + return { + products: productsDto, + totalPages: Math.ceil(count / limitAsInt), + currentPage: pageAsInt, + }; + } catch (err) { + throw new Error(); + } + } +} diff --git a/src/products/productsTypes.ts b/src/products/productsTypes.ts new file mode 100644 index 0000000000..5d2c2d5205 --- /dev/null +++ b/src/products/productsTypes.ts @@ -0,0 +1,21 @@ +import { ObjectId } from 'mongoose'; + +export interface ProductEntity { + _id: ObjectId | string; + category: string; + name: string; + price: number; + image: string; + createdAt: Date; + updatedAt: Date; +} + +export interface ProductDto extends Omit { + _id: string; +} + +export interface ProductListResponse { + products: ProductDto[]; + totalPages: number; + currentPage: number; +} diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000000..c6d0716bf9 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,7 @@ +import { app } from './app'; + +const port = process.env.PORT || 3000; + +app.listen(port, () => + console.log(`Example app listening at http://localhost:${port}`) +); diff --git a/tsconfig.json b/tsconfig.json index 33fa0aeb67..426d06536f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ /* Visit https://aka.ms/tsconfig to read more about this file */ /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + "incremental": true /* Save .tsbuildinfo files to allow for incremental compilation of projects. */, // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ @@ -11,11 +11,11 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "target": "es6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "libReplacement": true, /* Enable lib replacement. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + "experimentalDecorators": true /* Enable experimental support for legacy experimental decorators. */, // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ @@ -26,12 +26,12 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "NodeNext" /* Specify what module code is generated. */, + "module": "commonjs" /* Specify what module code is generated. */, // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "nodenext" /* Specify how TypeScript looks up a file from a given module specifier. */, - "baseUrl": "." /* Specify the base directory to resolve non-relative module names. */, + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + "baseUrl": "src" /* Specify the base directory to resolve non-relative module names. */, "paths": { - "#root/*": ["./*"] + "#root/*": ["*"] } /* Specify a set of entries that re-map imports to additional lookup locations. */, // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ @@ -44,7 +44,7 @@ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ @@ -88,20 +88,20 @@ /* Type Checking */ "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* When type checking, take into account 'null' and 'undefined'. */, + "strictFunctionTypes": true /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */, + "strictBindCallApply": true /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */, + "strictPropertyInitialization": true /* Check for class properties that are declared but not set in the constructor. */, // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + "noImplicitThis": true /* Enable error reporting when 'this' is given the type 'any'. */, // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + "alwaysStrict": true /* Ensure 'use strict' is always emitted. */, + "noUnusedLocals": true /* Enable error reporting when local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read. */, // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ diff --git a/tsoa.json b/tsoa.json new file mode 100644 index 0000000000..0e2ba0e2f6 --- /dev/null +++ b/tsoa.json @@ -0,0 +1,12 @@ +{ + "entryFile": "src/app.ts", + "noImplicitAdditionalProperties": "throw-on-extras", + "controllerPathGlobs": ["src/**/*Controller.ts"], + "spec": { + "outputDirectory": "build", + "specVersion": 3 + }, + "routes": { + "routesDir": "build" + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..ddcf9650f8 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1832 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@faker-js/faker@^9.8.0": + version "9.8.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.8.0.tgz#3344284028d1c9dc98dee2479f82939310370d88" + integrity sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg== + +"@hapi/accept@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-6.0.3.tgz#eef0800a4f89cd969da8e5d0311dc877c37279ab" + integrity sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + +"@hapi/ammo@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-6.0.1.tgz#1bc9f7102724ff288ca03b721854fc5393ad123a" + integrity sha512-pmL+nPod4g58kXrMcsGLp05O2jF4P2Q3GiL8qYV7nKYEh3cGf+rV4P5Jyi2Uq0agGhVU63GtaSAfBEZOlrJn9w== + dependencies: + "@hapi/hoek" "^11.0.2" + +"@hapi/b64@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-6.0.1.tgz#786b47dc070e14465af49e2428c1025bd06ed3df" + integrity sha512-ZvjX4JQReUmBheeCq+S9YavcnMMHWqx3S0jHNXWIM1kQDxB9cyfSycpVvjfrKcIS8Mh5N3hmu/YKo4Iag9g2Kw== + dependencies: + "@hapi/hoek" "^11.0.2" + +"@hapi/boom@^10.0.0", "@hapi/boom@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-10.0.1.tgz#ebb14688275ae150aa6af788dbe482e6a6062685" + integrity sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA== + dependencies: + "@hapi/hoek" "^11.0.2" + +"@hapi/bounce@^3.0.1", "@hapi/bounce@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-3.0.2.tgz#6499a1e2db6a699e2c8d284045af46b9d8d9d57d" + integrity sha512-d0XmlTi3H9HFDHhQLjg4F4auL1EY3Wqj7j7/hGDhFFe6xAbnm3qiGrXeT93zZnPH8gH+SKAFYiRzu26xkXcH3g== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + +"@hapi/bourne@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7" + integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w== + +"@hapi/call@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@hapi/call/-/call-9.0.1.tgz#569b87d5b67abf0e58fb82a3894a61aaed3ca92e" + integrity sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + +"@hapi/catbox-memory@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-6.0.2.tgz#399fa83e85134d45a548eee978e4c3c1523e1a70" + integrity sha512-H1l4ugoFW/ZRkqeFrIo8p1rWN0PA4MDTfu4JmcoNDvnY975o29mqoZblqFTotxNHlEkMPpIiIBJTV+Mbi+aF0g== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + +"@hapi/catbox@^12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-12.1.1.tgz#9339dca0a5b18b3ca0a825ac5dfc916dbc5bab83" + integrity sha512-hDqYB1J+R0HtZg4iPH3LEnldoaBsar6bYp0EonBmNQ9t5CO+1CqgCul2ZtFveW1ReA5SQuze9GPSU7/aecERhw== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/podium" "^5.0.0" + "@hapi/validate" "^2.0.1" + +"@hapi/content@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/content/-/content-6.0.0.tgz#2427af3bac8a2f743512fce2a70cbdc365af29df" + integrity sha512-CEhs7j+H0iQffKfe5Htdak5LBOz/Qc8TRh51cF+BFv0qnuph3Em4pjGVzJMkI2gfTDdlJKWJISGWS1rK34POGA== + dependencies: + "@hapi/boom" "^10.0.0" + +"@hapi/cryptiles@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-6.0.1.tgz#7868a9d4233567ed66f0a9caf85fdcc56e980621" + integrity sha512-9GM9ECEHfR8lk5ASOKG4+4ZsEzFqLfhiryIJ2ISePVB92OHLp/yne4m+zn7z9dgvM98TLpiFebjDFQ0UHcqxXQ== + dependencies: + "@hapi/boom" "^10.0.1" + +"@hapi/file@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/file/-/file-3.0.0.tgz#f1fd824493ac89a6fceaf89c824afc5ae2121c09" + integrity sha512-w+lKW+yRrLhJu620jT3y+5g2mHqnKfepreykvdOcl9/6up8GrQQn+l3FRTsjHTKbkbfQFkuksHpdv2EcpKcJ4Q== + +"@hapi/hapi@^21.3.12": + version "21.4.0" + resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-21.4.0.tgz#6f1493ffd6d83ef2d06a95b6e855f554545e3703" + integrity sha512-kqiRWbYYLSSt2rYbxyNj8svPsXP715p4W/K3OXpXeiiVLNSdBX4f+zfmC+dY6eyb6rqTqTAbx6x8b5HpJTkviQ== + dependencies: + "@hapi/accept" "^6.0.3" + "@hapi/ammo" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.2" + "@hapi/call" "^9.0.1" + "@hapi/catbox" "^12.1.1" + "@hapi/catbox-memory" "^6.0.2" + "@hapi/heavy" "^8.0.1" + "@hapi/hoek" "^11.0.6" + "@hapi/mimos" "^7.0.1" + "@hapi/podium" "^5.0.1" + "@hapi/shot" "^6.0.1" + "@hapi/somever" "^4.1.1" + "@hapi/statehood" "^8.2.0" + "@hapi/subtext" "^8.1.0" + "@hapi/teamwork" "^6.0.0" + "@hapi/topo" "^6.0.2" + "@hapi/validate" "^2.0.1" + +"@hapi/heavy@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-8.0.1.tgz#e2be4a6a249005b5a587f7604aafa8ed02461fb6" + integrity sha512-gBD/NANosNCOp6RsYTsjo2vhr5eYA3BEuogk6cxY0QdhllkkTaJFYtTXv46xd6qhBVMbMMqcSdtqey+UQU3//w== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" + +"@hapi/hoek@^11.0.2", "@hapi/hoek@^11.0.6": + version "11.0.7" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-11.0.7.tgz#56a920793e0a42d10e530da9a64cc0d3919c4002" + integrity sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ== + +"@hapi/iron@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-7.0.1.tgz#f74bace8dad9340c7c012c27c078504f070f14b5" + integrity sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ== + dependencies: + "@hapi/b64" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/cryptiles" "^6.0.1" + "@hapi/hoek" "^11.0.2" + +"@hapi/mimos@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-7.0.1.tgz#5b65c76bb9da28ba34b0092215891f2c72bc899d" + integrity sha512-b79V+BrG0gJ9zcRx1VGcCI6r6GEzzZUgiGEJVoq5gwzuB2Ig9Cax8dUuBauQCFKvl2YWSWyOc8mZ8HDaJOtkew== + dependencies: + "@hapi/hoek" "^11.0.2" + mime-db "^1.52.0" + +"@hapi/nigel@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-5.0.1.tgz#a6dfe357e9d48d944e2ffc552bd95cb701d79ee9" + integrity sha512-uv3dtYuB4IsNaha+tigWmN8mQw/O9Qzl5U26Gm4ZcJVtDdB1AVJOwX3X5wOX+A07qzpEZnOMBAm8jjSqGsU6Nw== + dependencies: + "@hapi/hoek" "^11.0.2" + "@hapi/vise" "^5.0.1" + +"@hapi/pez@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-6.1.0.tgz#64d9f95580fc7d8f1d13437ee4a8676709954fda" + integrity sha512-+FE3sFPYuXCpuVeHQ/Qag1b45clR2o54QoonE/gKHv9gukxQ8oJJZPR7o3/ydDTK6racnCJXxOyT1T93FCJMIg== + dependencies: + "@hapi/b64" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/content" "^6.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/nigel" "^5.0.1" + +"@hapi/podium@^5.0.0", "@hapi/podium@^5.0.1": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-5.0.2.tgz#6b1431bec13f55525cdfa83b2a7684c212c96189" + integrity sha512-T7gf2JYHQQfEfewTQFbsaXoZxSvuXO/QBIGljucUQ/lmPnTTNAepoIKOakWNVWvo2fMEDjycu77r8k6dhreqHA== + dependencies: + "@hapi/hoek" "^11.0.2" + "@hapi/teamwork" "^6.0.0" + "@hapi/validate" "^2.0.1" + +"@hapi/shot@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-6.0.1.tgz#ea84d1810b7c8599d5517c23b4ec55a529d7dc16" + integrity sha512-s5ynMKZXYoDd3dqPw5YTvOR/vjHvMTxc388+0qL0jZZP1+uwXuUD32o9DuuuLsmTlyXCWi02BJl1pBpwRuUrNA== + dependencies: + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" + +"@hapi/somever@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-4.1.1.tgz#b492c78408303c72cd1a39c5060f35d18a404b27" + integrity sha512-lt3QQiDDOVRatS0ionFDNrDIv4eXz58IibQaZQDOg4DqqdNme8oa0iPWcE0+hkq/KTeBCPtEOjDOBKBKwDumVg== + dependencies: + "@hapi/bounce" "^3.0.1" + "@hapi/hoek" "^11.0.2" + +"@hapi/statehood@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-8.2.0.tgz#f9e9367ad1a02a975dc6b24dad728af19962da0f" + integrity sha512-63JlCVIrsmuunWsyc3OeuFO+gH6v56swLCl7OM1w09l/exQKPUxSUDF2Slkuw8k91nIzr0A2/aPvjLOWf9ksrg== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/cryptiles" "^6.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/iron" "^7.0.1" + "@hapi/validate" "^2.0.1" + +"@hapi/subtext@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-8.1.0.tgz#58733020a6655bc4d978df9e2f75e31696ff3f91" + integrity sha512-PyaN4oSMtqPjjVxLny1k0iYg4+fwGusIhaom9B2StinBclHs7v46mIW706Y+Wo21lcgulGyXbQrmT/w4dus6ww== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/content" "^6.0.0" + "@hapi/file" "^3.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/pez" "^6.1.0" + "@hapi/wreck" "^18.0.1" + +"@hapi/teamwork@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-6.0.0.tgz#b3a173cf811ba59fc6ee22318a1b51f4561f06e0" + integrity sha512-05HumSy3LWfXpmJ9cr6HzwhAavrHkJ1ZRCmNE2qJMihdM5YcWreWPfyN0yKT2ZjCM92au3ZkuodjBxOibxM67A== + +"@hapi/topo@^6.0.1", "@hapi/topo@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4" + integrity sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg== + dependencies: + "@hapi/hoek" "^11.0.2" + +"@hapi/validate@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-2.0.1.tgz#45cf228c4c8cfc61ba2da7e0a5ba93ff3b9afff1" + integrity sha512-NZmXRnrSLK8MQ9y/CMqE9WSspgB9xA41/LlYR0k967aSZebWr4yNrpxIbov12ICwKy4APSlWXZga9jN5p6puPA== + dependencies: + "@hapi/hoek" "^11.0.2" + "@hapi/topo" "^6.0.1" + +"@hapi/vise@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-5.0.1.tgz#5c9f16bcf1c039ddd4b6cad5f32d71eeb6bb7dac" + integrity sha512-XZYWzzRtINQLedPYlIkSkUr7m5Ddwlu99V9elh8CSygXstfv3UnWIXT0QD+wmR0VAG34d2Vx3olqcEhRRoTu9A== + dependencies: + "@hapi/hoek" "^11.0.2" + +"@hapi/wreck@^18.0.1": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-18.1.0.tgz#68e631fc7568ebefc6252d5b86cb804466c8dbe6" + integrity sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/hoek" "^11.0.2" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@mongodb-js/saslprep@^1.1.9": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz#09506f29cc2a99d9d7b951caa7fffc87e522a6d3" + integrity sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA== + dependencies: + sparse-bitfield "^3.0.3" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@scarf/scarf@=1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" + integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@tsoa/cli@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@tsoa/cli/-/cli-6.6.0.tgz#7946adfb64a3f081d18d1b4b8e4546626b99c602" + integrity sha512-thSW0EiqjkF7HspcPIVIy0ZX65VqbWALHbxwl8Sk83j2kakOMq+fJvfo8FcBAWlMki+JDH7CO5iaAaSLHbeqtg== + dependencies: + "@tsoa/runtime" "^6.6.0" + "@types/multer" "^1.4.12" + fs-extra "^11.2.0" + glob "^10.3.10" + handlebars "^4.7.8" + merge-anything "^5.1.7" + minimatch "^9.0.1" + ts-deepmerge "^7.0.2" + typescript "^5.7.2" + validator "^13.12.0" + yaml "^2.6.1" + yargs "^17.7.1" + +"@tsoa/runtime@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@tsoa/runtime/-/runtime-6.6.0.tgz#8cbe2773fed7867979b6dee51d6c8abd5d264e14" + integrity sha512-+rF2gdL8CX+jQ82/IBc+MRJFNAvWPoBBl77HHJv3ESVMqbKhlhlo97JHmKyFbLcX6XOJN8zl8gfQpAEJN4SOMQ== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/hapi" "^21.3.12" + "@types/koa" "^2.15.0" + "@types/multer" "^1.4.12" + express "^4.21.2" + reflect-metadata "^0.2.2" + validator "^13.12.0" + +"@types/accepts@*": + version "1.3.7" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265" + integrity sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.8" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.8.tgz#6742a5971f490dc41e59d277eee71361fea0b537" + integrity sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg== + +"@types/cookies@*": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.9.0.tgz#a2290cfb325f75f0f28720939bee854d4142aee2" + integrity sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.2.tgz#7be9e337a5745d6b43ef5b0c352dad94a7f0c256" + integrity sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/serve-static" "*" + +"@types/http-assert@*": + version "1.5.6" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.6.tgz#b6b657c38a2350d21ce213139f33b03b2b5fa431" + integrity sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/keygrip@*": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.6.tgz#1749535181a2a9b02ac04a797550a8787345b740" + integrity sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ== + +"@types/koa-compose@*": + version "3.2.8" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.8.tgz#dec48de1f6b3d87f87320097686a915f1e954b57" + integrity sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA== + dependencies: + "@types/koa" "*" + +"@types/koa@*", "@types/koa@^2.15.0": + version "2.15.0" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.15.0.tgz#eca43d76f527c803b491731f95df575636e7b6f2" + integrity sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/mongoose@^5.11.96": + version "5.11.97" + resolved "https://registry.yarnpkg.com/@types/mongoose/-/mongoose-5.11.97.tgz#80b0357f3de6807eb597262f52e49c3e13ee14d8" + integrity sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q== + dependencies: + mongoose "*" + +"@types/multer@^1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== + dependencies: + "@types/express" "*" + +"@types/node@*", "@types/node@^22.15.29": + version "22.15.29" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.29.tgz#c75999124a8224a3f79dd8b6ccfb37d74098f678" + integrity sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ== + dependencies: + undici-types "~6.21.0" + +"@types/qs@*": + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" + integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/webidl-conversions@*": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" + integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== + +"@types/whatwg-url@^11.0.2": + version "11.0.5" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.5.tgz#aaa2546e60f0c99209ca13360c32c78caf2c409f" + integrity sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ== + dependencies: + "@types/webidl-conversions" "*" + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +body-parser@1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + 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.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" + integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== + dependencies: + bytes "^3.1.2" + content-type "^1.0.5" + debug "^4.4.0" + http-errors "^2.0.0" + iconv-lite "^0.6.3" + on-finished "^2.4.1" + qs "^6.14.0" + raw-body "^3.0.0" + type-is "^2.0.0" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +bson@^6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.3.tgz#5f9a463af6b83e264bedd08b236d1356a30eda47" + integrity sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ== + +bytes@3.1.2, bytes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-disposition@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" + integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4.x, debug@^4.3.5, debug@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +depd@2.0.0, depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@^2.0.0, encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.21.2: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.12" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +express@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" + integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== + dependencies: + accepts "^2.0.0" + body-parser "^2.2.0" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +finalhandler@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" + integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" + +foreground-child@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fs-extra@^11.2.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +handlebars@^4.7.8: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + 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" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-what@^4.1.8: + version "4.1.16" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" + integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kareem@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" + integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + +merge-anything@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-5.1.7.tgz#94f364d2b0cf21ac76067b5120e429353b3525d7" + integrity sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ== + dependencies: + is-what "^4.1.8" + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@^1.52.0, mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^9.0.1, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mongodb-connection-string-url@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz#e223089dfa0a5fa9bf505f8aedcbc67b077b33e7" + integrity sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA== + dependencies: + "@types/whatwg-url" "^11.0.2" + whatwg-url "^14.1.0 || ^13.0.0" + +mongodb@~6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.16.0.tgz#2a7a1986ec151d9c738fc8ce4cf4324c3f728a2f" + integrity sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw== + dependencies: + "@mongodb-js/saslprep" "^1.1.9" + bson "^6.10.3" + mongodb-connection-string-url "^3.0.0" + +mongoose@*, mongoose@^8.15.1: + version "8.15.1" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-8.15.1.tgz#d0c5224a01ea8a8f96f5fd5f8557675a054d0a6f" + integrity sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw== + dependencies: + bson "^6.10.3" + kareem "2.6.3" + mongodb "~6.16.0" + mpath "0.9.0" + mquery "5.0.0" + ms "2.1.3" + sift "17.1.3" + +mpath@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" + integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== + +mquery@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/mquery/-/mquery-5.0.0.tgz#a95be5dfc610b23862df34a47d3e5d60e110695d" + integrity sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg== + dependencies: + debug "4.x" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +on-finished@2.4.1, on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +parseurl@^1.3.3, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + +path-to-regexp@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + +proxy-addr@^2.0.7, proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +qs@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.6.3" + unpipe "1.0.0" + +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +router@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + 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" + +send@^1.1.0, send@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" + integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + dependencies: + debug "^4.3.5" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.0" + mime-types "^3.0.1" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.1" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +serve-static@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" + integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +sift@17.1.3: + version "17.1.3" + resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" + integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== + dependencies: + memory-pager "^1.0.2" + +statuses@2.0.1, statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +swagger-ui-dist@>=5.0.0: + version "5.22.0" + resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.22.0.tgz#8280cfa9659d90cf6f682c76f7e792b0da939946" + integrity sha512-8YlCSxiyb8uPFa7qoB1lRHYr1PBbT1NuV9RvQdFFPFPudRBTPf9coU5jl02KhzvrtmTEw4jXRgb0kg8pJvVuWQ== + dependencies: + "@scarf/scarf" "=1.4.0" + +swagger-ui-express@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz#fb8c1b781d2793a6bd2f8a205a3f4bd6fa020dd8" + integrity sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA== + dependencies: + swagger-ui-dist ">=5.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" + integrity sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw== + dependencies: + punycode "^2.3.1" + +ts-deepmerge@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-deepmerge/-/ts-deepmerge-7.0.3.tgz#e7053ddb45be093b71d7f9a5a05935ae119f1d31" + integrity sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tsoa@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/tsoa/-/tsoa-6.6.0.tgz#6a4b1b1227866b44c2884c5fb9ca3dd945c7ddb2" + integrity sha512-7FudRojmbEpbSQ3t1pyG5EjV3scF7/X75giQt1q+tnuGjjJppB8BOEmIdCK/G8S5Dqnmpwz5Q3vxluKozpIW9A== + dependencies: + "@tsoa/cli" "^6.6.0" + "@tsoa/runtime" "^6.6.0" + +type-is@^2.0.0, type-is@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^5.7.2, typescript@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== + +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validator@^13.12.0: + version "13.15.15" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.15.tgz#246594be5671dc09daa35caec5689fcd18c6e7e4" + integrity sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A== + +vary@^1.1.2, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +"whatwg-url@^14.1.0 || ^13.0.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" + integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== + dependencies: + tr46 "^5.1.0" + webidl-conversions "^7.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaml@^2.6.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zod@^3.25.46: + version "3.25.46" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.46.tgz#a8761d188e492b869bfb4f855bf0f716d54daf19" + integrity sha512-IqRxcHEIjqLd4LNS/zKffB3Jzg3NwqJxQQ0Ns7pdrvgGkwQsEBdEQcOHaBVqvvZArShRzI39+aMST3FBGmTrLQ== From e4c7ff62bc03aacc8fa55a4518adf66543090b0f Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Mon, 2 Jun 2025 13:35:31 -0400 Subject: [PATCH 04/27] feat(tsoa-swagger): Add additional get route to find a product using Id. --- build/build/routes.js | 122 ++++++++++ build/build/swagger.json | 206 +++++++++++++++++ build/routes.ts | 37 ++- build/src/products/productHelpers.js | 8 + build/src/products/productsController.js | 9 + build/src/products/productsService.js | 14 +- build/swagger.json | 78 +++---- build/tsconfig.tsbuildinfo | 2 +- nodemon.json | 5 + package.json | 11 +- src/app.ts | 4 +- src/products/productHelpers.ts | 7 + src/products/productsController.ts | 11 +- src/products/productsService.ts | 14 +- src/products/productsTypes.ts | 12 +- tsconfig.tsbuildinfo | 1 + yarn.lock | 280 +++++++++++++++++++++-- 17 files changed, 739 insertions(+), 82 deletions(-) create mode 100644 build/build/routes.js create mode 100644 build/build/swagger.json create mode 100644 build/src/products/productHelpers.js create mode 100644 nodemon.json create mode 100644 src/products/productHelpers.ts create mode 100644 tsconfig.tsbuildinfo diff --git a/build/build/routes.js b/build/build/routes.js new file mode 100644 index 0000000000..35a9f451b2 --- /dev/null +++ b/build/build/routes.js @@ -0,0 +1,122 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RegisterRoutes = RegisterRoutes; +const runtime_1 = require("@tsoa/runtime"); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +const productsController_1 = require("./../src/products/productsController"); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +const models = { + "ProductDto": { + "dataType": "refObject", + "properties": { + "_id": { "dataType": "string", "required": true }, + "category": { "dataType": "string", "required": true }, + "name": { "dataType": "string", "required": true }, + "price": { "dataType": "double", "required": true }, + "image": { "dataType": "string", "required": true }, + "createdAt": { "dataType": "datetime", "required": true }, + "updatedAt": { "dataType": "datetime", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductListResponse": { + "dataType": "refObject", + "properties": { + "products": { "dataType": "array", "array": { "dataType": "refObject", "ref": "ProductDto" }, "required": true }, + "totalPages": { "dataType": "double", "required": true }, + "currentPage": { "dataType": "double", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "Error": { + "dataType": "refObject", + "properties": { + "name": { "dataType": "string", "required": true }, + "message": { "dataType": "string", "required": true }, + "stack": { "dataType": "string" }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "QueryParams": { + "dataType": "refObject", + "properties": { + "page": { "dataType": "string", "required": true }, + "limit": { "dataType": "string", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +}; +const templateService = new runtime_1.ExpressTemplateService(models, { "noImplicitAdditionalProperties": "throw-on-extras", "bodyCoercion": true }); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +function RegisterRoutes(app) { + // ########################################################################################################### + // NOTE: If you do not see routes for all of your controllers in this file, then you might not have informed tsoa of where to look + // Please look into the "controllerPathGlobs" config option described in the readme: https://github.com/lukeautry/tsoa + // ########################################################################################################### + const argsProductsController_getAllProducts = { + queryParams: { "in": "queries", "name": "queryParams", "required": true, "ref": "QueryParams" }, + }; + app.get('/products', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.getAllProducts)), function ProductsController_getAllProducts(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getAllProducts, request, response }); + const controller = new productsController_1.ProductsController(); + yield templateService.apiHandler({ + methodName: 'getAllProducts', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_getByProductId = { + productId: { "in": "path", "name": "productId", "required": true, "dataType": "string" }, + }; + app.get('/products/:productId', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.getByProductId)), function ProductsController_getByProductId(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getByProductId, request, response }); + const controller = new productsController_1.ProductsController(); + yield templateService.apiHandler({ + methodName: 'getByProductId', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +} +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa diff --git a/build/build/swagger.json b/build/build/swagger.json new file mode 100644 index 0000000000..d8895ab863 --- /dev/null +++ b/build/build/swagger.json @@ -0,0 +1,206 @@ +{ + "openapi": "3.0.0", + "components": { + "examples": {}, + "headers": {}, + "parameters": {}, + "requestBodies": {}, + "responses": {}, + "schemas": { + "ProductDto": { + "properties": { + "_id": { + "type": "string" + }, + "category": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "_id", + "category", + "name", + "price", + "image", + "createdAt", + "updatedAt" + ], + "type": "object", + "additionalProperties": false + }, + "ProductListResponse": { + "properties": { + "products": { + "items": { + "$ref": "#/components/schemas/ProductDto" + }, + "type": "array" + }, + "totalPages": { + "type": "number", + "format": "double" + }, + "currentPage": { + "type": "number", + "format": "double" + } + }, + "required": [ + "products", + "totalPages", + "currentPage" + ], + "type": "object", + "additionalProperties": false + }, + "Error": { + "properties": { + "name": { + "type": "string" + }, + "message": { + "type": "string" + }, + "stack": { + "type": "string" + } + }, + "required": [ + "name", + "message" + ], + "type": "object", + "additionalProperties": false + }, + "QueryParams": { + "properties": { + "page": { + "type": "string" + }, + "limit": { + "type": "string" + } + }, + "required": [ + "page", + "limit" + ], + "type": "object", + "additionalProperties": false + } + }, + "securitySchemes": {} + }, + "info": { + "title": "clear", + "version": "1.0.0", + "description": "This project has been created by a student at Parsity, an online software engineering course. The work in this repository is wholly of the student based on a sample starter project that can be accessed by looking at the repository that this project forks.", + "license": { + "name": "ISC" + }, + "contact": {} + }, + "paths": { + "/products": { + "get": { + "operationId": "GetAllProducts", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProductListResponse" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "query", + "name": "page", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/products/{productId}": { + "get": { + "operationId": "GetByProductId", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProductDto" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + } + }, + "servers": [ + { + "url": "/" + } + ] +} diff --git a/build/routes.ts b/build/routes.ts index c846ff885c..220cec771d 100644 --- a/build/routes.ts +++ b/build/routes.ts @@ -12,21 +12,16 @@ import type { Request as ExRequest, Response as ExResponse, RequestHandler, Rout // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa const models: TsoaRoute.Models = { - "Pick_ProductEntity.Exclude_keyofProductEntity._id__": { - "dataType": "refAlias", - "type": {"dataType":"nestedObjectLiteral","nestedProperties":{"category":{"dataType":"string","required":true},"name":{"dataType":"string","required":true},"price":{"dataType":"double","required":true},"image":{"dataType":"string","required":true},"createdAt":{"dataType":"datetime","required":true},"updatedAt":{"dataType":"datetime","required":true}},"validators":{}}, - }, - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa "ProductDto": { "dataType": "refObject", "properties": { + "_id": {"dataType":"string","required":true}, "category": {"dataType":"string","required":true}, "name": {"dataType":"string","required":true}, "price": {"dataType":"double","required":true}, "image": {"dataType":"string","required":true}, "createdAt": {"dataType":"datetime","required":true}, "updatedAt": {"dataType":"datetime","required":true}, - "_id": {"dataType":"string","required":true}, }, "additionalProperties": false, }, @@ -107,6 +102,36 @@ export function RegisterRoutes(app: Router) { } }); // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_getByProductId: Record = { + productId: {"in":"path","name":"productId","required":true,"dataType":"string"}, + }; + app.get('/products/:productId', + ...(fetchMiddlewares(ProductsController)), + ...(fetchMiddlewares(ProductsController.prototype.getByProductId)), + + async function ProductsController_getByProductId(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getByProductId, request, response }); + + const controller = new ProductsController(); + + await templateService.apiHandler({ + methodName: 'getByProductId', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa diff --git a/build/src/products/productHelpers.js b/build/src/products/productHelpers.js new file mode 100644 index 0000000000..b4f771bf7d --- /dev/null +++ b/build/src/products/productHelpers.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertDocumentToProductDto = void 0; +const convertDocumentToProductDto = (document) => { + const dto = document.toObject(); + return Object.assign(Object.assign({}, dto), { _id: dto._id.toString() }); +}; +exports.convertDocumentToProductDto = convertDocumentToProductDto; diff --git a/build/src/products/productsController.js b/build/src/products/productsController.js index 22b548c595..200bb279c6 100644 --- a/build/src/products/productsController.js +++ b/build/src/products/productsController.js @@ -27,12 +27,21 @@ let ProductsController = class ProductsController extends tsoa_1.Controller { return new productsService_1.ProductsService().getAllProducts(queryParams); }); } + getByProductId(productId) { + return __awaiter(this, void 0, void 0, function* () { + return new productsService_1.ProductsService().getByProductId(productId); + }); + } }; exports.ProductsController = ProductsController; __decorate([ (0, tsoa_1.Get)(), __param(0, (0, tsoa_1.Queries)()) ], ProductsController.prototype, "getAllProducts", null); +__decorate([ + (0, tsoa_1.Get)('{productId}'), + __param(0, (0, tsoa_1.Path)()) +], ProductsController.prototype, "getByProductId", null); exports.ProductsController = ProductsController = __decorate([ (0, tsoa_1.Route)('products') ], ProductsController); diff --git a/build/src/products/productsService.js b/build/src/products/productsService.js index 118f139af0..ca5fb150c7 100644 --- a/build/src/products/productsService.js +++ b/build/src/products/productsService.js @@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge Object.defineProperty(exports, "__esModule", { value: true }); exports.ProductsService = void 0; const productModel_1 = require("./productModel"); +const productHelpers_1 = require("./productHelpers"); class ProductsService { getAllProducts(_a) { return __awaiter(this, arguments, void 0, function* ({ page, limit, }) { @@ -23,7 +24,7 @@ class ProductsService { .sort({ createdAt: -1 }); const count = yield productModel_1.Product.countDocuments(); const productsDto = products.map((product) => { - return Object.assign(Object.assign({}, product.toObject()), { _id: product._id.toString() }); + return (0, productHelpers_1.convertDocumentToProductDto)(product); }); return { products: productsDto, @@ -36,5 +37,16 @@ class ProductsService { } }); } + getByProductId(productId) { + return __awaiter(this, void 0, void 0, function* () { + try { + const productsDto = yield productModel_1.Product.find({ _id: productId }); + return (0, productHelpers_1.convertDocumentToProductDto)(productsDto[0]); + } + catch (error) { + throw new Error(); + } + }); + } } exports.ProductsService = ProductsService; diff --git a/build/swagger.json b/build/swagger.json index e6d55a1c4b..24ffc21074 100644 --- a/build/swagger.json +++ b/build/swagger.json @@ -7,43 +7,11 @@ "requestBodies": {}, "responses": {}, "schemas": { - "Pick_ProductEntity.Exclude_keyofProductEntity._id__": { + "ProductDto": { "properties": { - "category": { - "type": "string" - }, - "name": { - "type": "string" - }, - "price": { - "type": "number", - "format": "double" - }, - "image": { + "_id": { "type": "string" }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "category", - "name", - "price", - "image", - "createdAt", - "updatedAt" - ], - "type": "object", - "description": "From T, pick a set of properties whose keys are in the union K" - }, - "ProductDto": { - "properties": { "category": { "type": "string" }, @@ -64,19 +32,16 @@ "updatedAt": { "type": "string", "format": "date-time" - }, - "_id": { - "type": "string" } }, "required": [ + "_id", "category", "name", "price", "image", "createdAt", - "updatedAt", - "_id" + "updatedAt" ], "type": "object", "additionalProperties": false @@ -196,6 +161,41 @@ } ] } + }, + "/products/{productId}": { + "get": { + "operationId": "GetByProductId", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProductDto" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } } }, "servers": [ diff --git a/build/tsconfig.tsbuildinfo b/build/tsconfig.tsbuildinfo index bd2d403434..62a420def2 100644 --- a/build/tsconfig.tsbuildinfo +++ b/build/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../node_modules/typescript/lib/lib.es6.d.ts","../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@tsoa/runtime/dist/decorators/deprecated.d.ts","../node_modules/@tsoa/runtime/dist/decorators/example.d.ts","../node_modules/@tsoa/runtime/dist/decorators/parameter.d.ts","../node_modules/@tsoa/runtime/dist/decorators/methods.d.ts","../node_modules/@tsoa/runtime/dist/decorators/tags.d.ts","../node_modules/@tsoa/runtime/dist/decorators/operationid.d.ts","../node_modules/@tsoa/runtime/dist/decorators/route.d.ts","../node_modules/@tsoa/runtime/dist/decorators/security.d.ts","../node_modules/@tsoa/runtime/dist/decorators/extension.d.ts","../node_modules/@tsoa/runtime/dist/decorators/middlewares.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/controller.d.ts","../node_modules/@tsoa/runtime/dist/utils/isheadertype.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/response.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/iocmodule.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/file.d.ts","../node_modules/@tsoa/runtime/dist/decorators/response.d.ts","../node_modules/@tsoa/runtime/dist/swagger/swagger.d.ts","../node_modules/@tsoa/runtime/dist/metadatageneration/tsoa.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/tsoa-route.d.ts","../node_modules/@types/multer/index.d.ts","../node_modules/@tsoa/runtime/dist/config.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/additionalprops.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templatehelpers.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/templateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/express/expresstemplateservice.d.ts","../node_modules/@hapi/boom/lib/index.d.ts","../node_modules/@hapi/podium/lib/index.d.ts","../node_modules/@hapi/shot/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/utils.d.ts","../node_modules/@hapi/mimos/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/route.d.ts","../node_modules/@hapi/catbox/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/cache.d.ts","../node_modules/@hapi/hapi/lib/types/server/encoders.d.ts","../node_modules/@hapi/hapi/lib/types/server/events.d.ts","../node_modules/@hapi/hapi/lib/types/server/ext.d.ts","../node_modules/@hapi/hapi/lib/types/server/info.d.ts","../node_modules/@hapi/hapi/lib/types/server/inject.d.ts","../node_modules/@hapi/hapi/lib/types/server/methods.d.ts","../node_modules/@hapi/iron/lib/index.d.ts","../node_modules/@hapi/statehood/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/state.d.ts","../node_modules/@hapi/hapi/lib/types/server/options.d.ts","../node_modules/@hapi/hapi/lib/types/server/server.d.ts","../node_modules/@hapi/hapi/lib/types/server/auth.d.ts","../node_modules/@hapi/hapi/lib/types/server/index.d.ts","../node_modules/@hapi/hapi/lib/types/response.d.ts","../node_modules/@hapi/hapi/lib/types/request.d.ts","../node_modules/@hapi/hapi/lib/types/plugin.d.ts","../node_modules/@hapi/hapi/lib/types/index.d.ts","../node_modules/@hapi/hapi/lib/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/hapi/hapitemplateservice.d.ts","../node_modules/@types/accepts/index.d.ts","../node_modules/@types/keygrip/index.d.ts","../node_modules/@types/cookies/index.d.ts","../node_modules/@types/http-assert/index.d.ts","../node_modules/@types/content-disposition/index.d.ts","../node_modules/@types/koa-compose/index.d.ts","../node_modules/@types/koa/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/koa/koatemplateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/index.d.ts","../node_modules/@tsoa/runtime/dist/utils/assertnever.d.ts","../node_modules/@tsoa/runtime/dist/index.d.ts","../node_modules/typescript/lib/typescript.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/routegenerator.d.ts","../node_modules/@tsoa/cli/dist/cli.d.ts","../node_modules/@tsoa/cli/dist/module/generate-spec.d.ts","../node_modules/@tsoa/cli/dist/module/generate-routes.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/defaultroutegenerator.d.ts","../node_modules/@tsoa/cli/dist/index.d.ts","../node_modules/tsoa/dist/index.d.ts","../node_modules/bson/bson.d.ts","../node_modules/mongodb/mongodb.d.ts","../node_modules/mongoose/types/aggregate.d.ts","../node_modules/mongoose/types/callback.d.ts","../node_modules/mongoose/types/collection.d.ts","../node_modules/mongoose/types/connection.d.ts","../node_modules/mongoose/types/cursor.d.ts","../node_modules/mongoose/types/document.d.ts","../node_modules/mongoose/types/error.d.ts","../node_modules/mongoose/types/expressions.d.ts","../node_modules/mongoose/types/helpers.d.ts","../node_modules/kareem/index.d.ts","../node_modules/mongoose/types/middlewares.d.ts","../node_modules/mongoose/types/indexes.d.ts","../node_modules/mongoose/types/models.d.ts","../node_modules/mongoose/types/mongooseoptions.d.ts","../node_modules/mongoose/types/pipelinestage.d.ts","../node_modules/mongoose/types/populate.d.ts","../node_modules/mongoose/types/query.d.ts","../node_modules/mongoose/types/schemaoptions.d.ts","../node_modules/mongoose/types/schematypes.d.ts","../node_modules/mongoose/types/session.d.ts","../node_modules/mongoose/types/types.d.ts","../node_modules/mongoose/types/utility.d.ts","../node_modules/mongoose/types/validation.d.ts","../node_modules/mongoose/types/inferschematype.d.ts","../node_modules/mongoose/types/inferrawdoctype.d.ts","../node_modules/mongoose/types/virtuals.d.ts","../node_modules/mongoose/types/augmentations.d.ts","../node_modules/mongoose/types/index.d.ts","../src/products/productmodel.ts","../src/products/productstypes.ts","../src/products/productsservice.ts","../src/products/productscontroller.ts","./routes.ts","../node_modules/@types/swagger-ui-express/index.d.ts","./swagger.json","../src/app.ts","../src/server.ts","../node_modules/@types/webidl-conversions/index.d.ts","../node_modules/@types/whatwg-url/index.d.ts"],"fileIdsList":[[56,98,158,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,264],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,186,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,209,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,141,185,186,188,190,205,206,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,203,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,191,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,203,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,192,193,194,195,196,197,198,201,202,203,204,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,187,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,189,190,192,201,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,188,189,190,192,193,194,195,196,197,198,201,202,204,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,200,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,115,130,185,187,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,185,199,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,226,227,228,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,223,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,176,179,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,172,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,180,181,182,220,221,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,168,176,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,180,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,178,181,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,170,178,183,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,183,210,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,183,184,211,219,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,183,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,182,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,177,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,158,213,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,148,150,151,152,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,153,155,157,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,113,114,118,124,141,148,154,212,213,214,215,216,217,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,104,110,111,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,100,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[51,52,53,56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,101,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,102,103,111,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,104,106,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,105,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,107,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,108,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,125,130,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,106,110,113,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,113,114,118,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[54,55,56,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,116,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,120,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,121,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,96,97,98,99,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,123,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,124,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,125,126,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,125,127,142,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,130,131,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,132,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,131,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,134,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,118,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,139,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,140,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,124,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,143,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,145,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,112,121,130,133,141,144,146,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,111,130,148,149,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,150,154,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,155,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,138,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,233,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,260],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,260],[56,98,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,260],[56,98,222,229,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,118,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,58,61,64,98,110,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,63,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,86,87,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,61,65,98,133,141,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,86,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,80,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,73,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,64,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,60,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,69,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,68,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,62,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,65,86,98,146,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,265,266,267],[56,98,230,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262,263],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,264],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,268]],"fileInfos":[{"version":"df039a67536fe2acc3affdcbfb645892f842db36fe599e8e652e2f0c640a90d1","impliedFormat":1},{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a4ef5ccfd69b5bc2a2c29896aa07daaff7c5924a12e70cb3d9819145c06897db","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4a1c5b43d4d408cb0df0a6cc82ca7be314553d37e432fc1fd801bae1a9ab2cb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"c6ab0dd29bf74b71a54ff2bbce509eb8ae3c4294d57cc54940f443c01cd1baae","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"86ea91bfa7fef1eeb958056f30f1db4e0680bc9b5132e5e9d6e9cfd773c0c4fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7832b05a98f791dcd408cff8699e95fcab73bbfae26ba9a13af5ec4a60f485d","impliedFormat":1},{"version":"9a9e62acbe3cf36141e3d76efa0eaf33ed21b51a90bc1d39c9f880ff4e0bdf87","impliedFormat":1},{"version":"b2453c7a4fe9e3e77f3a75945caa0dabe76a28ebb6dbffc4aef21309e68f6aa5","impliedFormat":1},{"version":"db09d88a24d5f720614b68a66a866e32643fc92444c0e3fd252263b2606ea10a","impliedFormat":1},{"version":"74a0f20e0b110436f175d6e531ef48120c2adc9702e2ca58b31392d2099071cf","impliedFormat":1},{"version":"70f71f639d94715dcf0577fae64d8b5829e89bf8cda1170473e68b8fdeb44378","impliedFormat":1},{"version":"2aeb069895578bac240d9d7317732b6d0ceb1ee25102bcee4b57c4e39bad965f","impliedFormat":1},{"version":"f6aaa84bca2234a227471cc26972b4cc9422afaab8d7f2d6ef51b8bc636bf58b","impliedFormat":1},{"version":"34d56740fa13eebf2b689742daf0d1834205cb9610db1df58403f6abb9adf919","impliedFormat":1},{"version":"29c621fbfd32afa52882955cf8638014e1039113174676edacc6c5b9228205f6","impliedFormat":1},{"version":"f30edc69b36565d72e55c6ebabf021455226cbf700172309e943b3c0caf326e6","impliedFormat":1},{"version":"950cdd2282ca4b38a5c2eadb727b9e2cdd936fabf0b92e36e72362cac0fd6ec5","impliedFormat":1},{"version":"b374d291655bd46fe2fa5e327586c4069361e8f2608df93e8325def3d86edf0f","impliedFormat":1},{"version":"ce9e81a19499c853c33dd83bff81daebd2931bf61e2399d81d26506573ad5928","impliedFormat":1},{"version":"5a67d052a6e4ff50663c6d5e3d807f46f4d1693ff91f6a1c83d6a557afdf6a82","impliedFormat":1},{"version":"5cb4013b09b175e02ef6c97658def451c2ae7338366af048486e3a57f526e118","impliedFormat":1},{"version":"d87e41029923fb44228d4d396aaa481d3270e0b8cf9595fcd81f187695b72c04","impliedFormat":1},{"version":"2b1dc75f0b51f7363a3fca64f48e20bd09aaf6b21446a042be9111ecb5599641","impliedFormat":1},{"version":"38e4e4bed98e94d700ff89caa521840affb5e6225abc1f1f1d17fcde12ae8e58","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3e78c2d0093f1283766ea1cf413bdb568f6e3fba30ca6979ca9c467dbd77af8","impliedFormat":1},{"version":"e800ed99d20215a12965bf7502f1371e1b46846551466c0ecda7443bc3225c5a","impliedFormat":1},{"version":"98e5b74c90814ada4ebbc8c6150a23e3fd19989f90c8fccd0219e06119c0966b","impliedFormat":1},{"version":"d134613e3638d004eab97a48b925856dcf3314484cbfe3145b148d7acc993b34","impliedFormat":1},{"version":"7ed10b8a09889585e37a93cc3d4d193995518913779650b2fec0f9896d112340","impliedFormat":1},{"version":"42289160bd23270bd10e956093df608f8a91243e2b2cdbd629c79744340a86cd","impliedFormat":1},{"version":"1bdd7e96e94e3ecd6720bc3a57de1e13760003ca03a8c6ee81c9ae9d12400c93","impliedFormat":1},{"version":"e7d3856062ae83e9903cefa63eb6d2b66fc2d084719e4f4c91dff80e1a679ef6","impliedFormat":1},{"version":"32b4066cafeacbba5af922904b0353e9db488e9e34dfa6528c979733fcf18532","impliedFormat":1},{"version":"ac830864d40131ddd4e739c7011a6fa023b9aeb9229367afa85305962321f91f","impliedFormat":1},{"version":"ea7b76d925ebcbbac1f8fc807b711f095b7633d5a08089762d7323569c4077be","impliedFormat":1},{"version":"536ce6090e9826d91d9b73557f27954d3f9b98c1b1c8b8e004d933677f7b0079","impliedFormat":1},{"version":"24923854943027b359d554b2a122a6e5d9360645f7a6354ac0c0534781cee1a0","impliedFormat":1},{"version":"352b4dc64333e91f53a15980fcc0bed2e062303a76c6b9717ec314dfbe29e93a","impliedFormat":1},{"version":"09bbc977cabb5cd49235e60ff89b77289fe6fa42aa2c472a524c845dc5f4c6fc","impliedFormat":1},{"version":"406717fd8feb6645442dff23a4821d3b6431438e047bdb49b5d37d8d84e49885","impliedFormat":1},{"version":"739d28fd2f30200f9147061c2a8928522d161c55335245003fa2db027d44880c","impliedFormat":1},{"version":"5139d33aeb679963a5d6337232c551464ccaca4661dddf2567f6abbf24e9a140","impliedFormat":1},{"version":"1b4ea9bdde8fb36710a1cde149e647c2e4b63a47132b3d404e76aa1469f10250","impliedFormat":1},{"version":"6a9d3a15e3f0679a1552e5b0f7fae3361536d5eac476b29f3d0b65dd2c672621","impliedFormat":1},{"version":"524fa80c39ce5ea4097eff4b21835738099f26c6dbe51f537873a37488b7d65a","impliedFormat":1},{"version":"6da5df3051db43101fbc4b64ab0c22cff1bdcec8f0324f8e8a305018dc4acc5d","impliedFormat":1},{"version":"7b44a75ca0913e8af7775ee46a9138e5a801521a708c4574c75ffd1e722d5aa0","impliedFormat":1},{"version":"11842523b052ea1cb88c81cdca2922244122b1cad318adcce2e465d48e0a52f8","impliedFormat":1},{"version":"622593b400ce3032a71addf4204c41bac042721ab985de7e42d086558b13a337","impliedFormat":1},{"version":"d243e8eb5a04f2044d9379cf27d881e8ba4be6ba38c66d921c409b46f6d78927","impliedFormat":1},{"version":"22a8a4f9138f039c4c8316d555a1c3715e56f047ed635a578027c08e197ada2b","impliedFormat":1},{"version":"0a5504004bb9a28cee0cd9d04a9b475ca33cde579f5148266b2df3cafc95bafc","impliedFormat":1},{"version":"759b043215e42ea84b4dd5950d993ed124c05bad56bd58397a363e25d0ee62de","impliedFormat":1},{"version":"0e495d33df5bad752abb97f26cf261a6db6dd102dc1e689ba477cdb70e411935","impliedFormat":1},{"version":"d5c19655468e29f60c871b21e73af8ebc653f736e7123ade916f22c4a5f80ce5","impliedFormat":1},{"version":"34a413bafdeae24c5b5419609be63b85255c5d56a4e3185b016e2329a8f13ec4","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"2224f3072e3cc07906eeed5c71746779511fba2dd224addc5489bcdb489bdee5","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"c96e47b3fbf3912887565641f4810f585dea9550eb2a31d91b1543c94cb6aed7","impliedFormat":1},{"version":"a03e9f9bf9fc56c6785a8d5b5bb8a99669acb38dd885afcb4d58673c9c7c0286","impliedFormat":1},{"version":"2f1c0d14f39377282b5dbf908502f5e82141b075770a1f3cd673bca11607a846","impliedFormat":1},{"version":"4ae86b01844cfd5116902a40ad3dd7e7659ea449279e21d2917413a2cfb5077c","impliedFormat":1},{"version":"c302df1d6f371c6064cb5f4d0b41165425b682b287a3b8625527b2752eb433ee","impliedFormat":1},{"version":"09762428597d0079f6ac0785ec4a24471a43796c5517bfbd0606aa163d651660","impliedFormat":1},{"version":"dd2d20937dbd382340d7364a6153c5a71a04e222fa33a26d255dc668e21eb196","impliedFormat":1},{"version":"2a8d9c59c5e85f41cec149485aca6481deb5c32b580dd0ea08d499cc9bfc0b2f","impliedFormat":1},{"version":"1ceda047afdd4436db76576b2bfc72d047c08982ebb40c66aab8bcabf195b8e4","impliedFormat":1},{"version":"fdbd67a5466c4f0dd609b37ddfdfe8ffc3955188f7494922ac7e85f83d3cf11c","impliedFormat":1},{"version":"5e9892fdebf7c79987e0d4cb48941f796a35582f8810bb96c89a31e5d396df8b","impliedFormat":1},{"version":"fd550ecb67f4fa6cc8c8f08d84c072afda2645c001aed5825d0be8e767b8e571","impliedFormat":1},{"version":"359e7188a3ad226e902c43443a45f17bd53bf279596aece7761dc72ffa22b30d","impliedFormat":1},{"version":"d8d9529a7f6c742de51ba5eecaa47fdab38f123af1b5280a1a6956de553e5fe9","impliedFormat":1},{"version":"403c4f2906f58407d454a401daf0fa59cbd683824b444b3151075bc3a6714c48","impliedFormat":1},{"version":"0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","impliedFormat":1},{"version":"35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","impliedFormat":1},{"version":"c9604ed0199a5ae1e86f9c17a981d297141bc0b3c4f51d88322859294f77f3ce","impliedFormat":1},{"version":"13a4d931c625360ab1cbf68961b13a60969a17cf3247bd60e18a49fb498b68e5","impliedFormat":1},{"version":"80b2eb4a470b8c3ef6709da5c3f8cd827d3b92b1bc96ec0ae661cc6eb7b213da","impliedFormat":1},{"version":"fe677c6e53f1eddbcc00af336d3ffbada25e6e0aa05a0fb5f10c818b5b6b6aa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"89cbb41c032a8602412a55d89c9fbee8af199ffb3e89e52a0306d42518f491c3","impliedFormat":1},{"version":"3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","impliedFormat":1},{"version":"021fbcae20ddc7ca7bf04cdb02a8c51f0d96afdde6a8462fb73b09ab4136ff7a","impliedFormat":1},{"version":"d2ce9e0d3035ad20bc34eb6177cd4a6ced475367170d8e46860598fe49dd9b3e","impliedFormat":1},{"version":"8443bbb1e167b4cca6d192eab6f9ab94442054f9b1c945f05070c23896396365","impliedFormat":1},{"version":"4e402f9d1887c077981d4668089ee20192bbfa7450b8abb36af3efa100fc1298","impliedFormat":1},{"version":"bbe98bf29952b80a91789cc6a3a3727aa958e652f32b145740229fe4b02f2a0a","impliedFormat":1},{"version":"18e0fa134b9df012b043ee0fc9698d7b1666c7e7df7918bf465a79c89742fbfc","impliedFormat":1},{"version":"3016511eadb560b6874050f8ff2ca671c64a663a48c60a24e3e7ddef92c3b095","impliedFormat":1},{"version":"ab066772d4672b6cfa1196820df536fa225888dbc9bf9cf68ce1173bc03d433b","impliedFormat":1},{"version":"9ee85178017faacec870ca5b75c292d6d1d6d6f4e81d42c79c4cf73b63a303d8","impliedFormat":1},{"version":"788a2d9ffaccf9ce65d321472ff3daaf9ab864504fad41753b978bfbd5e9ea71","impliedFormat":1},{"version":"861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","impliedFormat":1},{"version":"8d35820323a2758d61684679eddc3f1d0cc051c55258b3243aee14b6b8e285c1","impliedFormat":1},{"version":"8c418189bb1daec5e7736b6301345487e6f8f3c8ba49ef538e330e6003a47c87","impliedFormat":1},{"version":"da440f879ec47f7113408fb75f239f437b9ee812fba67562c499f10ef012464a","impliedFormat":1},{"version":"e78e58cf1d0a34668fe7365a0eeef0d85c67d81f15aaf976d9d45999b0baa9d5","impliedFormat":1},{"version":"b8de1c91d357f855aee17e06083abbf345cae76454548d1d112b9bc0d4f35821","impliedFormat":1},{"version":"f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","impliedFormat":1},{"version":"448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702","impliedFormat":1},{"version":"969ce33d76b1de933ab58f84db2936508252babf91875d429a3ce6a9961ec41e","affectsGlobalScope":true,"impliedFormat":1},"baf4e753153aaa14d8eb1dbc5712e419668311763293415b3f6ebf49ca852b83",{"version":"0bbcc0849e11d98f41664c92bcec1be4855b6296d356b9101bfc0c73c32f7475","signature":"f21dd23078502350b38b893a7d5b9ed6ee6f05bf639fde3d15f5cdaae84cf70d"},{"version":"57d2e530a9d993893ded1c05670679d14466eb63e2e063807de772d3e2e5e14e","signature":"26886b3019a8e5e008a52507c1565a974c2576592d4243e0b89305392a7ae9fe"},{"version":"3aa8a5abcc0aed315cc5be0389a0e6df9fa92b6677e58e9bc22beebd9df8a8a0","signature":"ef81cffc3d051763ecd7f40291b362dcbf95079975ab3d3fb84cc853fbc9bc69"},{"version":"20bdf8768b7f5fcef70e42e606202f36dd3731af76243ce1f3fcd1cf776b5606","signature":"7723954343a037ad4914a1dbf8b0ef2a4c266340c49c1e8c9f82aea052493635"},{"version":"85a55229c4d0f20d42c59cec768df0cb83a492f8bb1351ead8524a58f278a005","impliedFormat":1},{"version":"b2169207bf6ae9d0f414b954b6e8c3e3663a4e174df3a80957b86a351c74c06a","signature":"1b15babd7493c406e98e192c49f5c1b3334cd4c20da9886bca81a0c3aaf26bc8"},{"version":"d271d41f616162e1366947fc7a4445e3791475c6d3e847384c84af9447eab554","signature":"5ab0082578d32976c6616ce01e0b4d85859b6f6749be207b2548bb5516623999"},"85175d11bc7d4022fccc100de65ca3bf50dbc5f504576fc2bec5750c3afb71ef",{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1}],"root":[[261,264],268,269],"options":{"alwaysStrict":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":2},"referencedMap":[[265,1],[267,2],[185,2],[191,3],[210,4],[209,5],[208,6],[207,7],[206,8],[190,9],[204,10],[192,11],[193,12],[194,13],[195,14],[205,15],[196,2],[197,16],[198,11],[202,17],[203,18],[201,19],[188,20],[199,2],[189,2],[186,2],[187,21],[200,22],[225,23],[229,24],[227,25],[226,25],[228,26],[224,27],[180,28],[160,2],[161,2],[168,2],[163,2],[169,2],[165,2],[162,2],[175,29],[166,2],[167,2],[164,2],[222,30],[170,31],[174,32],[173,2],[172,33],[177,34],[181,35],[182,36],[184,37],[211,38],[220,39],[219,40],[183,41],[178,42],[176,2],[221,2],[171,2],[212,43],[157,44],[156,43],[216,2],[214,45],[153,46],[158,47],[215,2],[154,2],[213,2],[217,48],[218,49],[149,2],[179,50],[95,51],[96,51],[97,52],[56,53],[98,54],[99,55],[100,56],[51,2],[54,57],[52,2],[53,2],[101,58],[102,59],[103,60],[104,61],[105,62],[106,63],[107,63],[109,2],[108,64],[110,65],[111,66],[112,67],[94,68],[55,2],[113,69],[114,70],[115,71],[148,72],[116,73],[117,74],[118,75],[119,76],[120,77],[121,78],[122,79],[123,80],[124,81],[125,82],[126,82],[127,83],[128,2],[129,2],[130,84],[132,85],[131,86],[133,87],[134,88],[135,89],[136,90],[137,91],[138,92],[139,93],[140,94],[141,95],[142,96],[143,97],[144,98],[145,99],[146,100],[147,101],[151,2],[152,2],[150,102],[155,103],[266,104],[270,2],[271,2],[231,2],[242,2],[232,105],[233,106],[259,107],[234,108],[235,109],[236,110],[237,111],[238,112],[239,113],[240,114],[241,115],[260,116],[244,117],[257,118],[256,2],[243,119],[245,120],[246,121],[247,122],[248,123],[249,124],[250,125],[251,126],[252,127],[253,128],[254,129],[255,130],[258,131],[159,2],[230,132],[49,2],[50,2],[9,2],[10,2],[14,2],[13,2],[3,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[4,2],[23,2],[24,2],[5,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[6,2],[33,2],[34,2],[35,2],[36,2],[7,2],[40,2],[37,2],[38,2],[39,2],[41,2],[8,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[2,2],[1,2],[12,2],[11,2],[223,2],[72,133],[82,134],[71,133],[92,135],[63,136],[62,137],[91,138],[85,139],[90,140],[65,141],[79,142],[64,143],[88,144],[60,145],[59,138],[89,146],[61,147],[66,148],[67,2],[70,148],[57,2],[93,149],[83,150],[74,151],[75,152],[77,153],[73,154],[76,155],[86,138],[68,156],[69,157],[78,158],[58,32],[81,150],[80,148],[84,2],[87,159],[268,160],[261,2],[264,161],[263,162],[262,2],[269,163]],"version":"5.8.3"} \ No newline at end of file +{"fileNames":["../node_modules/typescript/lib/lib.es6.d.ts","../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@tsoa/runtime/dist/decorators/deprecated.d.ts","../node_modules/@tsoa/runtime/dist/decorators/example.d.ts","../node_modules/@tsoa/runtime/dist/decorators/parameter.d.ts","../node_modules/@tsoa/runtime/dist/decorators/methods.d.ts","../node_modules/@tsoa/runtime/dist/decorators/tags.d.ts","../node_modules/@tsoa/runtime/dist/decorators/operationid.d.ts","../node_modules/@tsoa/runtime/dist/decorators/route.d.ts","../node_modules/@tsoa/runtime/dist/decorators/security.d.ts","../node_modules/@tsoa/runtime/dist/decorators/extension.d.ts","../node_modules/@tsoa/runtime/dist/decorators/middlewares.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/controller.d.ts","../node_modules/@tsoa/runtime/dist/utils/isheadertype.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/response.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/iocmodule.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/file.d.ts","../node_modules/@tsoa/runtime/dist/decorators/response.d.ts","../node_modules/@tsoa/runtime/dist/swagger/swagger.d.ts","../node_modules/@tsoa/runtime/dist/metadatageneration/tsoa.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/tsoa-route.d.ts","../node_modules/@types/multer/index.d.ts","../node_modules/@tsoa/runtime/dist/config.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/additionalprops.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templatehelpers.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/templateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/express/expresstemplateservice.d.ts","../node_modules/@hapi/boom/lib/index.d.ts","../node_modules/@hapi/podium/lib/index.d.ts","../node_modules/@hapi/shot/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/utils.d.ts","../node_modules/@hapi/mimos/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/route.d.ts","../node_modules/@hapi/catbox/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/cache.d.ts","../node_modules/@hapi/hapi/lib/types/server/encoders.d.ts","../node_modules/@hapi/hapi/lib/types/server/events.d.ts","../node_modules/@hapi/hapi/lib/types/server/ext.d.ts","../node_modules/@hapi/hapi/lib/types/server/info.d.ts","../node_modules/@hapi/hapi/lib/types/server/inject.d.ts","../node_modules/@hapi/hapi/lib/types/server/methods.d.ts","../node_modules/@hapi/iron/lib/index.d.ts","../node_modules/@hapi/statehood/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/state.d.ts","../node_modules/@hapi/hapi/lib/types/server/options.d.ts","../node_modules/@hapi/hapi/lib/types/server/server.d.ts","../node_modules/@hapi/hapi/lib/types/server/auth.d.ts","../node_modules/@hapi/hapi/lib/types/server/index.d.ts","../node_modules/@hapi/hapi/lib/types/response.d.ts","../node_modules/@hapi/hapi/lib/types/request.d.ts","../node_modules/@hapi/hapi/lib/types/plugin.d.ts","../node_modules/@hapi/hapi/lib/types/index.d.ts","../node_modules/@hapi/hapi/lib/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/hapi/hapitemplateservice.d.ts","../node_modules/@types/accepts/index.d.ts","../node_modules/@types/keygrip/index.d.ts","../node_modules/@types/cookies/index.d.ts","../node_modules/@types/http-assert/index.d.ts","../node_modules/@types/content-disposition/index.d.ts","../node_modules/@types/koa-compose/index.d.ts","../node_modules/@types/koa/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/koa/koatemplateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/index.d.ts","../node_modules/@tsoa/runtime/dist/utils/assertnever.d.ts","../node_modules/@tsoa/runtime/dist/index.d.ts","../node_modules/typescript/lib/typescript.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/routegenerator.d.ts","../node_modules/@tsoa/cli/dist/cli.d.ts","../node_modules/@tsoa/cli/dist/module/generate-spec.d.ts","../node_modules/@tsoa/cli/dist/module/generate-routes.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/defaultroutegenerator.d.ts","../node_modules/@tsoa/cli/dist/index.d.ts","../node_modules/tsoa/dist/index.d.ts","../node_modules/bson/bson.d.ts","../node_modules/mongodb/mongodb.d.ts","../node_modules/mongoose/types/aggregate.d.ts","../node_modules/mongoose/types/callback.d.ts","../node_modules/mongoose/types/collection.d.ts","../node_modules/mongoose/types/connection.d.ts","../node_modules/mongoose/types/cursor.d.ts","../node_modules/mongoose/types/document.d.ts","../node_modules/mongoose/types/error.d.ts","../node_modules/mongoose/types/expressions.d.ts","../node_modules/mongoose/types/helpers.d.ts","../node_modules/kareem/index.d.ts","../node_modules/mongoose/types/middlewares.d.ts","../node_modules/mongoose/types/indexes.d.ts","../node_modules/mongoose/types/models.d.ts","../node_modules/mongoose/types/mongooseoptions.d.ts","../node_modules/mongoose/types/pipelinestage.d.ts","../node_modules/mongoose/types/populate.d.ts","../node_modules/mongoose/types/query.d.ts","../node_modules/mongoose/types/schemaoptions.d.ts","../node_modules/mongoose/types/schematypes.d.ts","../node_modules/mongoose/types/session.d.ts","../node_modules/mongoose/types/types.d.ts","../node_modules/mongoose/types/utility.d.ts","../node_modules/mongoose/types/validation.d.ts","../node_modules/mongoose/types/inferschematype.d.ts","../node_modules/mongoose/types/inferrawdoctype.d.ts","../node_modules/mongoose/types/virtuals.d.ts","../node_modules/mongoose/types/augmentations.d.ts","../node_modules/mongoose/types/index.d.ts","../src/products/productmodel.ts","../src/products/productstypes.ts","../src/products/producthelpers.ts","../src/products/productsservice.ts","../src/products/productscontroller.ts","./routes.ts","../node_modules/@types/swagger-ui-express/index.d.ts","./swagger.json","../src/app.ts","../src/server.ts","../node_modules/@types/webidl-conversions/index.d.ts","../node_modules/@types/whatwg-url/index.d.ts"],"fileIdsList":[[56,98,158,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,265],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,186,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,209,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,141,185,186,188,190,205,206,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,203,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,191,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,203,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,192,193,194,195,196,197,198,201,202,203,204,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,187,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,189,190,192,201,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,188,189,190,192,193,194,195,196,197,198,201,202,204,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,200,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,115,130,185,187,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,185,199,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,226,227,228,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,223,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,176,179,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,172,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,180,181,182,220,221,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,168,176,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,180,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,178,181,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,170,178,183,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,183,210,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,183,184,211,219,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,183,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,182,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,177,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,158,213,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,148,150,151,152,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,153,155,157,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,113,114,118,124,141,148,154,212,213,214,215,216,217,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,104,110,111,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,100,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[51,52,53,56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,101,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,102,103,111,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,104,106,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,105,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,107,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,108,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,125,130,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,106,110,113,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,113,114,118,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[54,55,56,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,116,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,120,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,121,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,96,97,98,99,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,123,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,124,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,125,126,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,125,127,142,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,130,131,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,132,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,131,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,134,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,118,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,139,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,140,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,124,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,143,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,145,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,112,121,130,133,141,144,146,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,111,130,148,149,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,150,154,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,155,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,138,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,233,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,260],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,260],[56,98,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,260],[56,98,222,229,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,118,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,58,61,64,98,110,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,63,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,86,87,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,61,65,98,133,141,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,86,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,80,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,73,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,64,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,60,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,69,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,68,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,62,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,65,86,98,146,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,266,267,268],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262],[56,98,230,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262,264],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,263,265],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,269]],"fileInfos":[{"version":"df039a67536fe2acc3affdcbfb645892f842db36fe599e8e652e2f0c640a90d1","impliedFormat":1},{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a4ef5ccfd69b5bc2a2c29896aa07daaff7c5924a12e70cb3d9819145c06897db","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4a1c5b43d4d408cb0df0a6cc82ca7be314553d37e432fc1fd801bae1a9ab2cb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"c6ab0dd29bf74b71a54ff2bbce509eb8ae3c4294d57cc54940f443c01cd1baae","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"86ea91bfa7fef1eeb958056f30f1db4e0680bc9b5132e5e9d6e9cfd773c0c4fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7832b05a98f791dcd408cff8699e95fcab73bbfae26ba9a13af5ec4a60f485d","impliedFormat":1},{"version":"9a9e62acbe3cf36141e3d76efa0eaf33ed21b51a90bc1d39c9f880ff4e0bdf87","impliedFormat":1},{"version":"b2453c7a4fe9e3e77f3a75945caa0dabe76a28ebb6dbffc4aef21309e68f6aa5","impliedFormat":1},{"version":"db09d88a24d5f720614b68a66a866e32643fc92444c0e3fd252263b2606ea10a","impliedFormat":1},{"version":"74a0f20e0b110436f175d6e531ef48120c2adc9702e2ca58b31392d2099071cf","impliedFormat":1},{"version":"70f71f639d94715dcf0577fae64d8b5829e89bf8cda1170473e68b8fdeb44378","impliedFormat":1},{"version":"2aeb069895578bac240d9d7317732b6d0ceb1ee25102bcee4b57c4e39bad965f","impliedFormat":1},{"version":"f6aaa84bca2234a227471cc26972b4cc9422afaab8d7f2d6ef51b8bc636bf58b","impliedFormat":1},{"version":"34d56740fa13eebf2b689742daf0d1834205cb9610db1df58403f6abb9adf919","impliedFormat":1},{"version":"29c621fbfd32afa52882955cf8638014e1039113174676edacc6c5b9228205f6","impliedFormat":1},{"version":"f30edc69b36565d72e55c6ebabf021455226cbf700172309e943b3c0caf326e6","impliedFormat":1},{"version":"950cdd2282ca4b38a5c2eadb727b9e2cdd936fabf0b92e36e72362cac0fd6ec5","impliedFormat":1},{"version":"b374d291655bd46fe2fa5e327586c4069361e8f2608df93e8325def3d86edf0f","impliedFormat":1},{"version":"ce9e81a19499c853c33dd83bff81daebd2931bf61e2399d81d26506573ad5928","impliedFormat":1},{"version":"5a67d052a6e4ff50663c6d5e3d807f46f4d1693ff91f6a1c83d6a557afdf6a82","impliedFormat":1},{"version":"5cb4013b09b175e02ef6c97658def451c2ae7338366af048486e3a57f526e118","impliedFormat":1},{"version":"d87e41029923fb44228d4d396aaa481d3270e0b8cf9595fcd81f187695b72c04","impliedFormat":1},{"version":"2b1dc75f0b51f7363a3fca64f48e20bd09aaf6b21446a042be9111ecb5599641","impliedFormat":1},{"version":"38e4e4bed98e94d700ff89caa521840affb5e6225abc1f1f1d17fcde12ae8e58","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3e78c2d0093f1283766ea1cf413bdb568f6e3fba30ca6979ca9c467dbd77af8","impliedFormat":1},{"version":"e800ed99d20215a12965bf7502f1371e1b46846551466c0ecda7443bc3225c5a","impliedFormat":1},{"version":"98e5b74c90814ada4ebbc8c6150a23e3fd19989f90c8fccd0219e06119c0966b","impliedFormat":1},{"version":"d134613e3638d004eab97a48b925856dcf3314484cbfe3145b148d7acc993b34","impliedFormat":1},{"version":"7ed10b8a09889585e37a93cc3d4d193995518913779650b2fec0f9896d112340","impliedFormat":1},{"version":"42289160bd23270bd10e956093df608f8a91243e2b2cdbd629c79744340a86cd","impliedFormat":1},{"version":"1bdd7e96e94e3ecd6720bc3a57de1e13760003ca03a8c6ee81c9ae9d12400c93","impliedFormat":1},{"version":"e7d3856062ae83e9903cefa63eb6d2b66fc2d084719e4f4c91dff80e1a679ef6","impliedFormat":1},{"version":"32b4066cafeacbba5af922904b0353e9db488e9e34dfa6528c979733fcf18532","impliedFormat":1},{"version":"ac830864d40131ddd4e739c7011a6fa023b9aeb9229367afa85305962321f91f","impliedFormat":1},{"version":"ea7b76d925ebcbbac1f8fc807b711f095b7633d5a08089762d7323569c4077be","impliedFormat":1},{"version":"536ce6090e9826d91d9b73557f27954d3f9b98c1b1c8b8e004d933677f7b0079","impliedFormat":1},{"version":"24923854943027b359d554b2a122a6e5d9360645f7a6354ac0c0534781cee1a0","impliedFormat":1},{"version":"352b4dc64333e91f53a15980fcc0bed2e062303a76c6b9717ec314dfbe29e93a","impliedFormat":1},{"version":"09bbc977cabb5cd49235e60ff89b77289fe6fa42aa2c472a524c845dc5f4c6fc","impliedFormat":1},{"version":"406717fd8feb6645442dff23a4821d3b6431438e047bdb49b5d37d8d84e49885","impliedFormat":1},{"version":"739d28fd2f30200f9147061c2a8928522d161c55335245003fa2db027d44880c","impliedFormat":1},{"version":"5139d33aeb679963a5d6337232c551464ccaca4661dddf2567f6abbf24e9a140","impliedFormat":1},{"version":"1b4ea9bdde8fb36710a1cde149e647c2e4b63a47132b3d404e76aa1469f10250","impliedFormat":1},{"version":"6a9d3a15e3f0679a1552e5b0f7fae3361536d5eac476b29f3d0b65dd2c672621","impliedFormat":1},{"version":"524fa80c39ce5ea4097eff4b21835738099f26c6dbe51f537873a37488b7d65a","impliedFormat":1},{"version":"6da5df3051db43101fbc4b64ab0c22cff1bdcec8f0324f8e8a305018dc4acc5d","impliedFormat":1},{"version":"7b44a75ca0913e8af7775ee46a9138e5a801521a708c4574c75ffd1e722d5aa0","impliedFormat":1},{"version":"11842523b052ea1cb88c81cdca2922244122b1cad318adcce2e465d48e0a52f8","impliedFormat":1},{"version":"622593b400ce3032a71addf4204c41bac042721ab985de7e42d086558b13a337","impliedFormat":1},{"version":"d243e8eb5a04f2044d9379cf27d881e8ba4be6ba38c66d921c409b46f6d78927","impliedFormat":1},{"version":"22a8a4f9138f039c4c8316d555a1c3715e56f047ed635a578027c08e197ada2b","impliedFormat":1},{"version":"0a5504004bb9a28cee0cd9d04a9b475ca33cde579f5148266b2df3cafc95bafc","impliedFormat":1},{"version":"759b043215e42ea84b4dd5950d993ed124c05bad56bd58397a363e25d0ee62de","impliedFormat":1},{"version":"0e495d33df5bad752abb97f26cf261a6db6dd102dc1e689ba477cdb70e411935","impliedFormat":1},{"version":"d5c19655468e29f60c871b21e73af8ebc653f736e7123ade916f22c4a5f80ce5","impliedFormat":1},{"version":"34a413bafdeae24c5b5419609be63b85255c5d56a4e3185b016e2329a8f13ec4","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"2224f3072e3cc07906eeed5c71746779511fba2dd224addc5489bcdb489bdee5","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"c96e47b3fbf3912887565641f4810f585dea9550eb2a31d91b1543c94cb6aed7","impliedFormat":1},{"version":"a03e9f9bf9fc56c6785a8d5b5bb8a99669acb38dd885afcb4d58673c9c7c0286","impliedFormat":1},{"version":"2f1c0d14f39377282b5dbf908502f5e82141b075770a1f3cd673bca11607a846","impliedFormat":1},{"version":"4ae86b01844cfd5116902a40ad3dd7e7659ea449279e21d2917413a2cfb5077c","impliedFormat":1},{"version":"c302df1d6f371c6064cb5f4d0b41165425b682b287a3b8625527b2752eb433ee","impliedFormat":1},{"version":"09762428597d0079f6ac0785ec4a24471a43796c5517bfbd0606aa163d651660","impliedFormat":1},{"version":"dd2d20937dbd382340d7364a6153c5a71a04e222fa33a26d255dc668e21eb196","impliedFormat":1},{"version":"2a8d9c59c5e85f41cec149485aca6481deb5c32b580dd0ea08d499cc9bfc0b2f","impliedFormat":1},{"version":"1ceda047afdd4436db76576b2bfc72d047c08982ebb40c66aab8bcabf195b8e4","impliedFormat":1},{"version":"fdbd67a5466c4f0dd609b37ddfdfe8ffc3955188f7494922ac7e85f83d3cf11c","impliedFormat":1},{"version":"5e9892fdebf7c79987e0d4cb48941f796a35582f8810bb96c89a31e5d396df8b","impliedFormat":1},{"version":"fd550ecb67f4fa6cc8c8f08d84c072afda2645c001aed5825d0be8e767b8e571","impliedFormat":1},{"version":"359e7188a3ad226e902c43443a45f17bd53bf279596aece7761dc72ffa22b30d","impliedFormat":1},{"version":"d8d9529a7f6c742de51ba5eecaa47fdab38f123af1b5280a1a6956de553e5fe9","impliedFormat":1},{"version":"403c4f2906f58407d454a401daf0fa59cbd683824b444b3151075bc3a6714c48","impliedFormat":1},{"version":"0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","impliedFormat":1},{"version":"35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","impliedFormat":1},{"version":"c9604ed0199a5ae1e86f9c17a981d297141bc0b3c4f51d88322859294f77f3ce","impliedFormat":1},{"version":"13a4d931c625360ab1cbf68961b13a60969a17cf3247bd60e18a49fb498b68e5","impliedFormat":1},{"version":"80b2eb4a470b8c3ef6709da5c3f8cd827d3b92b1bc96ec0ae661cc6eb7b213da","impliedFormat":1},{"version":"fe677c6e53f1eddbcc00af336d3ffbada25e6e0aa05a0fb5f10c818b5b6b6aa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"89cbb41c032a8602412a55d89c9fbee8af199ffb3e89e52a0306d42518f491c3","impliedFormat":1},{"version":"3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","impliedFormat":1},{"version":"021fbcae20ddc7ca7bf04cdb02a8c51f0d96afdde6a8462fb73b09ab4136ff7a","impliedFormat":1},{"version":"d2ce9e0d3035ad20bc34eb6177cd4a6ced475367170d8e46860598fe49dd9b3e","impliedFormat":1},{"version":"8443bbb1e167b4cca6d192eab6f9ab94442054f9b1c945f05070c23896396365","impliedFormat":1},{"version":"4e402f9d1887c077981d4668089ee20192bbfa7450b8abb36af3efa100fc1298","impliedFormat":1},{"version":"bbe98bf29952b80a91789cc6a3a3727aa958e652f32b145740229fe4b02f2a0a","impliedFormat":1},{"version":"18e0fa134b9df012b043ee0fc9698d7b1666c7e7df7918bf465a79c89742fbfc","impliedFormat":1},{"version":"3016511eadb560b6874050f8ff2ca671c64a663a48c60a24e3e7ddef92c3b095","impliedFormat":1},{"version":"ab066772d4672b6cfa1196820df536fa225888dbc9bf9cf68ce1173bc03d433b","impliedFormat":1},{"version":"9ee85178017faacec870ca5b75c292d6d1d6d6f4e81d42c79c4cf73b63a303d8","impliedFormat":1},{"version":"788a2d9ffaccf9ce65d321472ff3daaf9ab864504fad41753b978bfbd5e9ea71","impliedFormat":1},{"version":"861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","impliedFormat":1},{"version":"8d35820323a2758d61684679eddc3f1d0cc051c55258b3243aee14b6b8e285c1","impliedFormat":1},{"version":"8c418189bb1daec5e7736b6301345487e6f8f3c8ba49ef538e330e6003a47c87","impliedFormat":1},{"version":"da440f879ec47f7113408fb75f239f437b9ee812fba67562c499f10ef012464a","impliedFormat":1},{"version":"e78e58cf1d0a34668fe7365a0eeef0d85c67d81f15aaf976d9d45999b0baa9d5","impliedFormat":1},{"version":"b8de1c91d357f855aee17e06083abbf345cae76454548d1d112b9bc0d4f35821","impliedFormat":1},{"version":"f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","impliedFormat":1},{"version":"448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702","impliedFormat":1},{"version":"969ce33d76b1de933ab58f84db2936508252babf91875d429a3ce6a9961ec41e","affectsGlobalScope":true,"impliedFormat":1},"baf4e753153aaa14d8eb1dbc5712e419668311763293415b3f6ebf49ca852b83","26a5a5d5419ad7247790eae73aea7b7dc3a5410883895c8c9db3a921f81196d7","dffa36929cbf03610979340afa502cf754184c07e05d1842f91df14777f7397b","fa25df004e129d3a39f47ec4b54b070bab1c4f41d5bddf9bf98b22a679f6baf0","12d99f65c65814a6daf750a453ea51abb6cb3679f4fdc91a4fd36071ea07d7ee","ac5005e5849afc670b2060f58bfc7c525cf6f664cc746d46ac0d0bf2ffc2beef",{"version":"85a55229c4d0f20d42c59cec768df0cb83a492f8bb1351ead8524a58f278a005","impliedFormat":1},"8feb46d9c170669728772717cee178305758cf63145d3d551f76ffd7efd14a39","d271d41f616162e1366947fc7a4445e3791475c6d3e847384c84af9447eab554","85175d11bc7d4022fccc100de65ca3bf50dbc5f504576fc2bec5750c3afb71ef",{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1}],"root":[[261,265],269,270],"options":{"alwaysStrict":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":2},"referencedMap":[[266,1],[268,2],[185,2],[191,3],[210,4],[209,5],[208,6],[207,7],[206,8],[190,9],[204,10],[192,11],[193,12],[194,13],[195,14],[205,15],[196,2],[197,16],[198,11],[202,17],[203,18],[201,19],[188,20],[199,2],[189,2],[186,2],[187,21],[200,22],[225,23],[229,24],[227,25],[226,25],[228,26],[224,27],[180,28],[160,2],[161,2],[168,2],[163,2],[169,2],[165,2],[162,2],[175,29],[166,2],[167,2],[164,2],[222,30],[170,31],[174,32],[173,2],[172,33],[177,34],[181,35],[182,36],[184,37],[211,38],[220,39],[219,40],[183,41],[178,42],[176,2],[221,2],[171,2],[212,43],[157,44],[156,43],[216,2],[214,45],[153,46],[158,47],[215,2],[154,2],[213,2],[217,48],[218,49],[149,2],[179,50],[95,51],[96,51],[97,52],[56,53],[98,54],[99,55],[100,56],[51,2],[54,57],[52,2],[53,2],[101,58],[102,59],[103,60],[104,61],[105,62],[106,63],[107,63],[109,2],[108,64],[110,65],[111,66],[112,67],[94,68],[55,2],[113,69],[114,70],[115,71],[148,72],[116,73],[117,74],[118,75],[119,76],[120,77],[121,78],[122,79],[123,80],[124,81],[125,82],[126,82],[127,83],[128,2],[129,2],[130,84],[132,85],[131,86],[133,87],[134,88],[135,89],[136,90],[137,91],[138,92],[139,93],[140,94],[141,95],[142,96],[143,97],[144,98],[145,99],[146,100],[147,101],[151,2],[152,2],[150,102],[155,103],[267,104],[271,2],[272,2],[231,2],[242,2],[232,105],[233,106],[259,107],[234,108],[235,109],[236,110],[237,111],[238,112],[239,113],[240,114],[241,115],[260,116],[244,117],[257,118],[256,2],[243,119],[245,120],[246,121],[247,122],[248,123],[249,124],[250,125],[251,126],[252,127],[253,128],[254,129],[255,130],[258,131],[159,2],[230,132],[49,2],[50,2],[9,2],[10,2],[14,2],[13,2],[3,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[4,2],[23,2],[24,2],[5,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[6,2],[33,2],[34,2],[35,2],[36,2],[7,2],[40,2],[37,2],[38,2],[39,2],[41,2],[8,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[2,2],[1,2],[12,2],[11,2],[223,2],[72,133],[82,134],[71,133],[92,135],[63,136],[62,137],[91,138],[85,139],[90,140],[65,141],[79,142],[64,143],[88,144],[60,145],[59,138],[89,146],[61,147],[66,148],[67,2],[70,148],[57,2],[93,149],[83,150],[74,151],[75,152],[77,153],[73,154],[76,155],[86,138],[68,156],[69,157],[78,158],[58,32],[81,150],[80,148],[84,2],[87,159],[269,160],[263,161],[261,2],[265,162],[264,163],[262,2],[270,164]],"version":"5.8.3"} \ No newline at end of file diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000000..849e00d23b --- /dev/null +++ b/nodemon.json @@ -0,0 +1,5 @@ +{ + "exec": "ts-node src/server.ts", + "watch": ["src"], + "ext": "ts" +} \ No newline at end of file diff --git a/package.json b/package.json index f5d0381b56..ee62f00ade 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,12 @@ }, "license": "ISC", "author": "", - "main": "app.ts", + "main": "build/src/server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "node --loader ts-node/esm app.ts", - "build": "tsc", - "start": "node dist/app.js" + "dev": "concurrently \"nodemon\" \"nodemon -x tsoa spec-and-routes\"", + "build": "tsoa spec-and-routes && tsc --outDir build --experimentalDecorators", + "start": "node build/src/server.js" }, "dependencies": { "@faker-js/faker": "^9.8.0", @@ -25,7 +25,6 @@ "express": "^5.1.0", "mongoose": "^8.15.1", "swagger-ui-express": "^5.0.1", - "tsconfig-paths": "^4.2.0", "tsoa": "^6.6.0", "zod": "^3.25.46" }, @@ -37,6 +36,8 @@ "@types/mongoose": "^5.11.96", "@types/node": "^22.15.29", "@types/swagger-ui-express": "^4.1.8", + "concurrently": "^9.1.2", + "nodemon": "^3.1.10", "ts-node": "^10.9.2", "typescript": "^5.8.3" } diff --git a/src/app.ts b/src/app.ts index c82c85b8d5..59d5115c96 100644 --- a/src/app.ts +++ b/src/app.ts @@ -8,8 +8,6 @@ export const app = express(); connect('mongodb://localhost/products'); -app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); - app.use( urlencoded({ extended: true, @@ -17,5 +15,7 @@ app.use( ); app.use(json()); +app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); + //Import API routes, mount all under /api RegisterRoutes(app); diff --git a/src/products/productHelpers.ts b/src/products/productHelpers.ts new file mode 100644 index 0000000000..d7b3cf6a7b --- /dev/null +++ b/src/products/productHelpers.ts @@ -0,0 +1,7 @@ +import { Document } from 'mongoose'; +import { ProductDto } from './productsTypes'; + +export const convertDocumentToProductDto = (document: Document): ProductDto => { + const dto = document.toObject(); + return { ...dto, _id: dto._id.toString() as ProductDto }; +}; diff --git a/src/products/productsController.ts b/src/products/productsController.ts index 1a4953aab7..3deb52ecc7 100644 --- a/src/products/productsController.ts +++ b/src/products/productsController.ts @@ -1,6 +1,6 @@ -import { Controller, Get, Queries, Route } from 'tsoa'; +import { Controller, Get, Path, Queries, Route } from 'tsoa'; import { ProductsService } from './productsService'; -import { ProductListResponse } from './productsTypes'; +import { ProductDto, ProductListResponse } from './productsTypes'; export interface QueryParams { page: string; @@ -15,4 +15,11 @@ export class ProductsController extends Controller { ): Promise { return new ProductsService().getAllProducts(queryParams); } + + @Get('{productId}') + public async getByProductId( + @Path() productId: string + ): Promise { + return new ProductsService().getByProductId(productId); + } } diff --git a/src/products/productsService.ts b/src/products/productsService.ts index abd1503200..f2f064a8e5 100644 --- a/src/products/productsService.ts +++ b/src/products/productsService.ts @@ -1,6 +1,7 @@ import { QueryParams } from './productsController'; import { Product } from './productModel'; -import { ProductListResponse } from './productsTypes'; +import { ProductDto, ProductListResponse } from './productsTypes'; +import { convertDocumentToProductDto } from './productHelpers'; export class ProductsService { public async getAllProducts({ @@ -19,7 +20,7 @@ export class ProductsService { const count = await Product.countDocuments(); const productsDto = products.map((product) => { - return { ...product.toObject(), _id: product._id.toString() }; + return convertDocumentToProductDto(product); }); return { @@ -31,4 +32,13 @@ export class ProductsService { throw new Error(); } } + + public async getByProductId(productId: string): Promise { + try { + const productsDto = await Product.find({ _id: productId }); + return convertDocumentToProductDto(productsDto[0]); + } catch (error) { + throw new Error(); + } + } } diff --git a/src/products/productsTypes.ts b/src/products/productsTypes.ts index 5d2c2d5205..6da4ea7c69 100644 --- a/src/products/productsTypes.ts +++ b/src/products/productsTypes.ts @@ -1,6 +1,6 @@ -import { ObjectId } from 'mongoose'; +import { Document, ObjectId } from 'mongoose'; -export interface ProductEntity { +export interface ProductEntity extends Document { _id: ObjectId | string; category: string; name: string; @@ -10,8 +10,14 @@ export interface ProductEntity { updatedAt: Date; } -export interface ProductDto extends Omit { +export interface ProductDto { _id: string; + category: string; + name: string; + price: number; + image: string; + createdAt: Date; + updatedAt: Date; } export interface ProductListResponse { diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000000..6eb5adbcec --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/typescript/lib/lib.es6.d.ts","./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/reflect-metadata/index.d.ts","./node_modules/@tsoa/runtime/dist/decorators/deprecated.d.ts","./node_modules/@tsoa/runtime/dist/decorators/example.d.ts","./node_modules/@tsoa/runtime/dist/decorators/parameter.d.ts","./node_modules/@tsoa/runtime/dist/decorators/methods.d.ts","./node_modules/@tsoa/runtime/dist/decorators/tags.d.ts","./node_modules/@tsoa/runtime/dist/decorators/operationid.d.ts","./node_modules/@tsoa/runtime/dist/decorators/route.d.ts","./node_modules/@tsoa/runtime/dist/decorators/security.d.ts","./node_modules/@tsoa/runtime/dist/decorators/extension.d.ts","./node_modules/@tsoa/runtime/dist/decorators/middlewares.d.ts","./node_modules/@tsoa/runtime/dist/interfaces/controller.d.ts","./node_modules/@tsoa/runtime/dist/utils/isheadertype.d.ts","./node_modules/@tsoa/runtime/dist/interfaces/response.d.ts","./node_modules/@tsoa/runtime/dist/interfaces/iocmodule.d.ts","./node_modules/@tsoa/runtime/dist/interfaces/file.d.ts","./node_modules/@tsoa/runtime/dist/decorators/response.d.ts","./node_modules/@tsoa/runtime/dist/swagger/swagger.d.ts","./node_modules/@tsoa/runtime/dist/metadatageneration/tsoa.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/tsoa-route.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/mime/index.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/multer/index.d.ts","./node_modules/@tsoa/runtime/dist/config.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/additionalprops.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/templatehelpers.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/templates/templateservice.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/templates/express/expresstemplateservice.d.ts","./node_modules/@hapi/boom/lib/index.d.ts","./node_modules/@hapi/podium/lib/index.d.ts","./node_modules/@hapi/shot/lib/index.d.ts","./node_modules/@hapi/hapi/lib/types/utils.d.ts","./node_modules/@hapi/mimos/lib/index.d.ts","./node_modules/@hapi/hapi/lib/types/route.d.ts","./node_modules/@hapi/catbox/lib/index.d.ts","./node_modules/@hapi/hapi/lib/types/server/cache.d.ts","./node_modules/@hapi/hapi/lib/types/server/encoders.d.ts","./node_modules/@hapi/hapi/lib/types/server/events.d.ts","./node_modules/@hapi/hapi/lib/types/server/ext.d.ts","./node_modules/@hapi/hapi/lib/types/server/info.d.ts","./node_modules/@hapi/hapi/lib/types/server/inject.d.ts","./node_modules/@hapi/hapi/lib/types/server/methods.d.ts","./node_modules/@hapi/iron/lib/index.d.ts","./node_modules/@hapi/statehood/lib/index.d.ts","./node_modules/@hapi/hapi/lib/types/server/state.d.ts","./node_modules/@hapi/hapi/lib/types/server/options.d.ts","./node_modules/@hapi/hapi/lib/types/server/server.d.ts","./node_modules/@hapi/hapi/lib/types/server/auth.d.ts","./node_modules/@hapi/hapi/lib/types/server/index.d.ts","./node_modules/@hapi/hapi/lib/types/response.d.ts","./node_modules/@hapi/hapi/lib/types/request.d.ts","./node_modules/@hapi/hapi/lib/types/plugin.d.ts","./node_modules/@hapi/hapi/lib/types/index.d.ts","./node_modules/@hapi/hapi/lib/index.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/templates/hapi/hapitemplateservice.d.ts","./node_modules/@types/accepts/index.d.ts","./node_modules/@types/keygrip/index.d.ts","./node_modules/@types/cookies/index.d.ts","./node_modules/@types/http-assert/index.d.ts","./node_modules/@types/content-disposition/index.d.ts","./node_modules/@types/koa-compose/index.d.ts","./node_modules/@types/koa/index.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/templates/koa/koatemplateservice.d.ts","./node_modules/@tsoa/runtime/dist/routegeneration/templates/index.d.ts","./node_modules/@tsoa/runtime/dist/utils/assertnever.d.ts","./node_modules/@tsoa/runtime/dist/index.d.ts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/@tsoa/cli/dist/routegeneration/routegenerator.d.ts","./node_modules/@tsoa/cli/dist/cli.d.ts","./node_modules/@tsoa/cli/dist/module/generate-spec.d.ts","./node_modules/@tsoa/cli/dist/module/generate-routes.d.ts","./node_modules/@tsoa/cli/dist/routegeneration/defaultroutegenerator.d.ts","./node_modules/@tsoa/cli/dist/index.d.ts","./node_modules/tsoa/dist/index.d.ts","./node_modules/bson/bson.d.ts","./node_modules/mongodb/mongodb.d.ts","./node_modules/mongoose/types/aggregate.d.ts","./node_modules/mongoose/types/callback.d.ts","./node_modules/mongoose/types/collection.d.ts","./node_modules/mongoose/types/connection.d.ts","./node_modules/mongoose/types/cursor.d.ts","./node_modules/mongoose/types/document.d.ts","./node_modules/mongoose/types/error.d.ts","./node_modules/mongoose/types/expressions.d.ts","./node_modules/mongoose/types/helpers.d.ts","./node_modules/kareem/index.d.ts","./node_modules/mongoose/types/middlewares.d.ts","./node_modules/mongoose/types/indexes.d.ts","./node_modules/mongoose/types/models.d.ts","./node_modules/mongoose/types/mongooseoptions.d.ts","./node_modules/mongoose/types/pipelinestage.d.ts","./node_modules/mongoose/types/populate.d.ts","./node_modules/mongoose/types/query.d.ts","./node_modules/mongoose/types/schemaoptions.d.ts","./node_modules/mongoose/types/schematypes.d.ts","./node_modules/mongoose/types/session.d.ts","./node_modules/mongoose/types/types.d.ts","./node_modules/mongoose/types/utility.d.ts","./node_modules/mongoose/types/validation.d.ts","./node_modules/mongoose/types/inferschematype.d.ts","./node_modules/mongoose/types/inferrawdoctype.d.ts","./node_modules/mongoose/types/virtuals.d.ts","./node_modules/mongoose/types/augmentations.d.ts","./node_modules/mongoose/types/index.d.ts","./src/products/productmodel.ts","./src/products/productstypes.ts","./src/products/producthelpers.ts","./src/products/productsservice.ts","./src/products/productscontroller.ts","./build/routes.ts","./node_modules/@types/swagger-ui-express/index.d.ts","./build/swagger.json","./src/app.ts","./src/server.ts","./node_modules/@types/webidl-conversions/index.d.ts","./node_modules/@types/whatwg-url/index.d.ts"],"fileIdsList":[[76,118,178,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,265],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,168,186,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,209,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,188,190,205,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,188,190,205,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,150,161,185,186,188,190,205,206,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,186,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,188,190,203,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,191,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,167,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,186,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,188,203,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,192,193,194,195,196,197,198,201,202,203,204,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,187,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,135,189,190,192,201,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,150,188,189,190,192,193,194,195,196,197,198,201,202,204,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,200,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,135,150,185,187,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,133,150,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,185,199,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,222,224,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,222,224,225,226,227,228,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,222,223,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,222,224,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,222,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[68,76,118,179,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[63,64,76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[51,52,53,54,55,56,57,58,59,60,61,62,64,65,66,67,68,69,70,76,118,180,181,182,220,221,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[63,76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[60,68,76,118,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,180,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[70,76,118,181,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[62,70,76,118,178,183,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[62,70,76,118,181,183,210,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,183,184,211,219,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[62,70,76,118,183,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[62,70,76,118,181,182,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[69,76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,168,176,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,168,176,178,213,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,133,168,170,171,172,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,173,175,177,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,117,118,130,133,134,138,144,161,168,174,212,213,214,215,216,217,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,178,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,115,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,117,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,123,153,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,119,124,130,131,138,150,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,119,120,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[71,72,73,76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,121,162,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,122,123,131,139,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,123,150,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,124,126,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,117,118,125,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,126,127,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,128,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,117,118,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,131,132,150,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,131,132,145,150,153,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,113,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,113,118,126,130,133,138,150,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,131,133,134,138,150,158,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,135,150,158,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[74,75,76,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,136,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,137,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,126,130,138,150,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,139,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,140,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,117,118,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,115,116,117,118,119,120,121,122,123,124,125,126,127,128,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,143,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,145,146,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,145,147,162,164,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,150,151,153,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,152,153,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,151,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,153,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,154,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,115,118,150,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,156,157,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,156,157,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,123,138,150,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,159,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,138,160,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,144,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,123,162,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,163,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,137,164,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,165,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,132,141,150,153,161,164,166,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,167,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,131,150,168,169,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,133,168,170,174,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,175,178,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,126,130,138,150,158,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[76,118,232,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[76,118,233,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,232,233,234,235,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,233,234,235,236,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,235,236,237,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,235,236,237,238,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,233,234,235,236,237,238,239,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,130,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[76,118,232,233,234,235,236,237,238,239,240,241,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,260],[76,118,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,235,236,237,238,239,240,241,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,150,233,234,235,236,237,238,239,240,241,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,260],[76,118,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,260],[76,118,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260],[76,118,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,260],[76,118,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,260],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,260],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,260],[76,118,222,229,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,89,118,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,118,150,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,80,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,82,85,118,158,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,138,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,80,118,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,82,85,118,138,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,77,78,81,84,118,130,150,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,92,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,77,83,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,106,107,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,81,85,118,153,161,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,106,118,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,79,80,118,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,79,80,81,82,83,84,85,86,87,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,107,108,109,110,111,112,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,100,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,92,93,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,83,85,93,94,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,84,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,77,80,85,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,85,89,93,94,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,89,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,83,85,88,118,161,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,77,82,85,92,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,80,85,106,118,166,168,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[76,118,178,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,266,267,268],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262],[76,118,230,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262,264],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,263,265],[76,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,269]],"fileInfos":[{"version":"df039a67536fe2acc3affdcbfb645892f842db36fe599e8e652e2f0c640a90d1","impliedFormat":1},{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7832b05a98f791dcd408cff8699e95fcab73bbfae26ba9a13af5ec4a60f485d","impliedFormat":1},{"version":"9a9e62acbe3cf36141e3d76efa0eaf33ed21b51a90bc1d39c9f880ff4e0bdf87","impliedFormat":1},{"version":"b2453c7a4fe9e3e77f3a75945caa0dabe76a28ebb6dbffc4aef21309e68f6aa5","impliedFormat":1},{"version":"db09d88a24d5f720614b68a66a866e32643fc92444c0e3fd252263b2606ea10a","impliedFormat":1},{"version":"74a0f20e0b110436f175d6e531ef48120c2adc9702e2ca58b31392d2099071cf","impliedFormat":1},{"version":"70f71f639d94715dcf0577fae64d8b5829e89bf8cda1170473e68b8fdeb44378","impliedFormat":1},{"version":"2aeb069895578bac240d9d7317732b6d0ceb1ee25102bcee4b57c4e39bad965f","impliedFormat":1},{"version":"f6aaa84bca2234a227471cc26972b4cc9422afaab8d7f2d6ef51b8bc636bf58b","impliedFormat":1},{"version":"34d56740fa13eebf2b689742daf0d1834205cb9610db1df58403f6abb9adf919","impliedFormat":1},{"version":"29c621fbfd32afa52882955cf8638014e1039113174676edacc6c5b9228205f6","impliedFormat":1},{"version":"f30edc69b36565d72e55c6ebabf021455226cbf700172309e943b3c0caf326e6","impliedFormat":1},{"version":"950cdd2282ca4b38a5c2eadb727b9e2cdd936fabf0b92e36e72362cac0fd6ec5","impliedFormat":1},{"version":"b374d291655bd46fe2fa5e327586c4069361e8f2608df93e8325def3d86edf0f","impliedFormat":1},{"version":"ce9e81a19499c853c33dd83bff81daebd2931bf61e2399d81d26506573ad5928","impliedFormat":1},{"version":"5a67d052a6e4ff50663c6d5e3d807f46f4d1693ff91f6a1c83d6a557afdf6a82","impliedFormat":1},{"version":"5cb4013b09b175e02ef6c97658def451c2ae7338366af048486e3a57f526e118","impliedFormat":1},{"version":"d87e41029923fb44228d4d396aaa481d3270e0b8cf9595fcd81f187695b72c04","impliedFormat":1},{"version":"2b1dc75f0b51f7363a3fca64f48e20bd09aaf6b21446a042be9111ecb5599641","impliedFormat":1},{"version":"38e4e4bed98e94d700ff89caa521840affb5e6225abc1f1f1d17fcde12ae8e58","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a4ef5ccfd69b5bc2a2c29896aa07daaff7c5924a12e70cb3d9819145c06897db","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4a1c5b43d4d408cb0df0a6cc82ca7be314553d37e432fc1fd801bae1a9ab2cb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"c6ab0dd29bf74b71a54ff2bbce509eb8ae3c4294d57cc54940f443c01cd1baae","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"86ea91bfa7fef1eeb958056f30f1db4e0680bc9b5132e5e9d6e9cfd773c0c4fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3e78c2d0093f1283766ea1cf413bdb568f6e3fba30ca6979ca9c467dbd77af8","impliedFormat":1},{"version":"e800ed99d20215a12965bf7502f1371e1b46846551466c0ecda7443bc3225c5a","impliedFormat":1},{"version":"98e5b74c90814ada4ebbc8c6150a23e3fd19989f90c8fccd0219e06119c0966b","impliedFormat":1},{"version":"d134613e3638d004eab97a48b925856dcf3314484cbfe3145b148d7acc993b34","impliedFormat":1},{"version":"7ed10b8a09889585e37a93cc3d4d193995518913779650b2fec0f9896d112340","impliedFormat":1},{"version":"42289160bd23270bd10e956093df608f8a91243e2b2cdbd629c79744340a86cd","impliedFormat":1},{"version":"1bdd7e96e94e3ecd6720bc3a57de1e13760003ca03a8c6ee81c9ae9d12400c93","impliedFormat":1},{"version":"e7d3856062ae83e9903cefa63eb6d2b66fc2d084719e4f4c91dff80e1a679ef6","impliedFormat":1},{"version":"32b4066cafeacbba5af922904b0353e9db488e9e34dfa6528c979733fcf18532","impliedFormat":1},{"version":"ac830864d40131ddd4e739c7011a6fa023b9aeb9229367afa85305962321f91f","impliedFormat":1},{"version":"ea7b76d925ebcbbac1f8fc807b711f095b7633d5a08089762d7323569c4077be","impliedFormat":1},{"version":"536ce6090e9826d91d9b73557f27954d3f9b98c1b1c8b8e004d933677f7b0079","impliedFormat":1},{"version":"24923854943027b359d554b2a122a6e5d9360645f7a6354ac0c0534781cee1a0","impliedFormat":1},{"version":"352b4dc64333e91f53a15980fcc0bed2e062303a76c6b9717ec314dfbe29e93a","impliedFormat":1},{"version":"09bbc977cabb5cd49235e60ff89b77289fe6fa42aa2c472a524c845dc5f4c6fc","impliedFormat":1},{"version":"406717fd8feb6645442dff23a4821d3b6431438e047bdb49b5d37d8d84e49885","impliedFormat":1},{"version":"739d28fd2f30200f9147061c2a8928522d161c55335245003fa2db027d44880c","impliedFormat":1},{"version":"5139d33aeb679963a5d6337232c551464ccaca4661dddf2567f6abbf24e9a140","impliedFormat":1},{"version":"1b4ea9bdde8fb36710a1cde149e647c2e4b63a47132b3d404e76aa1469f10250","impliedFormat":1},{"version":"6a9d3a15e3f0679a1552e5b0f7fae3361536d5eac476b29f3d0b65dd2c672621","impliedFormat":1},{"version":"524fa80c39ce5ea4097eff4b21835738099f26c6dbe51f537873a37488b7d65a","impliedFormat":1},{"version":"6da5df3051db43101fbc4b64ab0c22cff1bdcec8f0324f8e8a305018dc4acc5d","impliedFormat":1},{"version":"7b44a75ca0913e8af7775ee46a9138e5a801521a708c4574c75ffd1e722d5aa0","impliedFormat":1},{"version":"11842523b052ea1cb88c81cdca2922244122b1cad318adcce2e465d48e0a52f8","impliedFormat":1},{"version":"622593b400ce3032a71addf4204c41bac042721ab985de7e42d086558b13a337","impliedFormat":1},{"version":"d243e8eb5a04f2044d9379cf27d881e8ba4be6ba38c66d921c409b46f6d78927","impliedFormat":1},{"version":"22a8a4f9138f039c4c8316d555a1c3715e56f047ed635a578027c08e197ada2b","impliedFormat":1},{"version":"0a5504004bb9a28cee0cd9d04a9b475ca33cde579f5148266b2df3cafc95bafc","impliedFormat":1},{"version":"759b043215e42ea84b4dd5950d993ed124c05bad56bd58397a363e25d0ee62de","impliedFormat":1},{"version":"0e495d33df5bad752abb97f26cf261a6db6dd102dc1e689ba477cdb70e411935","impliedFormat":1},{"version":"d5c19655468e29f60c871b21e73af8ebc653f736e7123ade916f22c4a5f80ce5","impliedFormat":1},{"version":"34a413bafdeae24c5b5419609be63b85255c5d56a4e3185b016e2329a8f13ec4","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"2224f3072e3cc07906eeed5c71746779511fba2dd224addc5489bcdb489bdee5","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"c96e47b3fbf3912887565641f4810f585dea9550eb2a31d91b1543c94cb6aed7","impliedFormat":1},{"version":"a03e9f9bf9fc56c6785a8d5b5bb8a99669acb38dd885afcb4d58673c9c7c0286","impliedFormat":1},{"version":"2f1c0d14f39377282b5dbf908502f5e82141b075770a1f3cd673bca11607a846","impliedFormat":1},{"version":"4ae86b01844cfd5116902a40ad3dd7e7659ea449279e21d2917413a2cfb5077c","impliedFormat":1},{"version":"c302df1d6f371c6064cb5f4d0b41165425b682b287a3b8625527b2752eb433ee","impliedFormat":1},{"version":"09762428597d0079f6ac0785ec4a24471a43796c5517bfbd0606aa163d651660","impliedFormat":1},{"version":"dd2d20937dbd382340d7364a6153c5a71a04e222fa33a26d255dc668e21eb196","impliedFormat":1},{"version":"2a8d9c59c5e85f41cec149485aca6481deb5c32b580dd0ea08d499cc9bfc0b2f","impliedFormat":1},{"version":"1ceda047afdd4436db76576b2bfc72d047c08982ebb40c66aab8bcabf195b8e4","impliedFormat":1},{"version":"fdbd67a5466c4f0dd609b37ddfdfe8ffc3955188f7494922ac7e85f83d3cf11c","impliedFormat":1},{"version":"5e9892fdebf7c79987e0d4cb48941f796a35582f8810bb96c89a31e5d396df8b","impliedFormat":1},{"version":"fd550ecb67f4fa6cc8c8f08d84c072afda2645c001aed5825d0be8e767b8e571","impliedFormat":1},{"version":"359e7188a3ad226e902c43443a45f17bd53bf279596aece7761dc72ffa22b30d","impliedFormat":1},{"version":"d8d9529a7f6c742de51ba5eecaa47fdab38f123af1b5280a1a6956de553e5fe9","impliedFormat":1},{"version":"403c4f2906f58407d454a401daf0fa59cbd683824b444b3151075bc3a6714c48","impliedFormat":1},{"version":"0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","impliedFormat":1},{"version":"35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","impliedFormat":1},{"version":"c9604ed0199a5ae1e86f9c17a981d297141bc0b3c4f51d88322859294f77f3ce","impliedFormat":1},{"version":"13a4d931c625360ab1cbf68961b13a60969a17cf3247bd60e18a49fb498b68e5","impliedFormat":1},{"version":"80b2eb4a470b8c3ef6709da5c3f8cd827d3b92b1bc96ec0ae661cc6eb7b213da","impliedFormat":1},{"version":"fe677c6e53f1eddbcc00af336d3ffbada25e6e0aa05a0fb5f10c818b5b6b6aa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"89cbb41c032a8602412a55d89c9fbee8af199ffb3e89e52a0306d42518f491c3","impliedFormat":1},{"version":"3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","impliedFormat":1},{"version":"021fbcae20ddc7ca7bf04cdb02a8c51f0d96afdde6a8462fb73b09ab4136ff7a","impliedFormat":1},{"version":"d2ce9e0d3035ad20bc34eb6177cd4a6ced475367170d8e46860598fe49dd9b3e","impliedFormat":1},{"version":"8443bbb1e167b4cca6d192eab6f9ab94442054f9b1c945f05070c23896396365","impliedFormat":1},{"version":"4e402f9d1887c077981d4668089ee20192bbfa7450b8abb36af3efa100fc1298","impliedFormat":1},{"version":"bbe98bf29952b80a91789cc6a3a3727aa958e652f32b145740229fe4b02f2a0a","impliedFormat":1},{"version":"18e0fa134b9df012b043ee0fc9698d7b1666c7e7df7918bf465a79c89742fbfc","impliedFormat":1},{"version":"3016511eadb560b6874050f8ff2ca671c64a663a48c60a24e3e7ddef92c3b095","impliedFormat":1},{"version":"ab066772d4672b6cfa1196820df536fa225888dbc9bf9cf68ce1173bc03d433b","impliedFormat":1},{"version":"9ee85178017faacec870ca5b75c292d6d1d6d6f4e81d42c79c4cf73b63a303d8","impliedFormat":1},{"version":"788a2d9ffaccf9ce65d321472ff3daaf9ab864504fad41753b978bfbd5e9ea71","impliedFormat":1},{"version":"861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","impliedFormat":1},{"version":"8d35820323a2758d61684679eddc3f1d0cc051c55258b3243aee14b6b8e285c1","impliedFormat":1},{"version":"8c418189bb1daec5e7736b6301345487e6f8f3c8ba49ef538e330e6003a47c87","impliedFormat":1},{"version":"da440f879ec47f7113408fb75f239f437b9ee812fba67562c499f10ef012464a","impliedFormat":1},{"version":"e78e58cf1d0a34668fe7365a0eeef0d85c67d81f15aaf976d9d45999b0baa9d5","impliedFormat":1},{"version":"b8de1c91d357f855aee17e06083abbf345cae76454548d1d112b9bc0d4f35821","impliedFormat":1},{"version":"f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","impliedFormat":1},{"version":"448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702","impliedFormat":1},{"version":"969ce33d76b1de933ab58f84db2936508252babf91875d429a3ce6a9961ec41e","affectsGlobalScope":true,"impliedFormat":1},"baf4e753153aaa14d8eb1dbc5712e419668311763293415b3f6ebf49ca852b83","26a5a5d5419ad7247790eae73aea7b7dc3a5410883895c8c9db3a921f81196d7","dffa36929cbf03610979340afa502cf754184c07e05d1842f91df14777f7397b","fa25df004e129d3a39f47ec4b54b070bab1c4f41d5bddf9bf98b22a679f6baf0","12d99f65c65814a6daf750a453ea51abb6cb3679f4fdc91a4fd36071ea07d7ee","ac5005e5849afc670b2060f58bfc7c525cf6f664cc746d46ac0d0bf2ffc2beef",{"version":"85a55229c4d0f20d42c59cec768df0cb83a492f8bb1351ead8524a58f278a005","impliedFormat":1},"8feb46d9c170669728772717cee178305758cf63145d3d551f76ffd7efd14a39","d271d41f616162e1366947fc7a4445e3791475c6d3e847384c84af9447eab554","85175d11bc7d4022fccc100de65ca3bf50dbc5f504576fc2bec5750c3afb71ef",{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1}],"root":[[261,266],269,270],"options":{"alwaysStrict":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":2},"referencedMap":[[266,1],[268,2],[185,2],[191,3],[210,4],[209,5],[208,6],[207,7],[206,8],[190,9],[204,10],[192,11],[193,12],[194,13],[195,14],[205,15],[196,2],[197,16],[198,11],[202,17],[203,18],[201,19],[188,20],[199,2],[189,2],[186,2],[187,21],[200,22],[225,23],[229,24],[227,25],[226,25],[228,26],[224,27],[180,28],[52,2],[53,2],[60,2],[55,2],[61,2],[57,2],[54,2],[67,29],[58,2],[59,2],[56,2],[222,30],[62,31],[66,32],[65,2],[64,33],[69,34],[181,35],[182,36],[184,37],[211,38],[220,39],[219,40],[183,41],[70,42],[68,2],[221,2],[63,2],[212,43],[177,44],[176,43],[216,2],[214,45],[173,46],[178,47],[215,2],[174,2],[213,2],[217,48],[218,49],[169,2],[179,50],[115,51],[116,51],[117,52],[76,53],[118,54],[119,55],[120,56],[71,2],[74,57],[72,2],[73,2],[121,58],[122,59],[123,60],[124,61],[125,62],[126,63],[127,63],[129,2],[128,64],[130,65],[131,66],[132,67],[114,68],[75,2],[133,69],[134,70],[135,71],[168,72],[136,73],[137,74],[138,75],[139,76],[140,77],[141,78],[142,79],[143,80],[144,81],[145,82],[146,82],[147,83],[148,2],[149,2],[150,84],[152,85],[151,86],[153,87],[154,88],[155,89],[156,90],[157,91],[158,92],[159,93],[160,94],[161,95],[162,96],[163,97],[164,98],[165,99],[166,100],[167,101],[171,2],[172,2],[170,102],[175,103],[267,104],[271,2],[272,2],[231,2],[242,2],[232,105],[233,106],[259,107],[234,108],[235,109],[236,110],[237,111],[238,112],[239,113],[240,114],[241,115],[260,116],[244,117],[257,118],[256,2],[243,119],[245,120],[246,121],[247,122],[248,123],[249,124],[250,125],[251,126],[252,127],[253,128],[254,129],[255,130],[258,131],[51,2],[230,132],[49,2],[50,2],[9,2],[10,2],[14,2],[13,2],[3,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[4,2],[23,2],[24,2],[5,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[6,2],[33,2],[34,2],[35,2],[36,2],[7,2],[40,2],[37,2],[38,2],[39,2],[41,2],[8,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[2,2],[1,2],[12,2],[11,2],[223,2],[92,133],[102,134],[91,133],[112,135],[83,136],[82,137],[111,138],[105,139],[110,140],[85,141],[99,142],[84,143],[108,144],[80,145],[79,138],[109,146],[81,147],[86,148],[87,2],[90,148],[77,2],[113,149],[103,150],[94,151],[95,152],[97,153],[93,154],[96,155],[106,138],[88,156],[89,157],[98,158],[78,32],[101,150],[100,148],[104,2],[107,159],[269,160],[263,161],[261,2],[265,162],[264,163],[262,2],[270,164]],"version":"5.8.3"} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ddcf9650f8..5a2f4aca0e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,6 +507,14 @@ "@types/node" "*" "@types/send" "*" +"@types/swagger-ui-express@^4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz#3c0e0bf2543c7efb500eaa081bfde6d92f88096c" + integrity sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g== + dependencies: + "@types/express" "*" + "@types/serve-static" "*" + "@types/webidl-conversions@*": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" @@ -557,7 +565,7 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== -ansi-styles@^4.0.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -569,6 +577,14 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -584,6 +600,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + body-parser@1.20.3: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -617,6 +638,14 @@ body-parser@^2.2.0: raw-body "^3.0.0" type-is "^2.0.0" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" @@ -624,6 +653,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + bson@^6.10.3: version "6.10.3" resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.3.tgz#5f9a463af6b83e264bedd08b236d1356a30eda47" @@ -650,6 +686,29 @@ call-bound@^1.0.2: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.2: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + 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" + optionalDependencies: + fsevents "~2.3.2" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -671,6 +730,24 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concurrently@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.1.2.tgz#22d9109296961eaee773e12bfb1ce9a66bc9836c" + integrity sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ== + dependencies: + chalk "^4.1.2" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -731,7 +808,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.x, debug@^4.3.5, debug@^4.4.0: +debug@4.x, debug@^4, debug@^4.3.5, debug@^4.4.0: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== @@ -894,6 +971,13 @@ express@^5.1.0: type-is "^2.0.1" vary "^1.1.2" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" @@ -951,6 +1035,11 @@ fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" @@ -985,6 +1074,13 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^10.3.10: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" @@ -1019,6 +1115,16 @@ handlebars@^4.7.8: optionalDependencies: uglify-js "^3.1.4" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" @@ -1056,6 +1162,11 @@ iconv-lite@0.6.3, iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + inherits@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" @@ -1066,11 +1177,35 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-promise@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" @@ -1095,11 +1230,6 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -1114,6 +1244,11 @@ kareem@2.6.3: resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" @@ -1195,6 +1330,13 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^9.0.1, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -1202,7 +1344,7 @@ minimatch@^9.0.1, minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.5: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -1279,6 +1421,27 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +nodemon@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.10.tgz#5015c5eb4fffcb24d98cf9454df14f4fecec9bc1" + integrity sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw== + 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" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + object-inspect@^1.13.3: version "1.13.4" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" @@ -1331,6 +1494,11 @@ path-to-regexp@^8.0.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -1339,6 +1507,11 @@ proxy-addr@^2.0.7, proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -1383,6 +1556,13 @@ raw-body@^3.0.0: iconv-lite "0.6.3" unpipe "1.0.0" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + reflect-metadata@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" @@ -1404,6 +1584,13 @@ router@^2.2.0: parseurl "^1.3.3" path-to-regexp "^8.0.0" +rxjs@^7.8.1: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -1414,6 +1601,11 @@ safe-buffer@5.2.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +semver@^7.5.3: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -1487,6 +1679,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" + integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== + side-channel-list@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" @@ -1537,6 +1734,13 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -1602,10 +1806,26 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" swagger-ui-dist@>=5.0.0: version "5.22.0" @@ -1621,11 +1841,23 @@ swagger-ui-express@^5.0.1: dependencies: swagger-ui-dist ">=5.0.0" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +touch@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== + tr46@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" @@ -1633,6 +1865,11 @@ tr46@^5.1.0: dependencies: punycode "^2.3.1" +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + ts-deepmerge@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/ts-deepmerge/-/ts-deepmerge-7.0.3.tgz#e7053ddb45be093b71d7f9a5a05935ae119f1d31" @@ -1657,14 +1894,10 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsconfig-paths@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" +tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsoa@^6.6.0: version "6.6.0" @@ -1701,6 +1934,11 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + undici-types@~6.21.0: version "6.21.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" @@ -1808,7 +2046,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.7.1: +yargs@^17.7.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 373fd4de48f372b3ed19a7ef4d6c5a5011a25d96 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Mon, 2 Jun 2025 16:08:49 -0400 Subject: [PATCH 05/27] feat(tsoa-swagger): Add generate service and controller to add reviews. Add review helpers, model and types. Start to add get reviews for product route and service. --- build/routes.ts | 179 ++++++++++++++- build/swagger.json | 215 +++++++++++++++++- src/generate/generateController.ts | 10 + src/generate/generateHelpers.ts | 17 ++ src/generate/generateService.ts | 23 ++ src/products/productHelpers.ts | 4 +- src/products/productModel.ts | 2 +- .../{productsTypes.ts => productTypes.ts} | 24 +- src/products/productsController.ts | 90 +++++++- src/products/productsService.ts | 82 ++++++- src/reviews/reviewHelpers.ts | 11 + src/reviews/reviewModel.ts | 14 ++ src/reviews/reviewTypes.ts | 24 ++ 13 files changed, 652 insertions(+), 43 deletions(-) create mode 100644 src/generate/generateController.ts create mode 100644 src/generate/generateHelpers.ts create mode 100644 src/generate/generateService.ts rename src/products/{productsTypes.ts => productTypes.ts} (67%) create mode 100644 src/reviews/reviewHelpers.ts create mode 100644 src/reviews/reviewModel.ts create mode 100644 src/reviews/reviewTypes.ts diff --git a/build/routes.ts b/build/routes.ts index 220cec771d..066d1e1788 100644 --- a/build/routes.ts +++ b/build/routes.ts @@ -5,6 +5,8 @@ import type { TsoaRoute } from '@tsoa/runtime'; import { fetchMiddlewares, ExpressTemplateService } from '@tsoa/runtime'; // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa import { ProductsController } from './../src/products/productsController'; +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +import { GenerateController } from './../src/generate/generateController'; import type { Request as ExRequest, Response as ExResponse, RequestHandler, Router } from 'express'; @@ -46,7 +48,50 @@ const models: TsoaRoute.Models = { "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "QueryParams": { + "ProductQueryParams": { + "dataType": "refObject", + "properties": { + "page": {"dataType":"string","required":true}, + "limit": {"dataType":"string","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductCreationParams": { + "dataType": "refObject", + "properties": { + "name": {"dataType":"string","required":true}, + "category": {"dataType":"string","required":true}, + "price": {"dataType":"double","required":true}, + "image": {"dataType":"string","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ReviewDto": { + "dataType": "refObject", + "properties": { + "_id": {"dataType":"string","required":true}, + "text": {"dataType":"string","required":true}, + "rating": {"dataType":"double","required":true}, + "productId": {"dataType":"string","required":true}, + "createdAt": {"dataType":"datetime","required":true}, + "updatedAt": {"dataType":"datetime","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ReviewListResponse": { + "dataType": "refObject", + "properties": { + "reviews": {"dataType":"array","array":{"dataType":"refObject","ref":"ReviewDto"},"required":true}, + "totalPages": {"dataType":"double","required":true}, + "currentPage": {"dataType":"double","required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ReviewQueryParams": { "dataType": "refObject", "properties": { "page": {"dataType":"string","required":true}, @@ -73,7 +118,7 @@ export function RegisterRoutes(app: Router) { const argsProductsController_getAllProducts: Record = { - queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"QueryParams"}, + queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"ProductQueryParams"}, }; app.get('/products', ...(fetchMiddlewares(ProductsController)), @@ -102,25 +147,145 @@ export function RegisterRoutes(app: Router) { } }); // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - const argsProductsController_getByProductId: Record = { + const argsProductsController_getProductById: Record = { productId: {"in":"path","name":"productId","required":true,"dataType":"string"}, }; app.get('/products/:productId', ...(fetchMiddlewares(ProductsController)), - ...(fetchMiddlewares(ProductsController.prototype.getByProductId)), + ...(fetchMiddlewares(ProductsController.prototype.getProductById)), + + async function ProductsController_getProductById(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getProductById, request, response }); + + const controller = new ProductsController(); + + await templateService.apiHandler({ + methodName: 'getProductById', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_postProduct: Record = { + requestBody: {"in":"body","name":"requestBody","required":true,"ref":"ProductCreationParams"}, + }; + app.post('/products', + ...(fetchMiddlewares(ProductsController)), + ...(fetchMiddlewares(ProductsController.prototype.postProduct)), + + async function ProductsController_postProduct(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_postProduct, request, response }); + + const controller = new ProductsController(); + + await templateService.apiHandler({ + methodName: 'postProduct', + controller, + response, + next, + validatedArgs, + successStatus: 201, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_deleteProduct: Record = { + productId: {"in":"path","name":"productId","required":true,"dataType":"string"}, + }; + app.delete('/products/:productId', + ...(fetchMiddlewares(ProductsController)), + ...(fetchMiddlewares(ProductsController.prototype.deleteProduct)), - async function ProductsController_getByProductId(request: ExRequest, response: ExResponse, next: any) { + async function ProductsController_deleteProduct(request: ExRequest, response: ExResponse, next: any) { // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa let validatedArgs: any[] = []; try { - validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getByProductId, request, response }); + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_deleteProduct, request, response }); const controller = new ProductsController(); await templateService.apiHandler({ - methodName: 'getByProductId', + methodName: 'deleteProduct', + controller, + response, + next, + validatedArgs, + successStatus: 204, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_getProductReviews: Record = { + productId: {"in":"path","name":"productId","required":true,"dataType":"string"}, + queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"ReviewQueryParams"}, + }; + app.get('/products/:productId/reviews', + ...(fetchMiddlewares(ProductsController)), + ...(fetchMiddlewares(ProductsController.prototype.getProductReviews)), + + async function ProductsController_getProductReviews(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getProductReviews, request, response }); + + const controller = new ProductsController(); + + await templateService.apiHandler({ + methodName: 'getProductReviews', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsGenerateController_generateData: Record = { + }; + app.get('/generate', + ...(fetchMiddlewares(GenerateController)), + ...(fetchMiddlewares(GenerateController.prototype.generateData)), + + async function GenerateController_generateData(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsGenerateController_generateData, request, response }); + + const controller = new GenerateController(); + + await templateService.apiHandler({ + methodName: 'generateData', controller, response, next, diff --git a/build/swagger.json b/build/swagger.json index 24ffc21074..0a2e145d9d 100644 --- a/build/swagger.json +++ b/build/swagger.json @@ -90,7 +90,108 @@ "type": "object", "additionalProperties": false }, - "QueryParams": { + "ProductQueryParams": { + "properties": { + "page": { + "type": "string" + }, + "limit": { + "type": "string" + } + }, + "required": [ + "page", + "limit" + ], + "type": "object", + "additionalProperties": false + }, + "ProductCreationParams": { + "properties": { + "name": { + "type": "string" + }, + "category": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" + } + }, + "required": [ + "name", + "category", + "price", + "image" + ], + "type": "object", + "additionalProperties": false + }, + "ReviewDto": { + "properties": { + "_id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "rating": { + "type": "number", + "format": "double" + }, + "productId": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "_id", + "text", + "rating", + "productId", + "createdAt", + "updatedAt" + ], + "type": "object", + "additionalProperties": false + }, + "ReviewListResponse": { + "properties": { + "reviews": { + "items": { + "$ref": "#/components/schemas/ReviewDto" + }, + "type": "array" + }, + "totalPages": { + "type": "number", + "format": "double" + }, + "currentPage": { + "type": "number", + "format": "double" + } + }, + "required": [ + "reviews", + "totalPages", + "currentPage" + ], + "type": "object", + "additionalProperties": false + }, + "ReviewQueryParams": { "properties": { "page": { "type": "string" @@ -141,6 +242,7 @@ } } }, + "description": "Retrieves a an array of products. Requires URL query params page and limit.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", "security": [], "parameters": [ { @@ -160,11 +262,32 @@ } } ] + }, + "post": { + "operationId": "PostProduct", + "responses": { + "201": { + "description": "Created" + } + }, + "description": "Creates a product. Pass product information using request body.", + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductCreationParams" + } + } + } + } } }, "/products/{productId}": { "get": { - "operationId": "GetByProductId", + "operationId": "GetProductById", "responses": { "200": { "description": "Ok", @@ -178,12 +301,72 @@ { "$ref": "#/components/schemas/Error" } + ], + "nullable": true + } + } + } + } + }, + "description": "Retrieves a single product using product Id in URL path.", + "security": [], + "parameters": [ + { + "description": "The unique product id.", + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "operationId": "DeleteProduct", + "responses": { + "204": { + "description": "No Content" + } + }, + "description": "Deletes a single product using product Id in URL path.", + "security": [], + "parameters": [ + { + "description": "The unique product id.", + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/products/{productId}/reviews": { + "get": { + "operationId": "GetProductReviews", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReviewListResponse" + }, + { + "$ref": "#/components/schemas/Error" + } ] } } } } }, + "description": "Retrieves a an array of reviews for a specific product Id.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", "security": [], "parameters": [ { @@ -193,9 +376,37 @@ "schema": { "type": "string" } + }, + { + "in": "query", + "name": "page", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "required": true, + "schema": { + "type": "string" + } } ] } + }, + "/generate": { + "get": { + "operationId": "GenerateData", + "responses": { + "204": { + "description": "No content" + } + }, + "security": [], + "parameters": [] + } } }, "servers": [ diff --git a/src/generate/generateController.ts b/src/generate/generateController.ts new file mode 100644 index 0000000000..6ed23a0fd7 --- /dev/null +++ b/src/generate/generateController.ts @@ -0,0 +1,10 @@ +import { Controller, Get, Route } from 'tsoa'; +import { GenerateService } from './generateService'; + +@Route('generate') +export class GenerateController extends Controller { + @Get() + public async generateData(): Promise { + return new GenerateService().generateData(); + } +} diff --git a/src/generate/generateHelpers.ts b/src/generate/generateHelpers.ts new file mode 100644 index 0000000000..c33162006e --- /dev/null +++ b/src/generate/generateHelpers.ts @@ -0,0 +1,17 @@ +import { faker } from '@faker-js/faker'; + +export const buildProduct = () => { + return { + category: faker.commerce.department(), + name: faker.commerce.productName(), + price: faker.commerce.price(), + image: 'https://via.placeholder.com/250?text=Product+Image', + }; +}; + +export const buildReview = () => { + return { + text: faker.lorem.paragraph(), + rating: faker.number.int({ min: 1, max: 5 }), + }; +}; diff --git a/src/generate/generateService.ts b/src/generate/generateService.ts new file mode 100644 index 0000000000..0f5c4fd198 --- /dev/null +++ b/src/generate/generateService.ts @@ -0,0 +1,23 @@ +import { Review } from '../reviews/reviewModel'; +import { Product } from '../products/productModel'; +import { buildProduct, buildReview } from './generateHelpers'; + +const PRODUCTS = 90; +const REVIEWS = 5; + +export class GenerateService { + public async generateData(): Promise { + for (let i = 0; i < PRODUCTS; i++) { + //Build product and add to database + const productDocument = await Product.create(buildProduct()); + + for (let i = 0; i < REVIEWS; i++) { + //Build review with productDocument._id + await Review.create({ + ...buildReview(), + productId: productDocument._id, + }); + } + } + } +} diff --git a/src/products/productHelpers.ts b/src/products/productHelpers.ts index d7b3cf6a7b..b6a138fd0e 100644 --- a/src/products/productHelpers.ts +++ b/src/products/productHelpers.ts @@ -1,7 +1,7 @@ import { Document } from 'mongoose'; -import { ProductDto } from './productsTypes'; +import { ProductDto } from './productTypes'; export const convertDocumentToProductDto = (document: Document): ProductDto => { const dto = document.toObject(); - return { ...dto, _id: dto._id.toString() as ProductDto }; + return { ...dto, _id: dto._id.toString() } as ProductDto; }; diff --git a/src/products/productModel.ts b/src/products/productModel.ts index 63bd168b32..ca72e94b4e 100644 --- a/src/products/productModel.ts +++ b/src/products/productModel.ts @@ -4,8 +4,8 @@ const { Schema, model } = mongoose; //This is the Product Schema const ProductSchema = new Schema( { - category: { type: String, required: true }, name: { type: String, required: true }, + category: { type: String, required: true }, price: { type: Number, required: true }, image: { type: String, required: true }, }, diff --git a/src/products/productsTypes.ts b/src/products/productTypes.ts similarity index 67% rename from src/products/productsTypes.ts rename to src/products/productTypes.ts index 6da4ea7c69..dbe3c8affb 100644 --- a/src/products/productsTypes.ts +++ b/src/products/productTypes.ts @@ -1,15 +1,3 @@ -import { Document, ObjectId } from 'mongoose'; - -export interface ProductEntity extends Document { - _id: ObjectId | string; - category: string; - name: string; - price: number; - image: string; - createdAt: Date; - updatedAt: Date; -} - export interface ProductDto { _id: string; category: string; @@ -25,3 +13,15 @@ export interface ProductListResponse { totalPages: number; currentPage: number; } + +export interface ProductQueryParams { + page: string; + limit: string; +} + +export interface ProductCreationParams { + name: string; + category: string; + price: number; + image: string; +} diff --git a/src/products/productsController.ts b/src/products/productsController.ts index 3deb52ecc7..10d7bf6203 100644 --- a/src/products/productsController.ts +++ b/src/products/productsController.ts @@ -1,25 +1,93 @@ -import { Controller, Get, Path, Queries, Route } from 'tsoa'; +import { + Body, + Controller, + Delete, + Get, + Path, + Post, + Queries, + Route, + SuccessResponse, +} from 'tsoa'; import { ProductsService } from './productsService'; -import { ProductDto, ProductListResponse } from './productsTypes'; - -export interface QueryParams { - page: string; - limit: string; -} +import { + ProductCreationParams, + ProductDto, + ProductListResponse, + ProductQueryParams, +} from './productTypes'; +import { ReviewListResponse, ReviewQueryParams } from '../reviews/reviewTypes'; @Route('products') export class ProductsController extends Controller { + /** + * Retrieves a an array of products. Requires URL query params page and limit. + * Optional URL query params page and limit. + * If no page or limit given, only first 10 results returned. + * @example "http://localhost:3000/products?page=1&limit=5" + */ @Get() public async getAllProducts( - @Queries() queryParams: QueryParams + @Queries() queryParams: ProductQueryParams ): Promise { return new ProductsService().getAllProducts(queryParams); } + /** + * Retrieves a single product using product Id in URL path. + * @param {string} productId The unique product id. + */ @Get('{productId}') - public async getByProductId( + public async getProductById( @Path() productId: string - ): Promise { - return new ProductsService().getByProductId(productId); + ): Promise { + return new ProductsService().getProductById(productId); + // TODO: TomW return for product not found + } + + /** + * Creates a product. Pass product information using request body. + * @example { + * "name": "Scissors", + * "category": "tools", + * "price": 5.50, + * "image": "https://via.placeholder.com/250?text=Product+Image" + * } + */ + @SuccessResponse('201', 'Created') + @Post() + public async postProduct( + @Body() requestBody: ProductCreationParams + ): Promise { + this.setStatus(201); + new ProductsService().createProduct(requestBody); + return; + } + + /** + * Deletes a single product using product Id in URL path. + * @param {string} productId The unique product id. + */ + @SuccessResponse('204', 'No Content') + @Delete('{productId}') + public async deleteProduct(@Path() productId: string): Promise { + this.setStatus(204); + new ProductsService().deleteProduct(productId); + return; + // TODO: TomW return for product not found + } + + /** + * Retrieves a an array of reviews for a specific product Id. + * Optional URL query params page and limit. + * If no page or limit given, only first 10 results returned. + * @example "http://localhost:3000/6839f26a130912d633d748c5/reviews?page=1&limit=5" + */ + @Get('{productId}/reviews') + public async getProductReviews( + @Path() productId: string, + @Queries() queryParams: ReviewQueryParams + ): Promise { + return new ProductsService().getProductReviews(productId, queryParams); } } diff --git a/src/products/productsService.ts b/src/products/productsService.ts index f2f064a8e5..c6ebcc2f3f 100644 --- a/src/products/productsService.ts +++ b/src/products/productsService.ts @@ -1,25 +1,31 @@ -import { QueryParams } from './productsController'; import { Product } from './productModel'; -import { ProductDto, ProductListResponse } from './productsTypes'; +import { + ProductCreationParams, + ProductDto, + ProductListResponse, + ProductQueryParams, +} from './productTypes'; import { convertDocumentToProductDto } from './productHelpers'; +import { ReviewListResponse, ReviewQueryParams } from '../reviews/reviewTypes'; +import { convertDocumentToReviewDto } from '../reviews/reviewHelpers'; export class ProductsService { public async getAllProducts({ page, limit, - }: QueryParams): Promise { + }: ProductQueryParams): Promise { try { const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); - const products = await Product.find({}) + const productDocuments = await Product.find({}) .skip(limitAsInt * (pageAsInt - 1)) .limit(limitAsInt) .sort({ createdAt: -1 }); const count = await Product.countDocuments(); - const productsDto = products.map((product) => { + const productsDto = productDocuments.map((product) => { return convertDocumentToProductDto(product); }); @@ -33,10 +39,70 @@ export class ProductsService { } } - public async getByProductId(productId: string): Promise { + public async getProductById( + productId: string + ): Promise { try { - const productsDto = await Product.find({ _id: productId }); - return convertDocumentToProductDto(productsDto[0]); + const productDocument = await Product.findById(productId); + return productDocument + ? convertDocumentToProductDto(productDocument) + : null; + } catch (error) { + throw new Error(); + } + } + + public async createProduct( + productToCreate: ProductCreationParams + ): Promise { + try { + const productDocument = await Product.create(productToCreate); + return convertDocumentToProductDto(productDocument); + } catch (error) { + throw new Error(); + } + } + + public async deleteProduct( + productId: string + ): Promise { + try { + const productDocument = await Product.findByIdAndDelete(productId); + return productDocument + ? convertDocumentToProductDto(productDocument) + : null; + } catch (error) { + throw new Error(); + } + } + + public async getProductReviews( + productId: string, + { page, limit }: ReviewQueryParams + ): Promise { + try { + const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + + const productDocument = await Product.findById(productId); + if (!productDocument) throw new Error(); + + const reviewDocuments = await Product.find({ productId }) + .skip(limitAsInt * (pageAsInt - 1)) + .limit(limitAsInt) + .sort({ createdAt: -1 }); + + const count = await Product.countDocuments(); + + const reviewsDto = reviewDocuments.map((review) => { + return convertDocumentToReviewDto(review); + }); + + return { + reviews: reviewsDto, + totalPages: Math.ceil(count / limitAsInt), + currentPage: pageAsInt, + }; } catch (error) { throw new Error(); } diff --git a/src/reviews/reviewHelpers.ts b/src/reviews/reviewHelpers.ts new file mode 100644 index 0000000000..e7fbd7bbaf --- /dev/null +++ b/src/reviews/reviewHelpers.ts @@ -0,0 +1,11 @@ +import { Document } from 'mongoose'; +import { ReviewDto } from './reviewTypes'; + +export const convertDocumentToReviewDto = (document: Document): ReviewDto => { + const dto = document.toObject(); + return { + ...dto, + _id: dto._id.toString(), + productId: dto.productId.toString(), + } as ReviewDto; +}; diff --git a/src/reviews/reviewModel.ts b/src/reviews/reviewModel.ts new file mode 100644 index 0000000000..1ff32704d8 --- /dev/null +++ b/src/reviews/reviewModel.ts @@ -0,0 +1,14 @@ +import mongoose from 'mongoose'; +const { Schema, model } = mongoose; + +//This is the Product Schema +const ReviewSchema = new Schema( + { + text: { type: String, required: true }, + rating: { type: Number, required: true }, + productId: { type: Schema.Types.ObjectId, ref: 'Product' }, + }, + { timestamps: true } +); + +export const Review = model('Review', ReviewSchema); diff --git a/src/reviews/reviewTypes.ts b/src/reviews/reviewTypes.ts new file mode 100644 index 0000000000..f225277208 --- /dev/null +++ b/src/reviews/reviewTypes.ts @@ -0,0 +1,24 @@ +export interface ReviewDto { + _id: string; + text: string; + rating: number; + productId: string; + createdAt: Date; + updatedAt: Date; +} + +export interface ReviewListResponse { + reviews: ReviewDto[]; + totalPages: number; + currentPage: number; +} + +export interface ReviewQueryParams { + page: string; + limit: string; +} + +export interface ReviewCreationParams { + text: string; + rating: number; +} From 597cbd2663f10478f890e70de3806dbd0d081f1f Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Mon, 2 Jun 2025 16:22:41 -0400 Subject: [PATCH 06/27] feat(tsoa-swagger): Add productId/reviews route to get all reviews for a specific productId. --- build/routes.ts | 10 +++++----- build/swagger.json | 21 +++++++-------------- src/generate/generateController.ts | 6 +++++- src/products/productTypes.ts | 4 ++-- src/products/productsService.ts | 5 +++-- src/reviews/reviewTypes.ts | 4 ++-- 6 files changed, 24 insertions(+), 26 deletions(-) diff --git a/build/routes.ts b/build/routes.ts index 066d1e1788..9fe21d7d47 100644 --- a/build/routes.ts +++ b/build/routes.ts @@ -51,8 +51,8 @@ const models: TsoaRoute.Models = { "ProductQueryParams": { "dataType": "refObject", "properties": { - "page": {"dataType":"string","required":true}, - "limit": {"dataType":"string","required":true}, + "page": {"dataType":"string"}, + "limit": {"dataType":"string"}, }, "additionalProperties": false, }, @@ -94,8 +94,8 @@ const models: TsoaRoute.Models = { "ReviewQueryParams": { "dataType": "refObject", "properties": { - "page": {"dataType":"string","required":true}, - "limit": {"dataType":"string","required":true}, + "page": {"dataType":"string"}, + "limit": {"dataType":"string"}, }, "additionalProperties": false, }, @@ -290,7 +290,7 @@ export function RegisterRoutes(app: Router) { response, next, validatedArgs, - successStatus: undefined, + successStatus: 201, }); } catch (err) { return next(err); diff --git a/build/swagger.json b/build/swagger.json index 0a2e145d9d..67827ad2c3 100644 --- a/build/swagger.json +++ b/build/swagger.json @@ -99,10 +99,6 @@ "type": "string" } }, - "required": [ - "page", - "limit" - ], "type": "object", "additionalProperties": false }, @@ -200,10 +196,6 @@ "type": "string" } }, - "required": [ - "page", - "limit" - ], "type": "object", "additionalProperties": false } @@ -248,7 +240,7 @@ { "in": "query", "name": "page", - "required": true, + "required": false, "schema": { "type": "string" } @@ -256,7 +248,7 @@ { "in": "query", "name": "limit", - "required": true, + "required": false, "schema": { "type": "string" } @@ -380,7 +372,7 @@ { "in": "query", "name": "page", - "required": true, + "required": false, "schema": { "type": "string" } @@ -388,7 +380,7 @@ { "in": "query", "name": "limit", - "required": true, + "required": false, "schema": { "type": "string" } @@ -400,10 +392,11 @@ "get": { "operationId": "GenerateData", "responses": { - "204": { - "description": "No content" + "201": { + "description": "Created" } }, + "description": "Generates products and reviews then saves them to the database.", "security": [], "parameters": [] } diff --git a/src/generate/generateController.ts b/src/generate/generateController.ts index 6ed23a0fd7..6b59f74ee2 100644 --- a/src/generate/generateController.ts +++ b/src/generate/generateController.ts @@ -1,8 +1,12 @@ -import { Controller, Get, Route } from 'tsoa'; +import { Controller, Get, Route, SuccessResponse } from 'tsoa'; import { GenerateService } from './generateService'; @Route('generate') export class GenerateController extends Controller { + /** + * Generates products and reviews then saves them to the database. + */ + @SuccessResponse('201', 'Created') @Get() public async generateData(): Promise { return new GenerateService().generateData(); diff --git a/src/products/productTypes.ts b/src/products/productTypes.ts index dbe3c8affb..d3a1d5de85 100644 --- a/src/products/productTypes.ts +++ b/src/products/productTypes.ts @@ -15,8 +15,8 @@ export interface ProductListResponse { } export interface ProductQueryParams { - page: string; - limit: string; + page?: string; + limit?: string; } export interface ProductCreationParams { diff --git a/src/products/productsService.ts b/src/products/productsService.ts index c6ebcc2f3f..504de864d3 100644 --- a/src/products/productsService.ts +++ b/src/products/productsService.ts @@ -8,6 +8,7 @@ import { import { convertDocumentToProductDto } from './productHelpers'; import { ReviewListResponse, ReviewQueryParams } from '../reviews/reviewTypes'; import { convertDocumentToReviewDto } from '../reviews/reviewHelpers'; +import { Review } from '../reviews/reviewModel'; export class ProductsService { public async getAllProducts({ @@ -87,12 +88,12 @@ export class ProductsService { const productDocument = await Product.findById(productId); if (!productDocument) throw new Error(); - const reviewDocuments = await Product.find({ productId }) + const reviewDocuments = await Review.find({ productId }) .skip(limitAsInt * (pageAsInt - 1)) .limit(limitAsInt) .sort({ createdAt: -1 }); - const count = await Product.countDocuments(); + const count = await Review.countDocuments({ productId }); const reviewsDto = reviewDocuments.map((review) => { return convertDocumentToReviewDto(review); diff --git a/src/reviews/reviewTypes.ts b/src/reviews/reviewTypes.ts index f225277208..d4c9d67166 100644 --- a/src/reviews/reviewTypes.ts +++ b/src/reviews/reviewTypes.ts @@ -14,8 +14,8 @@ export interface ReviewListResponse { } export interface ReviewQueryParams { - page: string; - limit: string; + page?: string; + limit?: string; } export interface ReviewCreationParams { From 6184f7cf135451fca92a9beab980bffc3601db7e Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:30:30 -0400 Subject: [PATCH 07/27] feat(sort-price): Add ability to sort products by price. --- build/routes.ts | 176 +++++++++++++------ build/swagger.json | 271 ++++++++++++++++++++--------- src/products/productTypes.ts | 2 + src/products/productsController.ts | 15 -- src/products/productsService.ts | 70 +++----- src/reviews/reviewTypes.ts | 1 + src/reviews/reviewsController.ts | 61 +++++++ src/reviews/reviewsService.ts | 61 +++++++ 8 files changed, 455 insertions(+), 202 deletions(-) create mode 100644 src/reviews/reviewsController.ts create mode 100644 src/reviews/reviewsService.ts diff --git a/build/routes.ts b/build/routes.ts index 9fe21d7d47..64f8929584 100644 --- a/build/routes.ts +++ b/build/routes.ts @@ -4,6 +4,8 @@ import type { TsoaRoute } from '@tsoa/runtime'; import { fetchMiddlewares, ExpressTemplateService } from '@tsoa/runtime'; // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +import { ReviewsController } from './../src/reviews/reviewsController'; +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa import { ProductsController } from './../src/products/productsController'; // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa import { GenerateController } from './../src/generate/generateController'; @@ -14,24 +16,23 @@ import type { Request as ExRequest, Response as ExResponse, RequestHandler, Rout // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa const models: TsoaRoute.Models = { - "ProductDto": { + "ReviewDto": { "dataType": "refObject", "properties": { "_id": {"dataType":"string","required":true}, - "category": {"dataType":"string","required":true}, - "name": {"dataType":"string","required":true}, - "price": {"dataType":"double","required":true}, - "image": {"dataType":"string","required":true}, + "text": {"dataType":"string","required":true}, + "rating": {"dataType":"double","required":true}, + "productId": {"dataType":"string","required":true}, "createdAt": {"dataType":"datetime","required":true}, "updatedAt": {"dataType":"datetime","required":true}, }, "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ProductListResponse": { + "ReviewListResponse": { "dataType": "refObject", "properties": { - "products": {"dataType":"array","array":{"dataType":"refObject","ref":"ProductDto"},"required":true}, + "reviews": {"dataType":"array","array":{"dataType":"refObject","ref":"ReviewDto"},"required":true}, "totalPages": {"dataType":"double","required":true}, "currentPage": {"dataType":"double","required":true}, }, @@ -48,7 +49,7 @@ const models: TsoaRoute.Models = { "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ProductQueryParams": { + "ReviewQueryParams": { "dataType": "refObject", "properties": { "page": {"dataType":"string"}, @@ -57,45 +58,58 @@ const models: TsoaRoute.Models = { "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ProductCreationParams": { + "ReviewCreationParams": { "dataType": "refObject", "properties": { - "name": {"dataType":"string","required":true}, - "category": {"dataType":"string","required":true}, - "price": {"dataType":"double","required":true}, - "image": {"dataType":"string","required":true}, + "text": {"dataType":"string","required":true}, + "rating": {"dataType":"double","required":true}, + "productId": {"dataType":"string","required":true}, }, "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ReviewDto": { + "ProductDto": { "dataType": "refObject", "properties": { "_id": {"dataType":"string","required":true}, - "text": {"dataType":"string","required":true}, - "rating": {"dataType":"double","required":true}, - "productId": {"dataType":"string","required":true}, + "category": {"dataType":"string","required":true}, + "name": {"dataType":"string","required":true}, + "price": {"dataType":"double","required":true}, + "image": {"dataType":"string","required":true}, "createdAt": {"dataType":"datetime","required":true}, "updatedAt": {"dataType":"datetime","required":true}, }, "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ReviewListResponse": { + "ProductListResponse": { "dataType": "refObject", "properties": { - "reviews": {"dataType":"array","array":{"dataType":"refObject","ref":"ReviewDto"},"required":true}, + "products": {"dataType":"array","array":{"dataType":"refObject","ref":"ProductDto"},"required":true}, "totalPages": {"dataType":"double","required":true}, "currentPage": {"dataType":"double","required":true}, }, "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ReviewQueryParams": { + "ProductQueryParams": { "dataType": "refObject", "properties": { "page": {"dataType":"string"}, "limit": {"dataType":"string"}, + "category": {"dataType":"string"}, + "price": {"dataType":"union","subSchemas":[{"dataType":"enum","enums":["highest"]},{"dataType":"enum","enums":["lowest"]}]}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductCreationParams": { + "dataType": "refObject", + "properties": { + "name": {"dataType":"string","required":true}, + "category": {"dataType":"string","required":true}, + "price": {"dataType":"double","required":true}, + "image": {"dataType":"string","required":true}, }, "additionalProperties": false, }, @@ -117,6 +131,97 @@ export function RegisterRoutes(app: Router) { + const argsReviewsController_getProductReviews: Record = { + productId: {"in":"path","name":"productId","required":true,"dataType":"string"}, + queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"ReviewQueryParams"}, + }; + app.get('/reviews/:productId', + ...(fetchMiddlewares(ReviewsController)), + ...(fetchMiddlewares(ReviewsController.prototype.getProductReviews)), + + async function ReviewsController_getProductReviews(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsReviewsController_getProductReviews, request, response }); + + const controller = new ReviewsController(); + + await templateService.apiHandler({ + methodName: 'getProductReviews', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsReviewsController_postProduct: Record = { + requestBody: {"in":"body","name":"requestBody","required":true,"ref":"ReviewCreationParams"}, + }; + app.post('/reviews', + ...(fetchMiddlewares(ReviewsController)), + ...(fetchMiddlewares(ReviewsController.prototype.postProduct)), + + async function ReviewsController_postProduct(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsReviewsController_postProduct, request, response }); + + const controller = new ReviewsController(); + + await templateService.apiHandler({ + methodName: 'postProduct', + controller, + response, + next, + validatedArgs, + successStatus: 201, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsReviewsController_deleteProduct: Record = { + reviewId: {"in":"path","name":"reviewId","required":true,"dataType":"string"}, + }; + app.delete('/reviews/:reviewId', + ...(fetchMiddlewares(ReviewsController)), + ...(fetchMiddlewares(ReviewsController.prototype.deleteProduct)), + + async function ReviewsController_deleteProduct(request: ExRequest, response: ExResponse, next: any) { + + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + + let validatedArgs: any[] = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsReviewsController_deleteProduct, request, response }); + + const controller = new ReviewsController(); + + await templateService.apiHandler({ + methodName: 'deleteProduct', + controller, + response, + next, + validatedArgs, + successStatus: 204, + }); + } catch (err) { + return next(err); + } + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa const argsProductsController_getAllProducts: Record = { queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"ProductQueryParams"}, }; @@ -237,37 +342,6 @@ export function RegisterRoutes(app: Router) { } }); // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - const argsProductsController_getProductReviews: Record = { - productId: {"in":"path","name":"productId","required":true,"dataType":"string"}, - queryParams: {"in":"queries","name":"queryParams","required":true,"ref":"ReviewQueryParams"}, - }; - app.get('/products/:productId/reviews', - ...(fetchMiddlewares(ProductsController)), - ...(fetchMiddlewares(ProductsController.prototype.getProductReviews)), - - async function ProductsController_getProductReviews(request: ExRequest, response: ExResponse, next: any) { - - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - - let validatedArgs: any[] = []; - try { - validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getProductReviews, request, response }); - - const controller = new ProductsController(); - - await templateService.apiHandler({ - methodName: 'getProductReviews', - controller, - response, - next, - validatedArgs, - successStatus: undefined, - }); - } catch (err) { - return next(err); - } - }); - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa const argsGenerateController_generateData: Record = { }; app.get('/generate', diff --git a/build/swagger.json b/build/swagger.json index 67827ad2c3..c34976d211 100644 --- a/build/swagger.json +++ b/build/swagger.json @@ -7,22 +7,19 @@ "requestBodies": {}, "responses": {}, "schemas": { - "ProductDto": { + "ReviewDto": { "properties": { "_id": { "type": "string" }, - "category": { - "type": "string" - }, - "name": { + "text": { "type": "string" }, - "price": { + "rating": { "type": "number", "format": "double" }, - "image": { + "productId": { "type": "string" }, "createdAt": { @@ -36,21 +33,20 @@ }, "required": [ "_id", - "category", - "name", - "price", - "image", + "text", + "rating", + "productId", "createdAt", "updatedAt" ], "type": "object", "additionalProperties": false }, - "ProductListResponse": { + "ReviewListResponse": { "properties": { - "products": { + "reviews": { "items": { - "$ref": "#/components/schemas/ProductDto" + "$ref": "#/components/schemas/ReviewDto" }, "type": "array" }, @@ -64,7 +60,7 @@ } }, "required": [ - "products", + "reviews", "totalPages", "currentPage" ], @@ -90,7 +86,7 @@ "type": "object", "additionalProperties": false }, - "ProductQueryParams": { + "ReviewQueryParams": { "properties": { "page": { "type": "string" @@ -102,44 +98,43 @@ "type": "object", "additionalProperties": false }, - "ProductCreationParams": { + "ReviewCreationParams": { "properties": { - "name": { - "type": "string" - }, - "category": { + "text": { "type": "string" }, - "price": { + "rating": { "type": "number", "format": "double" }, - "image": { + "productId": { "type": "string" } }, "required": [ - "name", - "category", - "price", - "image" + "text", + "rating", + "productId" ], "type": "object", "additionalProperties": false }, - "ReviewDto": { + "ProductDto": { "properties": { "_id": { "type": "string" }, - "text": { + "category": { "type": "string" }, - "rating": { + "name": { + "type": "string" + }, + "price": { "type": "number", "format": "double" }, - "productId": { + "image": { "type": "string" }, "createdAt": { @@ -153,20 +148,21 @@ }, "required": [ "_id", - "text", - "rating", - "productId", + "category", + "name", + "price", + "image", "createdAt", "updatedAt" ], "type": "object", "additionalProperties": false }, - "ReviewListResponse": { + "ProductListResponse": { "properties": { - "reviews": { + "products": { "items": { - "$ref": "#/components/schemas/ReviewDto" + "$ref": "#/components/schemas/ProductDto" }, "type": "array" }, @@ -180,22 +176,57 @@ } }, "required": [ - "reviews", + "products", "totalPages", "currentPage" ], "type": "object", "additionalProperties": false }, - "ReviewQueryParams": { + "ProductQueryParams": { "properties": { "page": { "type": "string" }, "limit": { "type": "string" + }, + "category": { + "type": "string" + }, + "price": { + "type": "string", + "enum": [ + "highest", + "lowest" + ] + } + }, + "type": "object", + "additionalProperties": false + }, + "ProductCreationParams": { + "properties": { + "name": { + "type": "string" + }, + "category": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" } }, + "required": [ + "name", + "category", + "price", + "image" + ], "type": "object", "additionalProperties": false } @@ -212,9 +243,9 @@ "contact": {} }, "paths": { - "/products": { + "/reviews/{productId}": { "get": { - "operationId": "GetAllProducts", + "operationId": "GetProductReviews", "responses": { "200": { "description": "Ok", @@ -223,7 +254,7 @@ "schema": { "anyOf": [ { - "$ref": "#/components/schemas/ProductListResponse" + "$ref": "#/components/schemas/ReviewListResponse" }, { "$ref": "#/components/schemas/Error" @@ -234,9 +265,17 @@ } } }, - "description": "Retrieves a an array of products. Requires URL query params page and limit.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", + "description": "Retrieves a an array of reviews for a specific product Id.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", "security": [], "parameters": [ + { + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + }, { "in": "query", "name": "page", @@ -254,7 +293,9 @@ } } ] - }, + } + }, + "/reviews": { "post": { "operationId": "PostProduct", "responses": { @@ -262,7 +303,7 @@ "description": "Created" } }, - "description": "Creates a product. Pass product information using request body.", + "description": "Creates a review. Pass review information using request body.", "security": [], "parameters": [], "requestBody": { @@ -270,16 +311,39 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProductCreationParams" + "$ref": "#/components/schemas/ReviewCreationParams" } } } } } }, - "/products/{productId}": { + "/reviews/{reviewId}": { + "delete": { + "operationId": "DeleteProduct", + "responses": { + "204": { + "description": "No Content" + } + }, + "description": "Deletes a single review using review Id in URL path.", + "security": [], + "parameters": [ + { + "description": "The unique review id.", + "in": "path", + "name": "reviewId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/products": { "get": { - "operationId": "GetProductById", + "operationId": "GetAllProducts", "responses": { "200": { "description": "Ok", @@ -288,57 +352,83 @@ "schema": { "anyOf": [ { - "$ref": "#/components/schemas/ProductDto" + "$ref": "#/components/schemas/ProductListResponse" }, { "$ref": "#/components/schemas/Error" } - ], - "nullable": true + ] } } } } }, - "description": "Retrieves a single product using product Id in URL path.", + "description": "Retrieves a an array of products. Requires URL query params page and limit.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", "security": [], "parameters": [ { - "description": "The unique product id.", - "in": "path", - "name": "productId", - "required": true, + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "required": false, "schema": { "type": "string" } + }, + { + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "price", + "required": false, + "schema": { + "type": "string", + "enum": [ + "highest", + "lowest" + ] + } } ] }, - "delete": { - "operationId": "DeleteProduct", + "post": { + "operationId": "PostProduct", "responses": { - "204": { - "description": "No Content" + "201": { + "description": "Created" } }, - "description": "Deletes a single product using product Id in URL path.", + "description": "Creates a product. Pass product information using request body.", "security": [], - "parameters": [ - { - "description": "The unique product id.", - "in": "path", - "name": "productId", - "required": true, - "schema": { - "type": "string" + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductCreationParams" + } } } - ] + } } }, - "/products/{productId}/reviews": { + "/products/{productId}": { "get": { - "operationId": "GetProductReviews", + "operationId": "GetProductById", "responses": { "200": { "description": "Ok", @@ -347,40 +437,47 @@ "schema": { "anyOf": [ { - "$ref": "#/components/schemas/ReviewListResponse" + "$ref": "#/components/schemas/ProductDto" }, { "$ref": "#/components/schemas/Error" } - ] + ], + "nullable": true } } } } }, - "description": "Retrieves a an array of reviews for a specific product Id.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", + "description": "Retrieves a single product using product Id in URL path.", "security": [], "parameters": [ { + "description": "The unique product id.", "in": "path", "name": "productId", "required": true, "schema": { "type": "string" } - }, - { - "in": "query", - "name": "page", - "required": false, - "schema": { - "type": "string" - } - }, + } + ] + }, + "delete": { + "operationId": "DeleteProduct", + "responses": { + "204": { + "description": "No Content" + } + }, + "description": "Deletes a single product using product Id in URL path.", + "security": [], + "parameters": [ { - "in": "query", - "name": "limit", - "required": false, + "description": "The unique product id.", + "in": "path", + "name": "productId", + "required": true, "schema": { "type": "string" } diff --git a/src/products/productTypes.ts b/src/products/productTypes.ts index d3a1d5de85..2647f1eecc 100644 --- a/src/products/productTypes.ts +++ b/src/products/productTypes.ts @@ -17,6 +17,8 @@ export interface ProductListResponse { export interface ProductQueryParams { page?: string; limit?: string; + category?: string; + price?: 'highest' | 'lowest'; } export interface ProductCreationParams { diff --git a/src/products/productsController.ts b/src/products/productsController.ts index 10d7bf6203..c0a0c1cf9c 100644 --- a/src/products/productsController.ts +++ b/src/products/productsController.ts @@ -16,7 +16,6 @@ import { ProductListResponse, ProductQueryParams, } from './productTypes'; -import { ReviewListResponse, ReviewQueryParams } from '../reviews/reviewTypes'; @Route('products') export class ProductsController extends Controller { @@ -76,18 +75,4 @@ export class ProductsController extends Controller { return; // TODO: TomW return for product not found } - - /** - * Retrieves a an array of reviews for a specific product Id. - * Optional URL query params page and limit. - * If no page or limit given, only first 10 results returned. - * @example "http://localhost:3000/6839f26a130912d633d748c5/reviews?page=1&limit=5" - */ - @Get('{productId}/reviews') - public async getProductReviews( - @Path() productId: string, - @Queries() queryParams: ReviewQueryParams - ): Promise { - return new ProductsService().getProductReviews(productId, queryParams); - } } diff --git a/src/products/productsService.ts b/src/products/productsService.ts index 504de864d3..b9ca95e6b2 100644 --- a/src/products/productsService.ts +++ b/src/products/productsService.ts @@ -6,25 +6,35 @@ import { ProductQueryParams, } from './productTypes'; import { convertDocumentToProductDto } from './productHelpers'; -import { ReviewListResponse, ReviewQueryParams } from '../reviews/reviewTypes'; -import { convertDocumentToReviewDto } from '../reviews/reviewHelpers'; -import { Review } from '../reviews/reviewModel'; +import { SortOrder } from 'mongoose'; export class ProductsService { public async getAllProducts({ page, limit, + category, + price, }: ProductQueryParams): Promise { try { const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + const findBy = category + ? { category: { $regex: category, $options: 'i' } } + : {}; - const productDocuments = await Product.find({}) + const sortBy = ( + price: 'highest' | 'lowest' + ): Record => { + if (price === 'highest') return { price: -1, createdAt: -1 }; + else return { price: 1 as SortOrder, createdAt: -1 }; + }; + + const productDocuments = await Product.find(findBy) .skip(limitAsInt * (pageAsInt - 1)) .limit(limitAsInt) - .sort({ createdAt: -1 }); + .sort(price ? sortBy(price) : { createdAt: -1 }); - const count = await Product.countDocuments(); + const count = await Product.countDocuments(findBy); const productsDto = productDocuments.map((product) => { return convertDocumentToProductDto(product); @@ -40,14 +50,11 @@ export class ProductsService { } } - public async getProductById( - productId: string - ): Promise { + public async getProductById(productId: string): Promise { try { const productDocument = await Product.findById(productId); - return productDocument - ? convertDocumentToProductDto(productDocument) - : null; + if (!productDocument) throw new Error(); + return convertDocumentToProductDto(productDocument); } catch (error) { throw new Error(); } @@ -64,46 +71,11 @@ export class ProductsService { } } - public async deleteProduct( - productId: string - ): Promise { + public async deleteProduct(productId: string): Promise { try { const productDocument = await Product.findByIdAndDelete(productId); - return productDocument - ? convertDocumentToProductDto(productDocument) - : null; - } catch (error) { - throw new Error(); - } - } - - public async getProductReviews( - productId: string, - { page, limit }: ReviewQueryParams - ): Promise { - try { - const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); - const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); - - const productDocument = await Product.findById(productId); if (!productDocument) throw new Error(); - - const reviewDocuments = await Review.find({ productId }) - .skip(limitAsInt * (pageAsInt - 1)) - .limit(limitAsInt) - .sort({ createdAt: -1 }); - - const count = await Review.countDocuments({ productId }); - - const reviewsDto = reviewDocuments.map((review) => { - return convertDocumentToReviewDto(review); - }); - - return { - reviews: reviewsDto, - totalPages: Math.ceil(count / limitAsInt), - currentPage: pageAsInt, - }; + return convertDocumentToProductDto(productDocument); } catch (error) { throw new Error(); } diff --git a/src/reviews/reviewTypes.ts b/src/reviews/reviewTypes.ts index d4c9d67166..8b9b55872f 100644 --- a/src/reviews/reviewTypes.ts +++ b/src/reviews/reviewTypes.ts @@ -21,4 +21,5 @@ export interface ReviewQueryParams { export interface ReviewCreationParams { text: string; rating: number; + productId: string; } diff --git a/src/reviews/reviewsController.ts b/src/reviews/reviewsController.ts new file mode 100644 index 0000000000..5390c0d8b4 --- /dev/null +++ b/src/reviews/reviewsController.ts @@ -0,0 +1,61 @@ +import { + Body, + Controller, + Delete, + Get, + Path, + Post, + Queries, + Route, + SuccessResponse, +} from 'tsoa'; +import { ReviewCreationParams, ReviewListResponse, ReviewQueryParams } from './reviewTypes'; +import { ReviewsService } from './reviewsService'; + +@Route('reviews') +export class ReviewsController extends Controller { + /** + * Retrieves a an array of reviews for a specific product Id. + * Optional URL query params page and limit. + * If no page or limit given, only first 10 results returned. + * @example "http://localhost:3000/reviews/6839f26a130912d633d748c5?page=1&limit=5" + */ + @Get('{productId}') + public async getProductReviews( + @Path() productId: string, + @Queries() queryParams: ReviewQueryParams + ): Promise { + return new ReviewsService().getProductReviews(productId, queryParams); + } + + /** + * Creates a review. Pass review information using request body. + * @example { + * "text": "Colligo angustus delectatio ademptio cupio celer volubilis.", + * "rating": "5", + * "productId": "", + * } + */ + @SuccessResponse('201', 'Created') + @Post() + public async postProduct( + @Body() requestBody: ReviewCreationParams + ): Promise { + this.setStatus(201); + new ReviewsService().createReview(requestBody); + return; + } + + /** + * Deletes a single review using review Id in URL path. + * @param {string} reviewId The unique review id. + */ + @SuccessResponse('204', 'No Content') + @Delete('{reviewId}') + public async deleteProduct(@Path() reviewId: string): Promise { + this.setStatus(204); + new ReviewsService().deleteReview(reviewId); + return; + // TODO: TomW return for product not found + } +} diff --git a/src/reviews/reviewsService.ts b/src/reviews/reviewsService.ts new file mode 100644 index 0000000000..7ac9359a11 --- /dev/null +++ b/src/reviews/reviewsService.ts @@ -0,0 +1,61 @@ +import { Product } from '../products/productModel'; +import { convertDocumentToReviewDto } from './reviewHelpers'; +import { Review } from './reviewModel'; +import { ReviewCreationParams, ReviewDto, ReviewListResponse, ReviewQueryParams } from './reviewTypes'; + +export class ReviewsService { + public async getProductReviews( + productId: string, + { page, limit }: ReviewQueryParams + ): Promise { + try { + const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + + const productDocument = await Product.findById(productId); + if (!productDocument) throw new Error(); + + const reviewDocuments = await Review.find({ productId }) + .skip(limitAsInt * (pageAsInt - 1)) + .limit(limitAsInt) + .sort({ createdAt: -1 }); + + const count = await Review.countDocuments({ productId }); + + const reviewsDto = reviewDocuments.map((review) => { + return convertDocumentToReviewDto(review); + }); + + return { + reviews: reviewsDto, + totalPages: Math.ceil(count / limitAsInt), + currentPage: pageAsInt, + }; + } catch (error) { + throw new Error(); + } + } + + public async createReview( + reviewToCreate: ReviewCreationParams + ): Promise { + try { + const productDocument = await Product.findById(reviewToCreate.productId); + if (!productDocument) throw new Error(); + const reviewDocument = await Review.create(reviewToCreate); + return convertDocumentToReviewDto(reviewDocument); + } catch (error) { + throw new Error(); + } + } + + public async deleteReview(reviewId: string): Promise { + try { + const reviewDocument = await Review.findByIdAndDelete(reviewId); + if (!reviewDocument) throw new Error(); + return convertDocumentToReviewDto(reviewDocument); + } catch (error) { + throw new Error(); + } + } +} From 10a6363373e883137093791ceee6a93bb6a75d43 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Mon, 2 Jun 2025 21:06:03 -0400 Subject: [PATCH 08/27] refactor(review-product-routes): Refactor some of the routes to /reviews. Introduce query to search Products. --- build/routes.ts | 1 + build/swagger.json | 11 ++++++++++ src/app.ts | 39 ++++++++++++++++++++++++++++++++- src/products/productHelpers.ts | 38 +++++++++++++++++++++++++++++++- src/products/productModel.ts | 4 +++- src/products/productTypes.ts | 1 + src/products/productsService.ts | 28 +++++++++++------------ 7 files changed, 104 insertions(+), 18 deletions(-) diff --git a/build/routes.ts b/build/routes.ts index 64f8929584..5f0484571c 100644 --- a/build/routes.ts +++ b/build/routes.ts @@ -99,6 +99,7 @@ const models: TsoaRoute.Models = { "limit": {"dataType":"string"}, "category": {"dataType":"string"}, "price": {"dataType":"union","subSchemas":[{"dataType":"enum","enums":["highest"]},{"dataType":"enum","enums":["lowest"]}]}, + "query": {"dataType":"string"}, }, "additionalProperties": false, }, diff --git a/build/swagger.json b/build/swagger.json index c34976d211..522fe15104 100644 --- a/build/swagger.json +++ b/build/swagger.json @@ -200,6 +200,9 @@ "highest", "lowest" ] + }, + "query": { + "type": "string" } }, "type": "object", @@ -401,6 +404,14 @@ "lowest" ] } + }, + { + "in": "query", + "name": "query", + "required": false, + "schema": { + "type": "string" + } } ] }, diff --git a/src/app.ts b/src/app.ts index 59d5115c96..a91f17b0d0 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,8 +1,15 @@ -import express, { json, urlencoded } from 'express'; +import express, { + json, + urlencoded, + Response as ExResponse, + Request as ExRequest, + NextFunction, +} from 'express'; import { RegisterRoutes } from '../build/routes'; import { connect } from 'mongoose'; import swaggerUi from 'swagger-ui-express'; import swaggerDocument from '../build/swagger.json'; +import { ValidateError } from 'tsoa'; export const app = express(); @@ -19,3 +26,33 @@ app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); //Import API routes, mount all under /api RegisterRoutes(app); + +app.use(function notFoundHandler(_req, res: ExResponse) { + res.status(404).send({ + message: 'Not Found', + }); +}); + +const errorHandler = ( + err: unknown, + req: ExRequest, + res: ExResponse, + next: NextFunction +): void => { + if (err instanceof ValidateError) { + console.warn(`Caught Validation Error for ${req.path}:`, err.fields); + res.status(422).json({ + message: 'Validation Failed', + details: err?.fields, + }); + } + if (err instanceof Error) { + res.status(500).json({ + message: 'Internal Server Error', + }); + } + + next(); +}; + +app.use(errorHandler); diff --git a/src/products/productHelpers.ts b/src/products/productHelpers.ts index b6a138fd0e..b0b122d1c9 100644 --- a/src/products/productHelpers.ts +++ b/src/products/productHelpers.ts @@ -1,7 +1,43 @@ -import { Document } from 'mongoose'; +import { Document, FilterQuery, SortOrder } from 'mongoose'; import { ProductDto } from './productTypes'; +import { ProductType } from './productModel'; export const convertDocumentToProductDto = (document: Document): ProductDto => { const dto = document.toObject(); return { ...dto, _id: dto._id.toString() } as ProductDto; }; + +/** + * Build sort options. Returns object conditional on the value of price param. + * @param {'highest' | 'lowest' | undefined} price - Optional. + * @returns {Record} Returns a record used by Mongoose to sort search results. + */ +export const returnSortOptions = ( + price: 'highest' | 'lowest' | undefined +): Record => { + if (price === 'highest') return { price: -1, createdAt: -1 }; + else if (price === 'lowest') return { price: 1, createdAt: -1 }; + else return { createdAt: -1 }; +}; + +/** + * Format the find options for a product. + * Builds category and find objects. + * Returns object conditional on category or query being defined. + * @param {string | undefined} category - Optional product category. + * @param {string | undefined} query - Optional search query. + * @returns {FilterQuery} Returns a Mongoose query for Product model. + */ +export const returnFindOptions = ( + category: string | undefined, + query: string | undefined +): FilterQuery => { + const categoryFindObject = { + category: { $regex: category, $options: 'i' }, + }; + const queryFindObject = { name: { $regex: query, $options: 'i' } }; + if (category && query) return { ...categoryFindObject, ...queryFindObject }; + if (query) return queryFindObject; + if (category) return categoryFindObject; + return {}; +}; diff --git a/src/products/productModel.ts b/src/products/productModel.ts index ca72e94b4e..c5272caa0a 100644 --- a/src/products/productModel.ts +++ b/src/products/productModel.ts @@ -1,4 +1,4 @@ -import mongoose from 'mongoose'; +import mongoose, { InferSchemaType } from 'mongoose'; const { Schema, model } = mongoose; //This is the Product Schema @@ -12,4 +12,6 @@ const ProductSchema = new Schema( { timestamps: true } ); +export type ProductType = InferSchemaType; + export const Product = model('Product', ProductSchema); diff --git a/src/products/productTypes.ts b/src/products/productTypes.ts index 2647f1eecc..b5d5471659 100644 --- a/src/products/productTypes.ts +++ b/src/products/productTypes.ts @@ -19,6 +19,7 @@ export interface ProductQueryParams { limit?: string; category?: string; price?: 'highest' | 'lowest'; + query?: string; } export interface ProductCreationParams { diff --git a/src/products/productsService.ts b/src/products/productsService.ts index b9ca95e6b2..7e64eca45d 100644 --- a/src/products/productsService.ts +++ b/src/products/productsService.ts @@ -5,8 +5,11 @@ import { ProductListResponse, ProductQueryParams, } from './productTypes'; -import { convertDocumentToProductDto } from './productHelpers'; -import { SortOrder } from 'mongoose'; +import { + convertDocumentToProductDto, + returnFindOptions, + returnSortOptions, +} from './productHelpers'; export class ProductsService { public async getAllProducts({ @@ -14,27 +17,22 @@ export class ProductsService { limit, category, price, + query, }: ProductQueryParams): Promise { try { const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); - const findBy = category - ? { category: { $regex: category, $options: 'i' } } - : {}; - - const sortBy = ( - price: 'highest' | 'lowest' - ): Record => { - if (price === 'highest') return { price: -1, createdAt: -1 }; - else return { price: 1 as SortOrder, createdAt: -1 }; - }; - const productDocuments = await Product.find(findBy) + const productDocuments = await Product.find( + returnFindOptions(category, query) + ) .skip(limitAsInt * (pageAsInt - 1)) .limit(limitAsInt) - .sort(price ? sortBy(price) : { createdAt: -1 }); + .sort(returnSortOptions(price)); - const count = await Product.countDocuments(findBy); + const count = await Product.countDocuments( + returnFindOptions(category, query) + ); const productsDto = productDocuments.map((product) => { return convertDocumentToProductDto(product); From 7dd271e6babe2708fb407b2d620e225e212cc0ce Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 12:01:23 -0400 Subject: [PATCH 09/27] feat(error-handling): Add more comprehensive error handling across services. --- build/routes.ts | 9 ++++++ build/swagger.json | 45 ++++++++++++++++++++++++++++-- src/app.ts | 42 ++++------------------------ src/errors/errorHandlers.ts | 30 ++++++++++++++++++++ src/errors/errorTypes.ts | 4 +++ src/generate/generateService.ts | 29 +++++++++++++------ src/products/productsController.ts | 6 ++-- src/products/productsService.ts | 34 +++++++++++++++++----- src/reviews/reviewsController.ts | 10 +++++-- src/reviews/reviewsService.ts | 31 ++++++++++++++++---- src/server.ts | 2 +- 11 files changed, 177 insertions(+), 65 deletions(-) create mode 100644 src/errors/errorHandlers.ts create mode 100644 src/errors/errorTypes.ts diff --git a/build/routes.ts b/build/routes.ts index 5f0484571c..610b8ea61d 100644 --- a/build/routes.ts +++ b/build/routes.ts @@ -58,6 +58,15 @@ const models: TsoaRoute.Models = { "additionalProperties": false, }, // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ValidateErrorJSON": { + "dataType": "refObject", + "properties": { + "message": {"dataType":"enum","enums":["Validation failed"],"required":true}, + "details": {"dataType":"nestedObjectLiteral","nestedProperties":{},"additionalProperties":{"dataType":"any"},"required":true}, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa "ReviewCreationParams": { "dataType": "refObject", "properties": { diff --git a/build/swagger.json b/build/swagger.json index 522fe15104..a4a4fed69d 100644 --- a/build/swagger.json +++ b/build/swagger.json @@ -98,6 +98,28 @@ "type": "object", "additionalProperties": false }, + "ValidateErrorJSON": { + "properties": { + "message": { + "type": "string", + "enum": [ + "Validation failed" + ], + "nullable": false + }, + "details": { + "properties": {}, + "additionalProperties": {}, + "type": "object" + } + }, + "required": [ + "message", + "details" + ], + "type": "object", + "additionalProperties": false + }, "ReviewCreationParams": { "properties": { "text": { @@ -304,6 +326,16 @@ "responses": { "201": { "description": "Created" + }, + "422": { + "description": "Validation Failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidateErrorJSON" + } + } + } } }, "description": "Creates a review. Pass review information using request body.", @@ -420,6 +452,16 @@ "responses": { "201": { "description": "Created" + }, + "422": { + "description": "Validation Failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidateErrorJSON" + } + } + } } }, "description": "Creates a product. Pass product information using request body.", @@ -453,8 +495,7 @@ { "$ref": "#/components/schemas/Error" } - ], - "nullable": true + ] } } } diff --git a/src/app.ts b/src/app.ts index a91f17b0d0..376a884606 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,15 +1,9 @@ -import express, { - json, - urlencoded, - Response as ExResponse, - Request as ExRequest, - NextFunction, -} from 'express'; +import express, { json, urlencoded } from 'express'; import { RegisterRoutes } from '../build/routes'; import { connect } from 'mongoose'; import swaggerUi from 'swagger-ui-express'; import swaggerDocument from '../build/swagger.json'; -import { ValidateError } from 'tsoa'; +import { errorHandler, notFoundHandler } from './errors/errorHandlers'; export const app = express(); @@ -24,35 +18,11 @@ app.use(json()); app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); -//Import API routes, mount all under /api +// Import API routes, mount all under /api RegisterRoutes(app); -app.use(function notFoundHandler(_req, res: ExResponse) { - res.status(404).send({ - message: 'Not Found', - }); -}); - -const errorHandler = ( - err: unknown, - req: ExRequest, - res: ExResponse, - next: NextFunction -): void => { - if (err instanceof ValidateError) { - console.warn(`Caught Validation Error for ${req.path}:`, err.fields); - res.status(422).json({ - message: 'Validation Failed', - details: err?.fields, - }); - } - if (err instanceof Error) { - res.status(500).json({ - message: 'Internal Server Error', - }); - } - - next(); -}; +// Handle route not found +app.use(notFoundHandler); +// Handle errors app.use(errorHandler); diff --git a/src/errors/errorHandlers.ts b/src/errors/errorHandlers.ts new file mode 100644 index 0000000000..f0cab40e22 --- /dev/null +++ b/src/errors/errorHandlers.ts @@ -0,0 +1,30 @@ +import { Request, Response, NextFunction } from 'express'; +import { ValidateError } from 'tsoa'; + +export const errorHandler = ( + err: unknown, + req: Request, + res: Response, + next: NextFunction +): void => { + if (err instanceof ValidateError) { + console.warn(`Caught Validation Error for ${req.path}:`, err.fields); + res.status(422).json({ + message: 'Validation Failed', + details: err?.fields, + }); + } + if (err instanceof Error) { + console.warn(`Caught Error:`, err.message); + res.status(500).json({ + message: 'Internal Server Error', + }); + } + next(); +}; + +export const notFoundHandler = (_req: Request, res: Response) => { + res.status(404).send({ + message: 'Not Found', + }); +}; diff --git a/src/errors/errorTypes.ts b/src/errors/errorTypes.ts new file mode 100644 index 0000000000..7a15848fee --- /dev/null +++ b/src/errors/errorTypes.ts @@ -0,0 +1,4 @@ +export interface ValidateErrorJSON { + message: "Validation failed"; + details: { [name: string]: unknown }; +} \ No newline at end of file diff --git a/src/generate/generateService.ts b/src/generate/generateService.ts index 0f5c4fd198..99566ba179 100644 --- a/src/generate/generateService.ts +++ b/src/generate/generateService.ts @@ -1,23 +1,34 @@ import { Review } from '../reviews/reviewModel'; import { Product } from '../products/productModel'; import { buildProduct, buildReview } from './generateHelpers'; +import { MongooseError } from 'mongoose'; const PRODUCTS = 90; const REVIEWS = 5; export class GenerateService { public async generateData(): Promise { - for (let i = 0; i < PRODUCTS; i++) { - //Build product and add to database - const productDocument = await Product.create(buildProduct()); + try { + for (let i = 0; i < PRODUCTS; i++) { + //Build product and add to database - for (let i = 0; i < REVIEWS; i++) { - //Build review with productDocument._id - await Review.create({ - ...buildReview(), - productId: productDocument._id, - }); + const productDocument = await Product.create(buildProduct()); + console.log(`Created ${productDocument.name}`); + + for (let i = 0; i < REVIEWS; i++) { + //Build review with productDocument._id + const reviewDocument = await Review.create({ + ...buildReview(), + productId: productDocument._id, + }); + console.log(`Added review ${reviewDocument._id}`); + } + } + } catch (error) { + if (error instanceof MongooseError) { + throw new Error(`[generateData] ${error.message}`); } + throw new Error('[generateData] unknown error'); } } } diff --git a/src/products/productsController.ts b/src/products/productsController.ts index c0a0c1cf9c..ec4cf28866 100644 --- a/src/products/productsController.ts +++ b/src/products/productsController.ts @@ -8,6 +8,7 @@ import { Queries, Route, SuccessResponse, + Response, } from 'tsoa'; import { ProductsService } from './productsService'; import { @@ -16,6 +17,7 @@ import { ProductListResponse, ProductQueryParams, } from './productTypes'; +import { ValidateErrorJSON } from '../errors/errorTypes'; @Route('products') export class ProductsController extends Controller { @@ -39,9 +41,8 @@ export class ProductsController extends Controller { @Get('{productId}') public async getProductById( @Path() productId: string - ): Promise { + ): Promise { return new ProductsService().getProductById(productId); - // TODO: TomW return for product not found } /** @@ -53,6 +54,7 @@ export class ProductsController extends Controller { * "image": "https://via.placeholder.com/250?text=Product+Image" * } */ + @Response(422, 'Validation Failed') @SuccessResponse('201', 'Created') @Post() public async postProduct( diff --git a/src/products/productsService.ts b/src/products/productsService.ts index 7e64eca45d..6cbc236d01 100644 --- a/src/products/productsService.ts +++ b/src/products/productsService.ts @@ -10,6 +10,7 @@ import { returnFindOptions, returnSortOptions, } from './productHelpers'; +import { MongooseError } from 'mongoose'; export class ProductsService { public async getAllProducts({ @@ -43,18 +44,26 @@ export class ProductsService { totalPages: Math.ceil(count / limitAsInt), currentPage: pageAsInt, }; - } catch (err) { - throw new Error(); + } catch (error) { + if (error instanceof MongooseError) { + throw new Error(`[getAllProducts] ${error.message}`); + } + throw new Error('[getAllProducts] unknown error'); } } public async getProductById(productId: string): Promise { try { const productDocument = await Product.findById(productId); - if (!productDocument) throw new Error(); + if (!productDocument) + throw new Error('[getProductById] product not found'); return convertDocumentToProductDto(productDocument); } catch (error) { - throw new Error(); + if (error instanceof MongooseError) { + throw new Error(`[getProductById] ${error.message}`); + } + if (typeof error === 'string') throw new Error(error); + throw new Error('[getProductById] unknown error'); } } @@ -63,19 +72,30 @@ export class ProductsService { ): Promise { try { const productDocument = await Product.create(productToCreate); + if (!productDocument) + throw new Error('[createProduct] create product failed'); return convertDocumentToProductDto(productDocument); } catch (error) { - throw new Error(); + if (error instanceof MongooseError) { + throw new Error(`[createProduct] ${error.message}`); + } + if (typeof error === 'string') throw new Error(error); + throw new Error('[createProduct] unknown error'); } } public async deleteProduct(productId: string): Promise { try { const productDocument = await Product.findByIdAndDelete(productId); - if (!productDocument) throw new Error(); + if (!productDocument) + throw new Error('[deleteProduct] delete product failed'); return convertDocumentToProductDto(productDocument); } catch (error) { - throw new Error(); + if (error instanceof MongooseError) { + throw new Error(`[deleteProduct] ${error.message}`); + } + if (typeof error === 'string') throw new Error(error); + throw new Error('[deleteProduct] unknown error'); } } } diff --git a/src/reviews/reviewsController.ts b/src/reviews/reviewsController.ts index 5390c0d8b4..8a2350f69f 100644 --- a/src/reviews/reviewsController.ts +++ b/src/reviews/reviewsController.ts @@ -8,9 +8,15 @@ import { Queries, Route, SuccessResponse, + Response, } from 'tsoa'; -import { ReviewCreationParams, ReviewListResponse, ReviewQueryParams } from './reviewTypes'; +import { + ReviewCreationParams, + ReviewListResponse, + ReviewQueryParams, +} from './reviewTypes'; import { ReviewsService } from './reviewsService'; +import { ValidateErrorJSON } from '../errors/errorTypes'; @Route('reviews') export class ReviewsController extends Controller { @@ -36,6 +42,7 @@ export class ReviewsController extends Controller { * "productId": "", * } */ + @Response(422, 'Validation Failed') @SuccessResponse('201', 'Created') @Post() public async postProduct( @@ -56,6 +63,5 @@ export class ReviewsController extends Controller { this.setStatus(204); new ReviewsService().deleteReview(reviewId); return; - // TODO: TomW return for product not found } } diff --git a/src/reviews/reviewsService.ts b/src/reviews/reviewsService.ts index 7ac9359a11..f21d08d94c 100644 --- a/src/reviews/reviewsService.ts +++ b/src/reviews/reviewsService.ts @@ -1,7 +1,13 @@ +import { MongooseError } from 'mongoose'; import { Product } from '../products/productModel'; import { convertDocumentToReviewDto } from './reviewHelpers'; import { Review } from './reviewModel'; -import { ReviewCreationParams, ReviewDto, ReviewListResponse, ReviewQueryParams } from './reviewTypes'; +import { + ReviewCreationParams, + ReviewDto, + ReviewListResponse, + ReviewQueryParams, +} from './reviewTypes'; export class ReviewsService { public async getProductReviews( @@ -32,7 +38,10 @@ export class ReviewsService { currentPage: pageAsInt, }; } catch (error) { - throw new Error(); + if (error instanceof MongooseError) { + throw new Error(`[getProductReviews] ${error.message}`); + } + throw new Error('[getProductReviews] unknown error'); } } @@ -41,21 +50,31 @@ export class ReviewsService { ): Promise { try { const productDocument = await Product.findById(reviewToCreate.productId); - if (!productDocument) throw new Error(); + if (!productDocument) + throw new Error('[createReview] create review failed'); const reviewDocument = await Review.create(reviewToCreate); return convertDocumentToReviewDto(reviewDocument); } catch (error) { - throw new Error(); + if (error instanceof MongooseError) { + throw new Error(`[createReview] ${error.message}`); + } + if (typeof error === 'string') throw new Error(error); + throw new Error('[createReview] unknown error'); } } public async deleteReview(reviewId: string): Promise { try { const reviewDocument = await Review.findByIdAndDelete(reviewId); - if (!reviewDocument) throw new Error(); + if (!reviewDocument) + throw new Error('[deleteReview] delete review failed'); return convertDocumentToReviewDto(reviewDocument); } catch (error) { - throw new Error(); + if (error instanceof MongooseError) { + throw new Error(`[deleteReview] ${error.message}`); + } + if (typeof error === 'string') throw new Error(error); + throw new Error('[deleteReview] unknown error'); } } } diff --git a/src/server.ts b/src/server.ts index c6d0716bf9..445c56e7a2 100644 --- a/src/server.ts +++ b/src/server.ts @@ -3,5 +3,5 @@ import { app } from './app'; const port = process.env.PORT || 3000; app.listen(port, () => - console.log(`Example app listening at http://localhost:${port}`) + console.log(`App listening at http://localhost:${port}`) ); From a5dd0dd4b00c7d17eb5de78a5a76d378d17bceb6 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 12:17:26 -0400 Subject: [PATCH 10/27] feat(build-product): Add faker image url generator. --- src/generate/generateHelpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generate/generateHelpers.ts b/src/generate/generateHelpers.ts index c33162006e..ef55d58dd9 100644 --- a/src/generate/generateHelpers.ts +++ b/src/generate/generateHelpers.ts @@ -5,7 +5,7 @@ export const buildProduct = () => { category: faker.commerce.department(), name: faker.commerce.productName(), price: faker.commerce.price(), - image: 'https://via.placeholder.com/250?text=Product+Image', + image: faker.image.urlPicsumPhotos({ width: 320, height: 320 }), }; }; From 524d5282c82806a9ff9ef68c15b76fd104575573 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 12:53:31 -0400 Subject: [PATCH 11/27] refactor(monorepo): Switch to using yarn workspaces and monorepo for api and web. --- .gitignore | 29 +- README.md => apps/api/README.md | 0 apps/api/build/build/routes.js | 340 ++ apps/api/build/build/swagger.json | 559 +++ {build => apps/api/build}/routes.ts | 0 {build => apps/api/build}/src/app.js | 9 +- apps/api/build/src/errors/errorHandlers.js | 27 + .../api/build/src/errors/errorTypes.js | 0 .../build/src/generate/generateController.js | 39 +- .../api/build/src/generate/generateHelpers.js | 20 + .../api/build/src/generate/generateService.js | 43 + apps/api/build/src/products/productHelpers.js | 44 + .../api/build}/src/products/productModel.js | 2 +- apps/api/build/src/products/productTypes.js | 2 + .../build/src/products/productsController.js | 96 + .../api/build/src/products/productsService.js | 99 + apps/api/build/src/reviews/reviewHelpers.js | 8 + apps/api/build/src/reviews/reviewModel.js | 15 + apps/api/build/src/reviews/reviewTypes.js | 2 + .../build/src/reviews/reviewsController.js | 82 + apps/api/build/src/reviews/reviewsService.js | 86 + {build => apps/api/build}/src/server.js | 2 +- {build => apps/api/build}/swagger.json | 4 +- apps/api/build/tsconfig.tsbuildinfo | 1 + nodemon.json => apps/api/nodemon.json | 0 apps/api/package.json | 43 + {src => apps/api/src}/app.ts | 0 {src => apps/api/src}/errors/errorHandlers.ts | 0 {src => apps/api/src}/errors/errorTypes.ts | 0 .../api/src}/generate/generateController.ts | 0 .../api/src}/generate/generateHelpers.ts | 0 .../api/src}/generate/generateService.ts | 0 .../api/src}/products/productHelpers.ts | 0 .../api/src}/products/productModel.ts | 0 .../api/src}/products/productTypes.ts | 0 .../api/src}/products/productsController.ts | 0 .../api/src}/products/productsService.ts | 0 .../api/src}/reviews/reviewHelpers.ts | 0 {src => apps/api/src}/reviews/reviewModel.ts | 0 {src => apps/api/src}/reviews/reviewTypes.ts | 0 .../api/src}/reviews/reviewsController.ts | 0 .../api/src}/reviews/reviewsService.ts | 0 {src => apps/api/src}/server.ts | 0 tsconfig.json => apps/api/tsconfig.json | 0 .../api/tsconfig.tsbuildinfo | 0 tsoa.json => apps/api/tsoa.json | 0 apps/web/.prettierrc.json | 4 + apps/web/README.md | 27 + apps/web/eslint.config.js | 84 + apps/web/index.html | 14 + apps/web/package.json | 48 + apps/web/src/App.css | 39 + apps/web/src/App.test.tsx | 154 + apps/web/src/App.tsx | 64 + apps/web/src/app/createAppSlice.ts | 6 + apps/web/src/app/hooks.ts | 12 + apps/web/src/app/store.ts | 42 + .../src/features/counter/Counter.module.css | 81 + apps/web/src/features/counter/Counter.tsx | 80 + apps/web/src/features/counter/counterAPI.ts | 7 + .../src/features/counter/counterSlice.test.ts | 58 + apps/web/src/features/counter/counterSlice.ts | 89 + .../web/src/features/quotes/Quotes.module.css | 20 + apps/web/src/features/quotes/Quotes.tsx | 60 + .../web/src/features/quotes/quotesApiSlice.ts | 38 + apps/web/src/index.css | 13 + apps/web/src/logo.svg | 1 + apps/web/src/main.tsx | 24 + apps/web/src/setupTests.ts | 1 + apps/web/src/utils/test-utils.tsx | 65 + apps/web/src/vite-env.d.ts | 1 + apps/web/tsconfig.app.json | 28 + apps/web/tsconfig.json | 7 + apps/web/tsconfig.node.json | 27 + apps/web/vite.config.ts | 28 + build/build/routes.js | 122 - build/build/swagger.json | 206 -- build/src/products/productHelpers.js | 8 - build/src/products/productsService.js | 52 - build/tsconfig.tsbuildinfo | 1 - package.json | 46 +- yarn.lock | 3008 ++++++++++++++++- 82 files changed, 5621 insertions(+), 496 deletions(-) rename README.md => apps/api/README.md (100%) create mode 100644 apps/api/build/build/routes.js create mode 100644 apps/api/build/build/swagger.json rename {build => apps/api/build}/routes.ts (100%) rename {build => apps/api/build}/src/app.js (85%) create mode 100644 apps/api/build/src/errors/errorHandlers.js rename build/src/products/productsTypes.js => apps/api/build/src/errors/errorTypes.js (100%) rename build/src/products/productsController.js => apps/api/build/src/generate/generateController.js (58%) create mode 100644 apps/api/build/src/generate/generateHelpers.js create mode 100644 apps/api/build/src/generate/generateService.js create mode 100644 apps/api/build/src/products/productHelpers.js rename {build => apps/api/build}/src/products/productModel.js (100%) create mode 100644 apps/api/build/src/products/productTypes.js create mode 100644 apps/api/build/src/products/productsController.js create mode 100644 apps/api/build/src/products/productsService.js create mode 100644 apps/api/build/src/reviews/reviewHelpers.js create mode 100644 apps/api/build/src/reviews/reviewModel.js create mode 100644 apps/api/build/src/reviews/reviewTypes.js create mode 100644 apps/api/build/src/reviews/reviewsController.js create mode 100644 apps/api/build/src/reviews/reviewsService.js rename {build => apps/api/build}/src/server.js (60%) rename {build => apps/api/build}/swagger.json (97%) create mode 100644 apps/api/build/tsconfig.tsbuildinfo rename nodemon.json => apps/api/nodemon.json (100%) create mode 100644 apps/api/package.json rename {src => apps/api/src}/app.ts (100%) rename {src => apps/api/src}/errors/errorHandlers.ts (100%) rename {src => apps/api/src}/errors/errorTypes.ts (100%) rename {src => apps/api/src}/generate/generateController.ts (100%) rename {src => apps/api/src}/generate/generateHelpers.ts (100%) rename {src => apps/api/src}/generate/generateService.ts (100%) rename {src => apps/api/src}/products/productHelpers.ts (100%) rename {src => apps/api/src}/products/productModel.ts (100%) rename {src => apps/api/src}/products/productTypes.ts (100%) rename {src => apps/api/src}/products/productsController.ts (100%) rename {src => apps/api/src}/products/productsService.ts (100%) rename {src => apps/api/src}/reviews/reviewHelpers.ts (100%) rename {src => apps/api/src}/reviews/reviewModel.ts (100%) rename {src => apps/api/src}/reviews/reviewTypes.ts (100%) rename {src => apps/api/src}/reviews/reviewsController.ts (100%) rename {src => apps/api/src}/reviews/reviewsService.ts (100%) rename {src => apps/api/src}/server.ts (100%) rename tsconfig.json => apps/api/tsconfig.json (100%) rename tsconfig.tsbuildinfo => apps/api/tsconfig.tsbuildinfo (100%) rename tsoa.json => apps/api/tsoa.json (100%) create mode 100644 apps/web/.prettierrc.json create mode 100644 apps/web/README.md create mode 100644 apps/web/eslint.config.js create mode 100644 apps/web/index.html create mode 100644 apps/web/package.json create mode 100644 apps/web/src/App.css create mode 100644 apps/web/src/App.test.tsx create mode 100644 apps/web/src/App.tsx create mode 100644 apps/web/src/app/createAppSlice.ts create mode 100644 apps/web/src/app/hooks.ts create mode 100644 apps/web/src/app/store.ts create mode 100644 apps/web/src/features/counter/Counter.module.css create mode 100644 apps/web/src/features/counter/Counter.tsx create mode 100644 apps/web/src/features/counter/counterAPI.ts create mode 100644 apps/web/src/features/counter/counterSlice.test.ts create mode 100644 apps/web/src/features/counter/counterSlice.ts create mode 100644 apps/web/src/features/quotes/Quotes.module.css create mode 100644 apps/web/src/features/quotes/Quotes.tsx create mode 100644 apps/web/src/features/quotes/quotesApiSlice.ts create mode 100644 apps/web/src/index.css create mode 100644 apps/web/src/logo.svg create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/setupTests.ts create mode 100644 apps/web/src/utils/test-utils.tsx create mode 100644 apps/web/src/vite-env.d.ts create mode 100644 apps/web/tsconfig.app.json create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/tsconfig.node.json create mode 100644 apps/web/vite.config.ts delete mode 100644 build/build/routes.js delete mode 100644 build/build/swagger.json delete mode 100644 build/src/products/productHelpers.js delete mode 100644 build/src/products/productsService.js delete mode 100644 build/tsconfig.tsbuildinfo diff --git a/.gitignore b/.gitignore index dc150eb5da..af477adbff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,27 @@ -/node_modules -.env +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules/ +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.yalc/ +yalc.lock diff --git a/README.md b/apps/api/README.md similarity index 100% rename from README.md rename to apps/api/README.md diff --git a/apps/api/build/build/routes.js b/apps/api/build/build/routes.js new file mode 100644 index 0000000000..a7b1daaf31 --- /dev/null +++ b/apps/api/build/build/routes.js @@ -0,0 +1,340 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RegisterRoutes = RegisterRoutes; +const runtime_1 = require("@tsoa/runtime"); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +const reviewsController_1 = require("./../src/reviews/reviewsController"); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +const productsController_1 = require("./../src/products/productsController"); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +const generateController_1 = require("./../src/generate/generateController"); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +const models = { + "ReviewDto": { + "dataType": "refObject", + "properties": { + "_id": { "dataType": "string", "required": true }, + "text": { "dataType": "string", "required": true }, + "rating": { "dataType": "double", "required": true }, + "productId": { "dataType": "string", "required": true }, + "createdAt": { "dataType": "datetime", "required": true }, + "updatedAt": { "dataType": "datetime", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ReviewListResponse": { + "dataType": "refObject", + "properties": { + "reviews": { "dataType": "array", "array": { "dataType": "refObject", "ref": "ReviewDto" }, "required": true }, + "totalPages": { "dataType": "double", "required": true }, + "currentPage": { "dataType": "double", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "Error": { + "dataType": "refObject", + "properties": { + "name": { "dataType": "string", "required": true }, + "message": { "dataType": "string", "required": true }, + "stack": { "dataType": "string" }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ReviewQueryParams": { + "dataType": "refObject", + "properties": { + "page": { "dataType": "string" }, + "limit": { "dataType": "string" }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ValidateErrorJSON": { + "dataType": "refObject", + "properties": { + "message": { "dataType": "enum", "enums": ["Validation failed"], "required": true }, + "details": { "dataType": "nestedObjectLiteral", "nestedProperties": {}, "additionalProperties": { "dataType": "any" }, "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ReviewCreationParams": { + "dataType": "refObject", + "properties": { + "text": { "dataType": "string", "required": true }, + "rating": { "dataType": "double", "required": true }, + "productId": { "dataType": "string", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductDto": { + "dataType": "refObject", + "properties": { + "_id": { "dataType": "string", "required": true }, + "category": { "dataType": "string", "required": true }, + "name": { "dataType": "string", "required": true }, + "price": { "dataType": "double", "required": true }, + "image": { "dataType": "string", "required": true }, + "createdAt": { "dataType": "datetime", "required": true }, + "updatedAt": { "dataType": "datetime", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductListResponse": { + "dataType": "refObject", + "properties": { + "products": { "dataType": "array", "array": { "dataType": "refObject", "ref": "ProductDto" }, "required": true }, + "totalPages": { "dataType": "double", "required": true }, + "currentPage": { "dataType": "double", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductQueryParams": { + "dataType": "refObject", + "properties": { + "page": { "dataType": "string" }, + "limit": { "dataType": "string" }, + "category": { "dataType": "string" }, + "price": { "dataType": "union", "subSchemas": [{ "dataType": "enum", "enums": ["highest"] }, { "dataType": "enum", "enums": ["lowest"] }] }, + "query": { "dataType": "string" }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + "ProductCreationParams": { + "dataType": "refObject", + "properties": { + "name": { "dataType": "string", "required": true }, + "category": { "dataType": "string", "required": true }, + "price": { "dataType": "double", "required": true }, + "image": { "dataType": "string", "required": true }, + }, + "additionalProperties": false, + }, + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +}; +const templateService = new runtime_1.ExpressTemplateService(models, { "noImplicitAdditionalProperties": "throw-on-extras", "bodyCoercion": true }); +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +function RegisterRoutes(app) { + // ########################################################################################################### + // NOTE: If you do not see routes for all of your controllers in this file, then you might not have informed tsoa of where to look + // Please look into the "controllerPathGlobs" config option described in the readme: https://github.com/lukeautry/tsoa + // ########################################################################################################### + const argsReviewsController_getProductReviews = { + productId: { "in": "path", "name": "productId", "required": true, "dataType": "string" }, + queryParams: { "in": "queries", "name": "queryParams", "required": true, "ref": "ReviewQueryParams" }, + }; + app.get('/reviews/:productId', ...((0, runtime_1.fetchMiddlewares)(reviewsController_1.ReviewsController)), ...((0, runtime_1.fetchMiddlewares)(reviewsController_1.ReviewsController.prototype.getProductReviews)), function ReviewsController_getProductReviews(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsReviewsController_getProductReviews, request, response }); + const controller = new reviewsController_1.ReviewsController(); + yield templateService.apiHandler({ + methodName: 'getProductReviews', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsReviewsController_postProduct = { + requestBody: { "in": "body", "name": "requestBody", "required": true, "ref": "ReviewCreationParams" }, + }; + app.post('/reviews', ...((0, runtime_1.fetchMiddlewares)(reviewsController_1.ReviewsController)), ...((0, runtime_1.fetchMiddlewares)(reviewsController_1.ReviewsController.prototype.postProduct)), function ReviewsController_postProduct(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsReviewsController_postProduct, request, response }); + const controller = new reviewsController_1.ReviewsController(); + yield templateService.apiHandler({ + methodName: 'postProduct', + controller, + response, + next, + validatedArgs, + successStatus: 201, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsReviewsController_deleteProduct = { + reviewId: { "in": "path", "name": "reviewId", "required": true, "dataType": "string" }, + }; + app.delete('/reviews/:reviewId', ...((0, runtime_1.fetchMiddlewares)(reviewsController_1.ReviewsController)), ...((0, runtime_1.fetchMiddlewares)(reviewsController_1.ReviewsController.prototype.deleteProduct)), function ReviewsController_deleteProduct(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsReviewsController_deleteProduct, request, response }); + const controller = new reviewsController_1.ReviewsController(); + yield templateService.apiHandler({ + methodName: 'deleteProduct', + controller, + response, + next, + validatedArgs, + successStatus: 204, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_getAllProducts = { + queryParams: { "in": "queries", "name": "queryParams", "required": true, "ref": "ProductQueryParams" }, + }; + app.get('/products', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.getAllProducts)), function ProductsController_getAllProducts(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getAllProducts, request, response }); + const controller = new productsController_1.ProductsController(); + yield templateService.apiHandler({ + methodName: 'getAllProducts', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_getProductById = { + productId: { "in": "path", "name": "productId", "required": true, "dataType": "string" }, + }; + app.get('/products/:productId', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.getProductById)), function ProductsController_getProductById(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getProductById, request, response }); + const controller = new productsController_1.ProductsController(); + yield templateService.apiHandler({ + methodName: 'getProductById', + controller, + response, + next, + validatedArgs, + successStatus: undefined, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_postProduct = { + requestBody: { "in": "body", "name": "requestBody", "required": true, "ref": "ProductCreationParams" }, + }; + app.post('/products', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.postProduct)), function ProductsController_postProduct(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_postProduct, request, response }); + const controller = new productsController_1.ProductsController(); + yield templateService.apiHandler({ + methodName: 'postProduct', + controller, + response, + next, + validatedArgs, + successStatus: 201, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsProductsController_deleteProduct = { + productId: { "in": "path", "name": "productId", "required": true, "dataType": "string" }, + }; + app.delete('/products/:productId', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.deleteProduct)), function ProductsController_deleteProduct(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_deleteProduct, request, response }); + const controller = new productsController_1.ProductsController(); + yield templateService.apiHandler({ + methodName: 'deleteProduct', + controller, + response, + next, + validatedArgs, + successStatus: 204, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + const argsGenerateController_generateData = {}; + app.get('/generate', ...((0, runtime_1.fetchMiddlewares)(generateController_1.GenerateController)), ...((0, runtime_1.fetchMiddlewares)(generateController_1.GenerateController.prototype.generateData)), function GenerateController_generateData(request, response, next) { + return __awaiter(this, void 0, void 0, function* () { + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + let validatedArgs = []; + try { + validatedArgs = templateService.getValidatedArgs({ args: argsGenerateController_generateData, request, response }); + const controller = new generateController_1.GenerateController(); + yield templateService.apiHandler({ + methodName: 'generateData', + controller, + response, + next, + validatedArgs, + successStatus: 201, + }); + } + catch (err) { + return next(err); + } + }); + }); + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa + // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa +} +// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa diff --git a/apps/api/build/build/swagger.json b/apps/api/build/build/swagger.json new file mode 100644 index 0000000000..80922c6a2c --- /dev/null +++ b/apps/api/build/build/swagger.json @@ -0,0 +1,559 @@ +{ + "openapi": "3.0.0", + "components": { + "examples": {}, + "headers": {}, + "parameters": {}, + "requestBodies": {}, + "responses": {}, + "schemas": { + "ReviewDto": { + "properties": { + "_id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "rating": { + "type": "number", + "format": "double" + }, + "productId": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "_id", + "text", + "rating", + "productId", + "createdAt", + "updatedAt" + ], + "type": "object", + "additionalProperties": false + }, + "ReviewListResponse": { + "properties": { + "reviews": { + "items": { + "$ref": "#/components/schemas/ReviewDto" + }, + "type": "array" + }, + "totalPages": { + "type": "number", + "format": "double" + }, + "currentPage": { + "type": "number", + "format": "double" + } + }, + "required": [ + "reviews", + "totalPages", + "currentPage" + ], + "type": "object", + "additionalProperties": false + }, + "Error": { + "properties": { + "name": { + "type": "string" + }, + "message": { + "type": "string" + }, + "stack": { + "type": "string" + } + }, + "required": [ + "name", + "message" + ], + "type": "object", + "additionalProperties": false + }, + "ReviewQueryParams": { + "properties": { + "page": { + "type": "string" + }, + "limit": { + "type": "string" + } + }, + "type": "object", + "additionalProperties": false + }, + "ValidateErrorJSON": { + "properties": { + "message": { + "type": "string", + "enum": [ + "Validation failed" + ], + "nullable": false + }, + "details": { + "properties": {}, + "additionalProperties": {}, + "type": "object" + } + }, + "required": [ + "message", + "details" + ], + "type": "object", + "additionalProperties": false + }, + "ReviewCreationParams": { + "properties": { + "text": { + "type": "string" + }, + "rating": { + "type": "number", + "format": "double" + }, + "productId": { + "type": "string" + } + }, + "required": [ + "text", + "rating", + "productId" + ], + "type": "object", + "additionalProperties": false + }, + "ProductDto": { + "properties": { + "_id": { + "type": "string" + }, + "category": { + "type": "string" + }, + "name": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "_id", + "category", + "name", + "price", + "image", + "createdAt", + "updatedAt" + ], + "type": "object", + "additionalProperties": false + }, + "ProductListResponse": { + "properties": { + "products": { + "items": { + "$ref": "#/components/schemas/ProductDto" + }, + "type": "array" + }, + "totalPages": { + "type": "number", + "format": "double" + }, + "currentPage": { + "type": "number", + "format": "double" + } + }, + "required": [ + "products", + "totalPages", + "currentPage" + ], + "type": "object", + "additionalProperties": false + }, + "ProductQueryParams": { + "properties": { + "page": { + "type": "string" + }, + "limit": { + "type": "string" + }, + "category": { + "type": "string" + }, + "price": { + "type": "string", + "enum": [ + "highest", + "lowest" + ] + }, + "query": { + "type": "string" + } + }, + "type": "object", + "additionalProperties": false + }, + "ProductCreationParams": { + "properties": { + "name": { + "type": "string" + }, + "category": { + "type": "string" + }, + "price": { + "type": "number", + "format": "double" + }, + "image": { + "type": "string" + } + }, + "required": [ + "name", + "category", + "price", + "image" + ], + "type": "object", + "additionalProperties": false + } + }, + "securitySchemes": {} + }, + "info": { + "title": "api", + "version": "1.0.0", + "description": "A product list API", + "license": { + "name": "ISC" + }, + "contact": {} + }, + "paths": { + "/reviews/{productId}": { + "get": { + "operationId": "GetProductReviews", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReviewListResponse" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "description": "Retrieves a an array of reviews for a specific product Id.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", + "security": [], + "parameters": [ + { + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "string" + } + } + ] + } + }, + "/reviews": { + "post": { + "operationId": "PostProduct", + "responses": { + "201": { + "description": "Created" + }, + "422": { + "description": "Validation Failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidateErrorJSON" + } + } + } + } + }, + "description": "Creates a review. Pass review information using request body.", + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReviewCreationParams" + } + } + } + } + } + }, + "/reviews/{reviewId}": { + "delete": { + "operationId": "DeleteProduct", + "responses": { + "204": { + "description": "No Content" + } + }, + "description": "Deletes a single review using review Id in URL path.", + "security": [], + "parameters": [ + { + "description": "The unique review id.", + "in": "path", + "name": "reviewId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/products": { + "get": { + "operationId": "GetAllProducts", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProductListResponse" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "description": "Retrieves a an array of products. Requires URL query params page and limit.\nOptional URL query params page and limit.\nIf no page or limit given, only first 10 results returned.", + "security": [], + "parameters": [ + { + "in": "query", + "name": "page", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "category", + "required": false, + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "price", + "required": false, + "schema": { + "type": "string", + "enum": [ + "highest", + "lowest" + ] + } + }, + { + "in": "query", + "name": "query", + "required": false, + "schema": { + "type": "string" + } + } + ] + }, + "post": { + "operationId": "PostProduct", + "responses": { + "201": { + "description": "Created" + }, + "422": { + "description": "Validation Failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidateErrorJSON" + } + } + } + } + }, + "description": "Creates a product. Pass product information using request body.", + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProductCreationParams" + } + } + } + } + } + }, + "/products/{productId}": { + "get": { + "operationId": "GetProductById", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProductDto" + }, + { + "$ref": "#/components/schemas/Error" + } + ] + } + } + } + } + }, + "description": "Retrieves a single product using product Id in URL path.", + "security": [], + "parameters": [ + { + "description": "The unique product id.", + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "operationId": "DeleteProduct", + "responses": { + "204": { + "description": "No Content" + } + }, + "description": "Deletes a single product using product Id in URL path.", + "security": [], + "parameters": [ + { + "description": "The unique product id.", + "in": "path", + "name": "productId", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/generate": { + "get": { + "operationId": "GenerateData", + "responses": { + "201": { + "description": "Created" + } + }, + "description": "Generates products and reviews then saves them to the database.", + "security": [], + "parameters": [] + } + } + }, + "servers": [ + { + "url": "/" + } + ] +} diff --git a/build/routes.ts b/apps/api/build/routes.ts similarity index 100% rename from build/routes.ts rename to apps/api/build/routes.ts diff --git a/build/src/app.js b/apps/api/build/src/app.js similarity index 85% rename from build/src/app.js rename to apps/api/build/src/app.js index a9a929483f..60c035755f 100644 --- a/build/src/app.js +++ b/apps/api/build/src/app.js @@ -42,12 +42,17 @@ const routes_1 = require("../build/routes"); const mongoose_1 = require("mongoose"); const swagger_ui_express_1 = __importDefault(require("swagger-ui-express")); const swagger_json_1 = __importDefault(require("../build/swagger.json")); +const errorHandlers_1 = require("./errors/errorHandlers"); exports.app = (0, express_1.default)(); (0, mongoose_1.connect)('mongodb://localhost/products'); -exports.app.use('/api-docs', swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swagger_json_1.default)); exports.app.use((0, express_1.urlencoded)({ extended: true, })); exports.app.use((0, express_1.json)()); -//Import API routes, mount all under /api +exports.app.use('/docs', swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swagger_json_1.default)); +// Import API routes, mount all under /api (0, routes_1.RegisterRoutes)(exports.app); +// Handle route not found +exports.app.use(errorHandlers_1.notFoundHandler); +// Handle errors +exports.app.use(errorHandlers_1.errorHandler); diff --git a/apps/api/build/src/errors/errorHandlers.js b/apps/api/build/src/errors/errorHandlers.js new file mode 100644 index 0000000000..5b02832f9c --- /dev/null +++ b/apps/api/build/src/errors/errorHandlers.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.notFoundHandler = exports.errorHandler = void 0; +const tsoa_1 = require("tsoa"); +const errorHandler = (err, req, res, next) => { + if (err instanceof tsoa_1.ValidateError) { + console.warn(`Caught Validation Error for ${req.path}:`, err.fields); + res.status(422).json({ + message: 'Validation Failed', + details: err === null || err === void 0 ? void 0 : err.fields, + }); + } + if (err instanceof Error) { + console.warn(`Caught Error:`, err.message); + res.status(500).json({ + message: 'Internal Server Error', + }); + } + next(); +}; +exports.errorHandler = errorHandler; +const notFoundHandler = (_req, res) => { + res.status(404).send({ + message: 'Not Found', + }); +}; +exports.notFoundHandler = notFoundHandler; diff --git a/build/src/products/productsTypes.js b/apps/api/build/src/errors/errorTypes.js similarity index 100% rename from build/src/products/productsTypes.js rename to apps/api/build/src/errors/errorTypes.js diff --git a/build/src/products/productsController.js b/apps/api/build/src/generate/generateController.js similarity index 58% rename from build/src/products/productsController.js rename to apps/api/build/src/generate/generateController.js index 200bb279c6..271c9e44a2 100644 --- a/build/src/products/productsController.js +++ b/apps/api/build/src/generate/generateController.js @@ -5,9 +5,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; -var __param = (this && this.__param) || function (paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); } -}; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -18,30 +15,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ProductsController = void 0; +exports.GenerateController = void 0; const tsoa_1 = require("tsoa"); -const productsService_1 = require("./productsService"); -let ProductsController = class ProductsController extends tsoa_1.Controller { - getAllProducts(queryParams) { +const generateService_1 = require("./generateService"); +let GenerateController = class GenerateController extends tsoa_1.Controller { + /** + * Generates products and reviews then saves them to the database. + */ + generateData() { return __awaiter(this, void 0, void 0, function* () { - return new productsService_1.ProductsService().getAllProducts(queryParams); - }); - } - getByProductId(productId) { - return __awaiter(this, void 0, void 0, function* () { - return new productsService_1.ProductsService().getByProductId(productId); + return new generateService_1.GenerateService().generateData(); }); } }; -exports.ProductsController = ProductsController; -__decorate([ - (0, tsoa_1.Get)(), - __param(0, (0, tsoa_1.Queries)()) -], ProductsController.prototype, "getAllProducts", null); +exports.GenerateController = GenerateController; __decorate([ - (0, tsoa_1.Get)('{productId}'), - __param(0, (0, tsoa_1.Path)()) -], ProductsController.prototype, "getByProductId", null); -exports.ProductsController = ProductsController = __decorate([ - (0, tsoa_1.Route)('products') -], ProductsController); + (0, tsoa_1.SuccessResponse)('201', 'Created'), + (0, tsoa_1.Get)() +], GenerateController.prototype, "generateData", null); +exports.GenerateController = GenerateController = __decorate([ + (0, tsoa_1.Route)('generate') +], GenerateController); diff --git a/apps/api/build/src/generate/generateHelpers.js b/apps/api/build/src/generate/generateHelpers.js new file mode 100644 index 0000000000..7afcc46032 --- /dev/null +++ b/apps/api/build/src/generate/generateHelpers.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildReview = exports.buildProduct = void 0; +const faker_1 = require("@faker-js/faker"); +const buildProduct = () => { + return { + category: faker_1.faker.commerce.department(), + name: faker_1.faker.commerce.productName(), + price: faker_1.faker.commerce.price(), + image: faker_1.faker.image.urlPicsumPhotos({ width: 320, height: 320 }), + }; +}; +exports.buildProduct = buildProduct; +const buildReview = () => { + return { + text: faker_1.faker.lorem.paragraph(), + rating: faker_1.faker.number.int({ min: 1, max: 5 }), + }; +}; +exports.buildReview = buildReview; diff --git a/apps/api/build/src/generate/generateService.js b/apps/api/build/src/generate/generateService.js new file mode 100644 index 0000000000..b93355b9de --- /dev/null +++ b/apps/api/build/src/generate/generateService.js @@ -0,0 +1,43 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GenerateService = void 0; +const reviewModel_1 = require("../reviews/reviewModel"); +const productModel_1 = require("../products/productModel"); +const generateHelpers_1 = require("./generateHelpers"); +const mongoose_1 = require("mongoose"); +const PRODUCTS = 90; +const REVIEWS = 5; +class GenerateService { + generateData() { + return __awaiter(this, void 0, void 0, function* () { + try { + for (let i = 0; i < PRODUCTS; i++) { + //Build product and add to database + const productDocument = yield productModel_1.Product.create((0, generateHelpers_1.buildProduct)()); + console.log(`Created ${productDocument.name}`); + for (let i = 0; i < REVIEWS; i++) { + //Build review with productDocument._id + const reviewDocument = yield reviewModel_1.Review.create(Object.assign(Object.assign({}, (0, generateHelpers_1.buildReview)()), { productId: productDocument._id })); + console.log(`Added review ${reviewDocument._id}`); + } + } + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[generateData] ${error.message}`); + } + throw new Error('[generateData] unknown error'); + } + }); + } +} +exports.GenerateService = GenerateService; diff --git a/apps/api/build/src/products/productHelpers.js b/apps/api/build/src/products/productHelpers.js new file mode 100644 index 0000000000..331f825781 --- /dev/null +++ b/apps/api/build/src/products/productHelpers.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.returnFindOptions = exports.returnSortOptions = exports.convertDocumentToProductDto = void 0; +const convertDocumentToProductDto = (document) => { + const dto = document.toObject(); + return Object.assign(Object.assign({}, dto), { _id: dto._id.toString() }); +}; +exports.convertDocumentToProductDto = convertDocumentToProductDto; +/** + * Build sort options. Returns object conditional on the value of price param. + * @param {'highest' | 'lowest' | undefined} price - Optional. + * @returns {Record} Returns a record used by Mongoose to sort search results. + */ +const returnSortOptions = (price) => { + if (price === 'highest') + return { price: -1, createdAt: -1 }; + else if (price === 'lowest') + return { price: 1, createdAt: -1 }; + else + return { createdAt: -1 }; +}; +exports.returnSortOptions = returnSortOptions; +/** + * Format the find options for a product. + * Builds category and find objects. + * Returns object conditional on category or query being defined. + * @param {string | undefined} category - Optional product category. + * @param {string | undefined} query - Optional search query. + * @returns {FilterQuery} Returns a Mongoose query for Product model. + */ +const returnFindOptions = (category, query) => { + const categoryFindObject = { + category: { $regex: category, $options: 'i' }, + }; + const queryFindObject = { name: { $regex: query, $options: 'i' } }; + if (category && query) + return Object.assign(Object.assign({}, categoryFindObject), queryFindObject); + if (query) + return queryFindObject; + if (category) + return categoryFindObject; + return {}; +}; +exports.returnFindOptions = returnFindOptions; diff --git a/build/src/products/productModel.js b/apps/api/build/src/products/productModel.js similarity index 100% rename from build/src/products/productModel.js rename to apps/api/build/src/products/productModel.js index ac1a634f61..2c53a34de0 100644 --- a/build/src/products/productModel.js +++ b/apps/api/build/src/products/productModel.js @@ -8,8 +8,8 @@ const mongoose_1 = __importDefault(require("mongoose")); const { Schema, model } = mongoose_1.default; //This is the Product Schema const ProductSchema = new Schema({ - category: { type: String, required: true }, name: { type: String, required: true }, + category: { type: String, required: true }, price: { type: Number, required: true }, image: { type: String, required: true }, }, { timestamps: true }); diff --git a/apps/api/build/src/products/productTypes.js b/apps/api/build/src/products/productTypes.js new file mode 100644 index 0000000000..c8ad2e549b --- /dev/null +++ b/apps/api/build/src/products/productTypes.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/apps/api/build/src/products/productsController.js b/apps/api/build/src/products/productsController.js new file mode 100644 index 0000000000..e7f31babed --- /dev/null +++ b/apps/api/build/src/products/productsController.js @@ -0,0 +1,96 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProductsController = void 0; +const tsoa_1 = require("tsoa"); +const productsService_1 = require("./productsService"); +let ProductsController = class ProductsController extends tsoa_1.Controller { + /** + * Retrieves a an array of products. Requires URL query params page and limit. + * Optional URL query params page and limit. + * If no page or limit given, only first 10 results returned. + * @example "http://localhost:3000/products?page=1&limit=5" + */ + getAllProducts(queryParams) { + return __awaiter(this, void 0, void 0, function* () { + return new productsService_1.ProductsService().getAllProducts(queryParams); + }); + } + /** + * Retrieves a single product using product Id in URL path. + * @param {string} productId The unique product id. + */ + getProductById(productId) { + return __awaiter(this, void 0, void 0, function* () { + return new productsService_1.ProductsService().getProductById(productId); + }); + } + /** + * Creates a product. Pass product information using request body. + * @example { + * "name": "Scissors", + * "category": "tools", + * "price": 5.50, + * "image": "https://via.placeholder.com/250?text=Product+Image" + * } + */ + postProduct(requestBody) { + return __awaiter(this, void 0, void 0, function* () { + this.setStatus(201); + new productsService_1.ProductsService().createProduct(requestBody); + return; + }); + } + /** + * Deletes a single product using product Id in URL path. + * @param {string} productId The unique product id. + */ + deleteProduct(productId) { + return __awaiter(this, void 0, void 0, function* () { + this.setStatus(204); + new productsService_1.ProductsService().deleteProduct(productId); + return; + // TODO: TomW return for product not found + }); + } +}; +exports.ProductsController = ProductsController; +__decorate([ + (0, tsoa_1.Get)(), + __param(0, (0, tsoa_1.Queries)()) +], ProductsController.prototype, "getAllProducts", null); +__decorate([ + (0, tsoa_1.Get)('{productId}'), + __param(0, (0, tsoa_1.Path)()) +], ProductsController.prototype, "getProductById", null); +__decorate([ + (0, tsoa_1.Response)(422, 'Validation Failed'), + (0, tsoa_1.SuccessResponse)('201', 'Created'), + (0, tsoa_1.Post)(), + __param(0, (0, tsoa_1.Body)()) +], ProductsController.prototype, "postProduct", null); +__decorate([ + (0, tsoa_1.SuccessResponse)('204', 'No Content'), + (0, tsoa_1.Delete)('{productId}'), + __param(0, (0, tsoa_1.Path)()) +], ProductsController.prototype, "deleteProduct", null); +exports.ProductsController = ProductsController = __decorate([ + (0, tsoa_1.Route)('products') +], ProductsController); diff --git a/apps/api/build/src/products/productsService.js b/apps/api/build/src/products/productsService.js new file mode 100644 index 0000000000..36a557ffe3 --- /dev/null +++ b/apps/api/build/src/products/productsService.js @@ -0,0 +1,99 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ProductsService = void 0; +const productModel_1 = require("./productModel"); +const productHelpers_1 = require("./productHelpers"); +const mongoose_1 = require("mongoose"); +class ProductsService { + getAllProducts(_a) { + return __awaiter(this, arguments, void 0, function* ({ page, limit, category, price, query, }) { + try { + const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + const productDocuments = yield productModel_1.Product.find((0, productHelpers_1.returnFindOptions)(category, query)) + .skip(limitAsInt * (pageAsInt - 1)) + .limit(limitAsInt) + .sort((0, productHelpers_1.returnSortOptions)(price)); + const count = yield productModel_1.Product.countDocuments((0, productHelpers_1.returnFindOptions)(category, query)); + const productsDto = productDocuments.map((product) => { + return (0, productHelpers_1.convertDocumentToProductDto)(product); + }); + return { + products: productsDto, + totalPages: Math.ceil(count / limitAsInt), + currentPage: pageAsInt, + }; + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[getAllProducts] ${error.message}`); + } + throw new Error('[getAllProducts] unknown error'); + } + }); + } + getProductById(productId) { + return __awaiter(this, void 0, void 0, function* () { + try { + const productDocument = yield productModel_1.Product.findById(productId); + if (!productDocument) + throw new Error('[getProductById] product not found'); + return (0, productHelpers_1.convertDocumentToProductDto)(productDocument); + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[getProductById] ${error.message}`); + } + if (typeof error === 'string') + throw new Error(error); + throw new Error('[getProductById] unknown error'); + } + }); + } + createProduct(productToCreate) { + return __awaiter(this, void 0, void 0, function* () { + try { + const productDocument = yield productModel_1.Product.create(productToCreate); + if (!productDocument) + throw new Error('[createProduct] create product failed'); + return (0, productHelpers_1.convertDocumentToProductDto)(productDocument); + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[createProduct] ${error.message}`); + } + if (typeof error === 'string') + throw new Error(error); + throw new Error('[createProduct] unknown error'); + } + }); + } + deleteProduct(productId) { + return __awaiter(this, void 0, void 0, function* () { + try { + const productDocument = yield productModel_1.Product.findByIdAndDelete(productId); + if (!productDocument) + throw new Error('[deleteProduct] delete product failed'); + return (0, productHelpers_1.convertDocumentToProductDto)(productDocument); + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[deleteProduct] ${error.message}`); + } + if (typeof error === 'string') + throw new Error(error); + throw new Error('[deleteProduct] unknown error'); + } + }); + } +} +exports.ProductsService = ProductsService; diff --git a/apps/api/build/src/reviews/reviewHelpers.js b/apps/api/build/src/reviews/reviewHelpers.js new file mode 100644 index 0000000000..df23e28470 --- /dev/null +++ b/apps/api/build/src/reviews/reviewHelpers.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertDocumentToReviewDto = void 0; +const convertDocumentToReviewDto = (document) => { + const dto = document.toObject(); + return Object.assign(Object.assign({}, dto), { _id: dto._id.toString(), productId: dto.productId.toString() }); +}; +exports.convertDocumentToReviewDto = convertDocumentToReviewDto; diff --git a/apps/api/build/src/reviews/reviewModel.js b/apps/api/build/src/reviews/reviewModel.js new file mode 100644 index 0000000000..3ead04b8fe --- /dev/null +++ b/apps/api/build/src/reviews/reviewModel.js @@ -0,0 +1,15 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Review = void 0; +const mongoose_1 = __importDefault(require("mongoose")); +const { Schema, model } = mongoose_1.default; +//This is the Product Schema +const ReviewSchema = new Schema({ + text: { type: String, required: true }, + rating: { type: Number, required: true }, + productId: { type: Schema.Types.ObjectId, ref: 'Product' }, +}, { timestamps: true }); +exports.Review = model('Review', ReviewSchema); diff --git a/apps/api/build/src/reviews/reviewTypes.js b/apps/api/build/src/reviews/reviewTypes.js new file mode 100644 index 0000000000..c8ad2e549b --- /dev/null +++ b/apps/api/build/src/reviews/reviewTypes.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/apps/api/build/src/reviews/reviewsController.js b/apps/api/build/src/reviews/reviewsController.js new file mode 100644 index 0000000000..21ec4fa9d4 --- /dev/null +++ b/apps/api/build/src/reviews/reviewsController.js @@ -0,0 +1,82 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReviewsController = void 0; +const tsoa_1 = require("tsoa"); +const reviewsService_1 = require("./reviewsService"); +let ReviewsController = class ReviewsController extends tsoa_1.Controller { + /** + * Retrieves a an array of reviews for a specific product Id. + * Optional URL query params page and limit. + * If no page or limit given, only first 10 results returned. + * @example "http://localhost:3000/reviews/6839f26a130912d633d748c5?page=1&limit=5" + */ + getProductReviews(productId, queryParams) { + return __awaiter(this, void 0, void 0, function* () { + return new reviewsService_1.ReviewsService().getProductReviews(productId, queryParams); + }); + } + /** + * Creates a review. Pass review information using request body. + * @example { + * "text": "Colligo angustus delectatio ademptio cupio celer volubilis.", + * "rating": "5", + * "productId": "", + * } + */ + postProduct(requestBody) { + return __awaiter(this, void 0, void 0, function* () { + this.setStatus(201); + new reviewsService_1.ReviewsService().createReview(requestBody); + return; + }); + } + /** + * Deletes a single review using review Id in URL path. + * @param {string} reviewId The unique review id. + */ + deleteProduct(reviewId) { + return __awaiter(this, void 0, void 0, function* () { + this.setStatus(204); + new reviewsService_1.ReviewsService().deleteReview(reviewId); + return; + }); + } +}; +exports.ReviewsController = ReviewsController; +__decorate([ + (0, tsoa_1.Get)('{productId}'), + __param(0, (0, tsoa_1.Path)()), + __param(1, (0, tsoa_1.Queries)()) +], ReviewsController.prototype, "getProductReviews", null); +__decorate([ + (0, tsoa_1.Response)(422, 'Validation Failed'), + (0, tsoa_1.SuccessResponse)('201', 'Created'), + (0, tsoa_1.Post)(), + __param(0, (0, tsoa_1.Body)()) +], ReviewsController.prototype, "postProduct", null); +__decorate([ + (0, tsoa_1.SuccessResponse)('204', 'No Content'), + (0, tsoa_1.Delete)('{reviewId}'), + __param(0, (0, tsoa_1.Path)()) +], ReviewsController.prototype, "deleteProduct", null); +exports.ReviewsController = ReviewsController = __decorate([ + (0, tsoa_1.Route)('reviews') +], ReviewsController); diff --git a/apps/api/build/src/reviews/reviewsService.js b/apps/api/build/src/reviews/reviewsService.js new file mode 100644 index 0000000000..8657e4c635 --- /dev/null +++ b/apps/api/build/src/reviews/reviewsService.js @@ -0,0 +1,86 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReviewsService = void 0; +const mongoose_1 = require("mongoose"); +const productModel_1 = require("../products/productModel"); +const reviewHelpers_1 = require("./reviewHelpers"); +const reviewModel_1 = require("./reviewModel"); +class ReviewsService { + getProductReviews(productId_1, _a) { + return __awaiter(this, arguments, void 0, function* (productId, { page, limit }) { + try { + const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + const productDocument = yield productModel_1.Product.findById(productId); + if (!productDocument) + throw new Error(); + const reviewDocuments = yield reviewModel_1.Review.find({ productId }) + .skip(limitAsInt * (pageAsInt - 1)) + .limit(limitAsInt) + .sort({ createdAt: -1 }); + const count = yield reviewModel_1.Review.countDocuments({ productId }); + const reviewsDto = reviewDocuments.map((review) => { + return (0, reviewHelpers_1.convertDocumentToReviewDto)(review); + }); + return { + reviews: reviewsDto, + totalPages: Math.ceil(count / limitAsInt), + currentPage: pageAsInt, + }; + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[getProductReviews] ${error.message}`); + } + throw new Error('[getProductReviews] unknown error'); + } + }); + } + createReview(reviewToCreate) { + return __awaiter(this, void 0, void 0, function* () { + try { + const productDocument = yield productModel_1.Product.findById(reviewToCreate.productId); + if (!productDocument) + throw new Error('[createReview] create review failed'); + const reviewDocument = yield reviewModel_1.Review.create(reviewToCreate); + return (0, reviewHelpers_1.convertDocumentToReviewDto)(reviewDocument); + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[createReview] ${error.message}`); + } + if (typeof error === 'string') + throw new Error(error); + throw new Error('[createReview] unknown error'); + } + }); + } + deleteReview(reviewId) { + return __awaiter(this, void 0, void 0, function* () { + try { + const reviewDocument = yield reviewModel_1.Review.findByIdAndDelete(reviewId); + if (!reviewDocument) + throw new Error('[deleteReview] delete review failed'); + return (0, reviewHelpers_1.convertDocumentToReviewDto)(reviewDocument); + } + catch (error) { + if (error instanceof mongoose_1.MongooseError) { + throw new Error(`[deleteReview] ${error.message}`); + } + if (typeof error === 'string') + throw new Error(error); + throw new Error('[deleteReview] unknown error'); + } + }); + } +} +exports.ReviewsService = ReviewsService; diff --git a/build/src/server.js b/apps/api/build/src/server.js similarity index 60% rename from build/src/server.js rename to apps/api/build/src/server.js index 68242ae2ff..6af8318568 100644 --- a/build/src/server.js +++ b/apps/api/build/src/server.js @@ -2,4 +2,4 @@ Object.defineProperty(exports, "__esModule", { value: true }); const app_1 = require("./app"); const port = process.env.PORT || 3000; -app_1.app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`)); +app_1.app.listen(port, () => console.log(`App listening at http://localhost:${port}`)); diff --git a/build/swagger.json b/apps/api/build/swagger.json similarity index 97% rename from build/swagger.json rename to apps/api/build/swagger.json index a4a4fed69d..527b65f06d 100644 --- a/build/swagger.json +++ b/apps/api/build/swagger.json @@ -259,9 +259,9 @@ "securitySchemes": {} }, "info": { - "title": "clear", + "title": "api", "version": "1.0.0", - "description": "This project has been created by a student at Parsity, an online software engineering course. The work in this repository is wholly of the student based on a sample starter project that can be accessed by looking at the repository that this project forks.", + "description": "A product list API", "license": { "name": "ISC" }, diff --git a/apps/api/build/tsconfig.tsbuildinfo b/apps/api/build/tsconfig.tsbuildinfo new file mode 100644 index 0000000000..066463d51f --- /dev/null +++ b/apps/api/build/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../../node_modules/typescript/lib/lib.es6.d.ts","../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../node_modules/typescript/lib/lib.scripthost.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/file.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/filereader.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/dom-events.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts","../../../node_modules/@types/mime/index.d.ts","../../../node_modules/@types/send/index.d.ts","../../../node_modules/@types/qs/index.d.ts","../../../node_modules/@types/range-parser/index.d.ts","../../../node_modules/@types/express-serve-static-core/index.d.ts","../../../node_modules/@types/http-errors/index.d.ts","../../../node_modules/@types/serve-static/index.d.ts","../../../node_modules/@types/connect/index.d.ts","../../../node_modules/@types/body-parser/index.d.ts","../../../node_modules/@types/express/index.d.ts","../../../node_modules/reflect-metadata/index.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/deprecated.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/example.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/parameter.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/methods.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/tags.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/operationid.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/route.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/security.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/extension.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/middlewares.d.ts","../../../node_modules/@tsoa/runtime/dist/interfaces/controller.d.ts","../../../node_modules/@tsoa/runtime/dist/utils/isheadertype.d.ts","../../../node_modules/@tsoa/runtime/dist/interfaces/response.d.ts","../../../node_modules/@tsoa/runtime/dist/interfaces/iocmodule.d.ts","../../../node_modules/@tsoa/runtime/dist/interfaces/file.d.ts","../../../node_modules/@tsoa/runtime/dist/decorators/response.d.ts","../../../node_modules/@tsoa/runtime/dist/swagger/swagger.d.ts","../../../node_modules/@tsoa/runtime/dist/metadatageneration/tsoa.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/tsoa-route.d.ts","../../../node_modules/@types/multer/index.d.ts","../../../node_modules/@tsoa/runtime/dist/config.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/additionalprops.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/templatehelpers.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/templates/templateservice.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/templates/express/expresstemplateservice.d.ts","../../../node_modules/@hapi/boom/lib/index.d.ts","../../../node_modules/@hapi/podium/lib/index.d.ts","../../../node_modules/@hapi/shot/lib/index.d.ts","../../../node_modules/@hapi/hapi/lib/types/utils.d.ts","../../../node_modules/@hapi/mimos/lib/index.d.ts","../../../node_modules/@hapi/hapi/lib/types/route.d.ts","../../../node_modules/@hapi/catbox/lib/index.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/cache.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/encoders.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/events.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/ext.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/info.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/inject.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/methods.d.ts","../../../node_modules/@hapi/iron/lib/index.d.ts","../../../node_modules/@hapi/statehood/lib/index.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/state.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/options.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/server.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/auth.d.ts","../../../node_modules/@hapi/hapi/lib/types/server/index.d.ts","../../../node_modules/@hapi/hapi/lib/types/response.d.ts","../../../node_modules/@hapi/hapi/lib/types/request.d.ts","../../../node_modules/@hapi/hapi/lib/types/plugin.d.ts","../../../node_modules/@hapi/hapi/lib/types/index.d.ts","../../../node_modules/@hapi/hapi/lib/index.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/templates/hapi/hapitemplateservice.d.ts","../../../node_modules/@types/accepts/index.d.ts","../../../node_modules/@types/keygrip/index.d.ts","../../../node_modules/@types/cookies/index.d.ts","../../../node_modules/@types/http-assert/index.d.ts","../../../node_modules/@types/content-disposition/index.d.ts","../../../node_modules/@types/koa-compose/index.d.ts","../../../node_modules/@types/koa/index.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/templates/koa/koatemplateservice.d.ts","../../../node_modules/@tsoa/runtime/dist/routegeneration/templates/index.d.ts","../../../node_modules/@tsoa/runtime/dist/utils/assertnever.d.ts","../../../node_modules/@tsoa/runtime/dist/index.d.ts","../../../node_modules/typescript/lib/typescript.d.ts","../../../node_modules/@tsoa/cli/dist/routegeneration/routegenerator.d.ts","../../../node_modules/@tsoa/cli/dist/cli.d.ts","../../../node_modules/@tsoa/cli/dist/module/generate-spec.d.ts","../../../node_modules/@tsoa/cli/dist/module/generate-routes.d.ts","../../../node_modules/@tsoa/cli/dist/routegeneration/defaultroutegenerator.d.ts","../../../node_modules/@tsoa/cli/dist/index.d.ts","../../../node_modules/tsoa/dist/index.d.ts","../src/reviews/reviewtypes.ts","../../../node_modules/bson/bson.d.ts","../../../node_modules/mongodb/mongodb.d.ts","../../../node_modules/mongoose/types/aggregate.d.ts","../../../node_modules/mongoose/types/callback.d.ts","../../../node_modules/mongoose/types/collection.d.ts","../../../node_modules/mongoose/types/connection.d.ts","../../../node_modules/mongoose/types/cursor.d.ts","../../../node_modules/mongoose/types/document.d.ts","../../../node_modules/mongoose/types/error.d.ts","../../../node_modules/mongoose/types/expressions.d.ts","../../../node_modules/mongoose/types/helpers.d.ts","../../../node_modules/kareem/index.d.ts","../../../node_modules/mongoose/types/middlewares.d.ts","../../../node_modules/mongoose/types/indexes.d.ts","../../../node_modules/mongoose/types/models.d.ts","../../../node_modules/mongoose/types/mongooseoptions.d.ts","../../../node_modules/mongoose/types/pipelinestage.d.ts","../../../node_modules/mongoose/types/populate.d.ts","../../../node_modules/mongoose/types/query.d.ts","../../../node_modules/mongoose/types/schemaoptions.d.ts","../../../node_modules/mongoose/types/schematypes.d.ts","../../../node_modules/mongoose/types/session.d.ts","../../../node_modules/mongoose/types/types.d.ts","../../../node_modules/mongoose/types/utility.d.ts","../../../node_modules/mongoose/types/validation.d.ts","../../../node_modules/mongoose/types/inferschematype.d.ts","../../../node_modules/mongoose/types/inferrawdoctype.d.ts","../../../node_modules/mongoose/types/virtuals.d.ts","../../../node_modules/mongoose/types/augmentations.d.ts","../../../node_modules/mongoose/types/index.d.ts","../src/products/productmodel.ts","../src/reviews/reviewhelpers.ts","../src/reviews/reviewmodel.ts","../src/reviews/reviewsservice.ts","../src/errors/errortypes.ts","../src/reviews/reviewscontroller.ts","../src/products/producttypes.ts","../src/products/producthelpers.ts","../src/products/productsservice.ts","../src/products/productscontroller.ts","../../../node_modules/@faker-js/faker/dist/airline-bul6ntoj.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en.d.ts","../../../node_modules/@faker-js/faker/dist/locale/af_za.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ar.d.ts","../../../node_modules/@faker-js/faker/dist/locale/az.d.ts","../../../node_modules/@faker-js/faker/dist/locale/base.d.ts","../../../node_modules/@faker-js/faker/dist/locale/bn_bd.d.ts","../../../node_modules/@faker-js/faker/dist/locale/cs_cz.d.ts","../../../node_modules/@faker-js/faker/dist/locale/cy.d.ts","../../../node_modules/@faker-js/faker/dist/locale/da.d.ts","../../../node_modules/@faker-js/faker/dist/locale/de.d.ts","../../../node_modules/@faker-js/faker/dist/locale/de_at.d.ts","../../../node_modules/@faker-js/faker/dist/locale/de_ch.d.ts","../../../node_modules/@faker-js/faker/dist/locale/dv.d.ts","../../../node_modules/@faker-js/faker/dist/locale/el.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_au.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_au_ocker.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_bork.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_ca.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_gb.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_gh.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_hk.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_ie.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_in.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_ng.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_us.d.ts","../../../node_modules/@faker-js/faker/dist/locale/en_za.d.ts","../../../node_modules/@faker-js/faker/dist/locale/eo.d.ts","../../../node_modules/@faker-js/faker/dist/locale/es.d.ts","../../../node_modules/@faker-js/faker/dist/locale/es_mx.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fa.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fi.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fr.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fr_be.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fr_ca.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fr_ch.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fr_lu.d.ts","../../../node_modules/@faker-js/faker/dist/locale/fr_sn.d.ts","../../../node_modules/@faker-js/faker/dist/locale/he.d.ts","../../../node_modules/@faker-js/faker/dist/locale/hr.d.ts","../../../node_modules/@faker-js/faker/dist/locale/hu.d.ts","../../../node_modules/@faker-js/faker/dist/locale/hy.d.ts","../../../node_modules/@faker-js/faker/dist/locale/id_id.d.ts","../../../node_modules/@faker-js/faker/dist/locale/it.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ja.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ka_ge.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ko.d.ts","../../../node_modules/@faker-js/faker/dist/locale/lv.d.ts","../../../node_modules/@faker-js/faker/dist/locale/mk.d.ts","../../../node_modules/@faker-js/faker/dist/locale/nb_no.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ne.d.ts","../../../node_modules/@faker-js/faker/dist/locale/nl.d.ts","../../../node_modules/@faker-js/faker/dist/locale/nl_be.d.ts","../../../node_modules/@faker-js/faker/dist/locale/pl.d.ts","../../../node_modules/@faker-js/faker/dist/locale/pt_br.d.ts","../../../node_modules/@faker-js/faker/dist/locale/pt_pt.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ro.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ro_md.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ru.d.ts","../../../node_modules/@faker-js/faker/dist/locale/sk.d.ts","../../../node_modules/@faker-js/faker/dist/locale/sr_rs_latin.d.ts","../../../node_modules/@faker-js/faker/dist/locale/sv.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ta_in.d.ts","../../../node_modules/@faker-js/faker/dist/locale/th.d.ts","../../../node_modules/@faker-js/faker/dist/locale/tr.d.ts","../../../node_modules/@faker-js/faker/dist/locale/uk.d.ts","../../../node_modules/@faker-js/faker/dist/locale/ur.d.ts","../../../node_modules/@faker-js/faker/dist/locale/uz_uz_latin.d.ts","../../../node_modules/@faker-js/faker/dist/locale/vi.d.ts","../../../node_modules/@faker-js/faker/dist/locale/yo_ng.d.ts","../../../node_modules/@faker-js/faker/dist/locale/zh_cn.d.ts","../../../node_modules/@faker-js/faker/dist/locale/zh_tw.d.ts","../../../node_modules/@faker-js/faker/dist/locale/zu_za.d.ts","../../../node_modules/@faker-js/faker/dist/index.d.ts","../src/generate/generatehelpers.ts","../src/generate/generateservice.ts","../src/generate/generatecontroller.ts","./routes.ts","../../../node_modules/@types/swagger-ui-express/index.d.ts","./swagger.json","../src/errors/errorhandlers.ts","../src/app.ts","../src/server.ts","../../../node_modules/@types/webidl-conversions/index.d.ts","../../../node_modules/@types/whatwg-url/index.d.ts"],"fileIdsList":[[56,98,158,222,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,267,271,348],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,158,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,349,350,351,352],[56,98,158,230,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,230,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,347],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,345],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,264,346],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,268],[56,98,230,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,266,268,270],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,268,269],[56,98,231,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,230,231,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,265,266],[56,98,231,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,262,263,264],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,353],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261,272],[56,98,148,186,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,209,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,188,190,205,206,207,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,188,190,205,207,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,130,141,185,186,188,190,205,206,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,186,188,205,207,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,188,205,207,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,188,190,203,206,207,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,191,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,147,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,186,207,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,188,203,207,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,192,193,194,195,196,197,198,201,202,203,204,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,187,207,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,115,189,190,192,201,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,130,188,189,190,192,193,194,195,196,197,198,201,202,204,206,207,208,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,200,207,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,115,130,185,187,206,207,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,113,130,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,185,199,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,222,224,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,222,224,225,226,227,228,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,222,223,225,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,222,224,225,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,222,225,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,176,179,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,171,172,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,180,181,182,220,221,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,171,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,168,176,222,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,180,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,178,181,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,158,170,178,183,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,170,178,181,183,210,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,183,184,211,219,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,170,178,183,218,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,170,178,181,182,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,177,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,148,156,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,148,156,158,213,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,113,148,150,151,152,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,153,155,157,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,218,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,97,98,110,113,114,118,124,141,148,154,212,213,214,215,216,217,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,158,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,95,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,97,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,103,133,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,99,104,110,111,118,130,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,99,100,110,118,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[51,52,53,56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,101,142,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,102,103,111,119,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,103,130,138,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,104,106,110,118,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,97,98,105,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,106,107,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,108,110,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,97,98,110,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,111,112,130,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,111,112,125,130,133,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,93,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,93,98,106,110,113,118,130,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,111,113,114,118,130,138,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,115,130,138,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[54,55,56,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,116,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,117,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,106,110,118,130,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,119,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,120,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,97,98,121,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,95,96,97,98,99,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,123,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,124,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,125,126,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,125,127,142,144,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,130,131,133,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,132,133,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,131,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,133,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,134,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,95,98,130,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,136,137,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,136,137,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,103,118,130,138,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,139,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,118,140,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,124,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,103,142,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,143,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,117,144,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,145,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,112,121,130,133,141,144,146,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,147,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,111,130,148,149,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,113,148,150,154,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,155,158,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,106,110,118,130,138,232,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261],[56,98,233,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,232,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261],[56,98,234,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,233,234,235,236,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,234,235,236,237,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,236,237,238,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,236,237,238,239,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,234,235,236,237,238,239,240,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,236,237,238,239,240,241,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,110,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261],[56,98,233,234,235,236,237,238,239,240,241,242,244,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,259,261],[56,98,234,235,236,237,238,239,240,241,242,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,130,234,235,236,237,238,239,240,241,242,244,245,246,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,250,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,251,252,253,254,255,256,257,258,259,261],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,261],[56,98,232,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,253,254,255,256,257,258,259,260,261],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,261],[56,98,232,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,255,256,257,258,259,260,261],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,256,257,258,259,261],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,257,258,259,261],[56,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,261],[56,98,222,229,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,69,98,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,98,130,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,60,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,62,65,98,138,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,118,138,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,98,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,60,98,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,62,65,98,118,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,57,58,61,64,98,110,130,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,72,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,57,63,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,86,87,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,61,65,98,133,141,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,86,98,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,59,60,98,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,80,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,72,73,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,63,65,73,74,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,64,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,57,60,65,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,65,69,73,74,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,69,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,63,65,68,98,141,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,57,62,65,72,98,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261],[56,60,65,86,98,146,148,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,261]],"fileInfos":[{"version":"df039a67536fe2acc3affdcbfb645892f842db36fe599e8e652e2f0c640a90d1","impliedFormat":1},{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a4ef5ccfd69b5bc2a2c29896aa07daaff7c5924a12e70cb3d9819145c06897db","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4a1c5b43d4d408cb0df0a6cc82ca7be314553d37e432fc1fd801bae1a9ab2cb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"c6ab0dd29bf74b71a54ff2bbce509eb8ae3c4294d57cc54940f443c01cd1baae","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"86ea91bfa7fef1eeb958056f30f1db4e0680bc9b5132e5e9d6e9cfd773c0c4fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7832b05a98f791dcd408cff8699e95fcab73bbfae26ba9a13af5ec4a60f485d","impliedFormat":1},{"version":"9a9e62acbe3cf36141e3d76efa0eaf33ed21b51a90bc1d39c9f880ff4e0bdf87","impliedFormat":1},{"version":"b2453c7a4fe9e3e77f3a75945caa0dabe76a28ebb6dbffc4aef21309e68f6aa5","impliedFormat":1},{"version":"db09d88a24d5f720614b68a66a866e32643fc92444c0e3fd252263b2606ea10a","impliedFormat":1},{"version":"74a0f20e0b110436f175d6e531ef48120c2adc9702e2ca58b31392d2099071cf","impliedFormat":1},{"version":"70f71f639d94715dcf0577fae64d8b5829e89bf8cda1170473e68b8fdeb44378","impliedFormat":1},{"version":"2aeb069895578bac240d9d7317732b6d0ceb1ee25102bcee4b57c4e39bad965f","impliedFormat":1},{"version":"f6aaa84bca2234a227471cc26972b4cc9422afaab8d7f2d6ef51b8bc636bf58b","impliedFormat":1},{"version":"34d56740fa13eebf2b689742daf0d1834205cb9610db1df58403f6abb9adf919","impliedFormat":1},{"version":"29c621fbfd32afa52882955cf8638014e1039113174676edacc6c5b9228205f6","impliedFormat":1},{"version":"f30edc69b36565d72e55c6ebabf021455226cbf700172309e943b3c0caf326e6","impliedFormat":1},{"version":"950cdd2282ca4b38a5c2eadb727b9e2cdd936fabf0b92e36e72362cac0fd6ec5","impliedFormat":1},{"version":"b374d291655bd46fe2fa5e327586c4069361e8f2608df93e8325def3d86edf0f","impliedFormat":1},{"version":"ce9e81a19499c853c33dd83bff81daebd2931bf61e2399d81d26506573ad5928","impliedFormat":1},{"version":"5a67d052a6e4ff50663c6d5e3d807f46f4d1693ff91f6a1c83d6a557afdf6a82","impliedFormat":1},{"version":"5cb4013b09b175e02ef6c97658def451c2ae7338366af048486e3a57f526e118","impliedFormat":1},{"version":"d87e41029923fb44228d4d396aaa481d3270e0b8cf9595fcd81f187695b72c04","impliedFormat":1},{"version":"2b1dc75f0b51f7363a3fca64f48e20bd09aaf6b21446a042be9111ecb5599641","impliedFormat":1},{"version":"38e4e4bed98e94d700ff89caa521840affb5e6225abc1f1f1d17fcde12ae8e58","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3e78c2d0093f1283766ea1cf413bdb568f6e3fba30ca6979ca9c467dbd77af8","impliedFormat":1},{"version":"e800ed99d20215a12965bf7502f1371e1b46846551466c0ecda7443bc3225c5a","impliedFormat":1},{"version":"98e5b74c90814ada4ebbc8c6150a23e3fd19989f90c8fccd0219e06119c0966b","impliedFormat":1},{"version":"d134613e3638d004eab97a48b925856dcf3314484cbfe3145b148d7acc993b34","impliedFormat":1},{"version":"7ed10b8a09889585e37a93cc3d4d193995518913779650b2fec0f9896d112340","impliedFormat":1},{"version":"42289160bd23270bd10e956093df608f8a91243e2b2cdbd629c79744340a86cd","impliedFormat":1},{"version":"1bdd7e96e94e3ecd6720bc3a57de1e13760003ca03a8c6ee81c9ae9d12400c93","impliedFormat":1},{"version":"e7d3856062ae83e9903cefa63eb6d2b66fc2d084719e4f4c91dff80e1a679ef6","impliedFormat":1},{"version":"32b4066cafeacbba5af922904b0353e9db488e9e34dfa6528c979733fcf18532","impliedFormat":1},{"version":"ac830864d40131ddd4e739c7011a6fa023b9aeb9229367afa85305962321f91f","impliedFormat":1},{"version":"ea7b76d925ebcbbac1f8fc807b711f095b7633d5a08089762d7323569c4077be","impliedFormat":1},{"version":"536ce6090e9826d91d9b73557f27954d3f9b98c1b1c8b8e004d933677f7b0079","impliedFormat":1},{"version":"24923854943027b359d554b2a122a6e5d9360645f7a6354ac0c0534781cee1a0","impliedFormat":1},{"version":"352b4dc64333e91f53a15980fcc0bed2e062303a76c6b9717ec314dfbe29e93a","impliedFormat":1},{"version":"09bbc977cabb5cd49235e60ff89b77289fe6fa42aa2c472a524c845dc5f4c6fc","impliedFormat":1},{"version":"406717fd8feb6645442dff23a4821d3b6431438e047bdb49b5d37d8d84e49885","impliedFormat":1},{"version":"739d28fd2f30200f9147061c2a8928522d161c55335245003fa2db027d44880c","impliedFormat":1},{"version":"5139d33aeb679963a5d6337232c551464ccaca4661dddf2567f6abbf24e9a140","impliedFormat":1},{"version":"1b4ea9bdde8fb36710a1cde149e647c2e4b63a47132b3d404e76aa1469f10250","impliedFormat":1},{"version":"6a9d3a15e3f0679a1552e5b0f7fae3361536d5eac476b29f3d0b65dd2c672621","impliedFormat":1},{"version":"524fa80c39ce5ea4097eff4b21835738099f26c6dbe51f537873a37488b7d65a","impliedFormat":1},{"version":"6da5df3051db43101fbc4b64ab0c22cff1bdcec8f0324f8e8a305018dc4acc5d","impliedFormat":1},{"version":"7b44a75ca0913e8af7775ee46a9138e5a801521a708c4574c75ffd1e722d5aa0","impliedFormat":1},{"version":"11842523b052ea1cb88c81cdca2922244122b1cad318adcce2e465d48e0a52f8","impliedFormat":1},{"version":"622593b400ce3032a71addf4204c41bac042721ab985de7e42d086558b13a337","impliedFormat":1},{"version":"d243e8eb5a04f2044d9379cf27d881e8ba4be6ba38c66d921c409b46f6d78927","impliedFormat":1},{"version":"22a8a4f9138f039c4c8316d555a1c3715e56f047ed635a578027c08e197ada2b","impliedFormat":1},{"version":"0a5504004bb9a28cee0cd9d04a9b475ca33cde579f5148266b2df3cafc95bafc","impliedFormat":1},{"version":"759b043215e42ea84b4dd5950d993ed124c05bad56bd58397a363e25d0ee62de","impliedFormat":1},{"version":"0e495d33df5bad752abb97f26cf261a6db6dd102dc1e689ba477cdb70e411935","impliedFormat":1},{"version":"d5c19655468e29f60c871b21e73af8ebc653f736e7123ade916f22c4a5f80ce5","impliedFormat":1},{"version":"34a413bafdeae24c5b5419609be63b85255c5d56a4e3185b016e2329a8f13ec4","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"2224f3072e3cc07906eeed5c71746779511fba2dd224addc5489bcdb489bdee5","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"c96e47b3fbf3912887565641f4810f585dea9550eb2a31d91b1543c94cb6aed7","impliedFormat":1},{"version":"a03e9f9bf9fc56c6785a8d5b5bb8a99669acb38dd885afcb4d58673c9c7c0286","impliedFormat":1},{"version":"2f1c0d14f39377282b5dbf908502f5e82141b075770a1f3cd673bca11607a846","impliedFormat":1},{"version":"4ae86b01844cfd5116902a40ad3dd7e7659ea449279e21d2917413a2cfb5077c","impliedFormat":1},{"version":"c302df1d6f371c6064cb5f4d0b41165425b682b287a3b8625527b2752eb433ee","impliedFormat":1},{"version":"09762428597d0079f6ac0785ec4a24471a43796c5517bfbd0606aa163d651660","impliedFormat":1},{"version":"dd2d20937dbd382340d7364a6153c5a71a04e222fa33a26d255dc668e21eb196","impliedFormat":1},{"version":"2a8d9c59c5e85f41cec149485aca6481deb5c32b580dd0ea08d499cc9bfc0b2f","impliedFormat":1},{"version":"1ceda047afdd4436db76576b2bfc72d047c08982ebb40c66aab8bcabf195b8e4","impliedFormat":1},{"version":"fdbd67a5466c4f0dd609b37ddfdfe8ffc3955188f7494922ac7e85f83d3cf11c","impliedFormat":1},{"version":"5e9892fdebf7c79987e0d4cb48941f796a35582f8810bb96c89a31e5d396df8b","impliedFormat":1},{"version":"fd550ecb67f4fa6cc8c8f08d84c072afda2645c001aed5825d0be8e767b8e571","impliedFormat":1},"66eb7e967d0508fb1a80bf9c2db129a22ccca3b09a6e1f6476b78be70fa710fe",{"version":"359e7188a3ad226e902c43443a45f17bd53bf279596aece7761dc72ffa22b30d","impliedFormat":1},{"version":"d8d9529a7f6c742de51ba5eecaa47fdab38f123af1b5280a1a6956de553e5fe9","impliedFormat":1},{"version":"403c4f2906f58407d454a401daf0fa59cbd683824b444b3151075bc3a6714c48","impliedFormat":1},{"version":"0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","impliedFormat":1},{"version":"35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","impliedFormat":1},{"version":"c9604ed0199a5ae1e86f9c17a981d297141bc0b3c4f51d88322859294f77f3ce","impliedFormat":1},{"version":"13a4d931c625360ab1cbf68961b13a60969a17cf3247bd60e18a49fb498b68e5","impliedFormat":1},{"version":"80b2eb4a470b8c3ef6709da5c3f8cd827d3b92b1bc96ec0ae661cc6eb7b213da","impliedFormat":1},{"version":"fe677c6e53f1eddbcc00af336d3ffbada25e6e0aa05a0fb5f10c818b5b6b6aa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"89cbb41c032a8602412a55d89c9fbee8af199ffb3e89e52a0306d42518f491c3","impliedFormat":1},{"version":"3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","impliedFormat":1},{"version":"021fbcae20ddc7ca7bf04cdb02a8c51f0d96afdde6a8462fb73b09ab4136ff7a","impliedFormat":1},{"version":"d2ce9e0d3035ad20bc34eb6177cd4a6ced475367170d8e46860598fe49dd9b3e","impliedFormat":1},{"version":"8443bbb1e167b4cca6d192eab6f9ab94442054f9b1c945f05070c23896396365","impliedFormat":1},{"version":"4e402f9d1887c077981d4668089ee20192bbfa7450b8abb36af3efa100fc1298","impliedFormat":1},{"version":"bbe98bf29952b80a91789cc6a3a3727aa958e652f32b145740229fe4b02f2a0a","impliedFormat":1},{"version":"18e0fa134b9df012b043ee0fc9698d7b1666c7e7df7918bf465a79c89742fbfc","impliedFormat":1},{"version":"3016511eadb560b6874050f8ff2ca671c64a663a48c60a24e3e7ddef92c3b095","impliedFormat":1},{"version":"ab066772d4672b6cfa1196820df536fa225888dbc9bf9cf68ce1173bc03d433b","impliedFormat":1},{"version":"9ee85178017faacec870ca5b75c292d6d1d6d6f4e81d42c79c4cf73b63a303d8","impliedFormat":1},{"version":"788a2d9ffaccf9ce65d321472ff3daaf9ab864504fad41753b978bfbd5e9ea71","impliedFormat":1},{"version":"861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","impliedFormat":1},{"version":"8d35820323a2758d61684679eddc3f1d0cc051c55258b3243aee14b6b8e285c1","impliedFormat":1},{"version":"8c418189bb1daec5e7736b6301345487e6f8f3c8ba49ef538e330e6003a47c87","impliedFormat":1},{"version":"da440f879ec47f7113408fb75f239f437b9ee812fba67562c499f10ef012464a","impliedFormat":1},{"version":"e78e58cf1d0a34668fe7365a0eeef0d85c67d81f15aaf976d9d45999b0baa9d5","impliedFormat":1},{"version":"b8de1c91d357f855aee17e06083abbf345cae76454548d1d112b9bc0d4f35821","impliedFormat":1},{"version":"f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","impliedFormat":1},{"version":"448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702","impliedFormat":1},{"version":"969ce33d76b1de933ab58f84db2936508252babf91875d429a3ce6a9961ec41e","affectsGlobalScope":true,"impliedFormat":1},"1f1a42b1ec885eb34b38e37dd992bac48c3b00199abc18e0546dcacd105d332c","263f464747265dda6eeee1092b004003979274cfb71769e79487d73403ea30cf","024396b467dca6be5fe590c0031aa5ee415f84fa1d93e923561c2d89455a3ffd","842d65459d7ad9706ae5becce92846d48c644e802f9ed2c5b68702d61648649e","cb08495e0fbca0726669d264d2a3bf37476d07e469ae0c3bf42c6bb5dee46931","9ff86a9362b2f2410b5ef4aa45f8052849d2364f6fcbc428afc9d4a02e99af7b","03c9996afb26cb6edbb96807096676e240468b75a93a8b5a01ef35116318b1f5","b84f18671201a6954fae588d1676fd030ce3a64e72111ab33516bce42ff387f6","44339af02ac6293f839294d7ca9d34bf077d93119801ce9966934ca12dfa9667","f82f39dee3ec53a88a027f528251cfaf865cfed6e2da2744f63ee726a7d88f13",{"version":"6862a89bb2bd09ffe5371c871f939fd9600e16e95cae0566eccddda7cc58dd08","impliedFormat":99},{"version":"5785aa947d1fce8b8f86149b99a3958cb2ada189e70a312cc40e8431858b72da","impliedFormat":99},{"version":"07161d68a983b48d3be316c23b37c0bc79d37273ce686edaf980c1fdff29ca20","impliedFormat":99},{"version":"074d092a83ebd58f76768f7c02555e75dd67fa8f1d10a75d09243a2935200409","impliedFormat":99},{"version":"2eb95413458520a281ed9c22b4b2e844ca253d013811a092e6054381ab63d658","impliedFormat":99},{"version":"a8bec172a1c2499dd64a50ecdc64e73998f6d9884d4958dd2cbc906c4bf64ff0","impliedFormat":99},{"version":"b2bd8852ead7b3f4c814260bd88a6f4fd0602c3da86e0ae0b6e02e55f06cbb3a","impliedFormat":99},{"version":"9138d2941a0d2d1cd6530e803bc677c888f5a6c9e20c137a3246f5149d8e86ff","impliedFormat":99},{"version":"4090e1a25812c396ea3220f67097009c535ba87caf2f8471cebfdcd1210674b6","impliedFormat":99},{"version":"9d3a4e5c12c558f0d70c04a34264dcb273e7bc48936054e26c176d6b337e63a1","impliedFormat":99},{"version":"58455f44d42809d87936b4e1c085134530e42e8ed72f5e3e8df88a18e153e319","impliedFormat":99},{"version":"9329daa8c52344aed931be071e54a8c0863b76029747d8c8134530d34a4e90b0","impliedFormat":99},{"version":"b2a14a8a7dc975f6f2a40206ef41042338eb4af9dae3499cbee50c515622ad94","impliedFormat":99},{"version":"84a0b2568a72b886d9fc06d9a6c65af568a553e6922c8289856af98ace889f94","impliedFormat":99},{"version":"252f712e3b04acd146e67f352ff4c2a35886ae0f4e9eb3f2282d92633f636346","impliedFormat":99},{"version":"2781b98d180bff888288cc9cfc7950947d8d089daad82e3f9ac70f449c44d0e4","impliedFormat":99},{"version":"b28c2eec56949ad20dc9d2c95ee5b89ffbe69244a1d348fc493b725e6935ef77","impliedFormat":99},{"version":"1011953c95ec65571b49d49aaf4807707f60f460407c5431dad04509587d2a21","impliedFormat":99},{"version":"2a1dbadcfb0c1a58b096040ca8a1daa1171f2508420b2b279d5c4c7ea9cd1938","impliedFormat":99},{"version":"721e50575d5d9e2e1345a832a28c52c5651f298f57f93fd23d366fab4a3414fb","impliedFormat":99},{"version":"a23ec1dd72dd1b45771fbfa90eec13534c7039190e7a0c6a783133da518ba624","impliedFormat":99},{"version":"2e8ada03d0287e71f522d2323a8085d9c608036f83d091eb4d7c8b6ebcc74824","impliedFormat":99},{"version":"e810d77fdd00656334e68517a06a1857c9e04ee7500a9596e5e9222dfa81cfcd","impliedFormat":99},{"version":"422d0cbb02f5408e84cd73279b9be8e6fcab7c94663945e93c811606d8771dd7","impliedFormat":99},{"version":"4ba0c865e60afbcfc7cf343a60910ee91c0d92cffb7cccef193864e747ab73f3","impliedFormat":99},{"version":"59a64e8a2add9023e7131ef29463e8c851a4c98d2aebd9ca835cf3f84954f573","impliedFormat":99},{"version":"053b17d014cdbda1337a56591e631f44eee628cdccf37b859f24123722374380","impliedFormat":99},{"version":"18ca1c54dbc60b29d1499487c7f8379bcc66008c53d30875384097b8bf742c2a","impliedFormat":99},{"version":"f4734269727fc59b48d5883b7614d00e4f54695fcefa1681a3c60e37f23fd4c2","impliedFormat":99},{"version":"babcae356ec5155a8982782c62954d7935ae0feb7025fb5ffea2e389e9f41306","impliedFormat":99},{"version":"1d3888d5f326fc031b0decaaad450ca2717fda34cd10f434b50aac92d102542a","impliedFormat":99},{"version":"34567456237a880a61d68c400a8265e041749792d8d0f6f915cf283bc073a2e3","impliedFormat":99},{"version":"6b612e1bbec947e39aa0127765f6a8165ce75be19e76731060bedaec5363f687","impliedFormat":99},{"version":"27ca0833efe6a99149659b1369f6f3c29b81e4d559243b8017f99d7536261ad2","impliedFormat":99},{"version":"7da4f1fa4c6f006b5904ad23f111f698b60fd09cf5666cd310fd062ed24e18bb","impliedFormat":99},{"version":"a4cd0ec056ae98d57cc2f955bdd29da4f1d72cc98f8da6556720b5e98486d375","impliedFormat":99},{"version":"fccf8d102918bf019c3630d021e956cba9823acc9b0b316fbfa50ac2296c21a4","impliedFormat":99},{"version":"7d0ed94ed92ef3ada085aee2e8ed341d6ddb7494af1935971598379e531cc99b","impliedFormat":99},{"version":"f081178212a0960a8c8c8da815c1e92631f1cce9fc3be08c804ee858f124e082","impliedFormat":99},{"version":"3de3cae96d613eda7930bbb7264792f9736616551cd14ff293dfef48739823fd","impliedFormat":99},{"version":"abf996a40bd492a368647ad6ee270e5891b10b8387c1e1b496e5caad44545f5a","impliedFormat":99},{"version":"f5a6e1e31d5b7ac3b2f052ba149262640fa1bfd6eab4eaf18a32d8bd8e9331be","impliedFormat":99},{"version":"dfdb88e346237caee7a763f01b6818f720a4dc73e049a442cdad319967201d5d","impliedFormat":99},{"version":"4c64ee8ce62176d2046e0a57b2b31dcbc3ac355610c4f6e792f01fdd1c898392","impliedFormat":99},{"version":"4223c0fef4e3ddc79e66293439059550a5606dc86f4d37fc3c1b388862a0c162","impliedFormat":99},{"version":"188b5fbd240ce462072a34f798a1fed27338f5627fd4228d1cf852c14ae983b6","impliedFormat":99},{"version":"ae9cb72c60fb49958582cc8159c00c5838646def705c01bd9c6cdcc391b73fe0","impliedFormat":99},{"version":"4d64e45dbcbbc8bf31eeebe380f96accb0e4ba44317a1529ea77d718fc787e22","impliedFormat":99},{"version":"e2ff74884cbe04e71200f35e4203252fd44c53ec84014527ac31dcaac400126d","impliedFormat":99},{"version":"5245a5e9d2922ce986227734da202b97b3b62b6fed8bc53dd92f2b437c472b55","impliedFormat":99},{"version":"dc75b4cd76112ad15bf2bbfb45e22678e81d50b7c9fed4e230f1f9929fba42bf","impliedFormat":99},{"version":"774ec41754ed022911fe1e0ad186ce593ec89895849b81d7ad2fb564046a0671","impliedFormat":99},{"version":"b4756b7e56a29b2a187261f61959f0504e4ec2d24197b672dfb6004895cde3d8","impliedFormat":99},{"version":"f19356bf7c9b8eef6e07bb1a92cb9df28f49f6c89e81bf076d4fa8525b76eba4","impliedFormat":99},{"version":"300f5a6f682463395f4d55d32ec143f3d5a908dd3d0bf05978306604df94d648","impliedFormat":99},{"version":"2513efeff50b9c26cd9624b98d57cc9d39b832c00dc533775fabd89ebb8152f0","impliedFormat":99},{"version":"d20e7b86b588ce1f950a9252d6144e8053250854931fa3e08213e25bc25c60d5","impliedFormat":99},{"version":"6f81fd38e144898535e729a01c66f093e948e80d0a6bd0e3c47f1f677668d92b","impliedFormat":99},{"version":"34f1b437fe35d64663c281568e65d06a1e7e677e572a696ae936a829b1b59d9a","impliedFormat":99},{"version":"142cbf5831ca6829036300db866895cfb28d824c45699986d2a91dcde5889c9b","impliedFormat":99},{"version":"0f83e3916cd3a0573af439902eb8302aa9a98a9f14c561ffed5e6df3b50d1b05","impliedFormat":99},{"version":"18d44e06819b8db0e2ddb34b011a7bd1552aaf80211a12c8aee9ea62e3779d81","impliedFormat":99},{"version":"e027af9af98adbfb73e7c895b5f5ea5ca4bfa2a660585e326870c736ba77ee97","impliedFormat":99},{"version":"db29668926ab88e6cf3450d14cde831301c815dd0d85a4a83591a68bb6362be2","impliedFormat":99},{"version":"1ce672020bc8c9dbb51708a3d96d6394623e58c72c3c932443fc03f9cc4ef357","impliedFormat":99},{"version":"85a1e85cda648d9ab58382f4cf25f5cf7aa74593308eefda1b34ccfa73a0b68f","impliedFormat":99},{"version":"e71fb641872cf25c61884278f6638358b4093a32c2815ff47527b507f3d2ca7c","impliedFormat":99},{"version":"14e0f2e5f347ca5d3ce2b1507aac87bc118f02fa0a53b46d0cb46eec904648fa","impliedFormat":99},{"version":"599a362a00519577f154b9d9bebd7b66eaa0a72c657fecbcb22707a8ff219a9d","impliedFormat":99},{"version":"18adab560035a16fafee21f7d13513b0316f3cf8cf592831a5c51c379c3e5321","impliedFormat":99},{"version":"32fe7258b8136899aad4f4e9535facd4cbfe8f82df82ac66f2b4f56510a70579","impliedFormat":99},{"version":"2522d9b73a13acdd321962bd398fa925bf44d20d88893df05733312cc0576c1e","impliedFormat":99},{"version":"08f8b4935c5bfb0ca9976f92f57e7d7e85fb9f26576c4ec20546534d6bd60c7c","impliedFormat":99},{"version":"fa09ed87d190bd108856b87ec0fde7943191e0a928ff6aa22eb31115e204f1ef","impliedFormat":99},"7198e4840f90218d4232747cfbcaa0b452badcc76ee3c4738c3d67651f4feed4","6c89607231351608b9334e03799ca35d9a2477f9d243391356e7dc744817879c","56e892c3cc977b7871edca40f7c2dd76f79a6f07a81dde27c4558d8a63c1c3f6","785bfb63566633f4aa70f876371f4160af1b45d72519d37e441e911787593e5d",{"version":"85a55229c4d0f20d42c59cec768df0cb83a492f8bb1351ead8524a58f278a005","impliedFormat":1},"bba2d24d27ca8f64d25b207b8d4c22f3aa2e23851cedec6f52ca25a488d31510","451d89ca8f5e55613fee5c813924da0223846446577d39d97ad5fa7321d9f0c0","1d2e2961383a40533bc637ff2189a9c962e24e47e1310ec5add57cfcb998484f","811be3d6df7cb6b224a40bfa0f6799165edb1c02fa3872eeb10e21c48d4a1f8a",{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1}],"root":[231,[262,271],[346,348],[352,354]],"options":{"alwaysStrict":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":2},"referencedMap":[[349,1],[351,2],[353,3],[352,4],[266,2],[348,5],[346,6],[347,7],[269,8],[262,2],[271,9],[270,10],[268,2],[263,11],[264,2],[267,12],[265,13],[231,2],[354,14],[272,2],[345,15],[274,16],[275,16],[276,16],[277,16],[278,16],[279,16],[280,16],[281,16],[282,16],[283,16],[284,16],[285,16],[286,16],[273,16],[287,16],[288,16],[289,16],[290,16],[291,16],[292,16],[293,16],[294,16],[295,16],[296,16],[297,16],[298,16],[299,16],[300,16],[301,16],[302,16],[303,16],[304,16],[305,16],[306,16],[307,16],[308,16],[309,16],[310,16],[311,16],[312,16],[313,16],[314,16],[315,16],[316,16],[317,16],[318,16],[319,16],[320,16],[321,16],[322,16],[323,16],[324,16],[325,16],[326,16],[327,16],[328,16],[329,16],[330,16],[331,16],[332,16],[333,16],[334,16],[335,16],[336,16],[337,16],[338,16],[339,16],[340,16],[341,16],[342,16],[343,16],[344,16],[185,2],[191,17],[210,18],[209,19],[208,20],[207,21],[206,22],[190,23],[204,24],[192,25],[193,26],[194,27],[195,28],[205,29],[196,2],[197,30],[198,25],[202,31],[203,32],[201,33],[188,34],[199,2],[189,2],[186,2],[187,35],[200,36],[225,37],[229,38],[227,39],[226,39],[228,40],[224,41],[180,42],[160,2],[161,2],[168,2],[163,2],[169,2],[165,2],[162,2],[175,43],[166,2],[167,2],[164,2],[222,44],[170,45],[174,46],[173,2],[172,47],[177,48],[181,49],[182,50],[184,51],[211,52],[220,53],[219,54],[183,55],[178,56],[176,2],[221,2],[171,2],[212,57],[157,58],[156,57],[216,2],[214,59],[153,60],[158,61],[215,2],[154,2],[213,2],[217,62],[218,63],[149,2],[179,64],[95,65],[96,65],[97,66],[56,67],[98,68],[99,69],[100,70],[51,2],[54,71],[52,2],[53,2],[101,72],[102,73],[103,74],[104,75],[105,76],[106,77],[107,77],[109,2],[108,78],[110,79],[111,80],[112,81],[94,82],[55,2],[113,83],[114,84],[115,85],[148,86],[116,87],[117,88],[118,89],[119,90],[120,91],[121,92],[122,93],[123,94],[124,95],[125,96],[126,96],[127,97],[128,2],[129,2],[130,98],[132,99],[131,100],[133,101],[134,102],[135,103],[136,104],[137,105],[138,106],[139,107],[140,108],[141,109],[142,110],[143,111],[144,112],[145,113],[146,114],[147,115],[151,2],[152,2],[150,116],[155,117],[350,118],[355,2],[356,2],[232,2],[243,2],[233,119],[234,120],[260,121],[235,122],[236,123],[237,124],[238,125],[239,126],[240,127],[241,128],[242,129],[261,130],[245,131],[258,132],[257,2],[244,133],[246,134],[247,135],[248,136],[249,137],[250,138],[251,139],[252,140],[253,141],[254,142],[255,143],[256,144],[259,145],[159,2],[230,146],[49,2],[50,2],[9,2],[10,2],[14,2],[13,2],[3,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[4,2],[23,2],[24,2],[5,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[6,2],[33,2],[34,2],[35,2],[36,2],[7,2],[40,2],[37,2],[38,2],[39,2],[41,2],[8,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[2,2],[1,2],[12,2],[11,2],[223,2],[72,147],[82,148],[71,147],[92,149],[63,150],[62,151],[91,152],[85,153],[90,154],[65,155],[79,156],[64,157],[88,158],[60,159],[59,152],[89,160],[61,161],[66,162],[67,2],[70,162],[57,2],[93,163],[83,164],[74,165],[75,166],[77,167],[73,168],[76,169],[86,152],[68,170],[69,171],[78,172],[58,46],[81,164],[80,162],[84,2],[87,173]],"version":"5.8.3"} \ No newline at end of file diff --git a/nodemon.json b/apps/api/nodemon.json similarity index 100% rename from nodemon.json rename to apps/api/nodemon.json diff --git a/apps/api/package.json b/apps/api/package.json new file mode 100644 index 0000000000..94b0032285 --- /dev/null +++ b/apps/api/package.json @@ -0,0 +1,43 @@ +{ + "name": "api", + "version": "1.0.0", + "description": "A product list API", + "homepage": "https://github.com/tomwinskell/product-list#readme", + "bugs": { + "url": "https://github.com/tomwinskell/product-list/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tomwinskell/product-list.git" + }, + "license": "ISC", + "author": "", + "main": "build/src/server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "concurrently \"nodemon\" \"nodemon -x tsoa spec-and-routes\"", + "build": "tsoa spec-and-routes && tsc --outDir build --experimentalDecorators", + "start": "node build/src/server.js" + }, + "dependencies": { + "@faker-js/faker": "^9.8.0", + "body-parser": "^2.2.0", + "express": "^5.1.0", + "mongoose": "^8.15.1", + "swagger-ui-express": "^5.0.1", + "tsoa": "^6.6.0", + "zod": "^3.25.46" + }, + "imports": { + "#root/*": "./*" + }, + "devDependencies": { + "@types/express": "^5.0.2", + "@types/mongoose": "^5.11.96", + "@types/node": "^22.15.29", + "@types/swagger-ui-express": "^4.1.8", + "nodemon": "^3.1.10", + "ts-node": "^10.9.2", + "typescript": "^5.8.3" + } +} diff --git a/src/app.ts b/apps/api/src/app.ts similarity index 100% rename from src/app.ts rename to apps/api/src/app.ts diff --git a/src/errors/errorHandlers.ts b/apps/api/src/errors/errorHandlers.ts similarity index 100% rename from src/errors/errorHandlers.ts rename to apps/api/src/errors/errorHandlers.ts diff --git a/src/errors/errorTypes.ts b/apps/api/src/errors/errorTypes.ts similarity index 100% rename from src/errors/errorTypes.ts rename to apps/api/src/errors/errorTypes.ts diff --git a/src/generate/generateController.ts b/apps/api/src/generate/generateController.ts similarity index 100% rename from src/generate/generateController.ts rename to apps/api/src/generate/generateController.ts diff --git a/src/generate/generateHelpers.ts b/apps/api/src/generate/generateHelpers.ts similarity index 100% rename from src/generate/generateHelpers.ts rename to apps/api/src/generate/generateHelpers.ts diff --git a/src/generate/generateService.ts b/apps/api/src/generate/generateService.ts similarity index 100% rename from src/generate/generateService.ts rename to apps/api/src/generate/generateService.ts diff --git a/src/products/productHelpers.ts b/apps/api/src/products/productHelpers.ts similarity index 100% rename from src/products/productHelpers.ts rename to apps/api/src/products/productHelpers.ts diff --git a/src/products/productModel.ts b/apps/api/src/products/productModel.ts similarity index 100% rename from src/products/productModel.ts rename to apps/api/src/products/productModel.ts diff --git a/src/products/productTypes.ts b/apps/api/src/products/productTypes.ts similarity index 100% rename from src/products/productTypes.ts rename to apps/api/src/products/productTypes.ts diff --git a/src/products/productsController.ts b/apps/api/src/products/productsController.ts similarity index 100% rename from src/products/productsController.ts rename to apps/api/src/products/productsController.ts diff --git a/src/products/productsService.ts b/apps/api/src/products/productsService.ts similarity index 100% rename from src/products/productsService.ts rename to apps/api/src/products/productsService.ts diff --git a/src/reviews/reviewHelpers.ts b/apps/api/src/reviews/reviewHelpers.ts similarity index 100% rename from src/reviews/reviewHelpers.ts rename to apps/api/src/reviews/reviewHelpers.ts diff --git a/src/reviews/reviewModel.ts b/apps/api/src/reviews/reviewModel.ts similarity index 100% rename from src/reviews/reviewModel.ts rename to apps/api/src/reviews/reviewModel.ts diff --git a/src/reviews/reviewTypes.ts b/apps/api/src/reviews/reviewTypes.ts similarity index 100% rename from src/reviews/reviewTypes.ts rename to apps/api/src/reviews/reviewTypes.ts diff --git a/src/reviews/reviewsController.ts b/apps/api/src/reviews/reviewsController.ts similarity index 100% rename from src/reviews/reviewsController.ts rename to apps/api/src/reviews/reviewsController.ts diff --git a/src/reviews/reviewsService.ts b/apps/api/src/reviews/reviewsService.ts similarity index 100% rename from src/reviews/reviewsService.ts rename to apps/api/src/reviews/reviewsService.ts diff --git a/src/server.ts b/apps/api/src/server.ts similarity index 100% rename from src/server.ts rename to apps/api/src/server.ts diff --git a/tsconfig.json b/apps/api/tsconfig.json similarity index 100% rename from tsconfig.json rename to apps/api/tsconfig.json diff --git a/tsconfig.tsbuildinfo b/apps/api/tsconfig.tsbuildinfo similarity index 100% rename from tsconfig.tsbuildinfo rename to apps/api/tsconfig.tsbuildinfo diff --git a/tsoa.json b/apps/api/tsoa.json similarity index 100% rename from tsoa.json rename to apps/api/tsoa.json diff --git a/apps/web/.prettierrc.json b/apps/web/.prettierrc.json new file mode 100644 index 0000000000..33d2cfa3f6 --- /dev/null +++ b/apps/web/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "arrowParens": "avoid", + "semi": false +} diff --git a/apps/web/README.md b/apps/web/README.md new file mode 100644 index 0000000000..652a6c6720 --- /dev/null +++ b/apps/web/README.md @@ -0,0 +1,27 @@ +# vite-template-redux + +Uses [Vite](https://vitejs.dev/), [Vitest](https://vitest.dev/), and [React Testing Library](https://github.com/testing-library/react-testing-library) to create a modern [React](https://react.dev/) app compatible with [Create React App](https://create-react-app.dev/) + +```sh +npx tiged reduxjs/redux-templates/packages/vite-template-redux my-app +``` + +## Goals + +- Easy migration from Create React App or Vite +- As beginner friendly as Create React App +- Optimized performance compared to Create React App +- Customizable without ejecting + +## Scripts + +- `dev`/`start` - start dev server and open browser +- `build` - build for production +- `preview` - locally preview production build +- `test` - launch test runner + +## Inspiration + +- [Create React App](https://github.com/facebook/create-react-app/tree/main/packages/cra-template) +- [Vite](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react) +- [Vitest](https://github.com/vitest-dev/vitest/tree/main/examples/react-testing-lib) diff --git a/apps/web/eslint.config.js b/apps/web/eslint.config.js new file mode 100644 index 0000000000..d055500fda --- /dev/null +++ b/apps/web/eslint.config.js @@ -0,0 +1,84 @@ +import js from "@eslint/js" +import vitestPlugin from "@vitest/eslint-plugin" +import prettierConfig from "eslint-config-prettier/flat" +import reactPlugin from "eslint-plugin-react" +import reactHooksPlugin from "eslint-plugin-react-hooks" +import globals from "globals" +import { config, configs } from "typescript-eslint" + +const eslintConfig = config( + { + name: "global-ignores", + ignores: [ + "**/*.snap", + "**/dist/", + "**/.yalc/", + "**/build/", + "**/temp/", + "**/.temp/", + "**/.tmp/", + "**/.yarn/", + "**/coverage/", + ], + }, + { + name: `${js.meta.name}/recommended`, + ...js.configs.recommended, + }, + configs.strictTypeChecked, + configs.stylisticTypeChecked, + vitestPlugin.configs.recommended, + { + name: "eslint-plugin-react/jsx-runtime", + ...reactPlugin.configs.flat["jsx-runtime"], + }, + reactHooksPlugin.configs["recommended-latest"], + { + name: "main", + linterOptions: { + reportUnusedDisableDirectives: 2, + }, + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + settings: { + vitest: { + typecheck: true, + }, + }, + rules: { + "no-undef": [0], + "@typescript-eslint/consistent-type-definitions": [2, "type"], + "@typescript-eslint/consistent-type-imports": [ + 2, + { + prefer: "type-imports", + fixStyle: "separate-type-imports", + disallowTypeAnnotations: true, + }, + ], + "no-restricted-imports": [ + 2, + { + paths: [ + { + name: "react-redux", + importNames: ["useSelector", "useStore", "useDispatch"], + message: + "Please use pre-typed versions from `src/app/hooks.ts` instead.", + }, + ], + }, + ], + }, + }, + + prettierConfig, +) + +export default eslintConfig diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000000..b5fae3da23 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,14 @@ + + + + + + + React Redux App + + + +
+ + + diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000000..d8e6dd1c21 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,48 @@ +{ + "name": "web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "build": "tsc -b && vite build", + "dev": "vite", + "format:check": "prettier --check .", + "format": "prettier --write .", + "lint:fix": "eslint --fix .", + "lint": "eslint .", + "preview": "vite preview", + "start": "vite", + "test": "vitest --run", + "type-check": "tsc -b --noEmit" + }, + "dependencies": { + "@reduxjs/toolkit": "^2.6.1", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-redux": "^9.2.0" + }, + "devDependencies": { + "@eslint/js": "^9.23.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/node": "^22.14.0", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.1", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/eslint-plugin": "^1.1.39", + "eslint": "^9.23.0", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-prettier": "^5.2.6", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "globals": "^16.0.0", + "jsdom": "^26.0.0", + "prettier": "^3.5.3", + "typescript": "^5.8.2", + "typescript-eslint": "^8.29.0", + "vite": "^6.2.4", + "vitest": "^3.1.1" + } +} diff --git a/apps/web/src/App.css b/apps/web/src/App.css new file mode 100644 index 0000000000..01cc586770 --- /dev/null +++ b/apps/web/src/App.css @@ -0,0 +1,39 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-float infinite 3s ease-in-out; + } +} + +.App-header { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); +} + +.App-link { + color: rgb(112, 76, 182); +} + +@keyframes App-logo-float { + 0% { + transform: translateY(0); + } + 50% { + transform: translateY(10px); + } + 100% { + transform: translateY(0px); + } +} diff --git a/apps/web/src/App.test.tsx b/apps/web/src/App.test.tsx new file mode 100644 index 0000000000..81e063f78a --- /dev/null +++ b/apps/web/src/App.test.tsx @@ -0,0 +1,154 @@ +import { act, screen } from "@testing-library/react" +import { App } from "./App" +import { renderWithProviders } from "./utils/test-utils" + +test("App should have correct initial render", () => { + renderWithProviders() + + const countLabel = screen.getByLabelText("Count") + + const incrementValueInput = screen.getByLabelText( + "Set increment amount", + ) + + // The app should be rendered correctly + expect(screen.getByText(/learn/i)).toBeInTheDocument() + + // Initial state: count should be 0, incrementValue should be 2 + expect(countLabel).toHaveTextContent("0") + expect(incrementValueInput).toHaveValue(2) +}) + +test("Increment value and Decrement value should work as expected", async () => { + const { user } = renderWithProviders() + + const countLabel = screen.getByLabelText("Count") + + const incrementValueButton = + screen.getByLabelText("Increment value") + + const decrementValueButton = + screen.getByLabelText("Decrement value") + + // Click on "+" => Count should be 1 + await user.click(incrementValueButton) + expect(countLabel).toHaveTextContent("1") + + // Click on "-" => Count should be 0 + await user.click(decrementValueButton) + expect(countLabel).toHaveTextContent("0") +}) + +test("Add Amount should work as expected", async () => { + const { user } = renderWithProviders() + + const countLabel = screen.getByLabelText("Count") + + const incrementValueInput = screen.getByLabelText( + "Set increment amount", + ) + + const addAmountButton = screen.getByText("Add Amount") + + // "Add Amount" button is clicked => Count should be 2 + await user.click(addAmountButton) + expect(countLabel).toHaveTextContent("2") + + // incrementValue is 2, click on "Add Amount" => Count should be 4 + await user.clear(incrementValueInput) + await user.type(incrementValueInput, "2") + await user.click(addAmountButton) + expect(countLabel).toHaveTextContent("4") + + // [Negative number] incrementValue is -1, click on "Add Amount" => Count should be 3 + await user.clear(incrementValueInput) + await user.type(incrementValueInput, "-1") + await user.click(addAmountButton) + expect(countLabel).toHaveTextContent("3") +}) + +it("Add Async should work as expected", async () => { + vi.useFakeTimers({ shouldAdvanceTime: true }) + + const { user } = renderWithProviders() + + const addAsyncButton = screen.getByText("Add Async") + + const countLabel = screen.getByLabelText("Count") + + const incrementValueInput = screen.getByLabelText( + "Set increment amount", + ) + + await user.click(addAsyncButton) + + await act(async () => { + await vi.advanceTimersByTimeAsync(500) + }) + + // "Add Async" button is clicked => Count should be 2 + expect(countLabel).toHaveTextContent("2") + + await user.clear(incrementValueInput) + await user.type(incrementValueInput, "2") + + await user.click(addAsyncButton) + await act(async () => { + await vi.advanceTimersByTimeAsync(500) + }) + + // incrementValue is 2, click on "Add Async" => Count should be 4 + expect(countLabel).toHaveTextContent("4") + + await user.clear(incrementValueInput) + await user.type(incrementValueInput, "-1") + await user.click(addAsyncButton) + + await act(async () => { + await vi.advanceTimersByTimeAsync(500) + }) + + // [Negative number] incrementValue is -1, click on "Add Async" => Count should be 3 + expect(countLabel).toHaveTextContent("3") + + vi.useRealTimers() +}) + +test("Add If Odd should work as expected", async () => { + const { user } = renderWithProviders() + + const countLabel = screen.getByLabelText("Count") + + const addIfOddButton = screen.getByText("Add If Odd") + + const incrementValueInput = screen.getByLabelText( + "Set increment amount", + ) + + const incrementValueButton = + screen.getByLabelText("Increment value") + + // "Add If Odd" button is clicked => Count should stay 0 + await user.click(addIfOddButton) + expect(countLabel).toHaveTextContent("0") + + // Click on "+" => Count should be updated to 1 + await user.click(incrementValueButton) + expect(countLabel).toHaveTextContent("1") + + // "Add If Odd" button is clicked => Count should be updated to 3 + await user.click(addIfOddButton) + expect(countLabel).toHaveTextContent("3") + + // incrementValue is 1, click on "Add If Odd" => Count should be updated to 4 + await user.clear(incrementValueInput) + await user.type(incrementValueInput, "1") + await user.click(addIfOddButton) + expect(countLabel).toHaveTextContent("4") + + // click on "Add If Odd" => Count should stay 4 + await user.clear(incrementValueInput) + await user.type(incrementValueInput, "-1") + await user.click(addIfOddButton) + expect(countLabel).toHaveTextContent("4") +}) diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx new file mode 100644 index 0000000000..6c2a4d1d94 --- /dev/null +++ b/apps/web/src/App.tsx @@ -0,0 +1,64 @@ +import "./App.css" +import { Counter } from "./features/counter/Counter" +import { Quotes } from "./features/quotes/Quotes" +import logo from "./logo.svg" + +export const App = () => ( +
+
+ logo + +

+ Edit src/App.tsx and save to reload. +

+ + + Learn + + React + + , + + Redux + + , + + Redux Toolkit + + , + + React Redux + + , and + + Reselect + + +
+
+) diff --git a/apps/web/src/app/createAppSlice.ts b/apps/web/src/app/createAppSlice.ts new file mode 100644 index 0000000000..64afebbb60 --- /dev/null +++ b/apps/web/src/app/createAppSlice.ts @@ -0,0 +1,6 @@ +import { asyncThunkCreator, buildCreateSlice } from "@reduxjs/toolkit" + +// `buildCreateSlice` allows us to create a slice with async thunks. +export const createAppSlice = buildCreateSlice({ + creators: { asyncThunk: asyncThunkCreator }, +}) diff --git a/apps/web/src/app/hooks.ts b/apps/web/src/app/hooks.ts new file mode 100644 index 0000000000..810f581c48 --- /dev/null +++ b/apps/web/src/app/hooks.ts @@ -0,0 +1,12 @@ +// This file serves as a central hub for re-exporting pre-typed Redux hooks. +// These imports are restricted elsewhere to ensure consistent +// usage of typed hooks throughout the application. +// We disable the ESLint rule here because this is the designated place +// for importing and re-exporting the typed versions of hooks. +/* eslint-disable no-restricted-imports */ +import { useDispatch, useSelector } from "react-redux" +import type { AppDispatch, RootState } from "./store" + +// Use throughout your app instead of plain `useDispatch` and `useSelector` +export const useAppDispatch = useDispatch.withTypes() +export const useAppSelector = useSelector.withTypes() diff --git a/apps/web/src/app/store.ts b/apps/web/src/app/store.ts new file mode 100644 index 0000000000..9de880233d --- /dev/null +++ b/apps/web/src/app/store.ts @@ -0,0 +1,42 @@ +import type { Action, ThunkAction } from "@reduxjs/toolkit" +import { combineSlices, configureStore } from "@reduxjs/toolkit" +import { setupListeners } from "@reduxjs/toolkit/query" +import { counterSlice } from "../features/counter/counterSlice" +import { quotesApiSlice } from "../features/quotes/quotesApiSlice" + +// `combineSlices` automatically combines the reducers using +// their `reducerPath`s, therefore we no longer need to call `combineReducers`. +const rootReducer = combineSlices(counterSlice, quotesApiSlice) +// Infer the `RootState` type from the root reducer +export type RootState = ReturnType + +// The store setup is wrapped in `makeStore` to allow reuse +// when setting up tests that need the same store config +export const makeStore = (preloadedState?: Partial) => { + const store = configureStore({ + reducer: rootReducer, + // Adding the api middleware enables caching, invalidation, polling, + // and other useful features of `rtk-query`. + middleware: getDefaultMiddleware => { + return getDefaultMiddleware().concat(quotesApiSlice.middleware) + }, + preloadedState, + }) + // configure listeners using the provided defaults + // optional, but required for `refetchOnFocus`/`refetchOnReconnect` behaviors + setupListeners(store.dispatch) + return store +} + +export const store = makeStore() + +// Infer the type of `store` +export type AppStore = typeof store +// Infer the `AppDispatch` type from the store itself +export type AppDispatch = AppStore["dispatch"] +export type AppThunk = ThunkAction< + ThunkReturnType, + RootState, + unknown, + Action +> diff --git a/apps/web/src/features/counter/Counter.module.css b/apps/web/src/features/counter/Counter.module.css new file mode 100644 index 0000000000..a0e619ddaa --- /dev/null +++ b/apps/web/src/features/counter/Counter.module.css @@ -0,0 +1,81 @@ +.row { + display: flex; + align-items: center; + justify-content: center; +} + +.row > button { + margin-left: 4px; + margin-right: 8px; +} + +.row:not(:last-child) { + margin-bottom: 16px; +} + +.value { + font-size: 78px; + padding-left: 16px; + padding-right: 16px; + margin-top: 2px; + font-family: "Courier New", Courier, monospace; +} + +.button { + appearance: none; + background: none; + font-size: 32px; + padding-left: 12px; + padding-right: 12px; + outline: none; + border: 2px solid transparent; + color: rgb(112, 76, 182); + padding-bottom: 4px; + cursor: pointer; + background-color: rgba(112, 76, 182, 0.1); + border-radius: 2px; + transition: all 0.15s; +} + +.textbox { + font-size: 32px; + padding: 2px; + width: 64px; + text-align: center; + margin-right: 4px; +} + +.button:hover, +.button:focus { + border: 2px solid rgba(112, 76, 182, 0.4); +} + +.button:active { + background-color: rgba(112, 76, 182, 0.2); +} + +.asyncButton { + composes: button; + position: relative; +} + +.asyncButton:after { + content: ""; + background-color: rgba(112, 76, 182, 0.15); + display: block; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + opacity: 0; + transition: + width 1s linear, + opacity 0.5s ease 1s; +} + +.asyncButton:active:after { + width: 0%; + opacity: 1; + transition: 0s; +} diff --git a/apps/web/src/features/counter/Counter.tsx b/apps/web/src/features/counter/Counter.tsx new file mode 100644 index 0000000000..7be8d1ba34 --- /dev/null +++ b/apps/web/src/features/counter/Counter.tsx @@ -0,0 +1,80 @@ +import type { JSX } from "react" +import { useState } from "react" +import { useAppDispatch, useAppSelector } from "../../app/hooks" +import styles from "./Counter.module.css" +import { + decrement, + increment, + incrementAsync, + incrementByAmount, + incrementIfOdd, + selectCount, + selectStatus, +} from "./counterSlice" + +export const Counter = (): JSX.Element => { + const dispatch = useAppDispatch() + const count = useAppSelector(selectCount) + const status = useAppSelector(selectStatus) + const [incrementAmount, setIncrementAmount] = useState("2") + + const incrementValue = Number(incrementAmount) || 0 + + return ( +
+
+ + + +
+
+ { + setIncrementAmount(e.target.value) + }} + /> + + + +
+
+ ) +} diff --git a/apps/web/src/features/counter/counterAPI.ts b/apps/web/src/features/counter/counterAPI.ts new file mode 100644 index 0000000000..12f10aa32c --- /dev/null +++ b/apps/web/src/features/counter/counterAPI.ts @@ -0,0 +1,7 @@ +// A mock function to mimic making an async request for data +export const fetchCount = (amount = 1): Promise<{ data: number }> => + new Promise<{ data: number }>(resolve => + setTimeout(() => { + resolve({ data: amount }) + }, 500), + ) diff --git a/apps/web/src/features/counter/counterSlice.test.ts b/apps/web/src/features/counter/counterSlice.test.ts new file mode 100644 index 0000000000..c16dbdee30 --- /dev/null +++ b/apps/web/src/features/counter/counterSlice.test.ts @@ -0,0 +1,58 @@ +import type { AppStore } from "../../app/store" +import { makeStore } from "../../app/store" +import type { CounterSliceState } from "./counterSlice" +import { + counterSlice, + decrement, + increment, + incrementByAmount, + selectCount, +} from "./counterSlice" + +type LocalTestContext = { + store: AppStore +} + +describe("counter reducer", () => { + beforeEach(context => { + const initialState: CounterSliceState = { + value: 3, + status: "idle", + } + + const store = makeStore({ counter: initialState }) + + context.store = store + }) + + it("should handle initial state", () => { + expect(counterSlice.reducer(undefined, { type: "unknown" })).toStrictEqual({ + value: 0, + status: "idle", + }) + }) + + it("should handle increment", ({ store }) => { + expect(selectCount(store.getState())).toBe(3) + + store.dispatch(increment()) + + expect(selectCount(store.getState())).toBe(4) + }) + + it("should handle decrement", ({ store }) => { + expect(selectCount(store.getState())).toBe(3) + + store.dispatch(decrement()) + + expect(selectCount(store.getState())).toBe(2) + }) + + it("should handle incrementByAmount", ({ store }) => { + expect(selectCount(store.getState())).toBe(3) + + store.dispatch(incrementByAmount(2)) + + expect(selectCount(store.getState())).toBe(5) + }) +}) diff --git a/apps/web/src/features/counter/counterSlice.ts b/apps/web/src/features/counter/counterSlice.ts new file mode 100644 index 0000000000..c1af017e79 --- /dev/null +++ b/apps/web/src/features/counter/counterSlice.ts @@ -0,0 +1,89 @@ +import type { PayloadAction } from "@reduxjs/toolkit" +import { createAppSlice } from "../../app/createAppSlice" +import type { AppThunk } from "../../app/store" +import { fetchCount } from "./counterAPI" + +export type CounterSliceState = { + value: number + status: "idle" | "loading" | "failed" +} + +const initialState: CounterSliceState = { + value: 0, + status: "idle", +} + +// If you are not using async thunks you can use the standalone `createSlice`. +export const counterSlice = createAppSlice({ + name: "counter", + // `createSlice` will infer the state type from the `initialState` argument + initialState, + // The `reducers` field lets us define reducers and generate associated actions + reducers: create => ({ + increment: create.reducer(state => { + // Redux Toolkit allows us to write "mutating" logic in reducers. It + // doesn't actually mutate the state because it uses the Immer library, + // which detects changes to a "draft state" and produces a brand new + // immutable state based off those changes + state.value += 1 + }), + decrement: create.reducer(state => { + state.value -= 1 + }), + // Use the `PayloadAction` type to declare the contents of `action.payload` + incrementByAmount: create.reducer( + (state, action: PayloadAction) => { + state.value += action.payload + }, + ), + // The function below is called a thunk and allows us to perform async logic. It + // can be dispatched like a regular action: `dispatch(incrementAsync(10))`. This + // will call the thunk with the `dispatch` function as the first argument. Async + // code can then be executed and other actions can be dispatched. Thunks are + // typically used to make async requests. + incrementAsync: create.asyncThunk( + async (amount: number) => { + const response = await fetchCount(amount) + // The value we return becomes the `fulfilled` action payload + return response.data + }, + { + pending: state => { + state.status = "loading" + }, + fulfilled: (state, action) => { + state.status = "idle" + state.value += action.payload + }, + rejected: state => { + state.status = "failed" + }, + }, + ), + }), + // You can define your selectors here. These selectors receive the slice + // state as their first argument. + selectors: { + selectCount: counter => counter.value, + selectStatus: counter => counter.status, + }, +}) + +// Action creators are generated for each case reducer function. +export const { decrement, increment, incrementByAmount, incrementAsync } = + counterSlice.actions + +// Selectors returned by `slice.selectors` take the root state as their first argument. +export const { selectCount, selectStatus } = counterSlice.selectors + +// We can also write thunks by hand, which may contain both sync and async logic. +// Here's an example of conditionally dispatching actions based on current state. +export const incrementIfOdd = + (amount: number): AppThunk => + (dispatch, getState) => { + const currentValue = selectCount(getState()) + + if (currentValue % 2 === 1 || currentValue % 2 === -1) { + dispatch(incrementByAmount(amount)) + } + } diff --git a/apps/web/src/features/quotes/Quotes.module.css b/apps/web/src/features/quotes/Quotes.module.css new file mode 100644 index 0000000000..1f85690ef2 --- /dev/null +++ b/apps/web/src/features/quotes/Quotes.module.css @@ -0,0 +1,20 @@ +.select { + font-size: 25px; + padding: 5px; + padding-top: 2px; + padding-bottom: 2px; + size: 50; + outline: none; + border: 2px solid transparent; + color: rgb(112, 76, 182); + cursor: pointer; + background-color: rgba(112, 76, 182, 0.1); + border-radius: 5px; + transition: all 0.15s; +} + +.container { + display: flex; + flex-direction: column; + align-items: center; +} diff --git a/apps/web/src/features/quotes/Quotes.tsx b/apps/web/src/features/quotes/Quotes.tsx new file mode 100644 index 0000000000..76567335d6 --- /dev/null +++ b/apps/web/src/features/quotes/Quotes.tsx @@ -0,0 +1,60 @@ +import type { JSX } from "react" +import { useState } from "react" +import styles from "./Quotes.module.css" +import { useGetQuotesQuery } from "./quotesApiSlice" + +const options = [5, 10, 20, 30] + +export const Quotes = (): JSX.Element | null => { + const [numberOfQuotes, setNumberOfQuotes] = useState(10) + // Using a query hook automatically fetches data and returns query values + const { data, isError, isLoading, isSuccess } = + useGetQuotesQuery(numberOfQuotes) + + if (isError) { + return ( +
+

There was an error!!!

+
+ ) + } + + if (isLoading) { + return ( +
+

Loading...

+
+ ) + } + + if (isSuccess) { + return ( +
+

Select the Quantity of Quotes to Fetch:

+ + {data.quotes.map(({ author, quote, id }) => ( +
+ “{quote}” +
+ {author} +
+
+ ))} +
+ ) + } + + return null +} diff --git a/apps/web/src/features/quotes/quotesApiSlice.ts b/apps/web/src/features/quotes/quotesApiSlice.ts new file mode 100644 index 0000000000..779606a4ea --- /dev/null +++ b/apps/web/src/features/quotes/quotesApiSlice.ts @@ -0,0 +1,38 @@ +// Need to use the React-specific entry point to import `createApi` +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react" + +type Quote = { + id: number + quote: string + author: string +} + +type QuotesApiResponse = { + quotes: Quote[] + total: number + skip: number + limit: number +} + +// Define a service using a base URL and expected endpoints +export const quotesApiSlice = createApi({ + baseQuery: fetchBaseQuery({ baseUrl: "https://dummyjson.com/quotes" }), + reducerPath: "quotesApi", + // Tag types are used for caching and invalidation. + tagTypes: ["Quotes"], + endpoints: build => ({ + // Supply generics for the return type (in this case `QuotesApiResponse`) + // and the expected query argument. If there is no argument, use `void` + // for the argument type instead. + getQuotes: build.query({ + query: (limit = 10) => `?limit=${limit.toString()}`, + // `providesTags` determines which 'tag' is attached to the + // cached data returned by the query. + providesTags: (_result, _error, id) => [{ type: "Quotes", id }], + }), + }), +}) + +// Hooks are auto-generated by RTK-Query +// Same as `quotesApiSlice.endpoints.getQuotes.useQuery` +export const { useGetQuotesQuery } = quotesApiSlice diff --git a/apps/web/src/index.css b/apps/web/src/index.css new file mode 100644 index 0000000000..7e1aa8dc70 --- /dev/null +++ b/apps/web/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", + "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: + source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; +} diff --git a/apps/web/src/logo.svg b/apps/web/src/logo.svg new file mode 100644 index 0000000000..84667388ce --- /dev/null +++ b/apps/web/src/logo.svg @@ -0,0 +1 @@ + diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx new file mode 100644 index 0000000000..59756680a1 --- /dev/null +++ b/apps/web/src/main.tsx @@ -0,0 +1,24 @@ +import { StrictMode } from "react" +import { createRoot } from "react-dom/client" +import { Provider } from "react-redux" +import { App } from "./App" +import { store } from "./app/store" +import "./index.css" + +const container = document.getElementById("root") + +if (container) { + const root = createRoot(container) + + root.render( + + + + + , + ) +} else { + throw new Error( + "Root element with ID 'root' was not found in the document. Ensure there is a corresponding HTML element with the ID 'root' in your HTML file.", + ) +} diff --git a/apps/web/src/setupTests.ts b/apps/web/src/setupTests.ts new file mode 100644 index 0000000000..b9e7622996 --- /dev/null +++ b/apps/web/src/setupTests.ts @@ -0,0 +1 @@ +import "@testing-library/jest-dom/vitest" diff --git a/apps/web/src/utils/test-utils.tsx b/apps/web/src/utils/test-utils.tsx new file mode 100644 index 0000000000..1a180d154f --- /dev/null +++ b/apps/web/src/utils/test-utils.tsx @@ -0,0 +1,65 @@ +import type { RenderOptions } from "@testing-library/react" +import { render } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import type { PropsWithChildren, ReactElement } from "react" +import { Provider } from "react-redux" +import type { AppStore, RootState } from "../app/store" +import { makeStore } from "../app/store" + +/** + * This type extends the default options for + * React Testing Library's render function. It allows for + * additional configuration such as specifying an initial Redux state and + * a custom store instance. + */ +type ExtendedRenderOptions = Omit & { + /** + * Defines a specific portion or the entire initial state for the Redux store. + * This is particularly useful for initializing the state in a + * controlled manner during testing, allowing components to be rendered + * with predetermined state conditions. + */ + preloadedState?: Partial + + /** + * Allows the use of a specific Redux store instance instead of a + * default or global store. This flexibility is beneficial when + * testing components with unique store requirements or when isolating + * tests from a global store state. The custom store should be configured + * to match the structure and middleware of the store used by the application. + * + * @default makeStore(preloadedState) + */ + store?: AppStore +} + +/** + * Renders the given React element with Redux Provider and custom store. + * This function is useful for testing components that are connected to the Redux store. + * + * @param ui - The React component or element to render. + * @param extendedRenderOptions - Optional configuration options for rendering. This includes `preloadedState` for initial Redux state and `store` for a specific Redux store instance. Any additional properties are passed to React Testing Library's render function. + * @returns An object containing the Redux store used in the render, User event API for simulating user interactions in tests, and all of React Testing Library's query functions for testing the component. + */ +export const renderWithProviders = ( + ui: ReactElement, + extendedRenderOptions: ExtendedRenderOptions = {}, +) => { + const { + preloadedState = {}, + // Automatically create a store instance if no store was passed in + store = makeStore(preloadedState), + ...renderOptions + } = extendedRenderOptions + + const Wrapper = ({ children }: PropsWithChildren) => ( + {children} + ) + + // Return an object with the store and all of RTL's query functions + return { + store, + user: userEvent.setup(), + ...render(ui, { wrapper: Wrapper, ...renderOptions }), + } +} diff --git a/apps/web/src/vite-env.d.ts b/apps/web/src/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/apps/web/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/web/tsconfig.app.json b/apps/web/tsconfig.app.json new file mode 100644 index 0000000000..ea6a38d599 --- /dev/null +++ b/apps/web/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "resolveJsonModule": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "types": ["vitest/globals"] + }, + "include": ["src"] +} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000000..1ffef600d9 --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/apps/web/tsconfig.node.json b/apps/web/tsconfig.node.json new file mode 100644 index 0000000000..f5ad514297 --- /dev/null +++ b/apps/web/tsconfig.node.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "allowJs": true, + "checkJs": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "resolveJsonModule": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts", "eslint.config.js"] +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000000..0fd668160a --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,28 @@ +import react from "@vitejs/plugin-react" +import * as path from "node:path" +import { defineConfig } from "vitest/config" +import packageJson from "./package.json" with { type: "json" } + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + + server: { + open: true, + }, + + test: { + root: import.meta.dirname, + name: packageJson.name, + environment: "jsdom", + + typecheck: { + enabled: true, + tsconfig: path.join(import.meta.dirname, "tsconfig.json"), + }, + + globals: true, + watch: false, + setupFiles: ["./src/setupTests.ts"], + }, +}) diff --git a/build/build/routes.js b/build/build/routes.js deleted file mode 100644 index 35a9f451b2..0000000000 --- a/build/build/routes.js +++ /dev/null @@ -1,122 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RegisterRoutes = RegisterRoutes; -const runtime_1 = require("@tsoa/runtime"); -// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa -const productsController_1 = require("./../src/products/productsController"); -// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa -const models = { - "ProductDto": { - "dataType": "refObject", - "properties": { - "_id": { "dataType": "string", "required": true }, - "category": { "dataType": "string", "required": true }, - "name": { "dataType": "string", "required": true }, - "price": { "dataType": "double", "required": true }, - "image": { "dataType": "string", "required": true }, - "createdAt": { "dataType": "datetime", "required": true }, - "updatedAt": { "dataType": "datetime", "required": true }, - }, - "additionalProperties": false, - }, - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "ProductListResponse": { - "dataType": "refObject", - "properties": { - "products": { "dataType": "array", "array": { "dataType": "refObject", "ref": "ProductDto" }, "required": true }, - "totalPages": { "dataType": "double", "required": true }, - "currentPage": { "dataType": "double", "required": true }, - }, - "additionalProperties": false, - }, - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "Error": { - "dataType": "refObject", - "properties": { - "name": { "dataType": "string", "required": true }, - "message": { "dataType": "string", "required": true }, - "stack": { "dataType": "string" }, - }, - "additionalProperties": false, - }, - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - "QueryParams": { - "dataType": "refObject", - "properties": { - "page": { "dataType": "string", "required": true }, - "limit": { "dataType": "string", "required": true }, - }, - "additionalProperties": false, - }, - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa -}; -const templateService = new runtime_1.ExpressTemplateService(models, { "noImplicitAdditionalProperties": "throw-on-extras", "bodyCoercion": true }); -// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa -function RegisterRoutes(app) { - // ########################################################################################################### - // NOTE: If you do not see routes for all of your controllers in this file, then you might not have informed tsoa of where to look - // Please look into the "controllerPathGlobs" config option described in the readme: https://github.com/lukeautry/tsoa - // ########################################################################################################### - const argsProductsController_getAllProducts = { - queryParams: { "in": "queries", "name": "queryParams", "required": true, "ref": "QueryParams" }, - }; - app.get('/products', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.getAllProducts)), function ProductsController_getAllProducts(request, response, next) { - return __awaiter(this, void 0, void 0, function* () { - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - let validatedArgs = []; - try { - validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getAllProducts, request, response }); - const controller = new productsController_1.ProductsController(); - yield templateService.apiHandler({ - methodName: 'getAllProducts', - controller, - response, - next, - validatedArgs, - successStatus: undefined, - }); - } - catch (err) { - return next(err); - } - }); - }); - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - const argsProductsController_getByProductId = { - productId: { "in": "path", "name": "productId", "required": true, "dataType": "string" }, - }; - app.get('/products/:productId', ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController)), ...((0, runtime_1.fetchMiddlewares)(productsController_1.ProductsController.prototype.getByProductId)), function ProductsController_getByProductId(request, response, next) { - return __awaiter(this, void 0, void 0, function* () { - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - let validatedArgs = []; - try { - validatedArgs = templateService.getValidatedArgs({ args: argsProductsController_getByProductId, request, response }); - const controller = new productsController_1.ProductsController(); - yield templateService.apiHandler({ - methodName: 'getByProductId', - controller, - response, - next, - validatedArgs, - successStatus: undefined, - }); - } - catch (err) { - return next(err); - } - }); - }); - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa - // WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa -} -// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa diff --git a/build/build/swagger.json b/build/build/swagger.json deleted file mode 100644 index d8895ab863..0000000000 --- a/build/build/swagger.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "openapi": "3.0.0", - "components": { - "examples": {}, - "headers": {}, - "parameters": {}, - "requestBodies": {}, - "responses": {}, - "schemas": { - "ProductDto": { - "properties": { - "_id": { - "type": "string" - }, - "category": { - "type": "string" - }, - "name": { - "type": "string" - }, - "price": { - "type": "number", - "format": "double" - }, - "image": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "required": [ - "_id", - "category", - "name", - "price", - "image", - "createdAt", - "updatedAt" - ], - "type": "object", - "additionalProperties": false - }, - "ProductListResponse": { - "properties": { - "products": { - "items": { - "$ref": "#/components/schemas/ProductDto" - }, - "type": "array" - }, - "totalPages": { - "type": "number", - "format": "double" - }, - "currentPage": { - "type": "number", - "format": "double" - } - }, - "required": [ - "products", - "totalPages", - "currentPage" - ], - "type": "object", - "additionalProperties": false - }, - "Error": { - "properties": { - "name": { - "type": "string" - }, - "message": { - "type": "string" - }, - "stack": { - "type": "string" - } - }, - "required": [ - "name", - "message" - ], - "type": "object", - "additionalProperties": false - }, - "QueryParams": { - "properties": { - "page": { - "type": "string" - }, - "limit": { - "type": "string" - } - }, - "required": [ - "page", - "limit" - ], - "type": "object", - "additionalProperties": false - } - }, - "securitySchemes": {} - }, - "info": { - "title": "clear", - "version": "1.0.0", - "description": "This project has been created by a student at Parsity, an online software engineering course. The work in this repository is wholly of the student based on a sample starter project that can be accessed by looking at the repository that this project forks.", - "license": { - "name": "ISC" - }, - "contact": {} - }, - "paths": { - "/products": { - "get": { - "operationId": "GetAllProducts", - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProductListResponse" - }, - { - "$ref": "#/components/schemas/Error" - } - ] - } - } - } - } - }, - "security": [], - "parameters": [ - { - "in": "query", - "name": "page", - "required": true, - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "limit", - "required": true, - "schema": { - "type": "string" - } - } - ] - } - }, - "/products/{productId}": { - "get": { - "operationId": "GetByProductId", - "responses": { - "200": { - "description": "Ok", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProductDto" - }, - { - "$ref": "#/components/schemas/Error" - } - ] - } - } - } - } - }, - "security": [], - "parameters": [ - { - "in": "path", - "name": "productId", - "required": true, - "schema": { - "type": "string" - } - } - ] - } - } - }, - "servers": [ - { - "url": "/" - } - ] -} diff --git a/build/src/products/productHelpers.js b/build/src/products/productHelpers.js deleted file mode 100644 index b4f771bf7d..0000000000 --- a/build/src/products/productHelpers.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.convertDocumentToProductDto = void 0; -const convertDocumentToProductDto = (document) => { - const dto = document.toObject(); - return Object.assign(Object.assign({}, dto), { _id: dto._id.toString() }); -}; -exports.convertDocumentToProductDto = convertDocumentToProductDto; diff --git a/build/src/products/productsService.js b/build/src/products/productsService.js deleted file mode 100644 index ca5fb150c7..0000000000 --- a/build/src/products/productsService.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.ProductsService = void 0; -const productModel_1 = require("./productModel"); -const productHelpers_1 = require("./productHelpers"); -class ProductsService { - getAllProducts(_a) { - return __awaiter(this, arguments, void 0, function* ({ page, limit, }) { - try { - const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); - const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); - const products = yield productModel_1.Product.find({}) - .skip(limitAsInt * (pageAsInt - 1)) - .limit(limitAsInt) - .sort({ createdAt: -1 }); - const count = yield productModel_1.Product.countDocuments(); - const productsDto = products.map((product) => { - return (0, productHelpers_1.convertDocumentToProductDto)(product); - }); - return { - products: productsDto, - totalPages: Math.ceil(count / limitAsInt), - currentPage: pageAsInt, - }; - } - catch (err) { - throw new Error(); - } - }); - } - getByProductId(productId) { - return __awaiter(this, void 0, void 0, function* () { - try { - const productsDto = yield productModel_1.Product.find({ _id: productId }); - return (0, productHelpers_1.convertDocumentToProductDto)(productsDto[0]); - } - catch (error) { - throw new Error(); - } - }); - } -} -exports.ProductsService = ProductsService; diff --git a/build/tsconfig.tsbuildinfo b/build/tsconfig.tsbuildinfo deleted file mode 100644 index 62a420def2..0000000000 --- a/build/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../node_modules/typescript/lib/lib.es6.d.ts","../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../node_modules/typescript/lib/lib.scripthost.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/mime/index.d.ts","../node_modules/@types/send/index.d.ts","../node_modules/@types/qs/index.d.ts","../node_modules/@types/range-parser/index.d.ts","../node_modules/@types/express-serve-static-core/index.d.ts","../node_modules/@types/http-errors/index.d.ts","../node_modules/@types/serve-static/index.d.ts","../node_modules/@types/connect/index.d.ts","../node_modules/@types/body-parser/index.d.ts","../node_modules/@types/express/index.d.ts","../node_modules/reflect-metadata/index.d.ts","../node_modules/@tsoa/runtime/dist/decorators/deprecated.d.ts","../node_modules/@tsoa/runtime/dist/decorators/example.d.ts","../node_modules/@tsoa/runtime/dist/decorators/parameter.d.ts","../node_modules/@tsoa/runtime/dist/decorators/methods.d.ts","../node_modules/@tsoa/runtime/dist/decorators/tags.d.ts","../node_modules/@tsoa/runtime/dist/decorators/operationid.d.ts","../node_modules/@tsoa/runtime/dist/decorators/route.d.ts","../node_modules/@tsoa/runtime/dist/decorators/security.d.ts","../node_modules/@tsoa/runtime/dist/decorators/extension.d.ts","../node_modules/@tsoa/runtime/dist/decorators/middlewares.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/controller.d.ts","../node_modules/@tsoa/runtime/dist/utils/isheadertype.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/response.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/iocmodule.d.ts","../node_modules/@tsoa/runtime/dist/interfaces/file.d.ts","../node_modules/@tsoa/runtime/dist/decorators/response.d.ts","../node_modules/@tsoa/runtime/dist/swagger/swagger.d.ts","../node_modules/@tsoa/runtime/dist/metadatageneration/tsoa.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/tsoa-route.d.ts","../node_modules/@types/multer/index.d.ts","../node_modules/@tsoa/runtime/dist/config.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/additionalprops.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templatehelpers.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/templateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/express/expresstemplateservice.d.ts","../node_modules/@hapi/boom/lib/index.d.ts","../node_modules/@hapi/podium/lib/index.d.ts","../node_modules/@hapi/shot/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/utils.d.ts","../node_modules/@hapi/mimos/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/route.d.ts","../node_modules/@hapi/catbox/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/cache.d.ts","../node_modules/@hapi/hapi/lib/types/server/encoders.d.ts","../node_modules/@hapi/hapi/lib/types/server/events.d.ts","../node_modules/@hapi/hapi/lib/types/server/ext.d.ts","../node_modules/@hapi/hapi/lib/types/server/info.d.ts","../node_modules/@hapi/hapi/lib/types/server/inject.d.ts","../node_modules/@hapi/hapi/lib/types/server/methods.d.ts","../node_modules/@hapi/iron/lib/index.d.ts","../node_modules/@hapi/statehood/lib/index.d.ts","../node_modules/@hapi/hapi/lib/types/server/state.d.ts","../node_modules/@hapi/hapi/lib/types/server/options.d.ts","../node_modules/@hapi/hapi/lib/types/server/server.d.ts","../node_modules/@hapi/hapi/lib/types/server/auth.d.ts","../node_modules/@hapi/hapi/lib/types/server/index.d.ts","../node_modules/@hapi/hapi/lib/types/response.d.ts","../node_modules/@hapi/hapi/lib/types/request.d.ts","../node_modules/@hapi/hapi/lib/types/plugin.d.ts","../node_modules/@hapi/hapi/lib/types/index.d.ts","../node_modules/@hapi/hapi/lib/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/hapi/hapitemplateservice.d.ts","../node_modules/@types/accepts/index.d.ts","../node_modules/@types/keygrip/index.d.ts","../node_modules/@types/cookies/index.d.ts","../node_modules/@types/http-assert/index.d.ts","../node_modules/@types/content-disposition/index.d.ts","../node_modules/@types/koa-compose/index.d.ts","../node_modules/@types/koa/index.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/koa/koatemplateservice.d.ts","../node_modules/@tsoa/runtime/dist/routegeneration/templates/index.d.ts","../node_modules/@tsoa/runtime/dist/utils/assertnever.d.ts","../node_modules/@tsoa/runtime/dist/index.d.ts","../node_modules/typescript/lib/typescript.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/routegenerator.d.ts","../node_modules/@tsoa/cli/dist/cli.d.ts","../node_modules/@tsoa/cli/dist/module/generate-spec.d.ts","../node_modules/@tsoa/cli/dist/module/generate-routes.d.ts","../node_modules/@tsoa/cli/dist/routegeneration/defaultroutegenerator.d.ts","../node_modules/@tsoa/cli/dist/index.d.ts","../node_modules/tsoa/dist/index.d.ts","../node_modules/bson/bson.d.ts","../node_modules/mongodb/mongodb.d.ts","../node_modules/mongoose/types/aggregate.d.ts","../node_modules/mongoose/types/callback.d.ts","../node_modules/mongoose/types/collection.d.ts","../node_modules/mongoose/types/connection.d.ts","../node_modules/mongoose/types/cursor.d.ts","../node_modules/mongoose/types/document.d.ts","../node_modules/mongoose/types/error.d.ts","../node_modules/mongoose/types/expressions.d.ts","../node_modules/mongoose/types/helpers.d.ts","../node_modules/kareem/index.d.ts","../node_modules/mongoose/types/middlewares.d.ts","../node_modules/mongoose/types/indexes.d.ts","../node_modules/mongoose/types/models.d.ts","../node_modules/mongoose/types/mongooseoptions.d.ts","../node_modules/mongoose/types/pipelinestage.d.ts","../node_modules/mongoose/types/populate.d.ts","../node_modules/mongoose/types/query.d.ts","../node_modules/mongoose/types/schemaoptions.d.ts","../node_modules/mongoose/types/schematypes.d.ts","../node_modules/mongoose/types/session.d.ts","../node_modules/mongoose/types/types.d.ts","../node_modules/mongoose/types/utility.d.ts","../node_modules/mongoose/types/validation.d.ts","../node_modules/mongoose/types/inferschematype.d.ts","../node_modules/mongoose/types/inferrawdoctype.d.ts","../node_modules/mongoose/types/virtuals.d.ts","../node_modules/mongoose/types/augmentations.d.ts","../node_modules/mongoose/types/index.d.ts","../src/products/productmodel.ts","../src/products/productstypes.ts","../src/products/producthelpers.ts","../src/products/productsservice.ts","../src/products/productscontroller.ts","./routes.ts","../node_modules/@types/swagger-ui-express/index.d.ts","./swagger.json","../src/app.ts","../src/server.ts","../node_modules/@types/webidl-conversions/index.d.ts","../node_modules/@types/whatwg-url/index.d.ts"],"fileIdsList":[[56,98,158,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,265],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,186,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,209,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,205,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,141,185,186,188,190,205,206,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,205,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,190,203,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,191,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,186,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,188,203,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,192,193,194,195,196,197,198,201,202,203,204,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,187,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,189,190,192,201,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,130,188,189,190,192,193,194,195,196,197,198,201,202,204,206,207,208,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,200,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,115,130,185,187,206,207,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,185,199,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,226,227,228,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,223,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,224,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,222,225,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,176,179,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,172,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,177,178,180,181,182,220,221,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,171,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,168,176,222,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,180,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,178,181,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,170,178,183,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,183,210,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,183,184,211,219,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,183,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,170,178,181,182,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,177,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,156,158,213,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,113,148,150,151,152,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,153,155,157,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,218,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,113,114,118,124,141,148,154,212,213,214,215,216,217,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,104,110,111,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,99,100,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[51,52,53,56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,101,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,102,103,111,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,104,106,110,118,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,105,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,107,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,108,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,110,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,112,125,130,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,93,98,106,110,113,118,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,111,113,114,118,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,115,130,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[54,55,56,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,116,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,119,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,120,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,97,98,121,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,96,97,98,99,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,123,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,124,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,125,126,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,125,127,142,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,130,131,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,132,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,131,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,133,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,134,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,95,98,130,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,136,137,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,118,130,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,139,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,140,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,124,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,103,142,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,143,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,117,144,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,145,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,112,121,130,133,141,144,146,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,147,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,111,130,148,149,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,113,148,150,154,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,155,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,106,110,118,130,138,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,233,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,110,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,258,260],[56,98,233,234,235,236,237,238,239,240,241,242,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,130,233,234,235,236,237,238,239,240,241,243,244,245,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,249,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,250,251,252,253,254,255,256,257,258,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,251,252,253,254,255,256,257,258,260],[56,98,231,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,252,253,254,255,256,257,258,259,260],[56,98,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,253,254,255,256,257,258,260],[56,98,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,254,255,256,257,258,259,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,255,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,256,257,258,260],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,260],[56,98,222,229,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,138,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,118,138,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,62,65,98,118,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,58,61,64,98,110,130,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,63,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,86,87,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,61,65,98,133,141,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,86,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,98,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,59,60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,80,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,72,73,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,64,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,60,65,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,65,69,73,74,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,69,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,63,65,68,98,141,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,57,62,65,72,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,60,65,86,98,146,148,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260],[56,98,158,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,266,267,268],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262],[56,98,230,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,262,264],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,261,262,263,265],[56,98,233,234,235,236,237,238,239,240,241,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,260,269]],"fileInfos":[{"version":"df039a67536fe2acc3affdcbfb645892f842db36fe599e8e652e2f0c640a90d1","impliedFormat":1},{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a4ef5ccfd69b5bc2a2c29896aa07daaff7c5924a12e70cb3d9819145c06897db","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4a1c5b43d4d408cb0df0a6cc82ca7be314553d37e432fc1fd801bae1a9ab2cb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"c6ab0dd29bf74b71a54ff2bbce509eb8ae3c4294d57cc54940f443c01cd1baae","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"86ea91bfa7fef1eeb958056f30f1db4e0680bc9b5132e5e9d6e9cfd773c0c4fd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"d26a79f97f25eb1c5fc36a8552e4decc7ad11104a016d31b1307c3afaf48feb1","impliedFormat":1},{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7832b05a98f791dcd408cff8699e95fcab73bbfae26ba9a13af5ec4a60f485d","impliedFormat":1},{"version":"9a9e62acbe3cf36141e3d76efa0eaf33ed21b51a90bc1d39c9f880ff4e0bdf87","impliedFormat":1},{"version":"b2453c7a4fe9e3e77f3a75945caa0dabe76a28ebb6dbffc4aef21309e68f6aa5","impliedFormat":1},{"version":"db09d88a24d5f720614b68a66a866e32643fc92444c0e3fd252263b2606ea10a","impliedFormat":1},{"version":"74a0f20e0b110436f175d6e531ef48120c2adc9702e2ca58b31392d2099071cf","impliedFormat":1},{"version":"70f71f639d94715dcf0577fae64d8b5829e89bf8cda1170473e68b8fdeb44378","impliedFormat":1},{"version":"2aeb069895578bac240d9d7317732b6d0ceb1ee25102bcee4b57c4e39bad965f","impliedFormat":1},{"version":"f6aaa84bca2234a227471cc26972b4cc9422afaab8d7f2d6ef51b8bc636bf58b","impliedFormat":1},{"version":"34d56740fa13eebf2b689742daf0d1834205cb9610db1df58403f6abb9adf919","impliedFormat":1},{"version":"29c621fbfd32afa52882955cf8638014e1039113174676edacc6c5b9228205f6","impliedFormat":1},{"version":"f30edc69b36565d72e55c6ebabf021455226cbf700172309e943b3c0caf326e6","impliedFormat":1},{"version":"950cdd2282ca4b38a5c2eadb727b9e2cdd936fabf0b92e36e72362cac0fd6ec5","impliedFormat":1},{"version":"b374d291655bd46fe2fa5e327586c4069361e8f2608df93e8325def3d86edf0f","impliedFormat":1},{"version":"ce9e81a19499c853c33dd83bff81daebd2931bf61e2399d81d26506573ad5928","impliedFormat":1},{"version":"5a67d052a6e4ff50663c6d5e3d807f46f4d1693ff91f6a1c83d6a557afdf6a82","impliedFormat":1},{"version":"5cb4013b09b175e02ef6c97658def451c2ae7338366af048486e3a57f526e118","impliedFormat":1},{"version":"d87e41029923fb44228d4d396aaa481d3270e0b8cf9595fcd81f187695b72c04","impliedFormat":1},{"version":"2b1dc75f0b51f7363a3fca64f48e20bd09aaf6b21446a042be9111ecb5599641","impliedFormat":1},{"version":"38e4e4bed98e94d700ff89caa521840affb5e6225abc1f1f1d17fcde12ae8e58","impliedFormat":1},{"version":"d57be402cf1a3f1bd1852fc71b31ff54da497f64dcdcf8af9ad32435e3f32c1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3e78c2d0093f1283766ea1cf413bdb568f6e3fba30ca6979ca9c467dbd77af8","impliedFormat":1},{"version":"e800ed99d20215a12965bf7502f1371e1b46846551466c0ecda7443bc3225c5a","impliedFormat":1},{"version":"98e5b74c90814ada4ebbc8c6150a23e3fd19989f90c8fccd0219e06119c0966b","impliedFormat":1},{"version":"d134613e3638d004eab97a48b925856dcf3314484cbfe3145b148d7acc993b34","impliedFormat":1},{"version":"7ed10b8a09889585e37a93cc3d4d193995518913779650b2fec0f9896d112340","impliedFormat":1},{"version":"42289160bd23270bd10e956093df608f8a91243e2b2cdbd629c79744340a86cd","impliedFormat":1},{"version":"1bdd7e96e94e3ecd6720bc3a57de1e13760003ca03a8c6ee81c9ae9d12400c93","impliedFormat":1},{"version":"e7d3856062ae83e9903cefa63eb6d2b66fc2d084719e4f4c91dff80e1a679ef6","impliedFormat":1},{"version":"32b4066cafeacbba5af922904b0353e9db488e9e34dfa6528c979733fcf18532","impliedFormat":1},{"version":"ac830864d40131ddd4e739c7011a6fa023b9aeb9229367afa85305962321f91f","impliedFormat":1},{"version":"ea7b76d925ebcbbac1f8fc807b711f095b7633d5a08089762d7323569c4077be","impliedFormat":1},{"version":"536ce6090e9826d91d9b73557f27954d3f9b98c1b1c8b8e004d933677f7b0079","impliedFormat":1},{"version":"24923854943027b359d554b2a122a6e5d9360645f7a6354ac0c0534781cee1a0","impliedFormat":1},{"version":"352b4dc64333e91f53a15980fcc0bed2e062303a76c6b9717ec314dfbe29e93a","impliedFormat":1},{"version":"09bbc977cabb5cd49235e60ff89b77289fe6fa42aa2c472a524c845dc5f4c6fc","impliedFormat":1},{"version":"406717fd8feb6645442dff23a4821d3b6431438e047bdb49b5d37d8d84e49885","impliedFormat":1},{"version":"739d28fd2f30200f9147061c2a8928522d161c55335245003fa2db027d44880c","impliedFormat":1},{"version":"5139d33aeb679963a5d6337232c551464ccaca4661dddf2567f6abbf24e9a140","impliedFormat":1},{"version":"1b4ea9bdde8fb36710a1cde149e647c2e4b63a47132b3d404e76aa1469f10250","impliedFormat":1},{"version":"6a9d3a15e3f0679a1552e5b0f7fae3361536d5eac476b29f3d0b65dd2c672621","impliedFormat":1},{"version":"524fa80c39ce5ea4097eff4b21835738099f26c6dbe51f537873a37488b7d65a","impliedFormat":1},{"version":"6da5df3051db43101fbc4b64ab0c22cff1bdcec8f0324f8e8a305018dc4acc5d","impliedFormat":1},{"version":"7b44a75ca0913e8af7775ee46a9138e5a801521a708c4574c75ffd1e722d5aa0","impliedFormat":1},{"version":"11842523b052ea1cb88c81cdca2922244122b1cad318adcce2e465d48e0a52f8","impliedFormat":1},{"version":"622593b400ce3032a71addf4204c41bac042721ab985de7e42d086558b13a337","impliedFormat":1},{"version":"d243e8eb5a04f2044d9379cf27d881e8ba4be6ba38c66d921c409b46f6d78927","impliedFormat":1},{"version":"22a8a4f9138f039c4c8316d555a1c3715e56f047ed635a578027c08e197ada2b","impliedFormat":1},{"version":"0a5504004bb9a28cee0cd9d04a9b475ca33cde579f5148266b2df3cafc95bafc","impliedFormat":1},{"version":"759b043215e42ea84b4dd5950d993ed124c05bad56bd58397a363e25d0ee62de","impliedFormat":1},{"version":"0e495d33df5bad752abb97f26cf261a6db6dd102dc1e689ba477cdb70e411935","impliedFormat":1},{"version":"d5c19655468e29f60c871b21e73af8ebc653f736e7123ade916f22c4a5f80ce5","impliedFormat":1},{"version":"34a413bafdeae24c5b5419609be63b85255c5d56a4e3185b016e2329a8f13ec4","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"2224f3072e3cc07906eeed5c71746779511fba2dd224addc5489bcdb489bdee5","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"7e8d3f08435ad2cefe67f58182618bfc9a0a29db08cf2544b94cbcae754a9bd9","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"c96e47b3fbf3912887565641f4810f585dea9550eb2a31d91b1543c94cb6aed7","impliedFormat":1},{"version":"a03e9f9bf9fc56c6785a8d5b5bb8a99669acb38dd885afcb4d58673c9c7c0286","impliedFormat":1},{"version":"2f1c0d14f39377282b5dbf908502f5e82141b075770a1f3cd673bca11607a846","impliedFormat":1},{"version":"4ae86b01844cfd5116902a40ad3dd7e7659ea449279e21d2917413a2cfb5077c","impliedFormat":1},{"version":"c302df1d6f371c6064cb5f4d0b41165425b682b287a3b8625527b2752eb433ee","impliedFormat":1},{"version":"09762428597d0079f6ac0785ec4a24471a43796c5517bfbd0606aa163d651660","impliedFormat":1},{"version":"dd2d20937dbd382340d7364a6153c5a71a04e222fa33a26d255dc668e21eb196","impliedFormat":1},{"version":"2a8d9c59c5e85f41cec149485aca6481deb5c32b580dd0ea08d499cc9bfc0b2f","impliedFormat":1},{"version":"1ceda047afdd4436db76576b2bfc72d047c08982ebb40c66aab8bcabf195b8e4","impliedFormat":1},{"version":"fdbd67a5466c4f0dd609b37ddfdfe8ffc3955188f7494922ac7e85f83d3cf11c","impliedFormat":1},{"version":"5e9892fdebf7c79987e0d4cb48941f796a35582f8810bb96c89a31e5d396df8b","impliedFormat":1},{"version":"fd550ecb67f4fa6cc8c8f08d84c072afda2645c001aed5825d0be8e767b8e571","impliedFormat":1},{"version":"359e7188a3ad226e902c43443a45f17bd53bf279596aece7761dc72ffa22b30d","impliedFormat":1},{"version":"d8d9529a7f6c742de51ba5eecaa47fdab38f123af1b5280a1a6956de553e5fe9","impliedFormat":1},{"version":"403c4f2906f58407d454a401daf0fa59cbd683824b444b3151075bc3a6714c48","impliedFormat":1},{"version":"0339d33fe49fbc1c70842c886195e01eafd37f7431dd7f32209dd0544c289474","impliedFormat":1},{"version":"35855ea1dd13580e3a3f4ada5c25395c4977c62b93fd5116411e7b9dff32d7ce","impliedFormat":1},{"version":"c9604ed0199a5ae1e86f9c17a981d297141bc0b3c4f51d88322859294f77f3ce","impliedFormat":1},{"version":"13a4d931c625360ab1cbf68961b13a60969a17cf3247bd60e18a49fb498b68e5","impliedFormat":1},{"version":"80b2eb4a470b8c3ef6709da5c3f8cd827d3b92b1bc96ec0ae661cc6eb7b213da","impliedFormat":1},{"version":"fe677c6e53f1eddbcc00af336d3ffbada25e6e0aa05a0fb5f10c818b5b6b6aa7","affectsGlobalScope":true,"impliedFormat":1},{"version":"89cbb41c032a8602412a55d89c9fbee8af199ffb3e89e52a0306d42518f491c3","impliedFormat":1},{"version":"3b251e4edc903f60ab560be43d72840f58a5bb6f6b297a78147436b6dba0bf51","impliedFormat":1},{"version":"021fbcae20ddc7ca7bf04cdb02a8c51f0d96afdde6a8462fb73b09ab4136ff7a","impliedFormat":1},{"version":"d2ce9e0d3035ad20bc34eb6177cd4a6ced475367170d8e46860598fe49dd9b3e","impliedFormat":1},{"version":"8443bbb1e167b4cca6d192eab6f9ab94442054f9b1c945f05070c23896396365","impliedFormat":1},{"version":"4e402f9d1887c077981d4668089ee20192bbfa7450b8abb36af3efa100fc1298","impliedFormat":1},{"version":"bbe98bf29952b80a91789cc6a3a3727aa958e652f32b145740229fe4b02f2a0a","impliedFormat":1},{"version":"18e0fa134b9df012b043ee0fc9698d7b1666c7e7df7918bf465a79c89742fbfc","impliedFormat":1},{"version":"3016511eadb560b6874050f8ff2ca671c64a663a48c60a24e3e7ddef92c3b095","impliedFormat":1},{"version":"ab066772d4672b6cfa1196820df536fa225888dbc9bf9cf68ce1173bc03d433b","impliedFormat":1},{"version":"9ee85178017faacec870ca5b75c292d6d1d6d6f4e81d42c79c4cf73b63a303d8","impliedFormat":1},{"version":"788a2d9ffaccf9ce65d321472ff3daaf9ab864504fad41753b978bfbd5e9ea71","impliedFormat":1},{"version":"861b3b1cea0c4dbfd58cd3cb7a630ea8270b4ce92091941c263f4b4c6c21119b","impliedFormat":1},{"version":"8d35820323a2758d61684679eddc3f1d0cc051c55258b3243aee14b6b8e285c1","impliedFormat":1},{"version":"8c418189bb1daec5e7736b6301345487e6f8f3c8ba49ef538e330e6003a47c87","impliedFormat":1},{"version":"da440f879ec47f7113408fb75f239f437b9ee812fba67562c499f10ef012464a","impliedFormat":1},{"version":"e78e58cf1d0a34668fe7365a0eeef0d85c67d81f15aaf976d9d45999b0baa9d5","impliedFormat":1},{"version":"b8de1c91d357f855aee17e06083abbf345cae76454548d1d112b9bc0d4f35821","impliedFormat":1},{"version":"f967724c16fb47d360ad8fa1cedeacc045bd4b199535a3adcc85a1216b045ab8","impliedFormat":1},{"version":"448ae408883377930fb80d69635f949f3425c0f32c49c5656c73f8a6ae90d702","impliedFormat":1},{"version":"969ce33d76b1de933ab58f84db2936508252babf91875d429a3ce6a9961ec41e","affectsGlobalScope":true,"impliedFormat":1},"baf4e753153aaa14d8eb1dbc5712e419668311763293415b3f6ebf49ca852b83","26a5a5d5419ad7247790eae73aea7b7dc3a5410883895c8c9db3a921f81196d7","dffa36929cbf03610979340afa502cf754184c07e05d1842f91df14777f7397b","fa25df004e129d3a39f47ec4b54b070bab1c4f41d5bddf9bf98b22a679f6baf0","12d99f65c65814a6daf750a453ea51abb6cb3679f4fdc91a4fd36071ea07d7ee","ac5005e5849afc670b2060f58bfc7c525cf6f664cc746d46ac0d0bf2ffc2beef",{"version":"85a55229c4d0f20d42c59cec768df0cb83a492f8bb1351ead8524a58f278a005","impliedFormat":1},"8feb46d9c170669728772717cee178305758cf63145d3d551f76ffd7efd14a39","d271d41f616162e1366947fc7a4445e3791475c6d3e847384c84af9447eab554","85175d11bc7d4022fccc100de65ca3bf50dbc5f504576fc2bec5750c3afb71ef",{"version":"f2f23fe34b735887db1d5597714ae37a6ffae530cafd6908c9d79d485667c956","impliedFormat":1},{"version":"5bba0e6cd8375fd37047e99a080d1bd9a808c95ecb7f3043e3adc125196f6607","impliedFormat":1}],"root":[[261,265],269,270],"options":{"alwaysStrict":true,"esModuleInterop":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","skipLibCheck":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":2},"referencedMap":[[266,1],[268,2],[185,2],[191,3],[210,4],[209,5],[208,6],[207,7],[206,8],[190,9],[204,10],[192,11],[193,12],[194,13],[195,14],[205,15],[196,2],[197,16],[198,11],[202,17],[203,18],[201,19],[188,20],[199,2],[189,2],[186,2],[187,21],[200,22],[225,23],[229,24],[227,25],[226,25],[228,26],[224,27],[180,28],[160,2],[161,2],[168,2],[163,2],[169,2],[165,2],[162,2],[175,29],[166,2],[167,2],[164,2],[222,30],[170,31],[174,32],[173,2],[172,33],[177,34],[181,35],[182,36],[184,37],[211,38],[220,39],[219,40],[183,41],[178,42],[176,2],[221,2],[171,2],[212,43],[157,44],[156,43],[216,2],[214,45],[153,46],[158,47],[215,2],[154,2],[213,2],[217,48],[218,49],[149,2],[179,50],[95,51],[96,51],[97,52],[56,53],[98,54],[99,55],[100,56],[51,2],[54,57],[52,2],[53,2],[101,58],[102,59],[103,60],[104,61],[105,62],[106,63],[107,63],[109,2],[108,64],[110,65],[111,66],[112,67],[94,68],[55,2],[113,69],[114,70],[115,71],[148,72],[116,73],[117,74],[118,75],[119,76],[120,77],[121,78],[122,79],[123,80],[124,81],[125,82],[126,82],[127,83],[128,2],[129,2],[130,84],[132,85],[131,86],[133,87],[134,88],[135,89],[136,90],[137,91],[138,92],[139,93],[140,94],[141,95],[142,96],[143,97],[144,98],[145,99],[146,100],[147,101],[151,2],[152,2],[150,102],[155,103],[267,104],[271,2],[272,2],[231,2],[242,2],[232,105],[233,106],[259,107],[234,108],[235,109],[236,110],[237,111],[238,112],[239,113],[240,114],[241,115],[260,116],[244,117],[257,118],[256,2],[243,119],[245,120],[246,121],[247,122],[248,123],[249,124],[250,125],[251,126],[252,127],[253,128],[254,129],[255,130],[258,131],[159,2],[230,132],[49,2],[50,2],[9,2],[10,2],[14,2],[13,2],[3,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[4,2],[23,2],[24,2],[5,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[6,2],[33,2],[34,2],[35,2],[36,2],[7,2],[40,2],[37,2],[38,2],[39,2],[41,2],[8,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[2,2],[1,2],[12,2],[11,2],[223,2],[72,133],[82,134],[71,133],[92,135],[63,136],[62,137],[91,138],[85,139],[90,140],[65,141],[79,142],[64,143],[88,144],[60,145],[59,138],[89,146],[61,147],[66,148],[67,2],[70,148],[57,2],[93,149],[83,150],[74,151],[75,152],[77,153],[73,154],[76,155],[86,138],[68,156],[69,157],[78,158],[58,32],[81,150],[80,148],[84,2],[87,159],[269,160],[263,161],[261,2],[265,162],[264,163],[262,2],[270,164]],"version":"5.8.3"} \ No newline at end of file diff --git a/package.json b/package.json index ee62f00ade..24ee35eed3 100644 --- a/package.json +++ b/package.json @@ -1,44 +1,14 @@ { - "name": "clear", - "version": "1.0.0", - "description": "This project has been created by a student at Parsity, an online software engineering course. The work in this repository is wholly of the student based on a sample starter project that can be accessed by looking at the repository that this project forks.", - "homepage": "https://github.com/tomwinskell/product-list#readme", - "bugs": { - "url": "https://github.com/tomwinskell/product-list/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tomwinskell/product-list.git" - }, - "license": "ISC", - "author": "", - "main": "build/src/server.js", + "private": true, + "workspaces": [ + "apps/*" + ], "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "dev": "concurrently \"nodemon\" \"nodemon -x tsoa spec-and-routes\"", - "build": "tsoa spec-and-routes && tsc --outDir build --experimentalDecorators", - "start": "node build/src/server.js" - }, - "dependencies": { - "@faker-js/faker": "^9.8.0", - "body-parser": "^2.2.0", - "express": "^5.1.0", - "mongoose": "^8.15.1", - "swagger-ui-express": "^5.0.1", - "tsoa": "^6.6.0", - "zod": "^3.25.46" - }, - "imports": { - "#root/*": "./*" + "dev:api": "yarn workspace api dev", + "dev:web": "yarn workspace web dev", + "dev": "concurrently \"yarn dev:api\" \"yarn dev:web\"" }, "devDependencies": { - "@types/express": "^5.0.2", - "@types/mongoose": "^5.11.96", - "@types/node": "^22.15.29", - "@types/swagger-ui-express": "^4.1.8", - "concurrently": "^9.1.2", - "nodemon": "^3.1.10", - "ts-node": "^10.9.2", - "typescript": "^5.8.3" + "concurrently": "^9.1.2" } } diff --git a/yarn.lock b/yarn.lock index 5a2f4aca0e..df2e5db008 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,188 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.4.0": + version "4.4.3" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.3.tgz#beebbefb0264fdeb32d3052acae0e0d94315a9a2" + integrity sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA== + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@asamuzakjp/css-color@^3.1.2": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@asamuzakjp/css-color/-/css-color-3.2.0.tgz#cc42f5b85c593f79f1fa4f25d2b9b321e61d1794" + integrity sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw== + dependencies: + "@csstools/css-calc" "^2.1.3" + "@csstools/css-color-parser" "^3.0.9" + "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" + lru-cache "^10.4.3" + +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.5.tgz#7d0658ec1a8420fc866d1df1b03bea0e79934c82" + integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== + +"@babel/core@^7.26.10": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.4.tgz#cc1fc55d0ce140a1828d1dd2a2eba285adbfb3ce" + integrity sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.4" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.27.4" + "@babel/types" "^7.27.3" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.27.3": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c" + integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== + dependencies: + "@babel/parser" "^7.27.5" + "@babel/types" "^7.27.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.4": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.4.tgz#c79050c6a0e41e095bfc96d469c85431e9ed7fe7" + integrity sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" + +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/plugin-transform-react-jsx-self@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" + integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-react-jsx-source@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" + integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/runtime@^7.12.5": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.4.tgz#a91ec580e6c00c67118127777c316dfd5a5a6abf" + integrity sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA== + +"@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.4": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.3.tgz#c0257bedf33aad6aad1f406d35c44758321eb3ec" + integrity sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -9,6 +191,225 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@csstools/color-helpers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz#82592c9a7c2b83c293d9161894e2a6471feb97b8" + integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== + +"@csstools/css-calc@^2.1.3", "@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== + +"@csstools/css-color-parser@^3.0.9": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz#79fc68864dd43c3b6782d2b3828bc0fa9d085c10" + integrity sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg== + dependencies: + "@csstools/color-helpers" "^5.0.2" + "@csstools/css-calc" "^2.1.4" + +"@csstools/css-parser-algorithms@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@esbuild/aix-ppc64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz#4e0f91776c2b340e75558f60552195f6fad09f18" + integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== + +"@esbuild/android-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz#bc766407f1718923f6b8079c8c61bf86ac3a6a4f" + integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== + +"@esbuild/android-arm@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.5.tgz#4290d6d3407bae3883ad2cded1081a234473ce26" + integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== + +"@esbuild/android-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.5.tgz#40c11d9cbca4f2406548c8a9895d321bc3b35eff" + integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== + +"@esbuild/darwin-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz#49d8bf8b1df95f759ac81eb1d0736018006d7e34" + integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== + +"@esbuild/darwin-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz#e27a5d92a14886ef1d492fd50fc61a2d4d87e418" + integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== + +"@esbuild/freebsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz#97cede59d638840ca104e605cdb9f1b118ba0b1c" + integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== + +"@esbuild/freebsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz#71c77812042a1a8190c3d581e140d15b876b9c6f" + integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== + +"@esbuild/linux-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz#f7b7c8f97eff8ffd2e47f6c67eb5c9765f2181b8" + integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== + +"@esbuild/linux-arm@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz#2a0be71b6cd8201fa559aea45598dffabc05d911" + integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== + +"@esbuild/linux-ia32@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz#763414463cd9ea6fa1f96555d2762f9f84c61783" + integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== + +"@esbuild/linux-loong64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz#428cf2213ff786a502a52c96cf29d1fcf1eb8506" + integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== + +"@esbuild/linux-mips64el@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz#5cbcc7fd841b4cd53358afd33527cd394e325d96" + integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== + +"@esbuild/linux-ppc64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz#0d954ab39ce4f5e50f00c4f8c4fd38f976c13ad9" + integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== + +"@esbuild/linux-riscv64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz#0e7dd30730505abd8088321e8497e94b547bfb1e" + integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== + +"@esbuild/linux-s390x@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz#5669af81327a398a336d7e40e320b5bbd6e6e72d" + integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== + +"@esbuild/linux-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz#b2357dd153aa49038967ddc1ffd90c68a9d2a0d4" + integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== + +"@esbuild/netbsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz#53b4dfb8fe1cee93777c9e366893bd3daa6ba63d" + integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== + +"@esbuild/netbsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz#a0206f6314ce7dc8713b7732703d0f58de1d1e79" + integrity sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ== + +"@esbuild/openbsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz#2a796c87c44e8de78001d808c77d948a21ec22fd" + integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== + +"@esbuild/openbsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz#28d0cd8909b7fa3953af998f2b2ed34f576728f0" + integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== + +"@esbuild/sunos-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz#a28164f5b997e8247d407e36c90d3fd5ddbe0dc5" + integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== + +"@esbuild/win32-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz#6eadbead38e8bd12f633a5190e45eff80e24007e" + integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== + +"@esbuild/win32-ia32@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz#bab6288005482f9ed2adb9ded7e88eba9a62cc0d" + integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== + +"@esbuild/win32-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz#7fc114af5f6563f19f73324b5d5ff36ece0803d1" + integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" + integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.1": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" + integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== + +"@eslint/core@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.14.0.tgz#326289380968eaf7e96f364e1e4cf8f3adf2d003" + integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.28.0", "@eslint/js@^9.23.0": + version "9.28.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.28.0.tgz#7822ccc2f8cae7c3cd4f902377d520e9ae03f844" + integrity sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz#b71b037b2d4d68396df04a8c35a49481e5593067" + integrity sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w== + dependencies: + "@eslint/core" "^0.14.0" + levn "^0.4.1" + "@faker-js/faker@^9.8.0": version "9.8.0" resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.8.0.tgz#3344284028d1c9dc98dee2479f82939310370d88" @@ -264,6 +665,34 @@ "@hapi/bourne" "^3.0.0" "@hapi/hoek" "^11.0.2" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -276,12 +705,26 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== @@ -294,6 +737,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@mongodb-js/saslprep@^1.1.9": version "1.2.2" resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz#09506f29cc2a99d9d7b951caa7fffc87e522a6d3" @@ -301,16 +752,208 @@ dependencies: sparse-bitfield "^3.0.3" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@pkgr/core@^0.2.4": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.7.tgz#eb5014dfd0b03e7f3ba2eeeff506eed89b028058" + integrity sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg== + +"@reduxjs/toolkit@^2.6.1": + version "2.8.2" + resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.8.2.tgz#f4e9f973c6fc930c1e0f3bf462cc95210c28f5f9" + integrity sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A== + dependencies: + "@standard-schema/spec" "^1.0.0" + "@standard-schema/utils" "^0.3.0" + immer "^10.0.3" + redux "^5.0.1" + redux-thunk "^3.1.0" + reselect "^5.1.0" + +"@rolldown/pluginutils@1.0.0-beta.9": + version "1.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz#68ef9fff5a9791a642cea0dc4380ce6cb487a84a" + integrity sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w== + +"@rollup/rollup-android-arm-eabi@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz#f39f09f60d4a562de727c960d7b202a2cf797424" + integrity sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw== + +"@rollup/rollup-android-arm64@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz#d19af7e23760717f1d879d4ca3d2cd247742dff2" + integrity sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA== + +"@rollup/rollup-darwin-arm64@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz#1c3a2fbf205d80641728e05f4a56c909e95218b7" + integrity sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w== + +"@rollup/rollup-darwin-x64@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz#aa66d2ba1a25e609500e13bef06dc0e71cc0c0d4" + integrity sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg== + +"@rollup/rollup-freebsd-arm64@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz#df10a7b6316a0ef1028c6ca71a081124c537e30d" + integrity sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg== + +"@rollup/rollup-freebsd-x64@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz#a3fdce8a05e95b068cbcb46e4df5185e407d0c35" + integrity sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA== + +"@rollup/rollup-linux-arm-gnueabihf@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz#49f766c55383bd0498014a9d76924348c2f3890c" + integrity sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg== + +"@rollup/rollup-linux-arm-musleabihf@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz#1d4d7d32fc557e17d52e1857817381ea365e2959" + integrity sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA== + +"@rollup/rollup-linux-arm64-gnu@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz#f4fc317268441e9589edad3be8f62b6c03009bc1" + integrity sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA== + +"@rollup/rollup-linux-arm64-musl@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz#63a1f1b0671cb17822dabae827fef0e443aebeb7" + integrity sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg== + +"@rollup/rollup-linux-loongarch64-gnu@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz#c659b01cc6c0730b547571fc3973e1e955369f98" + integrity sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz#612e746f9ad7e58480f964d65e0d6c3f4aae69a8" + integrity sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A== + +"@rollup/rollup-linux-riscv64-gnu@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz#4610dbd1dcfbbae32fbc10c20ae7387acb31110c" + integrity sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw== + +"@rollup/rollup-linux-riscv64-musl@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz#054911fab40dc83fafc21e470193c058108f19d8" + integrity sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw== + +"@rollup/rollup-linux-s390x-gnu@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz#98896eca8012547c7f04bd07eaa6896825f9e1a5" + integrity sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g== + +"@rollup/rollup-linux-x64-gnu@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz#01cf56844a1e636ee80dfb364e72c2b7142ad896" + integrity sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A== + +"@rollup/rollup-linux-x64-musl@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz#e67c7531df6dff0b4c241101d4096617fbca87c3" + integrity sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ== + +"@rollup/rollup-win32-arm64-msvc@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz#7eeada98444e580674de6989284e4baacd48ea65" + integrity sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ== + +"@rollup/rollup-win32-ia32-msvc@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz#516c4b54f80587b4a390aaf4940b40870271d35d" + integrity sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg== + +"@rollup/rollup-win32-x64-msvc@4.41.1": + version "4.41.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz#848f99b0d9936d92221bb6070baeff4db6947a30" + integrity sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw== + "@scarf/scarf@=1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== +"@standard-schema/spec@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c" + integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA== + +"@standard-schema/utils@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b" + integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g== + +"@testing-library/dom@^10.4.0": + version "10.4.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.6.3": + version "6.6.3" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz#26ba906cf928c0f8172e182c6fe214eb4f9f2bd2" + integrity sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA== + dependencies: + "@adobe/css-tools" "^4.4.0" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.6.3" + lodash "^4.17.21" + redent "^3.0.0" + +"@testing-library/react@^16.3.0": + version "16.3.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.3.0.tgz#3a85bb9bdebf180cd76dba16454e242564d598a6" + integrity sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw== + dependencies: + "@babel/runtime" "^7.12.5" + +"@testing-library/user-event@^14.6.1": + version "14.6.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz#13e09a32d7a8b7060fe38304788ebf4197cd2149" + integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -369,6 +1012,44 @@ dependencies: "@types/node" "*" +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + +"@types/babel__core@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" + integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== + dependencies: + "@babel/types" "^7.20.7" + "@types/body-parser@*": version "1.19.5" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" @@ -377,6 +1058,13 @@ "@types/connect" "*" "@types/node" "*" +"@types/chai@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + dependencies: + "@types/deep-eql" "*" + "@types/connect@*": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" @@ -399,6 +1087,16 @@ "@types/keygrip" "*" "@types/node" "*" +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/estree@1.0.7", "@types/estree@^1.0.0", "@types/estree@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + "@types/express-serve-static-core@^5.0.0": version "5.0.6" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" @@ -428,6 +1126,11 @@ resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/keygrip@*": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.6.tgz#1749535181a2a9b02ac04a797550a8787345b740" @@ -473,7 +1176,7 @@ dependencies: "@types/express" "*" -"@types/node@*", "@types/node@^22.15.29": +"@types/node@*", "@types/node@^22.14.0", "@types/node@^22.15.29": version "22.15.29" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.29.tgz#c75999124a8224a3f79dd8b6ccfb37d74098f678" integrity sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ== @@ -490,6 +1193,18 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== +"@types/react-dom@^19.1.1": + version "19.1.5" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.1.5.tgz#cdfe2c663742887372f54804b16e8dbc26bd794a" + integrity sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg== + +"@types/react@^19.1.0": + version "19.1.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.6.tgz#dee39f3e1e9a7d693f156a5840570b6d57f325ea" + integrity sha512-JeG0rEWak0N6Itr6QUx+X60uQmN+5t3j9r/OVDtWzFXKaj6kD1BwJzOksD0FF6iWxZlbE1kB0q9vtnU2ekqa1Q== + dependencies: + csstype "^3.0.2" + "@types/send@*": version "0.17.4" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" @@ -515,6 +1230,11 @@ "@types/express" "*" "@types/serve-static" "*" +"@types/use-sync-external-store@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc" + integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg== + "@types/webidl-conversions@*": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz#1306dbfa53768bcbcfc95a1c8cde367975581859" @@ -527,6 +1247,182 @@ dependencies: "@types/webidl-conversions" "*" +"@typescript-eslint/eslint-plugin@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz#532641b416ed2afd5be893cddb2a58e9cd1f7a3e" + integrity sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.33.1" + "@typescript-eslint/type-utils" "8.33.1" + "@typescript-eslint/utils" "8.33.1" + "@typescript-eslint/visitor-keys" "8.33.1" + graphemer "^1.4.0" + ignore "^7.0.0" + natural-compare "^1.4.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/parser@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.33.1.tgz#ef9a5ee6aa37a6b4f46cc36d08a14f828238afe2" + integrity sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA== + dependencies: + "@typescript-eslint/scope-manager" "8.33.1" + "@typescript-eslint/types" "8.33.1" + "@typescript-eslint/typescript-estree" "8.33.1" + "@typescript-eslint/visitor-keys" "8.33.1" + debug "^4.3.4" + +"@typescript-eslint/project-service@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.33.1.tgz#c85e7d9a44d6a11fe64e73ac1ed47de55dc2bf9f" + integrity sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.33.1" + "@typescript-eslint/types" "^8.33.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz#d1e0efb296da5097d054bc9972e69878a2afea73" + integrity sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA== + dependencies: + "@typescript-eslint/types" "8.33.1" + "@typescript-eslint/visitor-keys" "8.33.1" + +"@typescript-eslint/tsconfig-utils@8.33.1", "@typescript-eslint/tsconfig-utils@^8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz#7836afcc097a4657a5ed56670851a450d8b70ab8" + integrity sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g== + +"@typescript-eslint/type-utils@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz#d73ee1a29d8a0abe60d4abbff4f1d040f0de15fa" + integrity sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww== + dependencies: + "@typescript-eslint/typescript-estree" "8.33.1" + "@typescript-eslint/utils" "8.33.1" + debug "^4.3.4" + ts-api-utils "^2.1.0" + +"@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f" + integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg== + +"@typescript-eslint/typescript-estree@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d" + integrity sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA== + dependencies: + "@typescript-eslint/project-service" "8.33.1" + "@typescript-eslint/tsconfig-utils" "8.33.1" + "@typescript-eslint/types" "8.33.1" + "@typescript-eslint/visitor-keys" "8.33.1" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/utils@8.33.1", "@typescript-eslint/utils@^8.24.0": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.33.1.tgz#ea22f40d3553da090f928cf17907e963643d4b96" + integrity sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.33.1" + "@typescript-eslint/types" "8.33.1" + "@typescript-eslint/typescript-estree" "8.33.1" + +"@typescript-eslint/visitor-keys@8.33.1": + version "8.33.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc" + integrity sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ== + dependencies: + "@typescript-eslint/types" "8.33.1" + eslint-visitor-keys "^4.2.0" + +"@vitejs/plugin-react@^4.3.4": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.5.1.tgz#19432712467ad3b81f24c85d695a6febf8d4cc11" + integrity sha512-uPZBqSI0YD4lpkIru6M35sIfylLGTyhGHvDZbNLuMA73lMlwJKz5xweH7FajfcCAc2HnINciejA9qTz0dr0M7A== + dependencies: + "@babel/core" "^7.26.10" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" + "@rolldown/pluginutils" "1.0.0-beta.9" + "@types/babel__core" "^7.20.5" + react-refresh "^0.17.0" + +"@vitest/eslint-plugin@^1.1.39": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@vitest/eslint-plugin/-/eslint-plugin-1.2.1.tgz#99136de056721e37d1b02832dbe88a78b2620b70" + integrity sha512-JQr1jdVcrsoS7Sdzn83h9sq4DvREf9Q/onTZbJCqTVlv/76qb+TZrLv/9VhjnjSMHweQH5FdpMDeCR6aDe2fgw== + dependencies: + "@typescript-eslint/utils" "^8.24.0" + +"@vitest/expect@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.0.tgz#1c1dacb9fe68f27b572795732c27a15c1ea5a502" + integrity sha512-0v4YVbhDKX3SKoy0PHWXpKhj44w+3zZkIoVES9Ex2pq+u6+Bijijbi2ua5kE+h3qT6LBWFTNZSCOEU37H8Y5sA== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.0" + "@vitest/utils" "3.2.0" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/mocker@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-3.2.0.tgz#f3c3546b7daea39d1382ba9bd5325f20669ae2b7" + integrity sha512-HFcW0lAMx3eN9vQqis63H0Pscv0QcVMo1Kv8BNysZbxcmHu3ZUYv59DS6BGYiGQ8F5lUkmsfMMlPm4DJFJdf/A== + dependencies: + "@vitest/spy" "3.2.0" + estree-walker "^3.0.3" + magic-string "^0.30.17" + +"@vitest/pretty-format@3.2.0", "@vitest/pretty-format@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.0.tgz#81728ccebae16f1421600d305d526bdce08783ad" + integrity sha512-gUUhaUmPBHFkrqnOokmfMGRBMHhgpICud9nrz/xpNV3/4OXCn35oG+Pl8rYYsKaTNd/FAIrqRHnwpDpmYxCYZw== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/runner@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-3.2.0.tgz#3dc645bc40ffb9f586267776337e3247402e4831" + integrity sha512-bXdmnHxuB7fXJdh+8vvnlwi/m1zvu+I06i1dICVcDQFhyV4iKw2RExC/acavtDn93m/dRuawUObKsrNE1gJacA== + dependencies: + "@vitest/utils" "3.2.0" + pathe "^2.0.3" + +"@vitest/snapshot@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-3.2.0.tgz#98ba12e3eb0ad39beffb9c44747b7c4d42f9e25e" + integrity sha512-z7P/EneBRMe7hdvWhcHoXjhA6at0Q4ipcoZo6SqgxLyQQ8KSMMCmvw1cSt7FHib3ozt0wnRHc37ivuUMbxzG/A== + dependencies: + "@vitest/pretty-format" "3.2.0" + magic-string "^0.30.17" + pathe "^2.0.3" + +"@vitest/spy@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.0.tgz#553b61838a1aabc33228b1193c1cf80a00c0c315" + integrity sha512-s3+TkCNUIEOX99S0JwNDfsHRaZDDZZR/n8F0mop0PmsEbQGKZikCGpTGZ6JRiHuONKew3Fb5//EPwCP+pUX9cw== + dependencies: + tinyspy "^4.0.3" + +"@vitest/utils@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.0.tgz#5a6165d54436d9d699076c2ea2631466909a06a3" + integrity sha512-gXXOe7Fj6toCsZKVQouTRLJftJwmvbhH5lKOBR6rlP950zUq9AitTUjnFoXS/CqjBC2aoejAztLPzzuva++XBw== + dependencies: + "@vitest/pretty-format" "3.2.0" + loupe "^3.1.3" + tinyrainbow "^2.0.0" + accepts@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" @@ -543,6 +1439,11 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.1.1: version "8.3.4" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" @@ -550,11 +1451,26 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1: +acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: version "8.14.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -572,6 +1488,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" @@ -590,11 +1511,123 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +aria-query@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" + integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -653,24 +1686,39 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" +browserslist@^4.24.0: + version "4.25.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== + dependencies: + caniuse-lite "^1.0.30001718" + electron-to-chromium "^1.5.160" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + bson@^6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.3.tgz#5f9a463af6b83e264bedd08b236d1356a30eda47" - integrity sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ== + version "6.10.4" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.4.tgz#d530733bb5bb16fb25c162e01a3344fab332fd2b" + integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng== bytes@3.1.2, bytes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== @@ -678,7 +1726,17 @@ call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: es-errors "^1.3.0" function-bind "^1.1.2" -call-bound@^1.0.2: +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== @@ -686,7 +1744,36 @@ call-bound@^1.0.2: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" -chalk@^4.1.2: +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001718: + version "1.0.30001720" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz#c138cb6026d362be9d8d7b0e4bcd0183a850edfd" + integrity sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g== + +chai@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05" + integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -694,6 +1781,11 @@ chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + chokidar@^3.5.2: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -767,6 +1859,11 @@ content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -801,6 +1898,59 @@ cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssstyle@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.3.1.tgz#68a3c9f5a70aa97d5a6ebecc9805e511fc022eb8" + integrity sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q== + dependencies: + "@asamuzakjp/css-color" "^3.1.2" + rrweb-cssom "^0.8.0" + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +data-urls@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" + integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== + dependencies: + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -808,18 +1958,56 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.x, debug@^4, debug@^4.3.5, debug@^4.4.0: +debug@4, debug@4.x, debug@^4, debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" +decimal.js@^10.5.0: + version "10.5.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" + integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -830,7 +2018,24 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dunder-proto@^1.0.1: +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== @@ -849,6 +2054,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +electron-to-chromium@^1.5.160: + version "1.5.162" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.162.tgz#5305c15292a960f36e86f8b330da958f8ae1690d" + integrity sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -869,7 +2079,72 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -es-define-property@^1.0.1: +entities@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.0.tgz#09c9e29cb79b0a6459a9b9db9efb418ac5bb8e51" + integrity sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw== + +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" + integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== @@ -879,6 +2154,33 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-iterator-helpers@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" + integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.6" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.4" + safe-array-concat "^1.1.3" + +es-module-lexer@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== + es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" @@ -886,7 +2188,64 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: dependencies: es-errors "^1.3.0" -escalade@^3.1.1: +es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +esbuild@^0.25.0: + version "0.25.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.5.tgz#71075054993fdfae76c66586f9b9c1f8d7edd430" + integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.5" + "@esbuild/android-arm" "0.25.5" + "@esbuild/android-arm64" "0.25.5" + "@esbuild/android-x64" "0.25.5" + "@esbuild/darwin-arm64" "0.25.5" + "@esbuild/darwin-x64" "0.25.5" + "@esbuild/freebsd-arm64" "0.25.5" + "@esbuild/freebsd-x64" "0.25.5" + "@esbuild/linux-arm" "0.25.5" + "@esbuild/linux-arm64" "0.25.5" + "@esbuild/linux-ia32" "0.25.5" + "@esbuild/linux-loong64" "0.25.5" + "@esbuild/linux-mips64el" "0.25.5" + "@esbuild/linux-ppc64" "0.25.5" + "@esbuild/linux-riscv64" "0.25.5" + "@esbuild/linux-s390x" "0.25.5" + "@esbuild/linux-x64" "0.25.5" + "@esbuild/netbsd-arm64" "0.25.5" + "@esbuild/netbsd-x64" "0.25.5" + "@esbuild/openbsd-arm64" "0.25.5" + "@esbuild/openbsd-x64" "0.25.5" + "@esbuild/sunos-x64" "0.25.5" + "@esbuild/win32-arm64" "0.25.5" + "@esbuild/win32-ia32" "0.25.5" + "@esbuild/win32-x64" "0.25.5" + +escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== @@ -896,11 +2255,162 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^10.1.1: + version "10.1.5" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.5.tgz#00c18d7225043b6fbce6a665697377998d453782" + integrity sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw== + +eslint-plugin-prettier@^5.2.6: + version "5.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz#99b55d7dd70047886b2222fdd853665f180b36af" + integrity sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.11.7" + +eslint-plugin-react-hooks@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3" + integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== + +eslint-plugin-react@^7.37.4: + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.23.0: + version "9.28.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.28.0.tgz#b0bcbe82a16945a40906924bea75e8b4980ced7d" + integrity sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.20.0" + "@eslint/config-helpers" "^0.2.1" + "@eslint/core" "^0.14.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.28.0" + "@eslint/plugin-kit" "^0.3.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +expect-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f" + integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== + express@^4.21.2: version "4.21.2" resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" @@ -971,12 +2481,62 @@ express@^5.1.0: type-is "^2.0.1" vary "^1.1.2" -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: - to-regex-range "^5.0.1" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +fdir@^6.4.4: + version "6.4.5" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.5.tgz#328e280f3a23699362f95f2e82acf978a0c0cb49" + integrity sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" finalhandler@1.3.1: version "1.3.1" @@ -1003,6 +2563,34 @@ finalhandler@^2.1.0: parseurl "^1.3.3" statuses "^2.0.1" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + foreground-child@^3.1.0: version "3.3.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" @@ -1035,7 +2623,7 @@ fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -1045,12 +2633,34 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -1066,7 +2676,7 @@ get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: hasown "^2.0.2" math-intrinsics "^1.1.0" -get-proto@^1.0.1: +get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== @@ -1074,13 +2684,29 @@ get-proto@^1.0.1: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -glob-parent@~5.1.2: +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^10.3.10: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" @@ -1093,7 +2719,30 @@ glob@^10.3.10: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -gopd@^1.2.0: +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.0.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.2.0.tgz#19efcd1ddde2bd5efce128e5c2e441df1abc6f7c" + integrity sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== @@ -1103,6 +2752,11 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + handlebars@^4.7.8: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" @@ -1115,6 +2769,11 @@ handlebars@^4.7.8: optionalDependencies: uglify-js "^3.1.4" +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -1125,11 +2784,32 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.1.0: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -1137,6 +2817,13 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" +html-encoding-sniffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" + integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== + dependencies: + whatwg-encoding "^3.1.1" + http-errors@2.0.0, http-errors@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -1148,6 +2835,22 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-proxy-agent@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1167,16 +2870,85 @@ ignore-by-default@^1.0.1: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +immer@^10.0.3: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inherits@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1184,43 +2956,203 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@~4.0.1: +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + is-promise@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + is-what@^4.1.8: version "4.1.16" resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +iterator.prototype@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" @@ -1230,6 +3162,69 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^26.0.0: + version "26.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-26.1.0.tgz#ab5f1c1cafc04bd878725490974ea5e8bf0c72b3" + integrity sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg== + dependencies: + cssstyle "^4.2.1" + data-urls "^5.0.0" + decimal.js "^10.5.0" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.6" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.16" + parse5 "^7.2.1" + rrweb-cssom "^0.8.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^5.1.1" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.1.1" + ws "^8.18.0" + xml-name-validator "^5.0.0" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -1239,21 +3234,89 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + kareem@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.6.3.tgz#23168ec8ffb6c1abfd31b7169a6fb1dd285992ac" integrity sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q== +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -lru-cache@^10.2.0: +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^3.1.0, loupe@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.3.tgz#042a8f7986d77f3d0f98ef7990a2b2fef18b0fd2" + integrity sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug== + +lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.30.17: + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -1296,11 +3359,24 @@ merge-descriptors@^2.0.0: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" @@ -1330,6 +3406,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1406,6 +3487,16 @@ ms@2.1.3, ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -1421,6 +3512,11 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + nodemon@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.10.tgz#5015c5eb4fffcb24d98cf9454df14f4fecec9bc1" @@ -1442,11 +3538,68 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-inspect@^1.13.3: +nwsapi@^2.2.16: + version "2.2.20" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.20.tgz#22e53253c61e7b0e7e93cef42c891154bcca11ef" + integrity sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + on-finished@2.4.1, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -1461,21 +3614,80 @@ once@^1.4.0: dependencies: wrappy "1" +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse5@^7.2.1: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" + parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" @@ -1494,11 +3706,80 @@ path-to-regexp@^8.0.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== -picomatch@^2.0.4, picomatch@^2.2.1: +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss@^8.5.3: + version "8.5.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.4.tgz#d61014ac00e11d5f58458ed7247d899bd65f99c0" + integrity sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proxy-addr@^2.0.7, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -1512,7 +3793,7 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -punycode@^2.3.1: +punycode@^2.1.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -1531,6 +3812,11 @@ qs@^6.14.0: dependencies: side-channel "^1.1.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -1556,6 +3842,41 @@ raw-body@^3.0.0: iconv-lite "0.6.3" unpipe "1.0.0" +react-dom@^19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== + dependencies: + scheduler "^0.26.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-redux@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.2.0.tgz#96c3ab23fb9a3af2cb4654be4b51c989e32366f5" + integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g== + dependencies: + "@types/use-sync-external-store" "^0.0.6" + use-sync-external-store "^1.4.0" + +react-refresh@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" + integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== + +react@^19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -1563,16 +3884,113 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redux-thunk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== + +redux@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== + reflect-metadata@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +reselect@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rollup@^4.34.9: + version "4.41.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.41.1.tgz#46ddc1b33cf1b0baa99320d3b0b4973dc2253b6a" + integrity sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw== + dependencies: + "@types/estree" "1.0.7" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.41.1" + "@rollup/rollup-android-arm64" "4.41.1" + "@rollup/rollup-darwin-arm64" "4.41.1" + "@rollup/rollup-darwin-x64" "4.41.1" + "@rollup/rollup-freebsd-arm64" "4.41.1" + "@rollup/rollup-freebsd-x64" "4.41.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.41.1" + "@rollup/rollup-linux-arm-musleabihf" "4.41.1" + "@rollup/rollup-linux-arm64-gnu" "4.41.1" + "@rollup/rollup-linux-arm64-musl" "4.41.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.41.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.41.1" + "@rollup/rollup-linux-riscv64-gnu" "4.41.1" + "@rollup/rollup-linux-riscv64-musl" "4.41.1" + "@rollup/rollup-linux-s390x-gnu" "4.41.1" + "@rollup/rollup-linux-x64-gnu" "4.41.1" + "@rollup/rollup-linux-x64-musl" "4.41.1" + "@rollup/rollup-win32-arm64-msvc" "4.41.1" + "@rollup/rollup-win32-ia32-msvc" "4.41.1" + "@rollup/rollup-win32-x64-msvc" "4.41.1" + fsevents "~2.3.2" + router@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" @@ -1584,6 +4002,18 @@ router@^2.2.0: parseurl "^1.3.3" path-to-regexp "^8.0.0" +rrweb-cssom@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" + integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rxjs@^7.8.1: version "7.8.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" @@ -1591,17 +4021,62 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + safe-buffer@5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^7.5.3: +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3, semver@^7.6.0: version "7.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== @@ -1662,6 +4137,37 @@ serve-static@^2.2.0: parseurl "^1.3.3" send "^1.2.0" +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -1729,6 +4235,11 @@ sift@17.1.3: resolved "https://registry.yarnpkg.com/sift/-/sift-17.1.3.tgz#9d2000d4d41586880b0079b5183d839c7a142bf7" integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ== +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" @@ -1741,6 +4252,11 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -1753,11 +4269,29 @@ sparse-bitfield@^3.0.3: dependencies: memory-pager "^1.0.2" +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + statuses@2.0.1, statuses@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +std-env@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1785,6 +4319,65 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1806,6 +4399,18 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -1827,6 +4432,11 @@ supports-color@^8.1.1: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + swagger-ui-dist@>=5.0.0: version "5.22.0" resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.22.0.tgz#8280cfa9659d90cf6f682c76f7e792b0da939946" @@ -1841,6 +4451,63 @@ swagger-ui-express@^5.0.1: dependencies: swagger-ui-dist ">=5.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +synckit@^0.11.7: + version "0.11.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.8.tgz#b2aaae998a4ef47ded60773ad06e7cb821f55457" + integrity sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A== + dependencies: + "@pkgr/core" "^0.2.4" + +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinyglobby@^0.2.13, tinyglobby@^0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + +tinypool@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.0.tgz#4252913ec76ef8f728f2524e2118f3bef9cf23f4" + integrity sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ== + +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.3.tgz#d1d0f0602f4c15f1aae083a34d6d0df3363b1b52" + integrity sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A== + +tldts-core@^6.1.86: + version "6.1.86" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.86.tgz#a93e6ed9d505cb54c542ce43feb14c73913265d8" + integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== + +tldts@^6.1.32: + version "6.1.86" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.86.tgz#087e0555b31b9725ee48ca7e77edc56115cd82f7" + integrity sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ== + dependencies: + tldts-core "^6.1.86" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1858,6 +4525,13 @@ touch@^3.1.0: resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== +tough-cookie@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.1.2.tgz#66d774b4a1d9e12dc75089725af3ac75ec31bed7" + integrity sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A== + dependencies: + tldts "^6.1.32" + tr46@^5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.1.1.tgz#96ae867cddb8fdb64a49cc3059a8d428bcf238ca" @@ -1870,6 +4544,11 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +ts-api-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== + ts-deepmerge@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/ts-deepmerge/-/ts-deepmerge-7.0.3.tgz#e7053ddb45be093b71d7f9a5a05935ae119f1d31" @@ -1907,6 +4586,13 @@ tsoa@^6.6.0: "@tsoa/cli" "^6.6.0" "@tsoa/runtime" "^6.6.0" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-is@^2.0.0, type-is@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" @@ -1924,7 +4610,61 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^5.7.2, typescript@^5.8.3: +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typescript-eslint@^8.29.0: + version "8.33.1" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.33.1.tgz#d2d59c9b24afe1f903a855b02145802e4ae930ff" + integrity sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A== + dependencies: + "@typescript-eslint/eslint-plugin" "8.33.1" + "@typescript-eslint/parser" "8.33.1" + "@typescript-eslint/utils" "8.33.1" + +typescript@^5.7.2, typescript@^5.8.2, typescript@^5.8.3: version "5.8.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== @@ -1934,6 +4674,16 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + undefsafe@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" @@ -1954,6 +4704,26 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-sync-external-store@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz#55122e2a3edd2a6c106174c27485e0fd59bcfca0" + integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -1974,12 +4744,85 @@ vary@^1.1.2, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vite-node@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-3.2.0.tgz#fb03f4062a418454f31194faee5f82b6aa78d579" + integrity sha512-8Fc5Ko5Y4URIJkmMF/iFP1C0/OJyY+VGVe9Nw6WAdZyw4bTO+eVg9mwxWkQp/y8NnAoQY3o9KAvE1ZdA2v+Vmg== + dependencies: + cac "^6.7.14" + debug "^4.4.1" + es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0", vite@^6.2.4: + version "6.3.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.5.tgz#fec73879013c9c0128c8d284504c6d19410d12a3" + integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== + dependencies: + esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" + tinyglobby "^0.2.13" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-3.2.0.tgz#a1dbd536e78f2a1fe5b949846bc2ee1c1e2c031d" + integrity sha512-P7Nvwuli8WBNmeMHHek7PnGW4oAZl9za1fddfRVidZar8wDZRi7hpznLKQePQ8JPLwSBEYDK11g+++j7uFJV8Q== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.0" + "@vitest/mocker" "3.2.0" + "@vitest/pretty-format" "^3.2.0" + "@vitest/runner" "3.2.0" + "@vitest/snapshot" "3.2.0" + "@vitest/spy" "3.2.0" + "@vitest/utils" "3.2.0" + chai "^5.2.0" + debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" + pathe "^2.0.3" + picomatch "^4.0.2" + std-env "^3.9.0" + tinybench "^2.9.0" + tinyexec "^0.3.2" + tinyglobby "^0.2.14" + tinypool "^1.1.0" + tinyrainbow "^2.0.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.0" + why-is-node-running "^2.3.0" + +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -"whatwg-url@^14.1.0 || ^13.0.0": +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^14.0.0, "whatwg-url@^14.1.0 || ^13.0.0", whatwg-url@^14.1.1: version "14.2.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.2.0.tgz#4ee02d5d725155dae004f6ae95c73e7ef5d95663" integrity sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw== @@ -1987,6 +4830,59 @@ webidl-conversions@^7.0.0: tr46 "^5.1.0" webidl-conversions "^7.0.0" +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -1994,6 +4890,19 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -2031,11 +4940,31 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^8.18.0: + version "8.18.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a" + integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== + +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yaml@^2.6.1: version "2.8.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" @@ -2064,7 +4993,12 @@ yn@3.1.1: resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + zod@^3.25.46: - version "3.25.46" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.46.tgz#a8761d188e492b869bfb4f855bf0f716d54daf19" - integrity sha512-IqRxcHEIjqLd4LNS/zKffB3Jzg3NwqJxQQ0Ns7pdrvgGkwQsEBdEQcOHaBVqvvZArShRzI39+aMST3FBGmTrLQ== + version "3.25.49" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.49.tgz#e044541aac57bd12d1cec5dbf9309cdc768774c2" + integrity sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q== From 2424bf20a27755025b09f7501913929472702ffe Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:58:55 -0400 Subject: [PATCH 12/27] refactor(web-app): Update to TailwindCSS, add necessary config files. --- .gitignore | 3 + apps/web/.env.example | 1 + apps/web/index.html | 2 +- apps/web/package.json | 5 +- apps/web/src/App.css | 40 +----- apps/web/src/App.tsx | 63 +-------- apps/web/src/index.css | 13 -- apps/web/src/logo.svg | 1 - apps/web/src/main.tsx | 1 - apps/web/vite.config.ts | 3 +- yarn.lock | 298 +++++++++++++++++++++++++++++++++++++++- 11 files changed, 307 insertions(+), 123 deletions(-) create mode 100644 apps/web/.env.example delete mode 100644 apps/web/src/index.css delete mode 100644 apps/web/src/logo.svg diff --git a/.gitignore b/.gitignore index af477adbff..e30a058e50 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ dist-ssr .yalc/ yalc.lock + +# Environment variables +.env diff --git a/apps/web/.env.example b/apps/web/.env.example new file mode 100644 index 0000000000..cd30aa932a --- /dev/null +++ b/apps/web/.env.example @@ -0,0 +1 @@ +BASE_URL=http://localhost:5173/ \ No newline at end of file diff --git a/apps/web/index.html b/apps/web/index.html index b5fae3da23..6cbfe7eb7c 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -4,7 +4,7 @@ - React Redux App + Product list app using Vite and tsoa diff --git a/apps/web/package.json b/apps/web/package.json index d8e6dd1c21..d44f139aa0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -17,9 +17,12 @@ }, "dependencies": { "@reduxjs/toolkit": "^2.6.1", + "@tailwindcss/vite": "^4.1.8", + "dotenv": "^16.5.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-redux": "^9.2.0" + "react-redux": "^9.2.0", + "tailwindcss": "^4.1.8" }, "devDependencies": { "@eslint/js": "^9.23.0", diff --git a/apps/web/src/App.css b/apps/web/src/App.css index 01cc586770..f1d8c73cdc 100644 --- a/apps/web/src/App.css +++ b/apps/web/src/App.css @@ -1,39 +1 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-float infinite 3s ease-in-out; - } -} - -.App-header { - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); -} - -.App-link { - color: rgb(112, 76, 182); -} - -@keyframes App-logo-float { - 0% { - transform: translateY(0); - } - 50% { - transform: translateY(10px); - } - 100% { - transform: translateY(0px); - } -} +@import "tailwindcss"; diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 6c2a4d1d94..2f28fcd50c 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,64 +1,3 @@ import "./App.css" -import { Counter } from "./features/counter/Counter" -import { Quotes } from "./features/quotes/Quotes" -import logo from "./logo.svg" -export const App = () => ( -
-
- logo - -

- Edit src/App.tsx and save to reload. -

- - - Learn - - React - - , - - Redux - - , - - Redux Toolkit - - , - - React Redux - - , and - - Reselect - - -
-
-) +export const App = () =>
diff --git a/apps/web/src/index.css b/apps/web/src/index.css deleted file mode 100644 index 7e1aa8dc70..0000000000 --- a/apps/web/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: - -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", - "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: - source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; -} diff --git a/apps/web/src/logo.svg b/apps/web/src/logo.svg deleted file mode 100644 index 84667388ce..0000000000 --- a/apps/web/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index 59756680a1..fd25c66897 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -3,7 +3,6 @@ import { createRoot } from "react-dom/client" import { Provider } from "react-redux" import { App } from "./App" import { store } from "./app/store" -import "./index.css" const container = document.getElementById("root") diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 0fd668160a..8b6782a9de 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -2,10 +2,11 @@ import react from "@vitejs/plugin-react" import * as path from "node:path" import { defineConfig } from "vitest/config" import packageJson from "./package.json" with { type: "json" } +import tailwindcss from "@tailwindcss/vite" // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), tailwindcss()], server: { open: true, diff --git a/yarn.lock b/yarn.lock index df2e5db008..10f254eb74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.3.tgz#beebbefb0264fdeb32d3052acae0e0d94315a9a2" integrity sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA== -"@ampproject/remapping@^2.2.0": +"@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== @@ -219,6 +219,28 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== +"@emnapi/core@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6" + integrity sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g== + dependencies: + "@emnapi/wasi-threads" "1.0.2" + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d" + integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.0.2", "@emnapi/wasi-threads@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz#977f44f844eac7d6c138a415a123818c655f874c" + integrity sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA== + dependencies: + tslib "^2.4.0" + "@esbuild/aix-ppc64@0.25.5": version "0.25.5" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz#4e0f91776c2b340e75558f60552195f6fad09f18" @@ -705,6 +727,13 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" @@ -752,6 +781,15 @@ dependencies: sparse-bitfield "^3.0.3" +"@napi-rs/wasm-runtime@^0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.10.tgz#f3b7109419c6670000b2401e0c778b98afc25f84" + integrity sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.9.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -915,6 +953,116 @@ resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b" integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g== +"@tailwindcss/node@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.8.tgz#e29187abec6194ce1e9f072208c62116a79a129b" + integrity sha512-OWwBsbC9BFAJelmnNcrKuf+bka2ZxCE2A4Ft53Tkg4uoiE67r/PMEYwCsourC26E+kmxfwE0hVzMdxqeW+xu7Q== + dependencies: + "@ampproject/remapping" "^2.3.0" + enhanced-resolve "^5.18.1" + jiti "^2.4.2" + lightningcss "1.30.1" + magic-string "^0.30.17" + source-map-js "^1.2.1" + tailwindcss "4.1.8" + +"@tailwindcss/oxide-android-arm64@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.8.tgz#4cb4b464636fc7e3154a1bb7df38a828291b3e9a" + integrity sha512-Fbz7qni62uKYceWYvUjRqhGfZKwhZDQhlrJKGtnZfuNtHFqa8wmr+Wn74CTWERiW2hn3mN5gTpOoxWKk0jRxjg== + +"@tailwindcss/oxide-darwin-arm64@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.8.tgz#b0b8c02745f76aea683c30818e249d62821864b8" + integrity sha512-RdRvedGsT0vwVVDztvyXhKpsU2ark/BjgG0huo4+2BluxdXo8NDgzl77qh0T1nUxmM11eXwR8jA39ibvSTbi7A== + +"@tailwindcss/oxide-darwin-x64@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.8.tgz#d0f3fa4c3bde21a772e29e31c9739d91db79de12" + integrity sha512-t6PgxjEMLp5Ovf7uMb2OFmb3kqzVTPPakWpBIFzppk4JE4ix0yEtbtSjPbU8+PZETpaYMtXvss2Sdkx8Vs4XRw== + +"@tailwindcss/oxide-freebsd-x64@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.8.tgz#545c94c941007ed1aa2e449465501b70d59cb3da" + integrity sha512-g8C8eGEyhHTqwPStSwZNSrOlyx0bhK/V/+zX0Y+n7DoRUzyS8eMbVshVOLJTDDC+Qn9IJnilYbIKzpB9n4aBsg== + +"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.8.tgz#e1bdbf63a179081669b8cd1c9523889774760eb9" + integrity sha512-Jmzr3FA4S2tHhaC6yCjac3rGf7hG9R6Gf2z9i9JFcuyy0u79HfQsh/thifbYTF2ic82KJovKKkIB6Z9TdNhCXQ== + +"@tailwindcss/oxide-linux-arm64-gnu@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.8.tgz#8d28093bbd43bdae771a2dcca720e926baa57093" + integrity sha512-qq7jXtO1+UEtCmCeBBIRDrPFIVI4ilEQ97qgBGdwXAARrUqSn/L9fUrkb1XP/mvVtoVeR2bt/0L77xx53bPZ/Q== + +"@tailwindcss/oxide-linux-arm64-musl@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.8.tgz#cc6cece814d813885ead9cd8b9d55aeb3db56c97" + integrity sha512-O6b8QesPbJCRshsNApsOIpzKt3ztG35gfX9tEf4arD7mwNinsoCKxkj8TgEE0YRjmjtO3r9FlJnT/ENd9EVefQ== + +"@tailwindcss/oxide-linux-x64-gnu@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.8.tgz#4cac14fa71382574773fb7986d9f0681ad89e3de" + integrity sha512-32iEXX/pXwikshNOGnERAFwFSfiltmijMIAbUhnNyjFr3tmWmMJWQKU2vNcFX0DACSXJ3ZWcSkzNbaKTdngH6g== + +"@tailwindcss/oxide-linux-x64-musl@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.8.tgz#e085f1ccbc8f97625773a6a3afc2a6f88edf59da" + integrity sha512-s+VSSD+TfZeMEsCaFaHTaY5YNj3Dri8rST09gMvYQKwPphacRG7wbuQ5ZJMIJXN/puxPcg/nU+ucvWguPpvBDg== + +"@tailwindcss/oxide-wasm32-wasi@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.8.tgz#c5e19fffe67f25cabf12a357bba4e87128151ea0" + integrity sha512-CXBPVFkpDjM67sS1psWohZ6g/2/cd+cq56vPxK4JeawelxwK4YECgl9Y9TjkE2qfF+9/s1tHHJqrC4SS6cVvSg== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@emnapi/wasi-threads" "^1.0.2" + "@napi-rs/wasm-runtime" "^0.2.10" + "@tybys/wasm-util" "^0.9.0" + tslib "^2.8.0" + +"@tailwindcss/oxide-win32-arm64-msvc@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.8.tgz#77521f23f91604c587736927fd2cb526667b7344" + integrity sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA== + +"@tailwindcss/oxide-win32-x64-msvc@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.8.tgz#55c876ab35f8779d1dceec61483cd9834d7365ac" + integrity sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ== + +"@tailwindcss/oxide@4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.1.8.tgz#b7a3df10c6c47ac5a3ac9976ad334732c4870d16" + integrity sha512-d7qvv9PsM5N3VNKhwVUhpK6r4h9wtLkJ6lz9ZY9aeZgrUWk1Z8VPyqyDT9MZlem7GTGseRQHkeB1j3tC7W1P+A== + dependencies: + detect-libc "^2.0.4" + tar "^7.4.3" + optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.1.8" + "@tailwindcss/oxide-darwin-arm64" "4.1.8" + "@tailwindcss/oxide-darwin-x64" "4.1.8" + "@tailwindcss/oxide-freebsd-x64" "4.1.8" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.8" + "@tailwindcss/oxide-linux-arm64-gnu" "4.1.8" + "@tailwindcss/oxide-linux-arm64-musl" "4.1.8" + "@tailwindcss/oxide-linux-x64-gnu" "4.1.8" + "@tailwindcss/oxide-linux-x64-musl" "4.1.8" + "@tailwindcss/oxide-wasm32-wasi" "4.1.8" + "@tailwindcss/oxide-win32-arm64-msvc" "4.1.8" + "@tailwindcss/oxide-win32-x64-msvc" "4.1.8" + +"@tailwindcss/vite@^4.1.8": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.1.8.tgz#4da74494e2e0578767e02b96450b7f5127862698" + integrity sha512-CQ+I8yxNV5/6uGaJjiuymgw0kEQiNKRinYbZXPdx1fk5WgiyReG0VaUx/Xq6aVNSUNJFzxm6o8FNKS5aMaim5A== + dependencies: + "@tailwindcss/node" "4.1.8" + "@tailwindcss/oxide" "4.1.8" + tailwindcss "4.1.8" + "@testing-library/dom@^10.4.0": version "10.4.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" @@ -1005,6 +1153,13 @@ reflect-metadata "^0.2.2" validator "^13.12.0" +"@tybys/wasm-util@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" + integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== + dependencies: + tslib "^2.4.0" + "@types/accepts@*": version "1.3.7" resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.7.tgz#3b98b1889d2b2386604c2bbbe62e4fb51e95b265" @@ -1801,6 +1956,11 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -2013,6 +2173,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^2.0.3, detect-libc@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8" + integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -2035,6 +2200,11 @@ dom-accessibility-api@^0.6.3: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== +dotenv@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" + integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== + dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -2079,6 +2249,14 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +enhanced-resolve@^5.18.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + entities@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.0.tgz#09c9e29cb79b0a6459a9b9db9efb418ac5bb8e51" @@ -2747,7 +2925,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3162,6 +3340,11 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jiti@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3264,6 +3447,74 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lightningcss-darwin-arm64@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz#3d47ce5e221b9567c703950edf2529ca4a3700ae" + integrity sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ== + +lightningcss-darwin-x64@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz#e81105d3fd6330860c15fe860f64d39cff5fbd22" + integrity sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA== + +lightningcss-freebsd-x64@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz#a0e732031083ff9d625c5db021d09eb085af8be4" + integrity sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig== + +lightningcss-linux-arm-gnueabihf@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz#1f5ecca6095528ddb649f9304ba2560c72474908" + integrity sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q== + +lightningcss-linux-arm64-gnu@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz#eee7799726103bffff1e88993df726f6911ec009" + integrity sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw== + +lightningcss-linux-arm64-musl@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz#f2e4b53f42892feeef8f620cbb889f7c064a7dfe" + integrity sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ== + +lightningcss-linux-x64-gnu@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz#2fc7096224bc000ebb97eea94aea248c5b0eb157" + integrity sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw== + +lightningcss-linux-x64-musl@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz#66dca2b159fd819ea832c44895d07e5b31d75f26" + integrity sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ== + +lightningcss-win32-arm64-msvc@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz#7d8110a19d7c2d22bfdf2f2bb8be68e7d1b69039" + integrity sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA== + +lightningcss-win32-x64-msvc@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz#fd7dd008ea98494b85d24b4bea016793f2e0e352" + integrity sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg== + +lightningcss@1.30.1: + version "1.30.1" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.30.1.tgz#78e979c2d595bfcb90d2a8c0eb632fe6c5bfed5d" + integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-darwin-arm64 "1.30.1" + lightningcss-darwin-x64 "1.30.1" + lightningcss-freebsd-x64 "1.30.1" + lightningcss-linux-arm-gnueabihf "1.30.1" + lightningcss-linux-arm64-gnu "1.30.1" + lightningcss-linux-arm64-musl "1.30.1" + lightningcss-linux-x64-gnu "1.30.1" + lightningcss-linux-x64-musl "1.30.1" + lightningcss-win32-arm64-msvc "1.30.1" + lightningcss-win32-x64-msvc "1.30.1" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3430,11 +3681,23 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +minizlib@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.2.tgz#f33d638eb279f664439aa38dc5f91607468cb574" + integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== + dependencies: + minipass "^7.1.2" + +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + mongodb-connection-string-url@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz#e223089dfa0a5fa9bf505f8aedcbc67b077b33e7" @@ -4463,6 +4726,28 @@ synckit@^0.11.7: dependencies: "@pkgr/core" "^0.2.4" +tailwindcss@4.1.8, tailwindcss@^4.1.8: + version "4.1.8" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.8.tgz#5d66d095ee7d82f03d6dbc6158bc248e064a5c05" + integrity sha512-kjeW8gjdxasbmFKpVGrGd5T4i40mV5J2Rasw48QARfYeQ8YS9x02ON9SFWax3Qf616rt4Cp3nVNIj6Hd1mP3og== + +tapable@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== + +tar@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" + integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.0.1" + mkdirp "^3.0.1" + yallist "^5.0.0" + tinybench@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" @@ -4573,7 +4858,7 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^2.1.0: +tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -4965,6 +5250,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + yaml@^2.6.1: version "2.8.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" From 632d16509f92d060284b076a6a7b930448e81794 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:59:29 -0400 Subject: [PATCH 13/27] feat(fetch-products): Add .ts files to build query URL and fetch products from API. --- .../src/features/products/fetchProducts.ts | 30 +++++++++++++++++++ .../web/src/features/products/productTypes.ts | 23 ++++++++++++++ .../src/features/products/productsSlice.ts | 0 3 files changed, 53 insertions(+) create mode 100644 apps/web/src/features/products/fetchProducts.ts create mode 100644 apps/web/src/features/products/productTypes.ts create mode 100644 apps/web/src/features/products/productsSlice.ts diff --git a/apps/web/src/features/products/fetchProducts.ts b/apps/web/src/features/products/fetchProducts.ts new file mode 100644 index 0000000000..5fbb76c9dc --- /dev/null +++ b/apps/web/src/features/products/fetchProducts.ts @@ -0,0 +1,30 @@ +import "dotenv/config" +import type { ProductFetchParams, ProductListResponse } from "./productTypes.ts" + +export const fetchProducts = async ( + params: ProductFetchParams, +): Promise => { + try { + const response = await fetch(buildFetchProductsUrl(params)) + if (!response.ok) { + throw new Error("[fetchProducts] API response error") + } + return (await response.json()) as ProductListResponse + } catch (error) { + console.error(error) + return + } +} + +const buildFetchProductsUrl = (params: ProductFetchParams): string => { + if (!process.env.BASE_URL) + throw new Error("[buildFetchProductsUrl] base url not defined") + return `${process.env.BASE_URL}/products?${new URLSearchParams(filterParams(params)).toString()}` +} + +const filterParams = (params: ProductFetchParams) => { + return Object.fromEntries( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + Object.entries(params).filter(([_, value]) => value != undefined), + ) +} diff --git a/apps/web/src/features/products/productTypes.ts b/apps/web/src/features/products/productTypes.ts new file mode 100644 index 0000000000..27f286a1b4 --- /dev/null +++ b/apps/web/src/features/products/productTypes.ts @@ -0,0 +1,23 @@ +export interface ProductDto { + _id: string + category: string + name: string + price: number + image: string + createdAt: Date + updatedAt: Date +} + +export interface ProductListResponse { + products: ProductDto[] + totalPages: number + currentPage: number +} + +export interface ProductFetchParams { + page?: string + limit?: string + category?: string + price?: "highest" | "lowest" + query?: string +} diff --git a/apps/web/src/features/products/productsSlice.ts b/apps/web/src/features/products/productsSlice.ts new file mode 100644 index 0000000000..e69de29bb2 From a70da4f9d7163e2d2c7acd848019e2f9bae2cddf Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:27:20 -0400 Subject: [PATCH 14/27] refactor(remove-redux-examples): Remove counter and quotes examples from app. --- apps/web/src/app/store.ts | 10 +-- .../src/features/counter/Counter.module.css | 81 ----------------- apps/web/src/features/counter/Counter.tsx | 80 ----------------- apps/web/src/features/counter/counterAPI.ts | 7 -- .../src/features/counter/counterSlice.test.ts | 58 ------------ apps/web/src/features/counter/counterSlice.ts | 89 ------------------- .../web/src/features/quotes/Quotes.module.css | 20 ----- apps/web/src/features/quotes/Quotes.tsx | 60 ------------- .../web/src/features/quotes/quotesApiSlice.ts | 38 -------- apps/web/src/utils/test-utils.tsx | 65 -------------- 10 files changed, 2 insertions(+), 506 deletions(-) delete mode 100644 apps/web/src/features/counter/Counter.module.css delete mode 100644 apps/web/src/features/counter/Counter.tsx delete mode 100644 apps/web/src/features/counter/counterAPI.ts delete mode 100644 apps/web/src/features/counter/counterSlice.test.ts delete mode 100644 apps/web/src/features/counter/counterSlice.ts delete mode 100644 apps/web/src/features/quotes/Quotes.module.css delete mode 100644 apps/web/src/features/quotes/Quotes.tsx delete mode 100644 apps/web/src/features/quotes/quotesApiSlice.ts delete mode 100644 apps/web/src/utils/test-utils.tsx diff --git a/apps/web/src/app/store.ts b/apps/web/src/app/store.ts index 9de880233d..e0680b5142 100644 --- a/apps/web/src/app/store.ts +++ b/apps/web/src/app/store.ts @@ -1,12 +1,11 @@ import type { Action, ThunkAction } from "@reduxjs/toolkit" import { combineSlices, configureStore } from "@reduxjs/toolkit" import { setupListeners } from "@reduxjs/toolkit/query" -import { counterSlice } from "../features/counter/counterSlice" -import { quotesApiSlice } from "../features/quotes/quotesApiSlice" +import { productsSlice } from "../features/products/productsSlice" // `combineSlices` automatically combines the reducers using // their `reducerPath`s, therefore we no longer need to call `combineReducers`. -const rootReducer = combineSlices(counterSlice, quotesApiSlice) +const rootReducer = combineSlices(productsSlice) // Infer the `RootState` type from the root reducer export type RootState = ReturnType @@ -15,11 +14,6 @@ export type RootState = ReturnType export const makeStore = (preloadedState?: Partial) => { const store = configureStore({ reducer: rootReducer, - // Adding the api middleware enables caching, invalidation, polling, - // and other useful features of `rtk-query`. - middleware: getDefaultMiddleware => { - return getDefaultMiddleware().concat(quotesApiSlice.middleware) - }, preloadedState, }) // configure listeners using the provided defaults diff --git a/apps/web/src/features/counter/Counter.module.css b/apps/web/src/features/counter/Counter.module.css deleted file mode 100644 index a0e619ddaa..0000000000 --- a/apps/web/src/features/counter/Counter.module.css +++ /dev/null @@ -1,81 +0,0 @@ -.row { - display: flex; - align-items: center; - justify-content: center; -} - -.row > button { - margin-left: 4px; - margin-right: 8px; -} - -.row:not(:last-child) { - margin-bottom: 16px; -} - -.value { - font-size: 78px; - padding-left: 16px; - padding-right: 16px; - margin-top: 2px; - font-family: "Courier New", Courier, monospace; -} - -.button { - appearance: none; - background: none; - font-size: 32px; - padding-left: 12px; - padding-right: 12px; - outline: none; - border: 2px solid transparent; - color: rgb(112, 76, 182); - padding-bottom: 4px; - cursor: pointer; - background-color: rgba(112, 76, 182, 0.1); - border-radius: 2px; - transition: all 0.15s; -} - -.textbox { - font-size: 32px; - padding: 2px; - width: 64px; - text-align: center; - margin-right: 4px; -} - -.button:hover, -.button:focus { - border: 2px solid rgba(112, 76, 182, 0.4); -} - -.button:active { - background-color: rgba(112, 76, 182, 0.2); -} - -.asyncButton { - composes: button; - position: relative; -} - -.asyncButton:after { - content: ""; - background-color: rgba(112, 76, 182, 0.15); - display: block; - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - opacity: 0; - transition: - width 1s linear, - opacity 0.5s ease 1s; -} - -.asyncButton:active:after { - width: 0%; - opacity: 1; - transition: 0s; -} diff --git a/apps/web/src/features/counter/Counter.tsx b/apps/web/src/features/counter/Counter.tsx deleted file mode 100644 index 7be8d1ba34..0000000000 --- a/apps/web/src/features/counter/Counter.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import type { JSX } from "react" -import { useState } from "react" -import { useAppDispatch, useAppSelector } from "../../app/hooks" -import styles from "./Counter.module.css" -import { - decrement, - increment, - incrementAsync, - incrementByAmount, - incrementIfOdd, - selectCount, - selectStatus, -} from "./counterSlice" - -export const Counter = (): JSX.Element => { - const dispatch = useAppDispatch() - const count = useAppSelector(selectCount) - const status = useAppSelector(selectStatus) - const [incrementAmount, setIncrementAmount] = useState("2") - - const incrementValue = Number(incrementAmount) || 0 - - return ( -
-
- - - -
-
- { - setIncrementAmount(e.target.value) - }} - /> - - - -
-
- ) -} diff --git a/apps/web/src/features/counter/counterAPI.ts b/apps/web/src/features/counter/counterAPI.ts deleted file mode 100644 index 12f10aa32c..0000000000 --- a/apps/web/src/features/counter/counterAPI.ts +++ /dev/null @@ -1,7 +0,0 @@ -// A mock function to mimic making an async request for data -export const fetchCount = (amount = 1): Promise<{ data: number }> => - new Promise<{ data: number }>(resolve => - setTimeout(() => { - resolve({ data: amount }) - }, 500), - ) diff --git a/apps/web/src/features/counter/counterSlice.test.ts b/apps/web/src/features/counter/counterSlice.test.ts deleted file mode 100644 index c16dbdee30..0000000000 --- a/apps/web/src/features/counter/counterSlice.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { AppStore } from "../../app/store" -import { makeStore } from "../../app/store" -import type { CounterSliceState } from "./counterSlice" -import { - counterSlice, - decrement, - increment, - incrementByAmount, - selectCount, -} from "./counterSlice" - -type LocalTestContext = { - store: AppStore -} - -describe("counter reducer", () => { - beforeEach(context => { - const initialState: CounterSliceState = { - value: 3, - status: "idle", - } - - const store = makeStore({ counter: initialState }) - - context.store = store - }) - - it("should handle initial state", () => { - expect(counterSlice.reducer(undefined, { type: "unknown" })).toStrictEqual({ - value: 0, - status: "idle", - }) - }) - - it("should handle increment", ({ store }) => { - expect(selectCount(store.getState())).toBe(3) - - store.dispatch(increment()) - - expect(selectCount(store.getState())).toBe(4) - }) - - it("should handle decrement", ({ store }) => { - expect(selectCount(store.getState())).toBe(3) - - store.dispatch(decrement()) - - expect(selectCount(store.getState())).toBe(2) - }) - - it("should handle incrementByAmount", ({ store }) => { - expect(selectCount(store.getState())).toBe(3) - - store.dispatch(incrementByAmount(2)) - - expect(selectCount(store.getState())).toBe(5) - }) -}) diff --git a/apps/web/src/features/counter/counterSlice.ts b/apps/web/src/features/counter/counterSlice.ts deleted file mode 100644 index c1af017e79..0000000000 --- a/apps/web/src/features/counter/counterSlice.ts +++ /dev/null @@ -1,89 +0,0 @@ -import type { PayloadAction } from "@reduxjs/toolkit" -import { createAppSlice } from "../../app/createAppSlice" -import type { AppThunk } from "../../app/store" -import { fetchCount } from "./counterAPI" - -export type CounterSliceState = { - value: number - status: "idle" | "loading" | "failed" -} - -const initialState: CounterSliceState = { - value: 0, - status: "idle", -} - -// If you are not using async thunks you can use the standalone `createSlice`. -export const counterSlice = createAppSlice({ - name: "counter", - // `createSlice` will infer the state type from the `initialState` argument - initialState, - // The `reducers` field lets us define reducers and generate associated actions - reducers: create => ({ - increment: create.reducer(state => { - // Redux Toolkit allows us to write "mutating" logic in reducers. It - // doesn't actually mutate the state because it uses the Immer library, - // which detects changes to a "draft state" and produces a brand new - // immutable state based off those changes - state.value += 1 - }), - decrement: create.reducer(state => { - state.value -= 1 - }), - // Use the `PayloadAction` type to declare the contents of `action.payload` - incrementByAmount: create.reducer( - (state, action: PayloadAction) => { - state.value += action.payload - }, - ), - // The function below is called a thunk and allows us to perform async logic. It - // can be dispatched like a regular action: `dispatch(incrementAsync(10))`. This - // will call the thunk with the `dispatch` function as the first argument. Async - // code can then be executed and other actions can be dispatched. Thunks are - // typically used to make async requests. - incrementAsync: create.asyncThunk( - async (amount: number) => { - const response = await fetchCount(amount) - // The value we return becomes the `fulfilled` action payload - return response.data - }, - { - pending: state => { - state.status = "loading" - }, - fulfilled: (state, action) => { - state.status = "idle" - state.value += action.payload - }, - rejected: state => { - state.status = "failed" - }, - }, - ), - }), - // You can define your selectors here. These selectors receive the slice - // state as their first argument. - selectors: { - selectCount: counter => counter.value, - selectStatus: counter => counter.status, - }, -}) - -// Action creators are generated for each case reducer function. -export const { decrement, increment, incrementByAmount, incrementAsync } = - counterSlice.actions - -// Selectors returned by `slice.selectors` take the root state as their first argument. -export const { selectCount, selectStatus } = counterSlice.selectors - -// We can also write thunks by hand, which may contain both sync and async logic. -// Here's an example of conditionally dispatching actions based on current state. -export const incrementIfOdd = - (amount: number): AppThunk => - (dispatch, getState) => { - const currentValue = selectCount(getState()) - - if (currentValue % 2 === 1 || currentValue % 2 === -1) { - dispatch(incrementByAmount(amount)) - } - } diff --git a/apps/web/src/features/quotes/Quotes.module.css b/apps/web/src/features/quotes/Quotes.module.css deleted file mode 100644 index 1f85690ef2..0000000000 --- a/apps/web/src/features/quotes/Quotes.module.css +++ /dev/null @@ -1,20 +0,0 @@ -.select { - font-size: 25px; - padding: 5px; - padding-top: 2px; - padding-bottom: 2px; - size: 50; - outline: none; - border: 2px solid transparent; - color: rgb(112, 76, 182); - cursor: pointer; - background-color: rgba(112, 76, 182, 0.1); - border-radius: 5px; - transition: all 0.15s; -} - -.container { - display: flex; - flex-direction: column; - align-items: center; -} diff --git a/apps/web/src/features/quotes/Quotes.tsx b/apps/web/src/features/quotes/Quotes.tsx deleted file mode 100644 index 76567335d6..0000000000 --- a/apps/web/src/features/quotes/Quotes.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import type { JSX } from "react" -import { useState } from "react" -import styles from "./Quotes.module.css" -import { useGetQuotesQuery } from "./quotesApiSlice" - -const options = [5, 10, 20, 30] - -export const Quotes = (): JSX.Element | null => { - const [numberOfQuotes, setNumberOfQuotes] = useState(10) - // Using a query hook automatically fetches data and returns query values - const { data, isError, isLoading, isSuccess } = - useGetQuotesQuery(numberOfQuotes) - - if (isError) { - return ( -
-

There was an error!!!

-
- ) - } - - if (isLoading) { - return ( -
-

Loading...

-
- ) - } - - if (isSuccess) { - return ( -
-

Select the Quantity of Quotes to Fetch:

- - {data.quotes.map(({ author, quote, id }) => ( -
- “{quote}” -
- {author} -
-
- ))} -
- ) - } - - return null -} diff --git a/apps/web/src/features/quotes/quotesApiSlice.ts b/apps/web/src/features/quotes/quotesApiSlice.ts deleted file mode 100644 index 779606a4ea..0000000000 --- a/apps/web/src/features/quotes/quotesApiSlice.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Need to use the React-specific entry point to import `createApi` -import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react" - -type Quote = { - id: number - quote: string - author: string -} - -type QuotesApiResponse = { - quotes: Quote[] - total: number - skip: number - limit: number -} - -// Define a service using a base URL and expected endpoints -export const quotesApiSlice = createApi({ - baseQuery: fetchBaseQuery({ baseUrl: "https://dummyjson.com/quotes" }), - reducerPath: "quotesApi", - // Tag types are used for caching and invalidation. - tagTypes: ["Quotes"], - endpoints: build => ({ - // Supply generics for the return type (in this case `QuotesApiResponse`) - // and the expected query argument. If there is no argument, use `void` - // for the argument type instead. - getQuotes: build.query({ - query: (limit = 10) => `?limit=${limit.toString()}`, - // `providesTags` determines which 'tag' is attached to the - // cached data returned by the query. - providesTags: (_result, _error, id) => [{ type: "Quotes", id }], - }), - }), -}) - -// Hooks are auto-generated by RTK-Query -// Same as `quotesApiSlice.endpoints.getQuotes.useQuery` -export const { useGetQuotesQuery } = quotesApiSlice diff --git a/apps/web/src/utils/test-utils.tsx b/apps/web/src/utils/test-utils.tsx deleted file mode 100644 index 1a180d154f..0000000000 --- a/apps/web/src/utils/test-utils.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import type { RenderOptions } from "@testing-library/react" -import { render } from "@testing-library/react" -import userEvent from "@testing-library/user-event" -import type { PropsWithChildren, ReactElement } from "react" -import { Provider } from "react-redux" -import type { AppStore, RootState } from "../app/store" -import { makeStore } from "../app/store" - -/** - * This type extends the default options for - * React Testing Library's render function. It allows for - * additional configuration such as specifying an initial Redux state and - * a custom store instance. - */ -type ExtendedRenderOptions = Omit & { - /** - * Defines a specific portion or the entire initial state for the Redux store. - * This is particularly useful for initializing the state in a - * controlled manner during testing, allowing components to be rendered - * with predetermined state conditions. - */ - preloadedState?: Partial - - /** - * Allows the use of a specific Redux store instance instead of a - * default or global store. This flexibility is beneficial when - * testing components with unique store requirements or when isolating - * tests from a global store state. The custom store should be configured - * to match the structure and middleware of the store used by the application. - * - * @default makeStore(preloadedState) - */ - store?: AppStore -} - -/** - * Renders the given React element with Redux Provider and custom store. - * This function is useful for testing components that are connected to the Redux store. - * - * @param ui - The React component or element to render. - * @param extendedRenderOptions - Optional configuration options for rendering. This includes `preloadedState` for initial Redux state and `store` for a specific Redux store instance. Any additional properties are passed to React Testing Library's render function. - * @returns An object containing the Redux store used in the render, User event API for simulating user interactions in tests, and all of React Testing Library's query functions for testing the component. - */ -export const renderWithProviders = ( - ui: ReactElement, - extendedRenderOptions: ExtendedRenderOptions = {}, -) => { - const { - preloadedState = {}, - // Automatically create a store instance if no store was passed in - store = makeStore(preloadedState), - ...renderOptions - } = extendedRenderOptions - - const Wrapper = ({ children }: PropsWithChildren) => ( - {children} - ) - - // Return an object with the store and all of RTL's query functions - return { - store, - user: userEvent.setup(), - ...render(ui, { wrapper: Wrapper, ...renderOptions }), - } -} From 70c16bbcf106d6d3d7f5e8e3a2ef038812b60ee6 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:27:56 -0400 Subject: [PATCH 15/27] feat(frontend-ui): Confirm products fetching, add Flowbite React and render products grid. --- apps/api/src/app.ts | 11 + apps/web/.flowbite-react/.gitignore | 2 + apps/web/.flowbite-react/config.json | 9 + apps/web/.vscode/extensions.json | 5 + apps/web/.vscode/settings.json | 20 ++ apps/web/package.json | 5 +- apps/web/src/App.css | 2 + apps/web/src/App.tsx | 7 +- .../web/src/features/products/ProductCard.tsx | 73 ++++++ apps/web/src/features/products/Products.tsx | 25 ++ .../src/features/products/fetchProducts.ts | 43 ++-- .../web/src/features/products/productTypes.ts | 13 +- .../src/features/products/productsSlice.ts | 52 +++++ apps/web/vite.config.ts | 7 +- yarn.lock | 217 +++++++++++++++++- 15 files changed, 455 insertions(+), 36 deletions(-) create mode 100644 apps/web/.flowbite-react/.gitignore create mode 100644 apps/web/.flowbite-react/config.json create mode 100644 apps/web/.vscode/extensions.json create mode 100644 apps/web/.vscode/settings.json create mode 100644 apps/web/src/features/products/ProductCard.tsx create mode 100644 apps/web/src/features/products/Products.tsx diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index 376a884606..f443309cb5 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -9,6 +9,17 @@ export const app = express(); connect('mongodb://localhost/products'); +// CORS +app.use((_, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE'); + res.header( + 'Access-Control-Allow-Headers', + 'Origin, X-Requested-With, Content-Type, Accept' + ); + next(); +}); + app.use( urlencoded({ extended: true, diff --git a/apps/web/.flowbite-react/.gitignore b/apps/web/.flowbite-react/.gitignore new file mode 100644 index 0000000000..da26dfd69a --- /dev/null +++ b/apps/web/.flowbite-react/.gitignore @@ -0,0 +1,2 @@ +class-list.json +pid \ No newline at end of file diff --git a/apps/web/.flowbite-react/config.json b/apps/web/.flowbite-react/config.json new file mode 100644 index 0000000000..d04ad92bd3 --- /dev/null +++ b/apps/web/.flowbite-react/config.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://unpkg.com/flowbite-react/schema.json", + "components": [], + "dark": true, + "prefix": "", + "path": "src/components", + "tsx": true, + "rsc": true +} \ No newline at end of file diff --git a/apps/web/.vscode/extensions.json b/apps/web/.vscode/extensions.json new file mode 100644 index 0000000000..77c4e66158 --- /dev/null +++ b/apps/web/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "bradlc.vscode-tailwindcss" + ] +} \ No newline at end of file diff --git a/apps/web/.vscode/settings.json b/apps/web/.vscode/settings.json new file mode 100644 index 0000000000..2a60871ef1 --- /dev/null +++ b/apps/web/.vscode/settings.json @@ -0,0 +1,20 @@ +{ + "files.associations": { + "*.css": "tailwindcss" + }, + "tailwindCSS.classAttributes": [ + "class", + "className", + "theme" + ], + "tailwindCSS.experimental.classRegex": [ + [ + "twMerge\\(([^)]*)\\)", + "[\"'`]([^\"'`]*).*?[\"'`]" + ], + [ + "createTheme(?:<\\w+>)?\\s*\\(([^)]*)\\)", + "{?\\s?[\\w].*:\\s*?[\"'`]([^\"'`]*).*?,?\\s?}?" + ] + ] +} \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index d44f139aa0..9b93db139a 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,12 +13,13 @@ "preview": "vite preview", "start": "vite", "test": "vitest --run", - "type-check": "tsc -b --noEmit" + "type-check": "tsc -b --noEmit", + "postinstall": "flowbite-react patch" }, "dependencies": { "@reduxjs/toolkit": "^2.6.1", "@tailwindcss/vite": "^4.1.8", - "dotenv": "^16.5.0", + "flowbite-react": "^0.11.7", "react": "^19.1.0", "react-dom": "^19.1.0", "react-redux": "^9.2.0", diff --git a/apps/web/src/App.css b/apps/web/src/App.css index f1d8c73cdc..04f69bf0a0 100644 --- a/apps/web/src/App.css +++ b/apps/web/src/App.css @@ -1 +1,3 @@ @import "tailwindcss"; +@plugin "flowbite-react/plugin/tailwindcss"; +@source "../.flowbite-react/class-list.json"; diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 2f28fcd50c..c0b2492a7a 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,3 +1,8 @@ import "./App.css" +import { Products } from "./features/products/Products" -export const App = () =>
+export const App = () => ( +
+ +
+) diff --git a/apps/web/src/features/products/ProductCard.tsx b/apps/web/src/features/products/ProductCard.tsx new file mode 100644 index 0000000000..2407f2e256 --- /dev/null +++ b/apps/web/src/features/products/ProductCard.tsx @@ -0,0 +1,73 @@ +import { Card } from "flowbite-react" +import type { ProductDto } from "./productTypes" +export const ProductCard = ({ name, price, image }: ProductDto) => { + return ( + + +
+ {name} +
+
+
+ + + + + + + + + + + + + + + + + 5.0 + +
+
+ + ${price} + + + Add to cart + +
+
+ ) +} diff --git a/apps/web/src/features/products/Products.tsx b/apps/web/src/features/products/Products.tsx new file mode 100644 index 0000000000..7a7e1f39b4 --- /dev/null +++ b/apps/web/src/features/products/Products.tsx @@ -0,0 +1,25 @@ +import { type ReactNode, useEffect } from "react" +import { useAppDispatch, useAppSelector } from "../../app/hooks" +import { fetchProductsAsync } from "./productsSlice" +import { ProductCard } from "./ProductCard" + +export const Products = (): ReactNode => { + const dispatch = useAppDispatch() + + const { products, status } = useAppSelector(state => state.products) + + useEffect(() => { + if (status === "idle") void dispatch(fetchProductsAsync({ page: "2" })) + }, [dispatch, status]) + + if (status === "loading") return

Loading products...

+ if (status === "failed") return

Error

+ + return ( +
+ {products.map(product => ( + + ))} +
+ ) +} diff --git a/apps/web/src/features/products/fetchProducts.ts b/apps/web/src/features/products/fetchProducts.ts index 5fbb76c9dc..443e01ca52 100644 --- a/apps/web/src/features/products/fetchProducts.ts +++ b/apps/web/src/features/products/fetchProducts.ts @@ -1,30 +1,35 @@ -import "dotenv/config" -import type { ProductFetchParams, ProductListResponse } from "./productTypes.ts" +import type { + ProductsFetchParams, + ProductsListResponse, +} from "./productTypes.ts" export const fetchProducts = async ( - params: ProductFetchParams, -): Promise => { - try { - const response = await fetch(buildFetchProductsUrl(params)) - if (!response.ok) { - throw new Error("[fetchProducts] API response error") - } - return (await response.json()) as ProductListResponse - } catch (error) { - console.error(error) - return + params: ProductsFetchParams, +): Promise => { + const response = await fetch(buildFetchProductsUrl(params)) + if (!response.ok) { + throw new Error("[fetchProducts] API response error") } + return (await response.json()) as ProductsListResponse } -const buildFetchProductsUrl = (params: ProductFetchParams): string => { - if (!process.env.BASE_URL) +const buildFetchProductsUrl = (params: ProductsFetchParams): string => { + if (!import.meta.env.VITE_API_URL) throw new Error("[buildFetchProductsUrl] base url not defined") - return `${process.env.BASE_URL}/products?${new URLSearchParams(filterParams(params)).toString()}` + const baseProductsUrl = `${import.meta.env.VITE_API_URL as string}/products` + const filteredParams = filterParams(params) + if (Object.keys(filteredParams).length === 0) { + return baseProductsUrl + } + return `${baseProductsUrl}?${returnParamsString(params)}` +} + +const returnParamsString = (params: ProductsFetchParams): string => { + return new URLSearchParams(filterParams(params)).toString() } -const filterParams = (params: ProductFetchParams) => { +const filterParams = (params: ProductsFetchParams) => { return Object.fromEntries( - // eslint-disable-next-line @typescript-eslint/no-unused-vars - Object.entries(params).filter(([_, value]) => value != undefined), + Object.entries(params).filter(([, /* unused */ value]) => value), ) } diff --git a/apps/web/src/features/products/productTypes.ts b/apps/web/src/features/products/productTypes.ts index 27f286a1b4..ce1e374f03 100644 --- a/apps/web/src/features/products/productTypes.ts +++ b/apps/web/src/features/products/productTypes.ts @@ -1,4 +1,4 @@ -export interface ProductDto { +export type ProductDto = { _id: string category: string name: string @@ -8,16 +8,23 @@ export interface ProductDto { updatedAt: Date } -export interface ProductListResponse { +export type ProductsListResponse = { products: ProductDto[] totalPages: number currentPage: number } -export interface ProductFetchParams { +export type ProductsFetchParams = { page?: string limit?: string category?: string price?: "highest" | "lowest" query?: string } + +export type ProductsSliceState = { + products: ProductDto[] + totalPages: number + currentPage: number + status: "idle" | "loading" | "failed" | "succeeded" +} diff --git a/apps/web/src/features/products/productsSlice.ts b/apps/web/src/features/products/productsSlice.ts index e69de29bb2..4a83cd33da 100644 --- a/apps/web/src/features/products/productsSlice.ts +++ b/apps/web/src/features/products/productsSlice.ts @@ -0,0 +1,52 @@ +import { createAppSlice } from "../../app/createAppSlice" +import { fetchProducts } from "./fetchProducts" +import type { ProductsFetchParams, ProductsSliceState } from "./productTypes" + +const initialState: ProductsSliceState = { + products: [], + totalPages: 0, + currentPage: 0, + status: "idle", +} + +export const productsSlice = createAppSlice({ + name: "products", + initialState, + reducers: create => ({ + fetchProductsAsync: create.asyncThunk( + async (params: ProductsFetchParams) => { + const response = await fetchProducts(params) + return response + }, + { + pending: state => { + state.status = "loading" + }, + fulfilled: (state, action) => { + state.status = "succeeded" + state.products = action.payload.products + state.currentPage = action.payload.currentPage + state.totalPages = action.payload.totalPages + }, + rejected: state => { + state.status = "failed" + }, + }, + ), + }), + selectors: { + selectProducts: products => products.products, + selectCurrentPage: products => products.currentPage, + selectTotalPages: products => products.totalPages, + selectStatus: products => products.status, + }, +}) + +export const { fetchProductsAsync } = productsSlice.actions + +export const { + selectProducts, + selectCurrentPage, + selectTotalPages, + selectStatus, +} = productsSlice.selectors diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 8b6782a9de..20709a863f 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,12 +1,13 @@ import react from "@vitejs/plugin-react" import * as path from "node:path" import { defineConfig } from "vitest/config" -import packageJson from "./package.json" with { type: "json" } +import packageJson from "./package.json"; import tailwindcss from "@tailwindcss/vite" +import flowbiteReact from "flowbite-react/plugin/vite"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [react(), tailwindcss(), flowbiteReact()], server: { open: true, @@ -26,4 +27,4 @@ export default defineConfig({ watch: false, setupFiles: ["./src/setupTests.ts"], }, -}) +}) \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 10f254eb74..22ae7e3bb8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -437,6 +437,49 @@ resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.8.0.tgz#3344284028d1c9dc98dee2479f82939310370d88" integrity sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg== +"@floating-ui/core@1.6.9": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.9.tgz#64d1da251433019dafa091de9b2886ff35ec14e6" + integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw== + dependencies: + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/core@^1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.1.tgz#1abc6b157d4a936174f9dbd078278c3a81c8bc6b" + integrity sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw== + dependencies: + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/dom@^1.0.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.1.tgz#76a4e3cbf7a08edf40c34711cf64e0cc8053d912" + integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ== + dependencies: + "@floating-ui/core" "^1.7.1" + "@floating-ui/utils" "^0.2.9" + +"@floating-ui/react-dom@^2.1.2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.3.tgz#1dea32e59514a67d182f0c89c8975ff959774b61" + integrity sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@0.27.3": + version "0.27.3" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.27.3.tgz#f9a30583eddd5770f3a6e1f3479a258f3df0c8c8" + integrity sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.9" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" + integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== + "@hapi/accept@^6.0.3": version "6.0.3" resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-6.0.3.tgz#eef0800a4f89cd969da8e5d0311dc877c37279ab" @@ -715,6 +758,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== +"@iarna/toml@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -1460,11 +1508,30 @@ debug "^4.3.4" ts-api-utils "^2.1.0" +"@typescript-eslint/types@8.26.0": + version "8.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.0.tgz#c4e93a8faf3a38a8d8adb007dc7834f1c89ee7bf" + integrity sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA== + "@typescript-eslint/types@8.33.1", "@typescript-eslint/types@^8.33.1": version "8.33.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.33.1.tgz#b693111bc2180f8098b68e9958cf63761657a55f" integrity sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg== +"@typescript-eslint/typescript-estree@8.26.0": + version "8.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz#128972172005a7376e34ed2ecba4e29363b0cad1" + integrity sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ== + dependencies: + "@typescript-eslint/types" "8.26.0" + "@typescript-eslint/visitor-keys" "8.26.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" + "@typescript-eslint/typescript-estree@8.33.1": version "8.33.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz#d271beed470bc915b8764e22365d4925c2ea265d" @@ -1491,6 +1558,14 @@ "@typescript-eslint/types" "8.33.1" "@typescript-eslint/typescript-estree" "8.33.1" +"@typescript-eslint/visitor-keys@8.26.0": + version "8.26.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz#a4876216756c69130ea958df3b77222c2ad95290" + integrity sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg== + dependencies: + "@typescript-eslint/types" "8.26.0" + eslint-visitor-keys "^4.2.0" + "@typescript-eslint/visitor-keys@8.33.1": version "8.33.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz#6c6e002c24d13211df3df851767f24dfdb4f42bc" @@ -1710,6 +1785,11 @@ array-includes@^3.1.6, array-includes@^3.1.8: is-string "^1.1.1" math-intrinsics "^1.1.0" +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" @@ -1771,6 +1851,13 @@ assertion-error@^2.0.1: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== +ast-types@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" + integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== + dependencies: + tslib "^2.0.1" + async-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" @@ -1941,6 +2028,13 @@ check-error@^2.1.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== +chokidar@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + chokidar@^3.5.2: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -1961,6 +2055,11 @@ chownr@^3.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== +classnames@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1982,6 +2081,17 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +comment-json@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.5.tgz#482e085f759c2704b60bc6f97f55b8c01bc41e70" + integrity sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2044,6 +2154,11 @@ cookie@^0.7.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +core-util-is@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -2111,6 +2226,11 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" +debounce@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-2.2.0.tgz#f895fa2fbdb579a0f0d3dcf5dde19657e50eaad5" + integrity sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2140,6 +2260,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge-ts@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-7.1.4.tgz#a6e8c27d9328443ccc5a24e22a4d1b12647a89ba" + integrity sha512-fxqo6nHGQ9zOVgI4KXqtWXJR/yCLtC7aXIVq+6jc8tHPFUxlFmuUcm2kC4vztQ+LJxQ3gER/XAWearGYQ8niGA== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -2200,11 +2325,6 @@ dom-accessibility-api@^0.6.3: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== -dotenv@^16.5.0: - version "16.5.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" - integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== - dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -2548,6 +2668,11 @@ espree@^10.0.1, espree@^10.3.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.0" +esprima@^4.0.1, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" @@ -2762,6 +2887,26 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== +flowbite-react@^0.11.7: + version "0.11.7" + resolved "https://registry.yarnpkg.com/flowbite-react/-/flowbite-react-0.11.7.tgz#0a2dde1ba1e33eae2a067ff10b1a2d83b1129431" + integrity sha512-Z8m+ycHEsXPacSAi8P4yYDeff7LvcHNwbGAnL/+Fpiv+6ZWDEAGY/YPKhUofZsZa837JTYrbcbmgjqQ1bpt51g== + dependencies: + "@floating-ui/core" "1.6.9" + "@floating-ui/react" "0.27.3" + "@iarna/toml" "2.2.5" + "@typescript-eslint/typescript-estree" "8.26.0" + chokidar "4.0.3" + classnames "2.5.1" + comment-json "4.2.5" + debounce "2.2.0" + deepmerge-ts "7.1.4" + klona "2.0.6" + package-manager-detector "0.2.9" + recast "0.23.11" + tailwind-merge-v2 "npm:tailwind-merge@2.6.0" + tailwind-merge-v3 "npm:tailwind-merge@3.0.1" + for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" @@ -2962,6 +3107,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-own-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== + has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" @@ -3439,6 +3589,11 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" +klona@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -3917,6 +4072,11 @@ package-json-from-dist@^1.0.0: resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== +package-manager-detector@0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.9.tgz#20990785afa69d38b4520ccc83b34e9f69cb970f" + integrity sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4140,6 +4300,11 @@ react@^19.1.0: resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4147,6 +4312,17 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +recast@0.23.11: + version "0.23.11" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.11.tgz#8885570bb28cf773ba1dc600da7f502f7883f73f" + integrity sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== + dependencies: + ast-types "^0.16.1" + esprima "~4.0.0" + source-map "~0.6.1" + tiny-invariant "^1.3.3" + tslib "^2.0.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -4196,6 +4372,11 @@ regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: gopd "^1.2.0" set-function-name "^2.0.2" +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4520,7 +4701,7 @@ source-map-js@^1.2.1: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map@^0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4726,6 +4907,21 @@ synckit@^0.11.7: dependencies: "@pkgr/core" "^0.2.4" +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +"tailwind-merge-v2@npm:tailwind-merge@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.6.0.tgz#ac5fb7e227910c038d458f396b7400d93a3142d5" + integrity sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA== + +"tailwind-merge-v3@npm:tailwind-merge@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-3.0.1.tgz#0f0189966511ebcd63ef98d9eaf5607beb0d59d3" + integrity sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g== + tailwindcss@4.1.8, tailwindcss@^4.1.8: version "4.1.8" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.8.tgz#5d66d095ee7d82f03d6dbc6158bc248e064a5c05" @@ -4748,6 +4944,11 @@ tar@^7.4.3: mkdirp "^3.0.1" yallist "^5.0.0" +tiny-invariant@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + tinybench@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" @@ -4829,7 +5030,7 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -ts-api-utils@^2.1.0: +ts-api-utils@^2.0.1, ts-api-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== @@ -4858,7 +5059,7 @@ ts-node@^10.9.2: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0: +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.8.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== From 94404e27e1a31ab3258cb4d36c4b80ae2cb0c659 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:40:49 -0400 Subject: [PATCH 16/27] feat(pagination): Add pagination. --- apps/web/src/App.tsx | 4 +++- apps/web/src/features/products/Pagination.tsx | 22 +++++++++++++++++++ apps/web/src/features/products/Products.tsx | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 apps/web/src/features/products/Pagination.tsx diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index c0b2492a7a..82f0bebe24 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,8 +1,10 @@ import "./App.css" +import { ProductPagination } from "./features/products/Pagination" import { Products } from "./features/products/Products" export const App = () => ( -
+
+
) diff --git a/apps/web/src/features/products/Pagination.tsx b/apps/web/src/features/products/Pagination.tsx new file mode 100644 index 0000000000..ce93b93dd0 --- /dev/null +++ b/apps/web/src/features/products/Pagination.tsx @@ -0,0 +1,22 @@ +import { Pagination } from "flowbite-react" +import { useAppDispatch, useAppSelector } from "../../app/hooks" +import { fetchProductsAsync } from "./productsSlice" + +export const ProductPagination = () => { + const dispatch = useAppDispatch() + + const { currentPage, totalPages } = useAppSelector(state => state.products) + + return ( +
+ { + const pageAsString = page.toString() + void dispatch(fetchProductsAsync({ page: pageAsString })) + }} + /> +
+ ) +} diff --git a/apps/web/src/features/products/Products.tsx b/apps/web/src/features/products/Products.tsx index 7a7e1f39b4..f04a2f4b9b 100644 --- a/apps/web/src/features/products/Products.tsx +++ b/apps/web/src/features/products/Products.tsx @@ -9,7 +9,7 @@ export const Products = (): ReactNode => { const { products, status } = useAppSelector(state => state.products) useEffect(() => { - if (status === "idle") void dispatch(fetchProductsAsync({ page: "2" })) + if (status === "idle") void dispatch(fetchProductsAsync({})) }, [dispatch, status]) if (status === "loading") return

Loading products...

From ab1c9f4f7a345b6a1682fe37d9deb9eaddf74922 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:42:21 -0400 Subject: [PATCH 17/27] feat(price-sort): Add ability to sort by lowest or highest price. Added to reducer and ui. --- apps/web/src/App.tsx | 2 + .../features/products/ProductSortOrder.tsx | 39 +++++++++++++++++++ .../web/src/features/products/productTypes.ts | 2 + .../src/features/products/productsSlice.ts | 22 +++++++++-- 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/features/products/ProductSortOrder.tsx diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 82f0bebe24..750b086998 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,9 +1,11 @@ import "./App.css" import { ProductPagination } from "./features/products/Pagination" import { Products } from "./features/products/Products" +import { ProductSortOrder } from "./features/products/ProductSortOrder" export const App = () => (
+
diff --git a/apps/web/src/features/products/ProductSortOrder.tsx b/apps/web/src/features/products/ProductSortOrder.tsx new file mode 100644 index 0000000000..7f71ef73f1 --- /dev/null +++ b/apps/web/src/features/products/ProductSortOrder.tsx @@ -0,0 +1,39 @@ +import { Button, ButtonGroup } from "flowbite-react" +import { useAppDispatch, useAppSelector } from "../../app/hooks" +import { + fetchProductsAsync, + sortByHighestPrice, + sortByLowestPrice, +} from "./productsSlice" + +export function ProductSortOrder() { + const dispatch = useAppDispatch() + + const { price } = useAppSelector(state => state.products) + + return ( + + Sort By Price + + + + ) +} diff --git a/apps/web/src/features/products/productTypes.ts b/apps/web/src/features/products/productTypes.ts index ce1e374f03..05fd33b05f 100644 --- a/apps/web/src/features/products/productTypes.ts +++ b/apps/web/src/features/products/productTypes.ts @@ -26,5 +26,7 @@ export type ProductsSliceState = { products: ProductDto[] totalPages: number currentPage: number + category: string | undefined + price: "highest" | "lowest" | undefined status: "idle" | "loading" | "failed" | "succeeded" } diff --git a/apps/web/src/features/products/productsSlice.ts b/apps/web/src/features/products/productsSlice.ts index 4a83cd33da..defc2babb7 100644 --- a/apps/web/src/features/products/productsSlice.ts +++ b/apps/web/src/features/products/productsSlice.ts @@ -1,4 +1,5 @@ import { createAppSlice } from "../../app/createAppSlice" +import type { RootState } from "../../app/store" import { fetchProducts } from "./fetchProducts" import type { ProductsFetchParams, ProductsSliceState } from "./productTypes" @@ -6,6 +7,8 @@ const initialState: ProductsSliceState = { products: [], totalPages: 0, currentPage: 0, + category: undefined, + price: undefined, status: "idle", } @@ -13,9 +16,19 @@ export const productsSlice = createAppSlice({ name: "products", initialState, reducers: create => ({ + sortByHighestPrice: create.reducer(state => { + state.price = "highest" + }), + sortByLowestPrice: create.reducer(state => { + state.price = "lowest" + }), fetchProductsAsync: create.asyncThunk( - async (params: ProductsFetchParams) => { - const response = await fetchProducts(params) + async (params: ProductsFetchParams, thunkApi) => { + const { products } = thunkApi.getState() as RootState + + const response = await fetchProducts( + products.price ? { ...params, price: products.price } : params, + ) return response }, { @@ -39,10 +52,13 @@ export const productsSlice = createAppSlice({ selectCurrentPage: products => products.currentPage, selectTotalPages: products => products.totalPages, selectStatus: products => products.status, + selectPrice: products => products.price, + selectCategory: products => products.category, }, }) -export const { fetchProductsAsync } = productsSlice.actions +export const { fetchProductsAsync, sortByHighestPrice, sortByLowestPrice } = + productsSlice.actions export const { selectProducts, From 6cf859199ef3b291c08d58dd8fe692a2b15d9b1f Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:07:45 -0400 Subject: [PATCH 18/27] feat(search-bar): Add search bar and dark / light mode. --- apps/api/src/products/productsService.ts | 2 +- apps/web/src/App.css | 1 + apps/web/src/App.tsx | 22 ++++++--- apps/web/src/components/navbar/Navbar.tsx | 24 ++++++++++ .../navbar/components/NavbarLogo.tsx | 7 +++ .../navbar/components/SearchInput.tsx | 13 +++++ .../features/products/ProductSortOrder.tsx | 48 ++++++++++--------- apps/web/src/features/products/Products.tsx | 2 +- 8 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 apps/web/src/components/navbar/Navbar.tsx create mode 100644 apps/web/src/components/navbar/components/NavbarLogo.tsx create mode 100644 apps/web/src/components/navbar/components/SearchInput.tsx diff --git a/apps/api/src/products/productsService.ts b/apps/api/src/products/productsService.ts index 6cbc236d01..310dcfc9a0 100644 --- a/apps/api/src/products/productsService.ts +++ b/apps/api/src/products/productsService.ts @@ -22,7 +22,7 @@ export class ProductsService { }: ProductQueryParams): Promise { try { const pageAsInt = parseInt(typeof page === 'string' ? page : '1'); - const limitAsInt = parseInt(typeof limit === 'string' ? limit : '10'); + const limitAsInt = parseInt(typeof limit === 'string' ? limit : '9'); const productDocuments = await Product.find( returnFindOptions(category, query) diff --git a/apps/web/src/App.css b/apps/web/src/App.css index 04f69bf0a0..3c44b7242d 100644 --- a/apps/web/src/App.css +++ b/apps/web/src/App.css @@ -1,3 +1,4 @@ @import "tailwindcss"; @plugin "flowbite-react/plugin/tailwindcss"; @source "../.flowbite-react/class-list.json"; +@custom-variant dark (&:where(.dark, .dark *)); diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 750b086998..c5438ff51b 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,12 +1,20 @@ import "./App.css" +import { Navbar } from "./components/navbar/Navbar" import { ProductPagination } from "./features/products/Pagination" import { Products } from "./features/products/Products" import { ProductSortOrder } from "./features/products/ProductSortOrder" -export const App = () => ( -
- - - -
-) +export const App = () => { + return ( +
+ +
+
+ + + +
+
+
+ ) +} diff --git a/apps/web/src/components/navbar/Navbar.tsx b/apps/web/src/components/navbar/Navbar.tsx new file mode 100644 index 0000000000..1a7ef2a1d8 --- /dev/null +++ b/apps/web/src/components/navbar/Navbar.tsx @@ -0,0 +1,24 @@ +import type { ReactNode } from "react" +import { SearchInput } from "./components/SearchInput" +import { NavbarLogo } from "./components/NavbarLogo" +import { DarkThemeToggle } from "flowbite-react" + +export const Navbar = (): ReactNode => { + return ( + + ) +} diff --git a/apps/web/src/components/navbar/components/NavbarLogo.tsx b/apps/web/src/components/navbar/components/NavbarLogo.tsx new file mode 100644 index 0000000000..c6ebd4eb08 --- /dev/null +++ b/apps/web/src/components/navbar/components/NavbarLogo.tsx @@ -0,0 +1,7 @@ +export const NavbarLogo = () => { + return ( + + Products + + ) +} diff --git a/apps/web/src/components/navbar/components/SearchInput.tsx b/apps/web/src/components/navbar/components/SearchInput.tsx new file mode 100644 index 0000000000..eaf8d9daed --- /dev/null +++ b/apps/web/src/components/navbar/components/SearchInput.tsx @@ -0,0 +1,13 @@ +import { TextInput } from "flowbite-react" + +export const SearchInput = () => { + return ( + + ) +} diff --git a/apps/web/src/features/products/ProductSortOrder.tsx b/apps/web/src/features/products/ProductSortOrder.tsx index 7f71ef73f1..991c8ad7b4 100644 --- a/apps/web/src/features/products/ProductSortOrder.tsx +++ b/apps/web/src/features/products/ProductSortOrder.tsx @@ -12,28 +12,30 @@ export function ProductSortOrder() { const { price } = useAppSelector(state => state.products) return ( - - Sort By Price - - - +
+ Sort By Price + + + + +
) } diff --git a/apps/web/src/features/products/Products.tsx b/apps/web/src/features/products/Products.tsx index f04a2f4b9b..a2399bbab8 100644 --- a/apps/web/src/features/products/Products.tsx +++ b/apps/web/src/features/products/Products.tsx @@ -16,7 +16,7 @@ export const Products = (): ReactNode => { if (status === "failed") return

Error

return ( -
+
{products.map(product => ( ))} From 7b54e631027f7002bf34f01eb15948cdf94187db Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:48:18 -0400 Subject: [PATCH 19/27] feat(category-dropdown): Add category dropdown for products. --- apps/web/src/App.tsx | 10 +--- apps/web/src/features/products/Products.tsx | 31 +++++------- .../products/components/CategoryDropdown.tsx | 49 +++++++++++++++++++ .../products/{ => components}/Pagination.tsx | 4 +- .../products/{ => components}/ProductCard.tsx | 0 .../{ => components}/ProductSortOrder.tsx | 4 +- .../products/components/ProductsList.tsx | 25 ++++++++++ .../src/features/products/components/index.ts | 4 ++ apps/web/src/features/products/index.ts | 1 + .../src/features/products/productsSlice.ts | 24 +++++++-- 10 files changed, 115 insertions(+), 37 deletions(-) create mode 100644 apps/web/src/features/products/components/CategoryDropdown.tsx rename apps/web/src/features/products/{ => components}/Pagination.tsx (81%) rename apps/web/src/features/products/{ => components}/ProductCard.tsx (100%) rename apps/web/src/features/products/{ => components}/ProductSortOrder.tsx (91%) create mode 100644 apps/web/src/features/products/components/ProductsList.tsx create mode 100644 apps/web/src/features/products/components/index.ts create mode 100644 apps/web/src/features/products/index.ts diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index c5438ff51b..d6aad26eaf 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -1,19 +1,13 @@ import "./App.css" import { Navbar } from "./components/navbar/Navbar" -import { ProductPagination } from "./features/products/Pagination" -import { Products } from "./features/products/Products" -import { ProductSortOrder } from "./features/products/ProductSortOrder" +import { Products } from "./features/products" export const App = () => { return (
-
- - - -
+
) diff --git a/apps/web/src/features/products/Products.tsx b/apps/web/src/features/products/Products.tsx index a2399bbab8..f127ad0fad 100644 --- a/apps/web/src/features/products/Products.tsx +++ b/apps/web/src/features/products/Products.tsx @@ -1,25 +1,16 @@ -import { type ReactNode, useEffect } from "react" -import { useAppDispatch, useAppSelector } from "../../app/hooks" -import { fetchProductsAsync } from "./productsSlice" -import { ProductCard } from "./ProductCard" - -export const Products = (): ReactNode => { - const dispatch = useAppDispatch() - - const { products, status } = useAppSelector(state => state.products) - - useEffect(() => { - if (status === "idle") void dispatch(fetchProductsAsync({})) - }, [dispatch, status]) - - if (status === "loading") return

Loading products...

- if (status === "failed") return

Error

+import { CategoryDropdown, ProductPagination } from "./components" +import { ProductSortOrder } from "./components" +import { ProductsList } from "./components" +export const Products = () => { return ( -
- {products.map(product => ( - - ))} +
+
+ + +
+ +
) } diff --git a/apps/web/src/features/products/components/CategoryDropdown.tsx b/apps/web/src/features/products/components/CategoryDropdown.tsx new file mode 100644 index 0000000000..a66ec3a6db --- /dev/null +++ b/apps/web/src/features/products/components/CategoryDropdown.tsx @@ -0,0 +1,49 @@ +import { Badge, Dropdown, DropdownItem } from "flowbite-react" +import { useAppDispatch, useAppSelector } from "../../../app/hooks" +import { + fetchProductsAsync, + filterByCategory, + resetCategory, +} from "../productsSlice" + +const categories = ["Tools", "Garden"] + +export const CategoryDropdown = () => { + const dispatch = useAppDispatch() + const { category: categoryInState } = useAppSelector(state => state.products) + + return ( +
+ + {categories.map( + category => + categoryInState !== category && ( + { + dispatch(filterByCategory(category)) + void dispatch(fetchProductsAsync({})) + }} + > + {category} + + ), + )} + + {categoryInState && ( + + { + dispatch(resetCategory()) + void dispatch(fetchProductsAsync({})) + }} + > + X + + {categoryInState} + + )} +
+ ) +} diff --git a/apps/web/src/features/products/Pagination.tsx b/apps/web/src/features/products/components/Pagination.tsx similarity index 81% rename from apps/web/src/features/products/Pagination.tsx rename to apps/web/src/features/products/components/Pagination.tsx index ce93b93dd0..cfbae912a0 100644 --- a/apps/web/src/features/products/Pagination.tsx +++ b/apps/web/src/features/products/components/Pagination.tsx @@ -1,6 +1,6 @@ import { Pagination } from "flowbite-react" -import { useAppDispatch, useAppSelector } from "../../app/hooks" -import { fetchProductsAsync } from "./productsSlice" +import { useAppDispatch, useAppSelector } from "../../../app/hooks" +import { fetchProductsAsync } from "../productsSlice" export const ProductPagination = () => { const dispatch = useAppDispatch() diff --git a/apps/web/src/features/products/ProductCard.tsx b/apps/web/src/features/products/components/ProductCard.tsx similarity index 100% rename from apps/web/src/features/products/ProductCard.tsx rename to apps/web/src/features/products/components/ProductCard.tsx diff --git a/apps/web/src/features/products/ProductSortOrder.tsx b/apps/web/src/features/products/components/ProductSortOrder.tsx similarity index 91% rename from apps/web/src/features/products/ProductSortOrder.tsx rename to apps/web/src/features/products/components/ProductSortOrder.tsx index 991c8ad7b4..c738d9e1e6 100644 --- a/apps/web/src/features/products/ProductSortOrder.tsx +++ b/apps/web/src/features/products/components/ProductSortOrder.tsx @@ -1,10 +1,10 @@ import { Button, ButtonGroup } from "flowbite-react" -import { useAppDispatch, useAppSelector } from "../../app/hooks" +import { useAppDispatch, useAppSelector } from "../../../app/hooks" import { fetchProductsAsync, sortByHighestPrice, sortByLowestPrice, -} from "./productsSlice" +} from "../productsSlice" export function ProductSortOrder() { const dispatch = useAppDispatch() diff --git a/apps/web/src/features/products/components/ProductsList.tsx b/apps/web/src/features/products/components/ProductsList.tsx new file mode 100644 index 0000000000..36451c28bb --- /dev/null +++ b/apps/web/src/features/products/components/ProductsList.tsx @@ -0,0 +1,25 @@ +import { type ReactNode, useEffect } from "react" +import { useAppDispatch, useAppSelector } from "../../../app/hooks" +import { fetchProductsAsync } from "../productsSlice" +import { ProductCard } from "./ProductCard" + +export const ProductsList = (): ReactNode => { + const dispatch = useAppDispatch() + + const { products, status } = useAppSelector(state => state.products) + + useEffect(() => { + if (status === "idle") void dispatch(fetchProductsAsync({})) + }, [dispatch, status]) + + if (status === "loading") return

Loading products...

+ if (status === "failed") return

Error

+ + return ( +
+ {products.map(product => ( + + ))} +
+ ) +} diff --git a/apps/web/src/features/products/components/index.ts b/apps/web/src/features/products/components/index.ts new file mode 100644 index 0000000000..45dab32b66 --- /dev/null +++ b/apps/web/src/features/products/components/index.ts @@ -0,0 +1,4 @@ +export { ProductPagination } from "./Pagination" +export { ProductSortOrder } from "./ProductSortOrder" +export { ProductsList } from "./ProductsList" +export { CategoryDropdown } from "./CategoryDropdown" diff --git a/apps/web/src/features/products/index.ts b/apps/web/src/features/products/index.ts new file mode 100644 index 0000000000..e09abdd10e --- /dev/null +++ b/apps/web/src/features/products/index.ts @@ -0,0 +1 @@ +export { Products } from "./Products" diff --git a/apps/web/src/features/products/productsSlice.ts b/apps/web/src/features/products/productsSlice.ts index defc2babb7..93b301c530 100644 --- a/apps/web/src/features/products/productsSlice.ts +++ b/apps/web/src/features/products/productsSlice.ts @@ -1,3 +1,4 @@ +import type { PayloadAction } from "@reduxjs/toolkit" import { createAppSlice } from "../../app/createAppSlice" import type { RootState } from "../../app/store" import { fetchProducts } from "./fetchProducts" @@ -22,13 +23,21 @@ export const productsSlice = createAppSlice({ sortByLowestPrice: create.reducer(state => { state.price = "lowest" }), + filterByCategory: create.reducer((state, action: PayloadAction) => { + state.category = action.payload + }), + resetCategory: create.reducer(state => { + state.category = undefined + }), fetchProductsAsync: create.asyncThunk( async (params: ProductsFetchParams, thunkApi) => { const { products } = thunkApi.getState() as RootState - const response = await fetchProducts( - products.price ? { ...params, price: products.price } : params, - ) + const response = await fetchProducts({ + ...params, + price: products.price, + category: products.category, + }) return response }, { @@ -57,8 +66,13 @@ export const productsSlice = createAppSlice({ }, }) -export const { fetchProductsAsync, sortByHighestPrice, sortByLowestPrice } = - productsSlice.actions +export const { + fetchProductsAsync, + sortByHighestPrice, + sortByLowestPrice, + filterByCategory, + resetCategory, +} = productsSlice.actions export const { selectProducts, From 000b66a4786ed039f3f6d48d8c0a8ac1b2e78090 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Wed, 4 Jun 2025 14:10:46 -0400 Subject: [PATCH 20/27] feat(search): Add ability to search products using debounce function. --- apps/web/package.json | 2 + .../navbar/components/SearchInput.tsx | 64 ++++++++++++++++--- .../products/components/CategoryDropdown.tsx | 27 ++++---- .../web/src/features/products/productTypes.ts | 1 + .../src/features/products/productsSlice.ts | 10 +++ apps/web/tsconfig.app.json | 1 + yarn.lock | 17 +++++ 7 files changed, 102 insertions(+), 20 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index 9b93db139a..537a7fa2a3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -20,6 +20,7 @@ "@reduxjs/toolkit": "^2.6.1", "@tailwindcss/vite": "^4.1.8", "flowbite-react": "^0.11.7", + "lodash.debounce": "^4.0.8", "react": "^19.1.0", "react-dom": "^19.1.0", "react-redux": "^9.2.0", @@ -31,6 +32,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", + "@types/lodash.debounce": "^4.0.9", "@types/node": "^22.14.0", "@types/react": "^19.1.0", "@types/react-dom": "^19.1.1", diff --git a/apps/web/src/components/navbar/components/SearchInput.tsx b/apps/web/src/components/navbar/components/SearchInput.tsx index eaf8d9daed..1e2ce4d7c5 100644 --- a/apps/web/src/components/navbar/components/SearchInput.tsx +++ b/apps/web/src/components/navbar/components/SearchInput.tsx @@ -1,13 +1,61 @@ -import { TextInput } from "flowbite-react" +import { Badge, TextInput, Tooltip } from "flowbite-react" +import debounce from "lodash.debounce" +import { useCallback, useState } from "react" +import { useAppDispatch, useAppSelector } from "../../../app/hooks" +import { + fetchProductsAsync, + resetQuery, + setQuery, +} from "../../../features/products/productsSlice" export const SearchInput = () => { + const dispatch = useAppDispatch() + const { query: queryInState } = useAppSelector(state => state.products) + const [inputValue, setInputValue] = useState("") + + const debouncedSearch = useCallback( + debounce((query: string) => { + dispatch(setQuery(query)) + void dispatch(fetchProductsAsync({})) + }, 500), + [dispatch], + ) + return ( - +
+ { + setInputValue(e.target.value) + debouncedSearch(e.target.value) + }} + /> + {queryInState && ( + + + { + dispatch(resetQuery()) + setInputValue("") + void dispatch(fetchProductsAsync({})) + }} + > + X + + + {queryInState} + + + )} +
) } diff --git a/apps/web/src/features/products/components/CategoryDropdown.tsx b/apps/web/src/features/products/components/CategoryDropdown.tsx index a66ec3a6db..e103005693 100644 --- a/apps/web/src/features/products/components/CategoryDropdown.tsx +++ b/apps/web/src/features/products/components/CategoryDropdown.tsx @@ -1,4 +1,4 @@ -import { Badge, Dropdown, DropdownItem } from "flowbite-react" +import { Badge, Dropdown, DropdownItem, Tooltip } from "flowbite-react" import { useAppDispatch, useAppSelector } from "../../../app/hooks" import { fetchProductsAsync, @@ -31,17 +31,20 @@ export const CategoryDropdown = () => { )} {categoryInState && ( - - { - dispatch(resetCategory()) - void dispatch(fetchProductsAsync({})) - }} - > - X - - {categoryInState} + + + { + dispatch(resetCategory()) + void dispatch(fetchProductsAsync({})) + }} + > + X + + + {categoryInState} + )}
diff --git a/apps/web/src/features/products/productTypes.ts b/apps/web/src/features/products/productTypes.ts index 05fd33b05f..1c7679eb32 100644 --- a/apps/web/src/features/products/productTypes.ts +++ b/apps/web/src/features/products/productTypes.ts @@ -26,6 +26,7 @@ export type ProductsSliceState = { products: ProductDto[] totalPages: number currentPage: number + query: string | undefined category: string | undefined price: "highest" | "lowest" | undefined status: "idle" | "loading" | "failed" | "succeeded" diff --git a/apps/web/src/features/products/productsSlice.ts b/apps/web/src/features/products/productsSlice.ts index 93b301c530..fef4f8d3f3 100644 --- a/apps/web/src/features/products/productsSlice.ts +++ b/apps/web/src/features/products/productsSlice.ts @@ -8,6 +8,7 @@ const initialState: ProductsSliceState = { products: [], totalPages: 0, currentPage: 0, + query: undefined, category: undefined, price: undefined, status: "idle", @@ -17,6 +18,12 @@ export const productsSlice = createAppSlice({ name: "products", initialState, reducers: create => ({ + setQuery: create.reducer((state, action: PayloadAction) => { + state.query = action.payload + }), + resetQuery: create.reducer(state => { + state.query = undefined + }), sortByHighestPrice: create.reducer(state => { state.price = "highest" }), @@ -35,6 +42,7 @@ export const productsSlice = createAppSlice({ const response = await fetchProducts({ ...params, + query: products.query, price: products.price, category: products.category, }) @@ -72,6 +80,8 @@ export const { sortByLowestPrice, filterByCategory, resetCategory, + setQuery, + resetQuery, } = productsSlice.actions export const { diff --git a/apps/web/tsconfig.app.json b/apps/web/tsconfig.app.json index ea6a38d599..3d7fa3e064 100644 --- a/apps/web/tsconfig.app.json +++ b/apps/web/tsconfig.app.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "allowSyntheticDefaultImports": true, "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "target": "ES2020", "useDefineForClassFields": true, diff --git a/yarn.lock b/yarn.lock index 22ae7e3bb8..3fdea80a7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1360,6 +1360,18 @@ "@types/koa-compose" "*" "@types/node" "*" +"@types/lodash.debounce@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" + integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.17.tgz#fb85a04f47e9e4da888384feead0de05f7070355" + integrity sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ== + "@types/mime@^1": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" @@ -3677,6 +3689,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" From 3f58277d57b473f7f55600dac81f91dd1e9df8b1 Mon Sep 17 00:00:00 2001 From: Tom Winskell <129330818+tomwinskell@users.noreply.github.com> Date: Wed, 4 Jun 2025 14:18:35 -0400 Subject: [PATCH 21/27] refactor(ui): Some refactoring of classNames to ensure UI renders correctly all screen sizes. --- apps/web/src/features/products/Products.tsx | 4 ++-- apps/web/src/features/products/components/Pagination.tsx | 2 +- .../src/features/products/components/ProductSortOrder.tsx | 2 +- .../web/src/features/products/components/ProductsList.tsx | 8 +++++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/web/src/features/products/Products.tsx b/apps/web/src/features/products/Products.tsx index f127ad0fad..7c0aaa66c9 100644 --- a/apps/web/src/features/products/Products.tsx +++ b/apps/web/src/features/products/Products.tsx @@ -4,8 +4,8 @@ import { ProductsList } from "./components" export const Products = () => { return ( -
-
+
+
diff --git a/apps/web/src/features/products/components/Pagination.tsx b/apps/web/src/features/products/components/Pagination.tsx index cfbae912a0..8d4afbeeac 100644 --- a/apps/web/src/features/products/components/Pagination.tsx +++ b/apps/web/src/features/products/components/Pagination.tsx @@ -8,7 +8,7 @@ export const ProductPagination = () => { const { currentPage, totalPages } = useAppSelector(state => state.products) return ( -
+
state.products) return ( -
+
Sort By Price