From a1274be571c547a4aea45fe143b233c796709814 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Mon, 8 Jul 2024 18:11:18 +0700 Subject: [PATCH 01/22] chore: create database --- .gitignore | 1 + config/config.json | 23 + models/index.js | 43 ++ package-lock.json | 1678 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 20 + 5 files changed, 1765 insertions(+) create mode 100644 .gitignore create mode 100644 config/config.json create mode 100644 models/index.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..4994120 --- /dev/null +++ b/config/config.json @@ -0,0 +1,23 @@ +{ + "development": { + "username": "postgres", + "password": "postgres", + "database": "IP", + "host": "127.0.0.1", + "dialect": "postgres" + }, + "test": { + "username": "root", + "password": null, + "database": "database_test", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "production": { + "username": "root", + "password": null, + "database": "database_production", + "host": "127.0.0.1", + "dialect": "mysql" + } +} \ No newline at end of file diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000..024200e --- /dev/null +++ b/models/index.js @@ -0,0 +1,43 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const Sequelize = require('sequelize'); +const process = require('process'); +const basename = path.basename(__filename); +const env = process.env.NODE_ENV || 'development'; +const config = require(__dirname + '/../config/config.json')[env]; +const db = {}; + +let sequelize; +if (config.use_env_variable) { + sequelize = new Sequelize(process.env[config.use_env_variable], config); +} else { + sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(file => { + return ( + file.indexOf('.') !== 0 && + file !== basename && + file.slice(-3) === '.js' && + file.indexOf('.test.js') === -1 + ); + }) + .forEach(file => { + const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); + db[model.name] = model; + }); + +Object.keys(db).forEach(modelName => { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2e97fd0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1678 @@ +{ + "name": "IP-RMT50", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "bcrypt": "^5.1.1", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", + "pg": "^8.12.0", + "sequelize": "^6.37.3" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "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.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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==", + "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==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sequelize": { + "version": "6.37.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", + "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sequelize/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8460521 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "bcrypt": "^5.1.1", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", + "pg": "^8.12.0", + "sequelize": "^6.37.3" + }, + "name": "ip-rmt50", + "description": "", + "version": "1.0.0", + "main": "index.js", + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} From 500006d78f5cfc079aa6d906613e9c585e323731 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Mon, 8 Jul 2024 19:18:47 +0700 Subject: [PATCH 02/22] chore: model --- data/weapon.json | 128 +++++++++++++++++++++++ migrations/20240708121828-create-user.js | 34 ++++++ models/user.js | 25 +++++ 3 files changed, 187 insertions(+) create mode 100644 data/weapon.json create mode 100644 migrations/20240708121828-create-user.js create mode 100644 models/user.js diff --git a/data/weapon.json b/data/weapon.json new file mode 100644 index 0000000..e0e1803 --- /dev/null +++ b/data/weapon.json @@ -0,0 +1,128 @@ +[ + { + "id": 1, + "name": "Aquila Favonia", + "rarity": 5, + "type": "Sword", + "baseAttack": 48, + "effect": "Increases ATK by 20%. On hit, attacks against opponents with less than 30% HP increase all party members' ATK by 40% for 12s. Can only occur once every 30s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Aquila_Favonia.png" + }, + { + "id": 2, + "name": "Skyward Blade", + "rarity": 5, + "type": "Sword", + "baseAttack": 46, + "effect": "CRIT Rate increased by 4%. Gains Skypiercing Might upon using an Elemental Burst: Increases Movement SPD by 10%, increases ATK SPD by 10%, and increases the DMG of Normal and Charged Attack hits by 20% for 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Blade.png" + }, + { + "id": 3, + "name": "Primordial Jade Cutter", + "rarity": 5, + "type": "Sword", + "baseAttack": 44, + "effect": "HP increased by 20%. Additionally, provides an ATK Bonus based on 1.2% of the wielder's Max HP.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Primordial_Jade_Cutter.png" + }, + { + "id": 4, + "name": "Summit Shaper", + "rarity": 5, + "type": "Sword", + "baseAttack": 46, + "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Summit_Shaper.png" + }, + { + "id": 5, + "name": "The Black Sword", + "rarity": 4, + "type": "Sword", + "baseAttack": 42, + "effect": "Increases DMG dealt by Normal and Charged Attacks by 20%. Additionally, regenerates 60% of ATK as HP when Normal and Charged Attacks score a CRIT Hit. This effect can occur once every 5s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Black_Sword.png" + }, + { + "id": 6, + "name": "Prototype Rancour", + "rarity": 4, + "type": "Sword", + "baseAttack": 44, + "effect": "On hit, Normal or Charged Attacks increase ATK and DEF by 4% for 6s. Max 4 stacks. This effect can only occur once every 0.3s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Rancour.png" + }, + { + "id": 7, + "name": "Lion's Roar", + "rarity": 4, + "type": "Sword", + "baseAttack": 42, + "effect": "Increases DMG against enemies affected by Pyro or Electro by 20%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lion's_Roar.png" + }, + { + "id": 8, + "name": "The Alley Flash", + "rarity": 4, + "type": "Sword", + "baseAttack": 44, + "effect": "Increases DMG dealt by the character equipping this weapon by 12%. Taking DMG disables this effect for 5s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Alley_Flash.png" + }, + { + "id": 9, + "name": "Favonius Sword", + "rarity": 4, + "type": "Sword", + "baseAttack": 41, + "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Sword.png" + }, + { + "id": 10, + "name": "Royal Longsword", + "rarity": 4, + "type": "Sword", + "baseAttack": 42, + "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Longsword.png" + }, + { + "id": 11, + "name": "Sacrificial Sword", + "rarity": 4, + "type": "Sword", + "baseAttack": 41, + "effect": "After damaging an opponent with an Elemental Skill, the skill has a 40% chance to end its own CD. Can only occur once every 30s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Sacrificial_Sword.png" + }, + { + "id": 12, + "name": "Iron Sting", + "rarity": 4, + "type": "Sword", + "baseAttack": 42, + "effect": "Dealing Elemental DMG increases all DMG by 6% for 6s. Max 2 stacks. Can only occur once every 1s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Iron_Sting.png" + }, + { + "id": 13, + "name": "The Flute", + "rarity": 4, + "type": "Sword", + "baseAttack": 42, + "effect": "Normal or Charged Attacks grant a Harmonic on hits. Gaining 5 Harmonics triggers the power of music and deals 100% ATK DMG to surrounding enemies. Harmonics last up to 30s, and a maximum of 1 can be gained every 0.5s.", + "imgUrl": "https://example.com/the_flute.jpg" + }, + { + "id": 14, + "name": "Sword of Descension", + "rarity": 4, + "type": "Sword", + "baseAttack": 39, + "effect": "Every 4s a character is on the field, they will deal 6% more DMG and take 3% more DMG. This effect has a maximum of 5 stacks and will not be reset if the character leaves the field, but will be reduced by 1 stack when the character takes DMG.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Flute.png" + } +] \ No newline at end of file diff --git a/migrations/20240708121828-create-user.js b/migrations/20240708121828-create-user.js new file mode 100644 index 0000000..6c14d47 --- /dev/null +++ b/migrations/20240708121828-create-user.js @@ -0,0 +1,34 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Users', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + email: { + type: Sequelize.STRING + }, + password: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Users'); + } +}; \ No newline at end of file diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..bb728a9 --- /dev/null +++ b/models/user.js @@ -0,0 +1,25 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class User extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + User.init({ + name: DataTypes.STRING, + email: DataTypes.STRING, + password: DataTypes.STRING + }, { + sequelize, + modelName: 'User', + }); + return User; +}; \ No newline at end of file From 032f52f0ce394437f1bae9c3edbaacd6f445c8d1 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Mon, 8 Jul 2024 21:23:12 +0700 Subject: [PATCH 03/22] chore: models & migrations --- data/type.json | 22 + data/weapon.json | 480 +++++++++- ...-user.js => 20240708134935-create-user.js} | 0 migrations/20240708134948-create-type.js | 28 + migrations/20240708134959-create-weapon.js | 47 + migrations/20240708135032-create-party.js | 42 + models/party.js | 25 + models/type.js | 23 + models/weapon.js | 28 + package-lock.json | 860 +++++++++++++++++- package.json | 4 +- 11 files changed, 1540 insertions(+), 19 deletions(-) create mode 100644 data/type.json rename migrations/{20240708121828-create-user.js => 20240708134935-create-user.js} (100%) create mode 100644 migrations/20240708134948-create-type.js create mode 100644 migrations/20240708134959-create-weapon.js create mode 100644 migrations/20240708135032-create-party.js create mode 100644 models/party.js create mode 100644 models/type.js create mode 100644 models/weapon.js diff --git a/data/type.json b/data/type.json new file mode 100644 index 0000000..5dab81a --- /dev/null +++ b/data/type.json @@ -0,0 +1,22 @@ +[ + { + "id": 1, + "name": "Sword" + }, + { + "id": 2, + "name": "Polearm" + }, + { + "id": 3, + "name": "Claymore" + }, + { + "id": 4, + "name": "Catalyst" + }, + { + "id": 5, + "name": "Bow" + } +] \ No newline at end of file diff --git a/data/weapon.json b/data/weapon.json index e0e1803..e238e01 100644 --- a/data/weapon.json +++ b/data/weapon.json @@ -3,7 +3,7 @@ "id": 1, "name": "Aquila Favonia", "rarity": 5, - "type": "Sword", + "typeId": 1, "baseAttack": 48, "effect": "Increases ATK by 20%. On hit, attacks against opponents with less than 30% HP increase all party members' ATK by 40% for 12s. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Aquila_Favonia.png" @@ -12,7 +12,7 @@ "id": 2, "name": "Skyward Blade", "rarity": 5, - "type": "Sword", + "typeId": 1, "baseAttack": 46, "effect": "CRIT Rate increased by 4%. Gains Skypiercing Might upon using an Elemental Burst: Increases Movement SPD by 10%, increases ATK SPD by 10%, and increases the DMG of Normal and Charged Attack hits by 20% for 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Blade.png" @@ -21,7 +21,7 @@ "id": 3, "name": "Primordial Jade Cutter", "rarity": 5, - "type": "Sword", + "typeId": 1, "baseAttack": 44, "effect": "HP increased by 20%. Additionally, provides an ATK Bonus based on 1.2% of the wielder's Max HP.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Primordial_Jade_Cutter.png" @@ -30,7 +30,7 @@ "id": 4, "name": "Summit Shaper", "rarity": 5, - "type": "Sword", + "typeId": 1, "baseAttack": 46, "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Summit_Shaper.png" @@ -39,7 +39,7 @@ "id": 5, "name": "The Black Sword", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 42, "effect": "Increases DMG dealt by Normal and Charged Attacks by 20%. Additionally, regenerates 60% of ATK as HP when Normal and Charged Attacks score a CRIT Hit. This effect can occur once every 5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Black_Sword.png" @@ -48,7 +48,7 @@ "id": 6, "name": "Prototype Rancour", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 44, "effect": "On hit, Normal or Charged Attacks increase ATK and DEF by 4% for 6s. Max 4 stacks. This effect can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Rancour.png" @@ -57,7 +57,7 @@ "id": 7, "name": "Lion's Roar", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 42, "effect": "Increases DMG against enemies affected by Pyro or Electro by 20%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lion's_Roar.png" @@ -66,7 +66,7 @@ "id": 8, "name": "The Alley Flash", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 44, "effect": "Increases DMG dealt by the character equipping this weapon by 12%. Taking DMG disables this effect for 5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Alley_Flash.png" @@ -75,7 +75,7 @@ "id": 9, "name": "Favonius Sword", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 41, "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Sword.png" @@ -84,7 +84,7 @@ "id": 10, "name": "Royal Longsword", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 42, "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Longsword.png" @@ -93,7 +93,7 @@ "id": 11, "name": "Sacrificial Sword", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 41, "effect": "After damaging an opponent with an Elemental Skill, the skill has a 40% chance to end its own CD. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Sacrificial_Sword.png" @@ -102,7 +102,7 @@ "id": 12, "name": "Iron Sting", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 42, "effect": "Dealing Elemental DMG increases all DMG by 6% for 6s. Max 2 stacks. Can only occur once every 1s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Iron_Sting.png" @@ -111,18 +111,468 @@ "id": 13, "name": "The Flute", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 42, "effect": "Normal or Charged Attacks grant a Harmonic on hits. Gaining 5 Harmonics triggers the power of music and deals 100% ATK DMG to surrounding enemies. Harmonics last up to 30s, and a maximum of 1 can be gained every 0.5s.", - "imgUrl": "https://example.com/the_flute.jpg" + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Flute.png" }, { "id": 14, "name": "Sword of Descension", "rarity": 4, - "type": "Sword", + "typeId": 1, "baseAttack": 39, "effect": "Every 4s a character is on the field, they will deal 6% more DMG and take 3% more DMG. This effect has a maximum of 5 stacks and will not be reset if the character leaves the field, but will be reduced by 1 stack when the character takes DMG.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Flute.png" + }, + { + "id": 15, + "name": "Lithic Spear", + "rarity": 4, + "typeId": 2, + "baseAttack": 42, + "effect": "For every character in the party who hails from Liyue, the character who equips this weapon gains 7% ATK increase and 3% CRIT Rate increase. This effect stacks up to 4 times.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lithic_Spear.png" + }, + { + "id": 16, + "name": "Blackcliff Pole", + "rarity": 4, + "typeId": 2, + "baseAttack": 42, + "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Pole.png" + }, + { + "id": 17, + "name": "Royal Spear", + "rarity": 4, + "typeId": 2, + "baseAttack": 44, + "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Spear.png" + }, + { + "id": 18, + "name": "Prototype Grudge", + "rarity": 4, + "typeId": 2, + "baseAttack": 42, + "effect": "After using an Elemental Skill, increases Normal and Charged Attack DMG by 8% for 12s. Max 2 stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Starglitter.png" + }, + { + "id": 19, + "name": "Favonius Lance", + "rarity": 4, + "typeId": 2, + "baseAttack": 44, + "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Lance.png" + }, + { + "id": 20, + "name": "Deathmatch", + "rarity": 4, + "typeId": 2, + "baseAttack": 41, + "effect": "If there are at least 2 enemies nearby, ATK is increased by 16% and DEF is increased by 16%. If there are fewer than 2 enemies nearby, ATK is increased by 24%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Deathmatch.png" + }, + { + "id": 21, + "name": "Halberd", + "rarity": 3, + "typeId": 2, + "baseAttack": 40, + "effect": "Normal Attacks deal an additional 160% DMG. Can only occur once every 10s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Halberd.png" + }, + { + "id": 22, + "name": "White Tassel", + "rarity": 3, + "typeId": 2, + "baseAttack": 39, + "effect": "Increases Normal Attack DMG by 24%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/White_Tassel.png" + }, + { + "id": 23, + "name": "Black Tassel", + "rarity": 3, + "typeId": 2, + "baseAttack": 38, + "effect": "Increases DMG against slimes by 40%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Black_Tassel.png" + }, + { + "id": 24, + "name": "Crescent Pike", + "rarity": 4, + "typeId": 2, + "baseAttack": 44, + "effect": "After picking up an Elemental Orb/Particle, Normal and Charged Attacks deal an additional 20% ATK DMG for 5s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Crescent_Pike.png" + }, + { + "id": 25, + "name": "Blackcliff Pole", + "rarity": 3, + "typeId": 2, + "baseAttack": 38, + "effect": "After defeating an opponent, ATK is increased by 6% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Pole.png" + }, + { + "id": 26, + "name": "Wolf's Gravestone", + "rarity": 5, + "typeId": 3, + "baseAttack": 46, + "effect": "Increases ATK by 20%. On hit, attacks against enemies with less than 30% HP increase all party members' ATK by 40% for 12s. Can only occur once every 30s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Wolf's_Gravestone.png" + }, + { + "id": 27, + "name": "Skyward Pride", + "rarity": 5, + "typeId": 3, + "baseAttack": 48, + "effect": "Increases all DMG by 8%. After using an Elemental Burst, Normal or Charged Attack, on hit, creates a vacuum blade that deals 80% of ATK as DMG to enemies along its path. Lasts for 20s or 8 vacuum blades.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Pride.png" + }, + { + "id": 28, + "name": "The Unforged", + "rarity": 5, + "typeId": 3, + "baseAttack": 46, + "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Unforged.png" + }, + { + "id": 29, + "name": "Serpent Spine", + "rarity": 4, + "typeId": 3, + "baseAttack": 42, + "effect": "Every 4s a character is on the field, they will deal 6% more DMG and take 3% more DMG. This effect has a maximum of 5 stacks and will not be reset if the character leaves the field, but will be reduced by 1 stack when the character takes DMG.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Serpent_Spine.png" + }, + { + "id": 30, + "name": "The Bell", + "rarity": 4, + "typeId": 3, + "baseAttack": 42, + "effect": "Taking DMG generates a shield that absorbs DMG up to 20% of Max HP. This shield lasts for 10s or until broken, and can only be triggered once every 45s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Bell.png" + }, + { + "id": 31, + "name": "Whiteblind", + "rarity": 4, + "typeId": 3, + "baseAttack": 42, + "effect": "On hit, Normal or Charged Attacks increase ATK and DEF by 6% for 6s. Max 4 stacks. This effect can only occur once every 0.5s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Whiteblind.png" + }, + { + "id": 32, + "name": "Rainslasher", + "rarity": 4, + "typeId": 3, + "baseAttack": 42, + "effect": "Increases DMG against enemies affected by Hydro or Electro by 20%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Rainslasher.png" + }, + { + "id": 33, + "name": "Lithic Blade", + "rarity": 4, + "typeId": 3, + "baseAttack": 44, + "effect": "For every character in the party who hails from Liyue, the character who equips this weapon gains 7% ATK increase and 3% CRIT Rate increase. This effect stacks up to 4 times.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lithic_Blade.png" + }, + { + "id": 34, + "name": "Blackcliff Slasher", + "rarity": 4, + "typeId": 3, + "baseAttack": 44, + "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Slasher.png" + }, + { + "id": 35, + "name": "Snow-Tombed Starsilver", + "rarity": 4, + "typeId": 3, + "baseAttack": 42, + "effect": "Hitting an enemy with Normal and Charged Attacks has a 60% chance of forming and dropping an Everfrost Icicle above them, dealing 80% AoE ATK DMG. Enemies affected by Cryo are dealt 200% ATK DMG instead by the icicle. Can only occur once every 10s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Snow-Tombed_Starsilver.png" + }, + { + "id": 36, + "name": "Royal Greatsword", + "rarity": 4, + "typeId": 3, + "baseAttack": 44, + "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Greatsword.png" + }, + { + "id": 37, + "name": "Sacrificial Greatsword", + "rarity": 4, + "typeId": 3, + "baseAttack": 44, + "effect": "After damaging an opponent with an Elemental Skill, the skill has a 40% chance to end its own CD. Can only occur once every 30s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Sacrificial_Greatsword.png" + }, + { + "id": 38, + "name": "White Iron Greatsword", + "rarity": 3, + "typeId": 3, + "baseAttack": 39, + "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/White_Iron_Greatsword.png" + }, + { + "id": 39, + "name": "Lost Prayer to the Sacred Winds", + "rarity": 5, + "typeId": 4, + "baseAttack": 46, + "effect": "Increases Movement SPD by 10%. When in battle, gain an 8% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lost_Prayer_to_the_Sacred_Winds.png" + }, + { + "id": 40, + "name": "Skyward Atlas", + "rarity": 5, + "typeId": 4, + "baseAttack": 48, + "effect": "Increases Elemental DMG Bonus by 12%. Normal Attack hits have a 50% chance to earn the favor of the clouds. which actively seek out nearby enemies to attack for 15s, dealing 160% ATK DMG. Can only occur once every 30s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Atlas.png" + }, + { + "id": 41, + "name": "Memory of Dust", + "rarity": 5, + "typeId": 4, + "baseAttack": 46, + "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Memory_of_Dust.png" + }, + { + "id": 42, + "name": "Widsith", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "When a character takes the field, they will gain a random theme song for 10s. This can only occur once every 30s. Recitative: ATK is increased by 60%. Aria: Increases all Elemental DMG by 48%. Interlude: Elemental Mastery is increased by 240.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Widsith.png" + }, + { + "id": 43, + "name": "Eye of Perception", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "Normal and Charged Attacks have a 50% chance to fire a Bolt of Perception, dealing 240% ATK as DMG. This bolt can bounce between enemies a maximum of 4 times. This effect can occur once every 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Eye_of_Perception.png" + }, + { + "id": 44, + "name": "Solar Pearl", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "Normal Attack hits increase Elemental Skill and Elemental Burst DMG by 20% for 6s. Likewise, Elemental Skill or Elemental Burst hits increase Normal Attack DMG by 20% for 6s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Solar_Pearl.png" + }, + { + "id": 45, + "name": "Frostbearer", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "Hitting an enemy with Normal and Charged Attacks has a 60% chance of forming and dropping an Everfrost Icicle above them, dealing 80% AoE ATK DMG. Enemies affected by Cryo are dealt 200% ATK DMG instead by the icicle. Can only occur once every 10s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Frostbearer.png" + }, + { + "id": 46, + "name": "Mappa Mare", + "rarity": 4, + "typeId": 4, + "baseAttack": 44, + "effect": "Triggering an Elemental reaction grants a 8% Elemental DMG Bonus for 10s. Max 2 stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Mappa_Mare.png" + }, + { + "id": 47, + "name": "The Widsith", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "When a character takes the field, they will gain a random theme song for 10s. This can only occur once every 30s. Recitative: ATK is increased by 60%. Aria: Increases all Elemental DMG by 48%. Interlude: Elemental Mastery is increased by 240.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Widsith.png" + }, + { + "id": 48, + "name": "Prototype Amber", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "Using an Elemental Burst regenerates 4 Energy every 2s for 6s. All party members will regenerate 4% HP every 2s for this duration.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Amber.png" + }, + { + "id": 49, + "name": "Blackcliff Agate", + "rarity": 4, + "typeId": 4, + "baseAttack": 44, + "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Agate.png" + }, + { + "id": 50, + "name": "Favonius Codex", + "rarity": 4, + "typeId": 4, + "baseAttack": 42, + "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Codex.png" + }, + { + "id": 51, + "name": "Magic Guide", + "rarity": 3, + "typeId": 4, + "baseAttack": 38, + "effect": "Increases DMG against slimes by 40%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Magic_Guide.png" + }, + { + "id": 51, + "name": "Amos' Bow", + "rarity": 5, + "typeId": 5, + "baseAttack": 46, + "effect": "Increases Normal and Charged Attack DMG by 12%. After using an Elemental Skill, increases Normal and Charged Attack DMG by 8% for 12s. Max 2 stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Amos'_Bow.png" + }, + { + "id": 52, + "name": "Skyward Harp", + "rarity": 5, + "typeId": 5, + "baseAttack": 48, + "effect": "Increases CRIT DMG by 20%. Hits have a 60% chance to inflict a small AoE attack, dealing 125% Physical ATK DMG. Can only occur once every 4s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Harp.png" + }, + { + "id": 53, + "name": "The Viridescent Hunt", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "Upon hit, Normal and Aimed Shot have a 50% chance to generate a Cyclone, which will continuously attract surrounding enemies, dealing 40% of ATK as DMG to these enemies every 0.5s for 4s. This effect can only occur once every 14s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Viridescent_Hunt.png" + }, + { + "id": 54, + "name": "Prototype Crescent", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "Charged Attack hits on weak points increase Movement SPD by 10% and ATK by 36% for 10s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Crescent.png" + }, + { + "id": 55, + "name": "The Stringless", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "Increases Elemental Skill and Elemental Burst DMG by 24%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Stringless.png" + }, + { + "id": 56, + "name": "Royal Bow", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Bow.png" + }, + { + "id": 57, + "name": "Favonius Warbow", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Warbow.png" + }, + { + "id": 58, + "name": "Rust", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "Increases Normal Attack DMG by 40% but decreases Aimed Shot DMG by 10%.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Rust.png" + }, + { + "id": 59, + "name": "Compound Bow", + "rarity": 4, + "typeId": 5, + "baseAttack": 41, + "effect": "Normal Attack and Aimed Shot hits increase ATK by 4% and Normal ATK SPD by 1.2% for 6s. Max 4 stacks. Can only occur once every 0.3s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Compound_Bow.png" + }, + { + "id": 60, + "name": "Blackcliff Warbow", + "rarity": 4, + "typeId": 5, + "baseAttack": 44, + "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Warbow.png" + }, + { + "id": 61, + "name": "Prototype Crescent", + "rarity": 4, + "typeId": 5, + "baseAttack": 44, + "effect": "On hit, Normal or Charged Attacks have a 50% chance to deal an additional 240% ATK DMG to enemies within a small AoE. Can only occur once every 15s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Crescent.png" + }, + { + "id": 62, + "name": "Favonius Warbow", + "rarity": 4, + "typeId": 5, + "baseAttack": 42, + "effect": "CRIT hits have a 60% chance to generate a small amount of Elemental Particles, which will regenerate 6 Energy for the character. Can only occur once every 12s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Warbow.png" + }, + { + "id": 63, + "name": "Messenger", + "rarity": 3, + "typeId": 5, + "baseAttack": 40, + "effect": "Normal Attack hits increase Elemental Skill and Elemental Burst DMG by 20% for 6s. Likewise, Elemental Skill or Elemental Burst hits increase Normal Attack DMG by 20% for 6s.", + "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Messenger.png" } ] \ No newline at end of file diff --git a/migrations/20240708121828-create-user.js b/migrations/20240708134935-create-user.js similarity index 100% rename from migrations/20240708121828-create-user.js rename to migrations/20240708134935-create-user.js diff --git a/migrations/20240708134948-create-type.js b/migrations/20240708134948-create-type.js new file mode 100644 index 0000000..d54ab2b --- /dev/null +++ b/migrations/20240708134948-create-type.js @@ -0,0 +1,28 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Types', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Types'); + } +}; \ No newline at end of file diff --git a/migrations/20240708134959-create-weapon.js b/migrations/20240708134959-create-weapon.js new file mode 100644 index 0000000..9b1f1ba --- /dev/null +++ b/migrations/20240708134959-create-weapon.js @@ -0,0 +1,47 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Weapons', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + rarity: { + type: Sequelize.INTEGER + }, + TypeId: { + type: Sequelize.INTEGER, + references: { + model: 'Type', + key: 'id' + } + }, + baseAttack: { + type: Sequelize.INTEGER + }, + effect: { + type: Sequelize.STRING + }, + imgUrl: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Weapons'); + } +}; \ No newline at end of file diff --git a/migrations/20240708135032-create-party.js b/migrations/20240708135032-create-party.js new file mode 100644 index 0000000..60aa649 --- /dev/null +++ b/migrations/20240708135032-create-party.js @@ -0,0 +1,42 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Parties', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + UserId: { + type: Sequelize.INTEGER, + references: { + model: 'User', + key: 'id' + } + }, + CharacterId: { + type: Sequelize.INTEGER, + references: { + model: 'Character', + key: 'id' + } + }, + WeaponId: { + type: Sequelize.INTEGER + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Parties'); + } +}; \ No newline at end of file diff --git a/models/party.js b/models/party.js new file mode 100644 index 0000000..b039757 --- /dev/null +++ b/models/party.js @@ -0,0 +1,25 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Party extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + Party.init({ + UserId: DataTypes.INTEGER, + CharacterId: DataTypes.INTEGER, + WeaponId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'Party', + }); + return Party; +}; \ No newline at end of file diff --git a/models/type.js b/models/type.js new file mode 100644 index 0000000..5bbe690 --- /dev/null +++ b/models/type.js @@ -0,0 +1,23 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Type extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + Type.init({ + name: DataTypes.STRING + }, { + sequelize, + modelName: 'Type', + }); + return Type; +}; \ No newline at end of file diff --git a/models/weapon.js b/models/weapon.js new file mode 100644 index 0000000..ed70f64 --- /dev/null +++ b/models/weapon.js @@ -0,0 +1,28 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Weapon extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + Weapon.init({ + name: DataTypes.STRING, + rarity: DataTypes.INTEGER, + TypeId: DataTypes.INTEGER, + baseAttack: DataTypes.INTEGER, + effect: DataTypes.STRING, + imgUrl: DataTypes.STRING + }, { + sequelize, + modelName: 'Weapon', + }); + return Weapon; +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2e97fd0..503313e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,110 @@ { - "name": "IP-RMT50", + "name": "ip-rmt50", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "ip-rmt50", + "version": "1.0.0", + "license": "ISC", "dependencies": { "bcrypt": "^5.1.1", "express": "^4.19.2", "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", - "sequelize": "^6.37.3" + "sequelize": "^6.37.3", + "sequelize-cli": "^6.6.2" + }, + "devDependencies": {} + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/@mapbox/node-pre-gyp": { @@ -31,6 +126,20 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -114,6 +223,20 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -137,6 +260,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -155,6 +286,11 @@ "node": ">= 10.0.0" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -226,6 +362,47 @@ "node": ">=10" } }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -234,11 +411,28 @@ "color-support": "bin.js" } }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -276,6 +470,31 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -335,6 +554,11 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -343,6 +567,45 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -380,11 +643,81 @@ "node": ">= 0.4" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -393,6 +726,15 @@ "node": ">= 0.6" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/express": { "version": "4.19.2", "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", @@ -434,6 +776,14 @@ "node": ">= 0.10.0" } }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -451,6 +801,32 @@ "node": ">= 0.8" } }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -467,6 +843,20 @@ "node": ">= 0.6" } }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -522,6 +912,14 @@ "node": ">=10" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -571,6 +969,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -702,6 +1105,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -710,6 +1118,20 @@ "node": ">= 0.10" } }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -718,6 +1140,146 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.1.tgz", + "integrity": "sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", + "integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.3.3", + "js-cookie": "^3.0.5", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.3.tgz", + "integrity": "sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==", + "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" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/js-beautify/node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -803,6 +1365,22 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "node_modules/lru-cache": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.0.tgz", + "integrity": "sha512-bfJaPTuEiTYBu+ulDaeQ0F+uLmlfFkMgXj4cbwfuMSjgObGMzb55FMMbDvbRU0fAHZ4sLGkz2mKwcMg8Dvm8Ww==", + "engines": { + "node": ">=18" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -833,6 +1411,24 @@ "node": ">= 0.6" } }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -961,6 +1557,11 @@ "node": ">= 0.6" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", @@ -1049,6 +1650,11 @@ "wrappy": "1" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1065,6 +1671,34 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -1186,6 +1820,11 @@ "node": ">=0.10.0" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1247,6 +1886,30 @@ "node": ">= 6" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", @@ -1391,6 +2054,27 @@ } } }, + "node_modules/sequelize-cli": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.6.2.tgz", + "integrity": "sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==", + "dependencies": { + "cli-color": "^2.0.3", + "fs-extra": "^9.1.0", + "js-beautify": "^1.14.5", + "lodash": "^4.17.21", + "resolve": "^1.22.1", + "umzug": "^2.3.0", + "yargs": "^16.2.0" + }, + "bin": { + "sequelize": "lib/sequelize", + "sequelize-cli": "lib/sequelize" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sequelize-pool": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", @@ -1460,6 +2144,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -1519,6 +2222,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1530,6 +2247,29 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -1546,6 +2286,18 @@ "node": ">=10" } }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1564,6 +2316,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1576,11 +2333,30 @@ "node": ">= 0.6" } }, + "node_modules/umzug": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", + "integrity": "sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==", + "dependencies": { + "bluebird": "^3.7.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1640,6 +2416,20 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -1656,6 +2446,39 @@ "@types/node": "*" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -1669,10 +2492,43 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } } } } diff --git a/package.json b/package.json index 8460521..0d5b7bc 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,13 @@ "express": "^4.19.2", "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", - "sequelize": "^6.37.3" + "sequelize": "^6.37.3", + "sequelize-cli": "^6.6.2" }, "name": "ip-rmt50", "description": "", "version": "1.0.0", "main": "index.js", - "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, From 7d284e24bda501d1375e190713992275218fa267 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Mon, 8 Jul 2024 21:28:32 +0700 Subject: [PATCH 04/22] docs: add docs --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b657ee..03e6daa 100644 --- a/README.md +++ b/README.md @@ -1 +1,11 @@ -# IP-RMT50 \ No newline at end of file +# IP-RMT50 + +# Genshin API Documentation + +## Endpoints + +List of available endpoints: +- `GET /character` +- `GET /weapon` + +### 1. GET /character \ No newline at end of file From 0b424dfeeae32c5aaf87962979e9042ec929e8e8 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Tue, 9 Jul 2024 14:08:01 +0700 Subject: [PATCH 05/22] chore: table relation --- data/user.json | 16 ++++++ helpers/bcrypt.js | 12 +++++ ...-user.js => 20240708134903-create-user.js} | 4 ++ migrations/20240708134904-create-character.js | 40 ++++++++++++++ migrations/20240708134959-create-weapon.js | 2 +- migrations/20240708135032-create-party.js | 10 ++-- models/character.js | 27 ++++++++++ models/party.js | 2 + models/type.js | 1 + models/user.js | 54 +++++++++++++++++-- models/weapon.js | 1 + seeders/20240709041808-user-seed.js | 39 ++++++++++++++ seeders/20240709041809-type-seed.js | 36 +++++++++++++ seeders/20240709041832-weapon-seed.js | 36 +++++++++++++ 14 files changed, 273 insertions(+), 7 deletions(-) create mode 100644 data/user.json create mode 100644 helpers/bcrypt.js rename migrations/{20240708134935-create-user.js => 20240708134903-create-user.js} (90%) create mode 100644 migrations/20240708134904-create-character.js create mode 100644 models/character.js create mode 100644 seeders/20240709041808-user-seed.js create mode 100644 seeders/20240709041809-type-seed.js create mode 100644 seeders/20240709041832-weapon-seed.js diff --git a/data/user.json b/data/user.json new file mode 100644 index 0000000..368cb16 --- /dev/null +++ b/data/user.json @@ -0,0 +1,16 @@ +[ + { + "id": 1, + "name": "User 1", + "email": "user1@mail.com", + "role": "Admin", + "password": "user1" + }, + { + "id": 2, + "name": "User 2", + "email": "user2@mail.com", + "role": "Staff", + "password": "user2" + } +] \ No newline at end of file diff --git a/helpers/bcrypt.js b/helpers/bcrypt.js new file mode 100644 index 0000000..5dc2ac4 --- /dev/null +++ b/helpers/bcrypt.js @@ -0,0 +1,12 @@ +const bcrypt = require('bcrypt'); + +const hashPassword = (password) => { + const salt = bcrypt.genSaltSync(10); + return bcrypt.hashSync(password, salt) +} + +const comparePassword = (password, hashPassword) => { + return bcrypt.compareSync(password, hashPassword) +} + +module.exports = { hashPassword, comparePassword } \ No newline at end of file diff --git a/migrations/20240708134935-create-user.js b/migrations/20240708134903-create-user.js similarity index 90% rename from migrations/20240708134935-create-user.js rename to migrations/20240708134903-create-user.js index 6c14d47..e340c4f 100644 --- a/migrations/20240708134935-create-user.js +++ b/migrations/20240708134903-create-user.js @@ -13,6 +13,10 @@ module.exports = { type: Sequelize.STRING }, email: { + type: Sequelize.STRING, + unique: true + }, + role: { type: Sequelize.STRING }, password: { diff --git a/migrations/20240708134904-create-character.js b/migrations/20240708134904-create-character.js new file mode 100644 index 0000000..63c16a5 --- /dev/null +++ b/migrations/20240708134904-create-character.js @@ -0,0 +1,40 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Characters', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + rarity: { + type: Sequelize.STRING + }, + weapon: { + type: Sequelize.STRING + }, + vision: { + type: Sequelize.STRING + }, + wiki_url: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Characters'); + } +}; \ No newline at end of file diff --git a/migrations/20240708134959-create-weapon.js b/migrations/20240708134959-create-weapon.js index 9b1f1ba..ca5a5cb 100644 --- a/migrations/20240708134959-create-weapon.js +++ b/migrations/20240708134959-create-weapon.js @@ -18,7 +18,7 @@ module.exports = { TypeId: { type: Sequelize.INTEGER, references: { - model: 'Type', + model: 'Types', key: 'id' } }, diff --git a/migrations/20240708135032-create-party.js b/migrations/20240708135032-create-party.js index 60aa649..626d264 100644 --- a/migrations/20240708135032-create-party.js +++ b/migrations/20240708135032-create-party.js @@ -12,19 +12,23 @@ module.exports = { UserId: { type: Sequelize.INTEGER, references: { - model: 'User', + model: 'Users', key: 'id' } }, CharacterId: { type: Sequelize.INTEGER, references: { - model: 'Character', + model: 'Characters', key: 'id' } }, WeaponId: { - type: Sequelize.INTEGER + type: Sequelize.INTEGER, + references: { + model: `Weapons`, + key: 'id' + } }, createdAt: { allowNull: false, diff --git a/models/character.js b/models/character.js new file mode 100644 index 0000000..987cf93 --- /dev/null +++ b/models/character.js @@ -0,0 +1,27 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Character extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + Character.init({ + name: DataTypes.STRING, + rarity: DataTypes.STRING, + weapon: DataTypes.STRING, + vision: DataTypes.STRING, + wiki_url: DataTypes.STRING + }, { + sequelize, + modelName: 'Character', + }); + return Character; +}; \ No newline at end of file diff --git a/models/party.js b/models/party.js index b039757..e3241a9 100644 --- a/models/party.js +++ b/models/party.js @@ -11,6 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Party.hasMany(models.Character, { foreignKey: { CharacterId } }) + Party.hasMany(models.Weapon, { foreignKey: { WeaponId } }) } } Party.init({ diff --git a/models/type.js b/models/type.js index 5bbe690..66ea8aa 100644 --- a/models/type.js +++ b/models/type.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Type.hasMany(models.Weapon) } } Type.init({ diff --git a/models/user.js b/models/user.js index bb728a9..6ce4a48 100644 --- a/models/user.js +++ b/models/user.js @@ -14,9 +14,57 @@ module.exports = (sequelize, DataTypes) => { } } User.init({ - name: DataTypes.STRING, - email: DataTypes.STRING, - password: DataTypes.STRING + name: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: `Name is required` + }, + notNull: { + args: true, + msg: `Name is required` + } + } + }, + email: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: `Email is required` + }, + notNull: { + args: true, + msg: `Email is required` + } + }, + unique: { + args: true, + msg: `Email already exists` + } + }, + role: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: `Staff` + }, + password: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: { + args: true, + msg: `Password is required` + }, + notNull: { + args: true, + msg: `Password is required` + } + } + } }, { sequelize, modelName: 'User', diff --git a/models/weapon.js b/models/weapon.js index ed70f64..125b70a 100644 --- a/models/weapon.js +++ b/models/weapon.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Weapon.belongsTo(models.Type) } } Weapon.init({ diff --git a/seeders/20240709041808-user-seed.js b/seeders/20240709041808-user-seed.js new file mode 100644 index 0000000..443f534 --- /dev/null +++ b/seeders/20240709041808-user-seed.js @@ -0,0 +1,39 @@ +'use strict'; + +const { hashPassword } = require('../helpers/bcrypt'); + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + const data = require('../data/user.json').map((e) => { + delete e.id; + e.createdAt = e.updatedAt = new Date(); + e.password = hashPassword(e.password) + return e + }) + await queryInterface.bulkInsert('Users', data, {}) + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + }, + + async down(queryInterface, Sequelize) { + await queryInterface.bulkDelete('Users', null, { + truncate: true, + restartIdentity: true, + cascade: true + }) + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; diff --git a/seeders/20240709041809-type-seed.js b/seeders/20240709041809-type-seed.js new file mode 100644 index 0000000..0b89bc4 --- /dev/null +++ b/seeders/20240709041809-type-seed.js @@ -0,0 +1,36 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + const data = require('../data/type.json').map((e) => { + delete e.id; + e.createdAt = e.updatedAt = new Date(); + return e + }); + await queryInterface.bulkInsert('Types', data, {}) + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + }, + + async down(queryInterface, Sequelize) { + await queryInterface.bulkDelete('Types', null, { + truncate: true, + restartIdentity: true, + cascade: true + }) + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; diff --git a/seeders/20240709041832-weapon-seed.js b/seeders/20240709041832-weapon-seed.js new file mode 100644 index 0000000..5cf040e --- /dev/null +++ b/seeders/20240709041832-weapon-seed.js @@ -0,0 +1,36 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + const data = require('../data/').map((e) => { + delete e.id; + e.createdAt = e.updatedAt = new Date(); + return e + }); + await queryInterface.bulkInsert('Weapons', data, {}) + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + }, + + async down(queryInterface, Sequelize) { + await queryInterface.bulkDelete('Weapons', null, { + truncate: true, + restartIdentity: true, + cascade: true + }) + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + } +}; From 06acd19e0c25de0d589c70056399648b4084958d Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Tue, 9 Jul 2024 14:13:06 +0700 Subject: [PATCH 06/22] done setup --- data/weapon.json | 128 +++++++++++++------------- seeders/20240709041832-weapon-seed.js | 2 +- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/data/weapon.json b/data/weapon.json index e238e01..1185e5c 100644 --- a/data/weapon.json +++ b/data/weapon.json @@ -3,7 +3,7 @@ "id": 1, "name": "Aquila Favonia", "rarity": 5, - "typeId": 1, + "TypeId": 1, "baseAttack": 48, "effect": "Increases ATK by 20%. On hit, attacks against opponents with less than 30% HP increase all party members' ATK by 40% for 12s. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Aquila_Favonia.png" @@ -12,7 +12,7 @@ "id": 2, "name": "Skyward Blade", "rarity": 5, - "typeId": 1, + "TypeId": 1, "baseAttack": 46, "effect": "CRIT Rate increased by 4%. Gains Skypiercing Might upon using an Elemental Burst: Increases Movement SPD by 10%, increases ATK SPD by 10%, and increases the DMG of Normal and Charged Attack hits by 20% for 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Blade.png" @@ -21,7 +21,7 @@ "id": 3, "name": "Primordial Jade Cutter", "rarity": 5, - "typeId": 1, + "TypeId": 1, "baseAttack": 44, "effect": "HP increased by 20%. Additionally, provides an ATK Bonus based on 1.2% of the wielder's Max HP.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Primordial_Jade_Cutter.png" @@ -30,7 +30,7 @@ "id": 4, "name": "Summit Shaper", "rarity": 5, - "typeId": 1, + "TypeId": 1, "baseAttack": 46, "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Summit_Shaper.png" @@ -39,7 +39,7 @@ "id": 5, "name": "The Black Sword", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 42, "effect": "Increases DMG dealt by Normal and Charged Attacks by 20%. Additionally, regenerates 60% of ATK as HP when Normal and Charged Attacks score a CRIT Hit. This effect can occur once every 5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Black_Sword.png" @@ -48,7 +48,7 @@ "id": 6, "name": "Prototype Rancour", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 44, "effect": "On hit, Normal or Charged Attacks increase ATK and DEF by 4% for 6s. Max 4 stacks. This effect can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Rancour.png" @@ -57,7 +57,7 @@ "id": 7, "name": "Lion's Roar", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 42, "effect": "Increases DMG against enemies affected by Pyro or Electro by 20%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lion's_Roar.png" @@ -66,7 +66,7 @@ "id": 8, "name": "The Alley Flash", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 44, "effect": "Increases DMG dealt by the character equipping this weapon by 12%. Taking DMG disables this effect for 5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Alley_Flash.png" @@ -75,7 +75,7 @@ "id": 9, "name": "Favonius Sword", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 41, "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Sword.png" @@ -84,7 +84,7 @@ "id": 10, "name": "Royal Longsword", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 42, "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Longsword.png" @@ -93,7 +93,7 @@ "id": 11, "name": "Sacrificial Sword", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 41, "effect": "After damaging an opponent with an Elemental Skill, the skill has a 40% chance to end its own CD. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Sacrificial_Sword.png" @@ -102,7 +102,7 @@ "id": 12, "name": "Iron Sting", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 42, "effect": "Dealing Elemental DMG increases all DMG by 6% for 6s. Max 2 stacks. Can only occur once every 1s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Iron_Sting.png" @@ -111,7 +111,7 @@ "id": 13, "name": "The Flute", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 42, "effect": "Normal or Charged Attacks grant a Harmonic on hits. Gaining 5 Harmonics triggers the power of music and deals 100% ATK DMG to surrounding enemies. Harmonics last up to 30s, and a maximum of 1 can be gained every 0.5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Flute.png" @@ -120,7 +120,7 @@ "id": 14, "name": "Sword of Descension", "rarity": 4, - "typeId": 1, + "TypeId": 1, "baseAttack": 39, "effect": "Every 4s a character is on the field, they will deal 6% more DMG and take 3% more DMG. This effect has a maximum of 5 stacks and will not be reset if the character leaves the field, but will be reduced by 1 stack when the character takes DMG.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Flute.png" @@ -129,7 +129,7 @@ "id": 15, "name": "Lithic Spear", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 42, "effect": "For every character in the party who hails from Liyue, the character who equips this weapon gains 7% ATK increase and 3% CRIT Rate increase. This effect stacks up to 4 times.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lithic_Spear.png" @@ -138,7 +138,7 @@ "id": 16, "name": "Blackcliff Pole", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 42, "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Pole.png" @@ -147,7 +147,7 @@ "id": 17, "name": "Royal Spear", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 44, "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Spear.png" @@ -156,7 +156,7 @@ "id": 18, "name": "Prototype Grudge", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 42, "effect": "After using an Elemental Skill, increases Normal and Charged Attack DMG by 8% for 12s. Max 2 stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Starglitter.png" @@ -165,7 +165,7 @@ "id": 19, "name": "Favonius Lance", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 44, "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Lance.png" @@ -174,7 +174,7 @@ "id": 20, "name": "Deathmatch", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 41, "effect": "If there are at least 2 enemies nearby, ATK is increased by 16% and DEF is increased by 16%. If there are fewer than 2 enemies nearby, ATK is increased by 24%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Deathmatch.png" @@ -183,7 +183,7 @@ "id": 21, "name": "Halberd", "rarity": 3, - "typeId": 2, + "TypeId": 2, "baseAttack": 40, "effect": "Normal Attacks deal an additional 160% DMG. Can only occur once every 10s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Halberd.png" @@ -192,7 +192,7 @@ "id": 22, "name": "White Tassel", "rarity": 3, - "typeId": 2, + "TypeId": 2, "baseAttack": 39, "effect": "Increases Normal Attack DMG by 24%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/White_Tassel.png" @@ -201,7 +201,7 @@ "id": 23, "name": "Black Tassel", "rarity": 3, - "typeId": 2, + "TypeId": 2, "baseAttack": 38, "effect": "Increases DMG against slimes by 40%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Black_Tassel.png" @@ -210,7 +210,7 @@ "id": 24, "name": "Crescent Pike", "rarity": 4, - "typeId": 2, + "TypeId": 2, "baseAttack": 44, "effect": "After picking up an Elemental Orb/Particle, Normal and Charged Attacks deal an additional 20% ATK DMG for 5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Crescent_Pike.png" @@ -219,7 +219,7 @@ "id": 25, "name": "Blackcliff Pole", "rarity": 3, - "typeId": 2, + "TypeId": 2, "baseAttack": 38, "effect": "After defeating an opponent, ATK is increased by 6% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Pole.png" @@ -228,7 +228,7 @@ "id": 26, "name": "Wolf's Gravestone", "rarity": 5, - "typeId": 3, + "TypeId": 3, "baseAttack": 46, "effect": "Increases ATK by 20%. On hit, attacks against enemies with less than 30% HP increase all party members' ATK by 40% for 12s. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Wolf's_Gravestone.png" @@ -237,7 +237,7 @@ "id": 27, "name": "Skyward Pride", "rarity": 5, - "typeId": 3, + "TypeId": 3, "baseAttack": 48, "effect": "Increases all DMG by 8%. After using an Elemental Burst, Normal or Charged Attack, on hit, creates a vacuum blade that deals 80% of ATK as DMG to enemies along its path. Lasts for 20s or 8 vacuum blades.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Pride.png" @@ -246,7 +246,7 @@ "id": 28, "name": "The Unforged", "rarity": 5, - "typeId": 3, + "TypeId": 3, "baseAttack": 46, "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Unforged.png" @@ -255,7 +255,7 @@ "id": 29, "name": "Serpent Spine", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 42, "effect": "Every 4s a character is on the field, they will deal 6% more DMG and take 3% more DMG. This effect has a maximum of 5 stacks and will not be reset if the character leaves the field, but will be reduced by 1 stack when the character takes DMG.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Serpent_Spine.png" @@ -264,7 +264,7 @@ "id": 30, "name": "The Bell", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 42, "effect": "Taking DMG generates a shield that absorbs DMG up to 20% of Max HP. This shield lasts for 10s or until broken, and can only be triggered once every 45s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Bell.png" @@ -273,7 +273,7 @@ "id": 31, "name": "Whiteblind", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 42, "effect": "On hit, Normal or Charged Attacks increase ATK and DEF by 6% for 6s. Max 4 stacks. This effect can only occur once every 0.5s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Whiteblind.png" @@ -282,7 +282,7 @@ "id": 32, "name": "Rainslasher", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 42, "effect": "Increases DMG against enemies affected by Hydro or Electro by 20%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Rainslasher.png" @@ -291,7 +291,7 @@ "id": 33, "name": "Lithic Blade", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 44, "effect": "For every character in the party who hails from Liyue, the character who equips this weapon gains 7% ATK increase and 3% CRIT Rate increase. This effect stacks up to 4 times.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lithic_Blade.png" @@ -300,7 +300,7 @@ "id": 34, "name": "Blackcliff Slasher", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 44, "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Slasher.png" @@ -309,7 +309,7 @@ "id": 35, "name": "Snow-Tombed Starsilver", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 42, "effect": "Hitting an enemy with Normal and Charged Attacks has a 60% chance of forming and dropping an Everfrost Icicle above them, dealing 80% AoE ATK DMG. Enemies affected by Cryo are dealt 200% ATK DMG instead by the icicle. Can only occur once every 10s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Snow-Tombed_Starsilver.png" @@ -318,7 +318,7 @@ "id": 36, "name": "Royal Greatsword", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 44, "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Greatsword.png" @@ -327,7 +327,7 @@ "id": 37, "name": "Sacrificial Greatsword", "rarity": 4, - "typeId": 3, + "TypeId": 3, "baseAttack": 44, "effect": "After damaging an opponent with an Elemental Skill, the skill has a 40% chance to end its own CD. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Sacrificial_Greatsword.png" @@ -336,7 +336,7 @@ "id": 38, "name": "White Iron Greatsword", "rarity": 3, - "typeId": 3, + "TypeId": 3, "baseAttack": 39, "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/White_Iron_Greatsword.png" @@ -345,7 +345,7 @@ "id": 39, "name": "Lost Prayer to the Sacred Winds", "rarity": 5, - "typeId": 4, + "TypeId": 4, "baseAttack": 46, "effect": "Increases Movement SPD by 10%. When in battle, gain an 8% Elemental DMG Bonus every 4s. Max 4 stacks. Lasts until the character falls or leaves combat.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Lost_Prayer_to_the_Sacred_Winds.png" @@ -354,7 +354,7 @@ "id": 40, "name": "Skyward Atlas", "rarity": 5, - "typeId": 4, + "TypeId": 4, "baseAttack": 48, "effect": "Increases Elemental DMG Bonus by 12%. Normal Attack hits have a 50% chance to earn the favor of the clouds. which actively seek out nearby enemies to attack for 15s, dealing 160% ATK DMG. Can only occur once every 30s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Atlas.png" @@ -363,7 +363,7 @@ "id": 41, "name": "Memory of Dust", "rarity": 5, - "typeId": 4, + "TypeId": 4, "baseAttack": 46, "effect": "Increases Shield Strength by 20%. Scoring hits on opponents increases ATK by 4% for 8s. Max 5 stacks. Can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Memory_of_Dust.png" @@ -372,7 +372,7 @@ "id": 42, "name": "Widsith", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "When a character takes the field, they will gain a random theme song for 10s. This can only occur once every 30s. Recitative: ATK is increased by 60%. Aria: Increases all Elemental DMG by 48%. Interlude: Elemental Mastery is increased by 240.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Widsith.png" @@ -381,7 +381,7 @@ "id": 43, "name": "Eye of Perception", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "Normal and Charged Attacks have a 50% chance to fire a Bolt of Perception, dealing 240% ATK as DMG. This bolt can bounce between enemies a maximum of 4 times. This effect can occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Eye_of_Perception.png" @@ -390,7 +390,7 @@ "id": 44, "name": "Solar Pearl", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "Normal Attack hits increase Elemental Skill and Elemental Burst DMG by 20% for 6s. Likewise, Elemental Skill or Elemental Burst hits increase Normal Attack DMG by 20% for 6s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Solar_Pearl.png" @@ -399,7 +399,7 @@ "id": 45, "name": "Frostbearer", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "Hitting an enemy with Normal and Charged Attacks has a 60% chance of forming and dropping an Everfrost Icicle above them, dealing 80% AoE ATK DMG. Enemies affected by Cryo are dealt 200% ATK DMG instead by the icicle. Can only occur once every 10s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Frostbearer.png" @@ -408,7 +408,7 @@ "id": 46, "name": "Mappa Mare", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 44, "effect": "Triggering an Elemental reaction grants a 8% Elemental DMG Bonus for 10s. Max 2 stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Mappa_Mare.png" @@ -417,7 +417,7 @@ "id": 47, "name": "The Widsith", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "When a character takes the field, they will gain a random theme song for 10s. This can only occur once every 30s. Recitative: ATK is increased by 60%. Aria: Increases all Elemental DMG by 48%. Interlude: Elemental Mastery is increased by 240.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Widsith.png" @@ -426,7 +426,7 @@ "id": 48, "name": "Prototype Amber", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "Using an Elemental Burst regenerates 4 Energy every 2s for 6s. All party members will regenerate 4% HP every 2s for this duration.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Amber.png" @@ -435,7 +435,7 @@ "id": 49, "name": "Blackcliff Agate", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 44, "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Agate.png" @@ -444,7 +444,7 @@ "id": 50, "name": "Favonius Codex", "rarity": 4, - "typeId": 4, + "TypeId": 4, "baseAttack": 42, "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Codex.png" @@ -453,7 +453,7 @@ "id": 51, "name": "Magic Guide", "rarity": 3, - "typeId": 4, + "TypeId": 4, "baseAttack": 38, "effect": "Increases DMG against slimes by 40%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Magic_Guide.png" @@ -462,7 +462,7 @@ "id": 51, "name": "Amos' Bow", "rarity": 5, - "typeId": 5, + "TypeId": 5, "baseAttack": 46, "effect": "Increases Normal and Charged Attack DMG by 12%. After using an Elemental Skill, increases Normal and Charged Attack DMG by 8% for 12s. Max 2 stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Amos'_Bow.png" @@ -471,7 +471,7 @@ "id": 52, "name": "Skyward Harp", "rarity": 5, - "typeId": 5, + "TypeId": 5, "baseAttack": 48, "effect": "Increases CRIT DMG by 20%. Hits have a 60% chance to inflict a small AoE attack, dealing 125% Physical ATK DMG. Can only occur once every 4s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Skyward_Harp.png" @@ -480,7 +480,7 @@ "id": 53, "name": "The Viridescent Hunt", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "Upon hit, Normal and Aimed Shot have a 50% chance to generate a Cyclone, which will continuously attract surrounding enemies, dealing 40% of ATK as DMG to these enemies every 0.5s for 4s. This effect can only occur once every 14s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Viridescent_Hunt.png" @@ -489,7 +489,7 @@ "id": 54, "name": "Prototype Crescent", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "Charged Attack hits on weak points increase Movement SPD by 10% and ATK by 36% for 10s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Crescent.png" @@ -498,7 +498,7 @@ "id": 55, "name": "The Stringless", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "Increases Elemental Skill and Elemental Burst DMG by 24%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/The_Stringless.png" @@ -507,7 +507,7 @@ "id": 56, "name": "Royal Bow", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "Upon damaging an opponent, increases CRIT Rate by 8%. Max 5 stacks. A CRIT hit removes all stacks.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Royal_Bow.png" @@ -516,7 +516,7 @@ "id": 57, "name": "Favonius Warbow", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "CRIT hits have a 60% chance to generate 1 Elemental Orb, which will regenerate 6 Energy for the character. Can only occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Warbow.png" @@ -525,7 +525,7 @@ "id": 58, "name": "Rust", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "Increases Normal Attack DMG by 40% but decreases Aimed Shot DMG by 10%.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Rust.png" @@ -534,7 +534,7 @@ "id": 59, "name": "Compound Bow", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 41, "effect": "Normal Attack and Aimed Shot hits increase ATK by 4% and Normal ATK SPD by 1.2% for 6s. Max 4 stacks. Can only occur once every 0.3s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Compound_Bow.png" @@ -543,7 +543,7 @@ "id": 60, "name": "Blackcliff Warbow", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 44, "effect": "After defeating an opponent, ATK is increased by 12% for 30s. This effect has a maximum of 3 stacks, and the duration of each stack is independent of the others.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Blackcliff_Warbow.png" @@ -552,7 +552,7 @@ "id": 61, "name": "Prototype Crescent", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 44, "effect": "On hit, Normal or Charged Attacks have a 50% chance to deal an additional 240% ATK DMG to enemies within a small AoE. Can only occur once every 15s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Prototype_Crescent.png" @@ -561,7 +561,7 @@ "id": 62, "name": "Favonius Warbow", "rarity": 4, - "typeId": 5, + "TypeId": 5, "baseAttack": 42, "effect": "CRIT hits have a 60% chance to generate a small amount of Elemental Particles, which will regenerate 6 Energy for the character. Can only occur once every 12s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Favonius_Warbow.png" @@ -570,7 +570,7 @@ "id": 63, "name": "Messenger", "rarity": 3, - "typeId": 5, + "TypeId": 5, "baseAttack": 40, "effect": "Normal Attack hits increase Elemental Skill and Elemental Burst DMG by 20% for 6s. Likewise, Elemental Skill or Elemental Burst hits increase Normal Attack DMG by 20% for 6s.", "imgUrl": "https://rerollcdn.com/GENSHIN/Weapons/Messenger.png" diff --git a/seeders/20240709041832-weapon-seed.js b/seeders/20240709041832-weapon-seed.js index 5cf040e..5f7042f 100644 --- a/seeders/20240709041832-weapon-seed.js +++ b/seeders/20240709041832-weapon-seed.js @@ -3,7 +3,7 @@ /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { - const data = require('../data/').map((e) => { + const data = require('../data/weapon.json').map((e) => { delete e.id; e.createdAt = e.updatedAt = new Date(); return e From 897437b3868e060087cc7273710c3ad2979cb1a4 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Tue, 9 Jul 2024 23:04:12 +0700 Subject: [PATCH 07/22] feat: login and register --- .gitignore | 3 +- app.js | 23 ++++ controllers/PartyController.js | 30 ++++++ controllers/PublicConroller.js | 25 +++++ controllers/UserController.js | 38 +++++++ helpers/authentication.js | 30 ++++++ helpers/jwt.js | 12 +++ middlewares/errorHandler.js | 35 ++++++ ...-user.js => 20240709082145-create-user.js} | 0 ....js => 20240709082154-create-character.js} | 0 ...-type.js => 20240709082156-create-type.js} | 0 ...pon.js => 20240709082204-create-weapon.js} | 4 +- ...arty.js => 20240709082234-create-party.js} | 11 +- models/party.js | 36 ++++++- models/type.js | 1 - models/user.js | 10 +- models/weapon.js | 1 - package-lock.json | 100 +++++++++++++++++- package.json | 3 + routes/index.js | 16 +++ seeders/20240709041808-user-seed.js | 15 --- seeders/20240709041809-character-seed.js | 13 +++ ...pe-seed.js => 20240709041810-type-seed.js} | 15 --- seeders/20240709041832-weapon-seed.js | 15 --- 24 files changed, 367 insertions(+), 69 deletions(-) create mode 100644 app.js create mode 100644 controllers/PartyController.js create mode 100644 controllers/PublicConroller.js create mode 100644 controllers/UserController.js create mode 100644 helpers/authentication.js create mode 100644 helpers/jwt.js create mode 100644 middlewares/errorHandler.js rename migrations/{20240708134903-create-user.js => 20240709082145-create-user.js} (100%) rename migrations/{20240708134904-create-character.js => 20240709082154-create-character.js} (100%) rename migrations/{20240708134948-create-type.js => 20240709082156-create-type.js} (100%) rename migrations/{20240708134959-create-weapon.js => 20240709082204-create-weapon.js} (95%) rename migrations/{20240708135032-create-party.js => 20240709082234-create-party.js} (87%) create mode 100644 routes/index.js create mode 100644 seeders/20240709041809-character-seed.js rename seeders/{20240709041809-type-seed.js => 20240709041810-type-seed.js} (60%) diff --git a/.gitignore b/.gitignore index b512c09..1dcef2d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +.env \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..024d281 --- /dev/null +++ b/app.js @@ -0,0 +1,23 @@ +require('dotenv').config() +const express = require('express') +const app = express() +const port = 3000 +const routes = require('./routes') +const errorHandler = require('./middlewares/errorHandler') + +app.use(express.urlencoded({ extended: true })) +app.use(express.json()) + + +app.get('/', (req, res) => { + res.send('Hello World!') +}) + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) + +app.use(routes) +app.use(errorHandler) + +module.exports = app \ No newline at end of file diff --git a/controllers/PartyController.js b/controllers/PartyController.js new file mode 100644 index 0000000..ec8c29c --- /dev/null +++ b/controllers/PartyController.js @@ -0,0 +1,30 @@ +const { Party } = require('../models'); + +module.exports = { + async getParty(req, res, next) { + try { + const party = await Party.findAll({ + where: { UserId: req.user.id } + }); + res.status(200).json({ party }); + } catch (err) { + next(err); + }; + }, + + async createParty(req, res, next) { + try { + console.log(req.user.id) + const party = await Party.create({ + UserId: req.user.id, + CharacterId: +(req.body.CharacterId), + WeaponId: +(req.body.WeaponId) + }); + console.log(party, '<<<<') + // res.status(201).json({ party }) + } catch (err) { + console.log(err) + next(err); + }; + } +} \ No newline at end of file diff --git a/controllers/PublicConroller.js b/controllers/PublicConroller.js new file mode 100644 index 0000000..f5c09e1 --- /dev/null +++ b/controllers/PublicConroller.js @@ -0,0 +1,25 @@ +const { Weapon } = require('../models'); + +module.exports = { + async getWeapons(req, res, next) { + try { + const data = await Weapon.findAll(); + res.status(200).json({ data }); + } catch (err) { + next(err); + }; + }, + + async getWeaponById(req, res, next) { + try { + const { id } = req.params + const data = await Weapon.findByPk(id); + if (!data) { + throw ({ name: `404`, id: id }) + } + res.status(200).json({ data }) + } catch (err) { + next(err); + }; + } +} \ No newline at end of file diff --git a/controllers/UserController.js b/controllers/UserController.js new file mode 100644 index 0000000..f38ca42 --- /dev/null +++ b/controllers/UserController.js @@ -0,0 +1,38 @@ +const { comparePassword } = require('../helpers/bcrypt'); +const { signToken } = require('../helpers/jwt'); +const { User } = require('../models'); + +module.exports = { + async register(req, res, next) { + try { + const user = await User.create(req.body); + res.status(201).json({ id: user.id, email: user.email }); + } catch (err) { + next(err); + }; + }, + + async login(req, res, next) { + try { + const { email, password } = req.body; + if (!email) { + throw ({ name: `email req` }); + }; + if (!password) { + throw ({ name: `pass req` }); + }; + const user = await User.findOne({ where: { email } }); + if (!user) { + throw ({ name: `email false` }) + }; + const checkToken = comparePassword(password, user.password); + if (!checkToken) { + throw ({ name: `pass fail` }) + }; + const token = signToken({ id: user.id }) + res.status(200).json({ access_token: token }) + } catch (err) { + next(err); + }; + } +} \ No newline at end of file diff --git a/helpers/authentication.js b/helpers/authentication.js new file mode 100644 index 0000000..d0a3fb0 --- /dev/null +++ b/helpers/authentication.js @@ -0,0 +1,30 @@ +const { verifyToken } = require("./jwt"); +const { User } = require('../models'); + +module.exports = { + async authentication(req, res, next) { + try { + let access_token = req.headers.authorization; + if (!access_token) { + throw ({ name: `Unauthenticated` }); + } + let [bearer, token] = access_token.split(' '); + if (bearer !== `Bearer`) { + throw ({ name: `Unauthenticated` }); + }; + let { id } = verifyToken(token); + let user = await User.findByPk(id); + if (!user) { + throw ({ name: `Unauthenticated` }); + }; + req.user = { + id: user.id, + role: user.role + }; + next(); + } catch (err) { + console.log(err) + next(err) + } + } +} \ No newline at end of file diff --git a/helpers/jwt.js b/helpers/jwt.js new file mode 100644 index 0000000..b9f5744 --- /dev/null +++ b/helpers/jwt.js @@ -0,0 +1,12 @@ +const { sign, verify } = require('jsonwebtoken') +const secret = process.env.SECRET_KEY; + +module.exports = { + signToken(payload) { + return sign(payload, secret) + }, + + verifyToken(token) { + return verify(token, secret) + } +} \ No newline at end of file diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js new file mode 100644 index 0000000..24f7f67 --- /dev/null +++ b/middlewares/errorHandler.js @@ -0,0 +1,35 @@ +function errorHandler(err, req, res, next) { + let status = err.status || 500; + let message = err.message || `Internal Server Error` + + switch (err.name) { + case `SequelizeValidationError`: + status = 400 + message = err.errors[0].message + break; + case `email req`: + status = 401 + message = `Email is required` + break; + case `pass req`: + status = 401 + message = `Password is required` + break; + case `email false`: + status = 401 + message = `Email is wrong` + break; + case `pass false`: + status = 401 + message = `Password is wrong` + break; + case `Unauthenticated`: + case `JsonWebTokenError`: + status = 404 + message = `Unauthenticated` + break; + } + res.status(status).json({ message: message }) +} + +module.exports = errorHandler \ No newline at end of file diff --git a/migrations/20240708134903-create-user.js b/migrations/20240709082145-create-user.js similarity index 100% rename from migrations/20240708134903-create-user.js rename to migrations/20240709082145-create-user.js diff --git a/migrations/20240708134904-create-character.js b/migrations/20240709082154-create-character.js similarity index 100% rename from migrations/20240708134904-create-character.js rename to migrations/20240709082154-create-character.js diff --git a/migrations/20240708134948-create-type.js b/migrations/20240709082156-create-type.js similarity index 100% rename from migrations/20240708134948-create-type.js rename to migrations/20240709082156-create-type.js diff --git a/migrations/20240708134959-create-weapon.js b/migrations/20240709082204-create-weapon.js similarity index 95% rename from migrations/20240708134959-create-weapon.js rename to migrations/20240709082204-create-weapon.js index ca5a5cb..0a77bdd 100644 --- a/migrations/20240708134959-create-weapon.js +++ b/migrations/20240709082204-create-weapon.js @@ -18,8 +18,8 @@ module.exports = { TypeId: { type: Sequelize.INTEGER, references: { - model: 'Types', - key: 'id' + model: `Types`, + key: `id` } }, baseAttack: { diff --git a/migrations/20240708135032-create-party.js b/migrations/20240709082234-create-party.js similarity index 87% rename from migrations/20240708135032-create-party.js rename to migrations/20240709082234-create-party.js index 626d264..6bdb3bc 100644 --- a/migrations/20240708135032-create-party.js +++ b/migrations/20240709082234-create-party.js @@ -12,22 +12,23 @@ module.exports = { UserId: { type: Sequelize.INTEGER, references: { - model: 'Users', - key: 'id' + model: `Users`, + key: `id` } }, CharacterId: { type: Sequelize.INTEGER, references: { - model: 'Characters', - key: 'id' + model: `Characters`, + key: `id` } + }, WeaponId: { type: Sequelize.INTEGER, references: { model: `Weapons`, - key: 'id' + key: `id` } }, createdAt: { diff --git a/models/party.js b/models/party.js index e3241a9..0f6f6e9 100644 --- a/models/party.js +++ b/models/party.js @@ -11,14 +11,40 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Party.hasMany(models.Character, { foreignKey: { CharacterId } }) - Party.hasMany(models.Weapon, { foreignKey: { WeaponId } }) } } Party.init({ - UserId: DataTypes.INTEGER, - CharacterId: DataTypes.INTEGER, - WeaponId: DataTypes.INTEGER + UserId: { + type: DataTypes.INTEGER + }, + CharacterId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notNull: { + args: true, + msg: `CharacterId is required` + }, + notEmpty: { + args: true, + msg: `CharacterId is required` + } + } + }, + WeaponId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notNull: { + args: true, + msg: `WeaponId is required` + }, + notEmpty: { + args: true, + msg: `WeaponId is required` + } + } + } }, { sequelize, modelName: 'Party', diff --git a/models/type.js b/models/type.js index 66ea8aa..5bbe690 100644 --- a/models/type.js +++ b/models/type.js @@ -11,7 +11,6 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Type.hasMany(models.Weapon) } } Type.init({ diff --git a/models/user.js b/models/user.js index 6ce4a48..1a52285 100644 --- a/models/user.js +++ b/models/user.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + User.hasMany(models.Party, { foreignKey: `` }) } } User.init({ @@ -34,28 +35,23 @@ module.exports = (sequelize, DataTypes) => { validate: { notEmpty: { args: true, - msg: `Email is required` + msg: `Email cannot be empty` }, notNull: { args: true, msg: `Email is required` } - }, - unique: { - args: true, - msg: `Email already exists` } }, role: { type: DataTypes.STRING, - allowNull: false, defaultValue: `Staff` }, password: { type: DataTypes.STRING, allowNull: false, validate: { - notNull: { + notEmpty: { args: true, msg: `Password is required` }, diff --git a/models/weapon.js b/models/weapon.js index 125b70a..ed70f64 100644 --- a/models/weapon.js +++ b/models/weapon.js @@ -11,7 +11,6 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Weapon.belongsTo(models.Type) } } Weapon.init({ diff --git a/package-lock.json b/package-lock.json index 503313e..212b0c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,16 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "axios": "^1.7.2", "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.4.5", "express": "^4.19.2", "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", "sequelize": "^6.37.3", "sequelize-cli": "^6.6.2" - }, - "devDependencies": {} + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -260,6 +262,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -268,6 +275,16 @@ "node": ">= 4.0.0" } }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -411,6 +428,17 @@ "color-support": "bin.js" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -470,6 +498,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -519,6 +559,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -549,6 +597,17 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dottie": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", @@ -801,6 +860,25 @@ "node": ">= 0.8" } }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", @@ -827,6 +905,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1837,6 +1928,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", diff --git a/package.json b/package.json index 0d5b7bc..2415803 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { "dependencies": { + "axios": "^1.7.2", "bcrypt": "^5.1.1", + "cors": "^2.8.5", + "dotenv": "^16.4.5", "express": "^4.19.2", "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..2b4f812 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,16 @@ +const { getParty, createParty } = require('../controllers/PartyController'); +const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); +const { register, login } = require('../controllers/UserController'); +const { authentication } = require('../helpers/authentication'); +const router = require('express').Router() + +router.get('/pub/weapons', getWeapons); +router.get('/pub/weapons/:id', getWeaponById); +router.post('/register', register); +router.post('/login', login); + +router.use(authentication); +router.get('/party', getParty); +router.post('/party', createParty); + +module.exports = router \ No newline at end of file diff --git a/seeders/20240709041808-user-seed.js b/seeders/20240709041808-user-seed.js index 443f534..7f66c88 100644 --- a/seeders/20240709041808-user-seed.js +++ b/seeders/20240709041808-user-seed.js @@ -12,15 +12,6 @@ module.exports = { return e }) await queryInterface.bulkInsert('Users', data, {}) - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ }, async down(queryInterface, Sequelize) { @@ -29,11 +20,5 @@ module.exports = { restartIdentity: true, cascade: true }) - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ } }; diff --git a/seeders/20240709041809-character-seed.js b/seeders/20240709041809-character-seed.js new file mode 100644 index 0000000..22356f1 --- /dev/null +++ b/seeders/20240709041809-character-seed.js @@ -0,0 +1,13 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + const axios = require('axios'); + + }, + + async down(queryInterface, Sequelize) { + + } +}; diff --git a/seeders/20240709041809-type-seed.js b/seeders/20240709041810-type-seed.js similarity index 60% rename from seeders/20240709041809-type-seed.js rename to seeders/20240709041810-type-seed.js index 0b89bc4..cf60011 100644 --- a/seeders/20240709041809-type-seed.js +++ b/seeders/20240709041810-type-seed.js @@ -9,15 +9,6 @@ module.exports = { return e }); await queryInterface.bulkInsert('Types', data, {}) - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ }, async down(queryInterface, Sequelize) { @@ -26,11 +17,5 @@ module.exports = { restartIdentity: true, cascade: true }) - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ } }; diff --git a/seeders/20240709041832-weapon-seed.js b/seeders/20240709041832-weapon-seed.js index 5f7042f..876913c 100644 --- a/seeders/20240709041832-weapon-seed.js +++ b/seeders/20240709041832-weapon-seed.js @@ -9,15 +9,6 @@ module.exports = { return e }); await queryInterface.bulkInsert('Weapons', data, {}) - /** - * Add seed commands here. - * - * Example: - * await queryInterface.bulkInsert('People', [{ - * name: 'John Doe', - * isBetaMember: false - * }], {}); - */ }, async down(queryInterface, Sequelize) { @@ -26,11 +17,5 @@ module.exports = { restartIdentity: true, cascade: true }) - /** - * Add commands to revert seed here. - * - * Example: - * await queryInterface.bulkDelete('People', null, {}); - */ } }; From 21cb34089f5c5df83bccceb2b5e5851bf58803fc Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Tue, 9 Jul 2024 23:53:36 +0700 Subject: [PATCH 08/22] chore: seeding from API --- seeders/20240709041809-character-seed.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/seeders/20240709041809-character-seed.js b/seeders/20240709041809-character-seed.js index 22356f1..39a42ef 100644 --- a/seeders/20240709041809-character-seed.js +++ b/seeders/20240709041809-character-seed.js @@ -5,9 +5,28 @@ module.exports = { async up(queryInterface, Sequelize) { const axios = require('axios'); + const options = { + method: `GET`, + url: `https://gsi.fly.dev/characters/?page=1&limit=51` + }; + try { + const response = await axios.request(options) + response.data.results.map((e) => { + e.createdAt = e.updatedAt = new Date(); + return e + }) + await queryInterface.bulkInsert('Characters', response.data.results) + // console.log(response.data.results) + } catch (err) { + console.error(err) + } }, async down(queryInterface, Sequelize) { - + await queryInterface.bulkDelete("Characters", null, { + truncate: true, + restartIdentity: true, + cascade: true + }); } }; From fba84e938f033baa279a2d17525efd263ad969f9 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Wed, 10 Jul 2024 12:29:07 +0700 Subject: [PATCH 09/22] chore: adding create & delete --- ERD.png | Bin 0 -> 52149 bytes controllers/PartyController.js | 57 ++++++++++++--- middlewares/errorHandler.js | 16 +++++ migrations/20240710031332-create-party.js | 32 +++++++++ ...party.js => 20240710031333-create-team.js} | 9 ++- models/party.js | 34 +-------- models/team.js | 65 ++++++++++++++++++ models/type.js | 2 +- models/user.js | 2 +- routes/index.js | 4 +- seeders/20240709041809-character-seed.js | 5 +- 11 files changed, 173 insertions(+), 53 deletions(-) create mode 100644 ERD.png create mode 100644 migrations/20240710031332-create-party.js rename migrations/{20240709082234-create-party.js => 20240710031333-create-team.js} (85%) create mode 100644 models/team.js diff --git a/ERD.png b/ERD.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7d7f3a8a63e625b6ef78f0cba315338a8e1d45 GIT binary patch literal 52149 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 literal 0 HcmV?d00001 diff --git a/controllers/PartyController.js b/controllers/PartyController.js index ec8c29c..55f1de1 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -1,10 +1,12 @@ -const { Party } = require('../models'); +const { Party, Team } = require('../models'); module.exports = { async getParty(req, res, next) { try { const party = await Party.findAll({ - where: { UserId: req.user.id } + where: { UserId: req.user.id }, + attributes: { exclude: ['createdAt', 'updatedAt'] }, + include: [{ model: Team, attributes: { exclude: ['id', 'PartyId', 'createdAt', 'updatedAt'] } }] }); res.status(200).json({ party }); } catch (err) { @@ -14,17 +16,52 @@ module.exports = { async createParty(req, res, next) { try { - console.log(req.user.id) - const party = await Party.create({ - UserId: req.user.id, - CharacterId: +(req.body.CharacterId), - WeaponId: +(req.body.WeaponId) + const checking = await Party.findAll({ where: { UserId: req.user.id } }) + if (checking.length > 4) { + throw ({ name: `Party Full` }); + }; + const party = await Party.create({ UserId: req.user.id }); + res.status(201).json({ party }); + } catch (err) { + console.log(err) + next(err); + }; + }, + + async deleteParty(req, res, next) { + const { id } = req.params; + try { + const party = await Party.findByPk(id, { include: Team }); + if (!party) { + throw ({ name: `delete 404`, id }); + }; + if (party.Teams.length > 0) { + throw ({ name: `cannot delete` }) + }; + await party.destroy(); + res.status(200).json({ message: `Party with id ${party.id} has been deleted` }); + } catch (err) { + console.log(err); + next(err); + } + }, + + async createTeam(req, res, next) { + const { id } = req.params + try { + const checking = await Team.findAll({ where: { PartyId: id } }); + if (checking.length > 4) { + throw ({ name: `Team Full` }) + }; + const team = await Team.create({ + ...req.body, PartyId: id }); - console.log(party, '<<<<') - // res.status(201).json({ party }) + res.status(201).json({ team }); } catch (err) { console.log(err) next(err); }; - } + }, + + } \ No newline at end of file diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js index 24f7f67..8548652 100644 --- a/middlewares/errorHandler.js +++ b/middlewares/errorHandler.js @@ -28,6 +28,22 @@ function errorHandler(err, req, res, next) { status = 404 message = `Unauthenticated` break; + case `Party Full`: + status = 404 + message = `Your party is full` + break; + case `Team Full`: + status = 404 + message = `Your team can only have 4 Character` + break; + case `delete 404`: + status = 404 + message = `Party with id ${err.id} not found` + break; + case `cannot delete`: + status = 404 + message = `Cannot delete party that has teams` + break; } res.status(status).json({ message: message }) } diff --git a/migrations/20240710031332-create-party.js b/migrations/20240710031332-create-party.js new file mode 100644 index 0000000..934ad60 --- /dev/null +++ b/migrations/20240710031332-create-party.js @@ -0,0 +1,32 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Parties', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + UserId: { + type: Sequelize.INTEGER, + references: { + model: 'Users', + key: `id` + } + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Parties'); + } +}; \ No newline at end of file diff --git a/migrations/20240709082234-create-party.js b/migrations/20240710031333-create-team.js similarity index 85% rename from migrations/20240709082234-create-party.js rename to migrations/20240710031333-create-team.js index 6bdb3bc..53338ac 100644 --- a/migrations/20240709082234-create-party.js +++ b/migrations/20240710031333-create-team.js @@ -2,17 +2,17 @@ /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { - await queryInterface.createTable('Parties', { + await queryInterface.createTable('Teams', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, - UserId: { + PartyId: { type: Sequelize.INTEGER, references: { - model: `Users`, + model: `Parties`, key: `id` } }, @@ -22,7 +22,6 @@ module.exports = { model: `Characters`, key: `id` } - }, WeaponId: { type: Sequelize.INTEGER, @@ -42,6 +41,6 @@ module.exports = { }); }, async down(queryInterface, Sequelize) { - await queryInterface.dropTable('Parties'); + await queryInterface.dropTable('Teams'); } }; \ No newline at end of file diff --git a/models/party.js b/models/party.js index 0f6f6e9..2e84cdd 100644 --- a/models/party.js +++ b/models/party.js @@ -10,41 +10,11 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - // define association here + Party.hasMany(models.Team) } } Party.init({ - UserId: { - type: DataTypes.INTEGER - }, - CharacterId: { - type: DataTypes.INTEGER, - allowNull: false, - validate: { - notNull: { - args: true, - msg: `CharacterId is required` - }, - notEmpty: { - args: true, - msg: `CharacterId is required` - } - } - }, - WeaponId: { - type: DataTypes.INTEGER, - allowNull: false, - validate: { - notNull: { - args: true, - msg: `WeaponId is required` - }, - notEmpty: { - args: true, - msg: `WeaponId is required` - } - } - } + UserId: DataTypes.INTEGER }, { sequelize, modelName: 'Party', diff --git a/models/team.js b/models/team.js new file mode 100644 index 0000000..5b3bea7 --- /dev/null +++ b/models/team.js @@ -0,0 +1,65 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Team extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + Team.hasMany(models.Character) + Team.belongsTo(models.Party, { foreignKey: `PartyId` }) + } + } + Team.init({ + PartyId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: `Party Id cannot be empty` + }, + notNull: { + args: true, + msg: `Party Id is required` + } + } + }, + CharacterId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: `Character Id cannot be empty` + }, + notNull: { + args: true, + msg: `Character Id is required` + } + } + }, + WeaponId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: `Weapon Id cannot be empty` + }, + notNull: { + args: true, + msg: `Weapon Id is required` + } + } + } + }, { + sequelize, + modelName: 'Team', + }); + return Team; +}; \ No newline at end of file diff --git a/models/type.js b/models/type.js index 5bbe690..5134ec5 100644 --- a/models/type.js +++ b/models/type.js @@ -10,7 +10,7 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - // define association here + Type.hasMany(models.Weapon) } } Type.init({ diff --git a/models/user.js b/models/user.js index 1a52285..27d6349 100644 --- a/models/user.js +++ b/models/user.js @@ -11,7 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - User.hasMany(models.Party, { foreignKey: `` }) + User.hasOne(models.Party) } } User.init({ diff --git a/routes/index.js b/routes/index.js index 2b4f812..9aa1312 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,4 +1,4 @@ -const { getParty, createParty } = require('../controllers/PartyController'); +const { getParty, createParty, createTeam, updateParty, deleteParty } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); const { register, login } = require('../controllers/UserController'); const { authentication } = require('../helpers/authentication'); @@ -12,5 +12,7 @@ router.post('/login', login); router.use(authentication); router.get('/party', getParty); router.post('/party', createParty); +router.delete('/party/:id', deleteParty); +router.post('/party/:id/team', createTeam); module.exports = router \ No newline at end of file diff --git a/seeders/20240709041809-character-seed.js b/seeders/20240709041809-character-seed.js index 39a42ef..4680722 100644 --- a/seeders/20240709041809-character-seed.js +++ b/seeders/20240709041809-character-seed.js @@ -15,10 +15,9 @@ module.exports = { e.createdAt = e.updatedAt = new Date(); return e }) - await queryInterface.bulkInsert('Characters', response.data.results) - // console.log(response.data.results) + await queryInterface.bulkInsert('Characters', response.data.results); } catch (err) { - console.error(err) + console.error(err); } }, From 4b5443271a07bced29e3a40eec79dee97649b7b3 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Wed, 10 Jul 2024 13:55:43 +0700 Subject: [PATCH 10/22] chore: add update --- controllers/PartyController.js | 16 ++++++++++++---- routes/index.js | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/controllers/PartyController.js b/controllers/PartyController.js index 55f1de1..7f8320c 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -23,7 +23,6 @@ module.exports = { const party = await Party.create({ UserId: req.user.id }); res.status(201).json({ party }); } catch (err) { - console.log(err) next(err); }; }, @@ -41,7 +40,6 @@ module.exports = { await party.destroy(); res.status(200).json({ message: `Party with id ${party.id} has been deleted` }); } catch (err) { - console.log(err); next(err); } }, @@ -58,10 +56,20 @@ module.exports = { }); res.status(201).json({ team }); } catch (err) { - console.log(err) next(err); }; }, - + async updateTeam(req, res, next) { + const { CharacterId, WeaponId } = req.body; + const { teamId } = req.params; + try { + const team = await Team.findByPk(teamId); + await team.update({ CharacterId, WeaponId }) + res.status(200).json({ team }) + } catch (err) { + console.log(err); + next(err); + }; + } } \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index 9aa1312..a29558a 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,4 +1,4 @@ -const { getParty, createParty, createTeam, updateParty, deleteParty } = require('../controllers/PartyController'); +const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); const { register, login } = require('../controllers/UserController'); const { authentication } = require('../helpers/authentication'); @@ -14,5 +14,6 @@ router.get('/party', getParty); router.post('/party', createParty); router.delete('/party/:id', deleteParty); router.post('/party/:id/team', createTeam); +router.put('/party/:id/team/:teamId', updateTeam); module.exports = router \ No newline at end of file From 4515286cfec4ef455ed4f5b68dff3a98ab4a7c93 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Wed, 10 Jul 2024 15:16:54 +0700 Subject: [PATCH 11/22] chore: add middlewares --- controllers/PartyController.js | 15 +++++++--- {helpers => middlewares}/authentication.js | 2 +- middlewares/authorization.js | 34 ++++++++++++++++++++++ middlewares/errorHandler.js | 10 +++++-- routes/index.js | 10 +++++-- 5 files changed, 60 insertions(+), 11 deletions(-) rename {helpers => middlewares}/authentication.js (94%) create mode 100644 middlewares/authorization.js diff --git a/controllers/PartyController.js b/controllers/PartyController.js index 7f8320c..01e9d96 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -31,9 +31,6 @@ module.exports = { const { id } = req.params; try { const party = await Party.findByPk(id, { include: Team }); - if (!party) { - throw ({ name: `delete 404`, id }); - }; if (party.Teams.length > 0) { throw ({ name: `cannot delete` }) }; @@ -68,7 +65,17 @@ module.exports = { await team.update({ CharacterId, WeaponId }) res.status(200).json({ team }) } catch (err) { - console.log(err); + next(err); + }; + }, + + async deleteTeam(req, res, next) { + const { teamId } = req.params; + try { + const team = await Team.findByPk(teamId); + team.destroy(); + res.status(200).json({ message: `Team with id ${team.id} has been deleted` }) + } catch (err) { next(err); }; } diff --git a/helpers/authentication.js b/middlewares/authentication.js similarity index 94% rename from helpers/authentication.js rename to middlewares/authentication.js index d0a3fb0..3bc5dc2 100644 --- a/helpers/authentication.js +++ b/middlewares/authentication.js @@ -1,4 +1,4 @@ -const { verifyToken } = require("./jwt"); +const { verifyToken } = require("../helpers/jwt"); const { User } = require('../models'); module.exports = { diff --git a/middlewares/authorization.js b/middlewares/authorization.js new file mode 100644 index 0000000..74fb6d6 --- /dev/null +++ b/middlewares/authorization.js @@ -0,0 +1,34 @@ +const { Party, Team } = require('../models'); + + +module.exports = { + async authorization(req, res, next) { + const id = req.params.id + try { + const party = await Party.findByPk(id, { include: Team }); + console.log(party) + if (!party) { + throw ({ name: `delete 404`, id }); + }; + if (req.user.role === `Staff`) { + if (party.UserId !== req.user.id) { + throw ({ name: `Forbidden` }) + } + } + next(); + } catch (err) { + next(err); + }; + }, + + async isAdmin(req, res, next) { + try { + if (req.user.role !== 'Admin') { + throw ({ name: `Forbidden` }) + } + next(); + } catch (err) { + next(err) + } + } +} \ No newline at end of file diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js index 8548652..5b94622 100644 --- a/middlewares/errorHandler.js +++ b/middlewares/errorHandler.js @@ -29,11 +29,11 @@ function errorHandler(err, req, res, next) { message = `Unauthenticated` break; case `Party Full`: - status = 404 + status = 400 message = `Your party is full` break; case `Team Full`: - status = 404 + status = 400 message = `Your team can only have 4 Character` break; case `delete 404`: @@ -41,9 +41,13 @@ function errorHandler(err, req, res, next) { message = `Party with id ${err.id} not found` break; case `cannot delete`: - status = 404 + status = 400 message = `Cannot delete party that has teams` break; + case `Forbidden`: + status = 404 + message = `You are not authorized` + break; } res.status(status).json({ message: message }) } diff --git a/routes/index.js b/routes/index.js index a29558a..9fa5148 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,19 +1,23 @@ const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); const { register, login } = require('../controllers/UserController'); -const { authentication } = require('../helpers/authentication'); +const { authentication } = require('../middlewares/authentication'); +const { authorization, isAdmin } = require('../middlewares/authorization'); const router = require('express').Router() router.get('/pub/weapons', getWeapons); router.get('/pub/weapons/:id', getWeaponById); -router.post('/register', register); router.post('/login', login); + router.use(authentication); + +router.post('/register', isAdmin, register); router.get('/party', getParty); router.post('/party', createParty); -router.delete('/party/:id', deleteParty); +router.delete('/party/:id', authorization, deleteParty); router.post('/party/:id/team', createTeam); router.put('/party/:id/team/:teamId', updateTeam); +router.delete('/party/:id/team/:teamId', deleteParty); module.exports = router \ No newline at end of file From cd451764d28952300e4b879144c741f50a535240 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Wed, 10 Jul 2024 22:48:06 +0700 Subject: [PATCH 12/22] test: add testing --- __test__/party.test.js | 211 + __test__/public.test.js | 56 + __test__/user.test.js | 185 + app.js | 30 +- bin/www | 6 + config/config.json | 9 +- controllers/PartyController.js | 4 +- coverage.png | Bin 0 -> 92626 bytes coverage/clover.xml | 317 ++ coverage/coverage-final.json | 18 + coverage/lcov-report/IP-RMT50/app.js.html | 133 + .../controllers/PartyController.js.html | 328 ++ .../controllers/PublicConroller.js.html | 157 + .../controllers/UserController.js.html | 196 + .../IP-RMT50/controllers/index.html | 146 + .../IP-RMT50/helpers/bcrypt.js.html | 118 + .../lcov-report/IP-RMT50/helpers/index.html | 131 + .../lcov-report/IP-RMT50/helpers/jwt.js.html | 118 + coverage/lcov-report/IP-RMT50/index.html | 116 + .../middlewares/authentication.js.html | 169 + .../middlewares/authorization.js.html | 181 + .../IP-RMT50/middlewares/errorHandler.js.html | 247 + .../IP-RMT50/middlewares/index.html | 146 + .../IP-RMT50/models/character.js.html | 163 + .../lcov-report/IP-RMT50/models/index.html | 206 + .../lcov-report/IP-RMT50/models/index.js.html | 214 + .../lcov-report/IP-RMT50/models/party.js.html | 151 + .../lcov-report/IP-RMT50/models/team.js.html | 277 + .../lcov-report/IP-RMT50/models/type.js.html | 151 + .../lcov-report/IP-RMT50/models/user.js.html | 289 + .../IP-RMT50/models/weapon.js.html | 166 + .../lcov-report/IP-RMT50/routes/index.html | 116 + .../lcov-report/IP-RMT50/routes/index.js.html | 151 + coverage/lcov-report/base.css | 224 + coverage/lcov-report/block-navigation.js | 87 + coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes coverage/lcov-report/index.html | 191 + coverage/lcov-report/prettify.css | 1 + coverage/lcov-report/prettify.js | 2 + coverage/lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/lcov-report/sorter.js | 196 + coverage/lcov.info | 519 ++ data/party.json | 30 + data/team.json | 38 + middlewares/authentication.js | 1 - middlewares/authorization.js | 1 - middlewares/errorHandler.js | 4 +- models/user.js | 4 +- package-lock.json | 4945 ++++++++++++++--- package.json | 11 +- routes/index.js | 4 +- 51 files changed, 10270 insertions(+), 894 deletions(-) create mode 100644 __test__/party.test.js create mode 100644 __test__/public.test.js create mode 100644 __test__/user.test.js create mode 100644 bin/www create mode 100644 coverage.png create mode 100644 coverage/clover.xml create mode 100644 coverage/coverage-final.json create mode 100644 coverage/lcov-report/IP-RMT50/app.js.html create mode 100644 coverage/lcov-report/IP-RMT50/controllers/PartyController.js.html create mode 100644 coverage/lcov-report/IP-RMT50/controllers/PublicConroller.js.html create mode 100644 coverage/lcov-report/IP-RMT50/controllers/UserController.js.html create mode 100644 coverage/lcov-report/IP-RMT50/controllers/index.html create mode 100644 coverage/lcov-report/IP-RMT50/helpers/bcrypt.js.html create mode 100644 coverage/lcov-report/IP-RMT50/helpers/index.html create mode 100644 coverage/lcov-report/IP-RMT50/helpers/jwt.js.html create mode 100644 coverage/lcov-report/IP-RMT50/index.html create mode 100644 coverage/lcov-report/IP-RMT50/middlewares/authentication.js.html create mode 100644 coverage/lcov-report/IP-RMT50/middlewares/authorization.js.html create mode 100644 coverage/lcov-report/IP-RMT50/middlewares/errorHandler.js.html create mode 100644 coverage/lcov-report/IP-RMT50/middlewares/index.html create mode 100644 coverage/lcov-report/IP-RMT50/models/character.js.html create mode 100644 coverage/lcov-report/IP-RMT50/models/index.html create mode 100644 coverage/lcov-report/IP-RMT50/models/index.js.html create mode 100644 coverage/lcov-report/IP-RMT50/models/party.js.html create mode 100644 coverage/lcov-report/IP-RMT50/models/team.js.html create mode 100644 coverage/lcov-report/IP-RMT50/models/type.js.html create mode 100644 coverage/lcov-report/IP-RMT50/models/user.js.html create mode 100644 coverage/lcov-report/IP-RMT50/models/weapon.js.html create mode 100644 coverage/lcov-report/IP-RMT50/routes/index.html create mode 100644 coverage/lcov-report/IP-RMT50/routes/index.js.html create mode 100644 coverage/lcov-report/base.css create mode 100644 coverage/lcov-report/block-navigation.js create mode 100644 coverage/lcov-report/favicon.png create mode 100644 coverage/lcov-report/index.html create mode 100644 coverage/lcov-report/prettify.css create mode 100644 coverage/lcov-report/prettify.js create mode 100644 coverage/lcov-report/sort-arrow-sprite.png create mode 100644 coverage/lcov-report/sorter.js create mode 100644 coverage/lcov.info create mode 100644 data/party.json create mode 100644 data/team.json diff --git a/__test__/party.test.js b/__test__/party.test.js new file mode 100644 index 0000000..dda67c1 --- /dev/null +++ b/__test__/party.test.js @@ -0,0 +1,211 @@ +const request = require('supertest'); +const app = require('../app'); +const { sequelize, User } = require('../models'); +const { hashPassword } = require('../helpers/bcrypt'); +const { signToken } = require('../helpers/jwt'); +const queryInterface = sequelize.queryInterface; + +let access_token = ''; +const party = { + UserId: 1 +} + +beforeAll(async () => { + const type = require('../data/type.json').map((e) => { + delete e.id + e.createdAt = e.updatedAt = new Date() + return e + }) + await queryInterface.bulkInsert('Types', type, {}) + + weapon = require('../data/weapon.json').map((e) => { + delete e.id + e.createdAt = e.updatedAt = new Date() + return e + }) + await queryInterface.bulkInsert('Weapons', weapon, {}) + + const data = require('../data/user.json').map((e) => { + delete e.id; + e.password = hashPassword(e.password); + e.createdAt = e.updatedAt = new Date(); + return e + }) + await queryInterface.bulkInsert(`Users`, data, {}) + + let user = await User.findOne({ where: { role: `Admin` } }); + access_token = signToken({ id: user.id }) + + await queryInterface.bulkInsert('Characters', [{ + id: 1, + name: "Amber", + rarity: "4_star", + weapon: "Bow", + vision: "Pyro", + wiki_url: "https://genshin-impact.fandom.com/wiki/Amber", + createdAt: new Date(), + updatedAt: new Date() + }], {}); + + const party = require('../data/party.json').map((e) => { + delete e.id + e.createdAt = e.updatedAt = new Date() + return e + }) + try { + + await queryInterface.bulkInsert('Parties', party, {}); + } catch (err) { + console.log(err) + } + + // const team = require('../data/team.json').map((e) => { + // delete e.id + // e.createdAt = e.updatedAt = new Date() + // return e + // }) + // await queryInterface.bulkInsert('Teams', team, {}); +}) + +describe('Party', () => { + describe('/party', () => { + test('should success show all party', async () => { + let { body, status } = await request(app) + .get('/party') + .set('Authorization', `Bearer ` + access_token) + expect(status).toBe(200) + expect(body).toHaveProperty('party') + }); + + test('should success create party', async () => { + let { body, status } = await request(app) + .post('/party') + .set('Authorization', `Bearer ` + access_token) + .send({ UserId: 2 }) + expect(status).toBe(201) + expect(body).toHaveProperty('party') + }); + + test('should success create team', async () => { + let { body, status } = await request(app) + .post('/party/1/team') + .set('Authorization', `Bearer ` + access_token) + .send({ CharacterId: 1, WeaponId: 1 }) + expect(status).toBe(201) + expect(body).toHaveProperty('team') + }); + + test('should fail delete party when party have teams', async () => { + let { body, status } = await request(app) + .delete('/party/1') + .set('Authorization', `Bearer ` + access_token) + expect(status).toBe(400) + expect(body).toHaveProperty('message', "Cannot delete party that has teams") + }); + + test('should fail created team when token is wrong', async () => { + let { body, status } = await request(app) + .post('/party/1/team') + .set('Authorization', `Bearer` + access_token) + .send({ + WeaponId: 1 + }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', "Unauthenticated") + }); + + test('should fail delete party when party not found', async () => { + let { body, status } = await request(app) + .delete('/party/11') + .set('Authorization', `Bearer ` + access_token) + expect(status).toBe(404) + expect(body).toHaveProperty('message', "Party with id 11 not found") + }); + + test('should fail delete party when token not found', async () => { + let { body, status } = await request(app) + .delete('/party/1') + .set('Authorization', `Bearer` + access_token) + expect(status).toBe(401) + expect(body).toHaveProperty('message', "Unauthenticated") + }); + + test('should failed create party because party is full', async () => { + let { body, status } = await request(app) + .post('/party') + .set('Authorization', `Bearer ` + access_token) + .send({ UserId: 1 }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', 'Your party is full') + }); + + test('should fail created team when Weapon is null/empty', async () => { + let { body, status } = await request(app) + .post('/party/1/team') + .set('Authorization', `Bearer ` + access_token) + .send({ + CharacterId: 1 + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', "Weapon Id is required") + }); + + test('should fail created team when Character is null/empty', async () => { + let { body, status } = await request(app) + .post('/party/1/team') + .set('Authorization', `Bearer ` + access_token) + .send({ + WeaponId: 1 + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', "Character Id is required") + }) + + test('should failed create party when token is wrong', async () => { + let { body, status } = await request(app) + .post('/party') + .set('Authorization', `Bearer` + `access_token`) + .send({ UserId: 1 }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', 'Unauthenticated') + }); + }) +}) + +afterAll(async () => { + await queryInterface.bulkDelete('Characters', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); + + await queryInterface.bulkDelete('Weapons', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); + + await queryInterface.bulkDelete('Types', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); + + await queryInterface.bulkDelete('Parties', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); + + await queryInterface.bulkDelete('Teams', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); + + await queryInterface.bulkDelete('Users', null, { + restartIdentity: true, + truncate: true, + cascade: true + }); +}); \ No newline at end of file diff --git a/__test__/public.test.js b/__test__/public.test.js new file mode 100644 index 0000000..9bf53ae --- /dev/null +++ b/__test__/public.test.js @@ -0,0 +1,56 @@ +const request = require('supertest'); +const app = require('../app'); +const { sequelize } = require('../models'); +const queryInterface = sequelize.queryInterface; + +let weapon = [] + +beforeAll(async () => { + const type = require('../data/type.json').map((e) => { + delete e.id + e.createdAt = e.updatedAt = new Date() + return e + }) + await queryInterface.bulkInsert('Types', type, {}) + + weapon = require('../data/weapon.json').map((e) => { + delete e.id + e.createdAt = e.updatedAt = new Date() + return e + }) + await queryInterface.bulkInsert('Weapons', weapon, {}) +}) + +describe('Pub', () => { + describe('/weapons', () => { + describe('Success', () => { + test(`should success show all weapon`, async () => { + let { status, body } = await request(app) + .get('/weapons') + expect(status).toBe(200) + expect(body).toHaveProperty('data') + }); + + test(`should success weapon by id`, async () => { + let { status, body } = await request(app) + .get('/weapons/2') + expect(status).toBe(200) + expect(body).toHaveProperty('data') + }); + }) + }) +}) + +afterAll(async () => { + await queryInterface.bulkDelete('Weapons', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); + + await queryInterface.bulkDelete('Types', null, { + truncate: true, + restartIdentity: true, + cascade: true + }); +}) \ No newline at end of file diff --git a/__test__/user.test.js b/__test__/user.test.js new file mode 100644 index 0000000..be568d3 --- /dev/null +++ b/__test__/user.test.js @@ -0,0 +1,185 @@ +const request = require('supertest'); +const app = require('../app'); +const { hashPassword } = require('../helpers/bcrypt'); +const { sequelize, User } = require('../models'); +const { signToken } = require('../helpers/jwt'); +const queryInterface = sequelize.queryInterface; + +const admin = { + email: `user1@mail.com`, + password: `user1` +}; + +const staff = { + email: `user2@mail.com`, + password: `user2` +}; + +const register = { + name: 'testing1', + email: 'testing1@mail.com', + role: `Staff`, + password: `testing1` +} + +let access_token = ``; + +beforeAll(async () => { + const data = require('../data/user.json').map((e) => { + delete e.id; + e.password = hashPassword(e.password); + e.createdAt = e.updatedAt = new Date(); + return e + }) + await queryInterface.bulkInsert(`Users`, data, {}) + + let user = await User.findOne({ where: { role: `Admin` } }); + access_token = signToken({ id: user.id }) +}); + +describe('User', () => { + describe('/register', () => { + describe('Success', () => { + test('should success register new user', async () => { + let { status, body } = await request(app) + .post('/register') + .set(`Authorization`, `Bearer ` + access_token) + .send(register) + expect(status).toBe(201) + expect(body).toHaveProperty(`id`, expect.any(Number)) + expect(body).toHaveProperty(`email`, register.email) + }); + }); + + describe('Failed', () => { + test('should fail when name is null', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer ' + access_token) + .send({ + email: `test1@mail.com`, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Name is required`) + }); + + test('should fail when name is null', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: ``, + email: `test1@mail.com`, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Name cannot be empty`) + }); + + test('should fail when email is null', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Email is required`) + }); + + test('should fail when email is empty', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + email: ``, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Email cannot be empty`) + }); + + test('should fail when password is null/empty', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + email: `test1@mail.com` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Password is required`) + }); + + test('should fail when password is null/empty', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + email: `test1@mail.com`, + password: "" + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Password cannot be empty`) + }); + + test('should fail when token is invalid', async () => { + let { body, status } = await request(app) + .post('/register') + .set('Authorization', 'Bearer') + .send(register) + expect(status).toBe(401) + expect(body).toHaveProperty('message', `Unauthenticated`) + }); + }) + }) + + describe('/login', () => { + describe('Success', () => { + test('should success login', async () => { + let { body, status } = await request(app) + .post('/login') + .send({ + email: `user1@mail.com`, + password: `user1` + }) + expect(status).toBe(200) + expect(body).toHaveProperty('access_token') + }); + }); + + describe('Failed', () => { + test('should failed login when email is null', async () => { + let { body, status } = await request(app) + .post('/login') + .send({ + password: `user1` + }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', 'Email is required') + }); + + test('should failed login when password is null', async () => { + let { body, status } = await request(app) + .post('/login') + .send({ + email: `user1@mail.com` + }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', 'Password is required') + }); + }) + }) +}) + +afterAll(async () => { + await queryInterface.bulkDelete('Users', null, { + restartIdentity: true, + truncate: true, + cascade: true + }); +}); \ No newline at end of file diff --git a/app.js b/app.js index 024d281..8b9e697 100644 --- a/app.js +++ b/app.js @@ -1,23 +1,17 @@ -require('dotenv').config() -const express = require('express') -const app = express() -const port = 3000 -const routes = require('./routes') -const errorHandler = require('./middlewares/errorHandler') - -app.use(express.urlencoded({ extended: true })) -app.use(express.json()) +require('dotenv').config(); +const express = require('express'); +const app = express(); +const routes = require('./routes'); +const errorHandler = require('./middlewares/errorHandler'); +app.use(express.urlencoded({ extended: true })); +app.use(express.json()); app.get('/', (req, res) => { - res.send('Hello World!') -}) - -app.listen(port, () => { - console.log(`Example app listening on port ${port}`) -}) + res.send('Hello World!'); +}); -app.use(routes) -app.use(errorHandler) +app.use(routes); +app.use(errorHandler); -module.exports = app \ No newline at end of file +module.exports = app; \ No newline at end of file diff --git a/bin/www b/bin/www new file mode 100644 index 0000000..4b6ea0f --- /dev/null +++ b/bin/www @@ -0,0 +1,6 @@ +const app = require('../app'); +const port = 3000; + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) \ No newline at end of file diff --git a/config/config.json b/config/config.json index 4994120..ed79e97 100644 --- a/config/config.json +++ b/config/config.json @@ -7,11 +7,12 @@ "dialect": "postgres" }, "test": { - "username": "root", - "password": null, - "database": "database_test", + "username": "postgres", + "password": "postgres", + "database": "IP_test", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres", + "logging": false }, "production": { "username": "root", diff --git a/controllers/PartyController.js b/controllers/PartyController.js index 01e9d96..f9a3a16 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -16,8 +16,8 @@ module.exports = { async createParty(req, res, next) { try { - const checking = await Party.findAll({ where: { UserId: req.user.id } }) - if (checking.length > 4) { + const checking = await Party.findAll({ where: { UserId: req.user.id }, raw: true }) + if (checking.length > 3) { throw ({ name: `Party Full` }); }; const party = await Party.create({ UserId: req.user.id }); diff --git a/coverage.png b/coverage.png new file mode 100644 index 0000000000000000000000000000000000000000..1cce7b9ea3160bf667b0f9a3dc23a2e61d826555 GIT binary patch literal 92626 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 literal 0 HcmV?d00001 diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 0000000..38a3aef --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..5fcb76b --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,18 @@ +{"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\app.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":16},"end":{"line":2,"column":34}},"2":{"start":{"line":3,"column":12},"end":{"line":3,"column":21}},"3":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"4":{"start":{"line":5,"column":21},"end":{"line":5,"column":58}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":48}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"7":{"start":{"line":10,"column":0},"end":{"line":12,"column":3}},"8":{"start":{"line":11,"column":4},"end":{"line":11,"column":29}},"9":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"10":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"11":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":27},"end":{"line":12,"column":1}},"line":10}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":0,"9":3,"10":3,"11":3},"f":{"0":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"238d41e6dec06e1da54c04581acc2c5d81a8ca2b"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PartyController.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PartyController.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":44}},"1":{"start":{"line":3,"column":0},"end":{"line":82,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":14,"column":9}},"3":{"start":{"line":6,"column":26},"end":{"line":10,"column":14}},"4":{"start":{"line":11,"column":12},"end":{"line":11,"column":44}},"5":{"start":{"line":13,"column":12},"end":{"line":13,"column":22}},"6":{"start":{"line":18,"column":8},"end":{"line":27,"column":9}},"7":{"start":{"line":19,"column":29},"end":{"line":19,"column":95}},"8":{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},"9":{"start":{"line":21,"column":16},"end":{"line":21,"column":47}},"10":{"start":{"line":23,"column":26},"end":{"line":23,"column":69}},"11":{"start":{"line":24,"column":12},"end":{"line":24,"column":44}},"12":{"start":{"line":26,"column":12},"end":{"line":26,"column":22}},"13":{"start":{"line":31,"column":23},"end":{"line":31,"column":33}},"14":{"start":{"line":32,"column":8},"end":{"line":41,"column":9}},"15":{"start":{"line":33,"column":26},"end":{"line":33,"column":69}},"16":{"start":{"line":34,"column":12},"end":{"line":36,"column":13}},"17":{"start":{"line":35,"column":16},"end":{"line":35,"column":49}},"18":{"start":{"line":37,"column":12},"end":{"line":37,"column":34}},"19":{"start":{"line":38,"column":12},"end":{"line":38,"column":92}},"20":{"start":{"line":40,"column":12},"end":{"line":40,"column":22}},"21":{"start":{"line":45,"column":23},"end":{"line":45,"column":33}},"22":{"start":{"line":46,"column":8},"end":{"line":57,"column":9}},"23":{"start":{"line":47,"column":29},"end":{"line":47,"column":75}},"24":{"start":{"line":48,"column":12},"end":{"line":50,"column":13}},"25":{"start":{"line":49,"column":16},"end":{"line":49,"column":45}},"26":{"start":{"line":51,"column":25},"end":{"line":53,"column":14}},"27":{"start":{"line":54,"column":12},"end":{"line":54,"column":43}},"28":{"start":{"line":56,"column":12},"end":{"line":56,"column":22}},"29":{"start":{"line":61,"column":42},"end":{"line":61,"column":50}},"30":{"start":{"line":62,"column":27},"end":{"line":62,"column":37}},"31":{"start":{"line":63,"column":8},"end":{"line":69,"column":9}},"32":{"start":{"line":64,"column":25},"end":{"line":64,"column":52}},"33":{"start":{"line":65,"column":12},"end":{"line":65,"column":56}},"34":{"start":{"line":66,"column":12},"end":{"line":66,"column":42}},"35":{"start":{"line":68,"column":12},"end":{"line":68,"column":22}},"36":{"start":{"line":73,"column":27},"end":{"line":73,"column":37}},"37":{"start":{"line":74,"column":8},"end":{"line":80,"column":9}},"38":{"start":{"line":75,"column":25},"end":{"line":75,"column":52}},"39":{"start":{"line":76,"column":12},"end":{"line":76,"column":27}},"40":{"start":{"line":77,"column":12},"end":{"line":77,"column":89}},"41":{"start":{"line":79,"column":12},"end":{"line":79,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":35},"end":{"line":15,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":38},"end":{"line":28,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":5}},"loc":{"start":{"line":30,"column":38},"end":{"line":42,"column":5}},"line":30},"3":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":4},"end":{"line":44,"column":5}},"loc":{"start":{"line":44,"column":37},"end":{"line":58,"column":5}},"line":44},"4":{"name":"(anonymous_4)","decl":{"start":{"line":60,"column":4},"end":{"line":60,"column":5}},"loc":{"start":{"line":60,"column":37},"end":{"line":70,"column":5}},"line":60},"5":{"name":"(anonymous_5)","decl":{"start":{"line":72,"column":4},"end":{"line":72,"column":5}},"loc":{"start":{"line":72,"column":37},"end":{"line":81,"column":5}},"line":72}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},"type":"if","locations":[{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},{"start":{},"end":{}}],"line":20},"1":{"loc":{"start":{"line":34,"column":12},"end":{"line":36,"column":13}},"type":"if","locations":[{"start":{"line":34,"column":12},"end":{"line":36,"column":13}},{"start":{},"end":{}}],"line":34},"2":{"loc":{"start":{"line":48,"column":12},"end":{"line":50,"column":13}},"type":"if","locations":[{"start":{"line":48,"column":12},"end":{"line":50,"column":13}},{"start":{},"end":{}}],"line":48}},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":2,"7":2,"8":2,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":0,"20":1,"21":3,"22":3,"23":3,"24":3,"25":0,"26":3,"27":1,"28":2,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0},"f":{"0":1,"1":2,"2":1,"3":3,"4":0,"5":0},"b":{"0":[1,1],"1":[1,0],"2":[0,3]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e5d8322b904fde76848f99a3c4e9ec98ff880216"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PublicConroller.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PublicConroller.js","statementMap":{"0":{"start":{"line":1,"column":19},"end":{"line":1,"column":39}},"1":{"start":{"line":3,"column":0},"end":{"line":25,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":10,"column":9}},"3":{"start":{"line":6,"column":25},"end":{"line":6,"column":47}},"4":{"start":{"line":7,"column":12},"end":{"line":7,"column":43}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":22}},"6":{"start":{"line":14,"column":8},"end":{"line":23,"column":9}},"7":{"start":{"line":15,"column":27},"end":{"line":15,"column":37}},"8":{"start":{"line":16,"column":25},"end":{"line":16,"column":50}},"9":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"10":{"start":{"line":18,"column":16},"end":{"line":18,"column":47}},"11":{"start":{"line":20,"column":12},"end":{"line":20,"column":42}},"12":{"start":{"line":22,"column":12},"end":{"line":22,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":37},"end":{"line":11,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":40},"end":{"line":24,"column":5}},"line":13}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},{"start":{},"end":{}}],"line":17}},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":0},"f":{"0":1,"1":1},"b":{"0":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"36000bacbfc46aa23d7c4d8b1e8328b84fac3b0c"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\UserController.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\UserController.js","statementMap":{"0":{"start":{"line":1,"column":28},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":17},"end":{"line":3,"column":37}},"3":{"start":{"line":5,"column":0},"end":{"line":38,"column":1}},"4":{"start":{"line":7,"column":8},"end":{"line":12,"column":9}},"5":{"start":{"line":8,"column":25},"end":{"line":8,"column":52}},"6":{"start":{"line":9,"column":12},"end":{"line":9,"column":69}},"7":{"start":{"line":11,"column":12},"end":{"line":11,"column":22}},"8":{"start":{"line":16,"column":8},"end":{"line":36,"column":9}},"9":{"start":{"line":17,"column":40},"end":{"line":17,"column":48}},"10":{"start":{"line":18,"column":12},"end":{"line":20,"column":13}},"11":{"start":{"line":19,"column":16},"end":{"line":19,"column":46}},"12":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"13":{"start":{"line":22,"column":16},"end":{"line":22,"column":45}},"14":{"start":{"line":24,"column":25},"end":{"line":24,"column":65}},"15":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"16":{"start":{"line":26,"column":16},"end":{"line":26,"column":47}},"17":{"start":{"line":28,"column":31},"end":{"line":28,"column":71}},"18":{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},"19":{"start":{"line":30,"column":16},"end":{"line":30,"column":45}},"20":{"start":{"line":32,"column":26},"end":{"line":32,"column":52}},"21":{"start":{"line":33,"column":12},"end":{"line":33,"column":57}},"22":{"start":{"line":35,"column":12},"end":{"line":35,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":35},"end":{"line":13,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":5}},"loc":{"start":{"line":15,"column":32},"end":{"line":37,"column":5}},"line":15}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":12},"end":{"line":20,"column":13}},"type":"if","locations":[{"start":{"line":18,"column":12},"end":{"line":20,"column":13}},{"start":{},"end":{}}],"line":18},"1":{"loc":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"type":"if","locations":[{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},{"start":{},"end":{}}],"line":21},"2":{"loc":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"type":"if","locations":[{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},{"start":{},"end":{}}],"line":25},"3":{"loc":{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},"type":"if","locations":[{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},{"start":{},"end":{}}],"line":29}},"s":{"0":3,"1":3,"2":3,"3":3,"4":7,"5":7,"6":1,"7":6,"8":3,"9":3,"10":3,"11":1,"12":2,"13":1,"14":1,"15":1,"16":0,"17":1,"18":1,"19":0,"20":1,"21":1,"22":2},"f":{"0":7,"1":3},"b":{"0":[1,2],"1":[1,1],"2":[0,1],"3":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d8dfeb03134da8db1c9c2e7a8765ebe6065d944f"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\bcrypt.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\bcrypt.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":3,"column":21},"end":{"line":6,"column":1}},"2":{"start":{"line":4,"column":17},"end":{"line":4,"column":39}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":42}},"4":{"start":{"line":8,"column":24},"end":{"line":10,"column":1}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":53}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":50}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":21},"end":{"line":3,"column":22}},"loc":{"start":{"line":3,"column":35},"end":{"line":6,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":25}},"loc":{"start":{"line":8,"column":52},"end":{"line":10,"column":1}},"line":8}},"branchMap":{},"s":{"0":3,"1":3,"2":4,"3":4,"4":3,"5":1,"6":3},"f":{"0":4,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"67c0886d3ad0e39cf96e1707c953cdf5b6da99b6"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\jwt.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\jwt.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":12,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":6,"column":36}},"4":{"start":{"line":10,"column":7},"end":{"line":10,"column":36}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":23},"end":{"line":7,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":5}},"loc":{"start":{"line":9,"column":23},"end":{"line":11,"column":5}},"line":9}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":16},"f":{"0":3,"1":16},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1a8b946ca563d2d798cec8d7932cc74919b93050"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authentication.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authentication.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":29,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":27,"column":9}},"4":{"start":{"line":7,"column":31},"end":{"line":7,"column":56}},"5":{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},"6":{"start":{"line":9,"column":16},"end":{"line":9,"column":52}},"7":{"start":{"line":11,"column":34},"end":{"line":11,"column":57}},"8":{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},"9":{"start":{"line":13,"column":16},"end":{"line":13,"column":52}},"10":{"start":{"line":15,"column":25},"end":{"line":15,"column":43}},"11":{"start":{"line":16,"column":23},"end":{"line":16,"column":46}},"12":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"13":{"start":{"line":18,"column":16},"end":{"line":18,"column":52}},"14":{"start":{"line":20,"column":12},"end":{"line":23,"column":14}},"15":{"start":{"line":24,"column":12},"end":{"line":24,"column":19}},"16":{"start":{"line":26,"column":12},"end":{"line":26,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":41},"end":{"line":28,"column":5}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},{"start":{},"end":{}}],"line":17}},"s":{"0":3,"1":3,"2":3,"3":19,"4":19,"5":19,"6":0,"7":19,"8":19,"9":3,"10":16,"11":15,"12":15,"13":0,"14":15,"15":15,"16":4},"f":{"0":19},"b":{"0":[0,19],"1":[3,16],"2":[0,15]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0503cc6fc04a7cfe13d3d5b2593bf2ccf31b1e91"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authorization.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authorization.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":0},"end":{"line":33,"column":1}},"2":{"start":{"line":6,"column":19},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":8},"end":{"line":20,"column":9}},"4":{"start":{"line":8,"column":26},"end":{"line":8,"column":69}},"5":{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},"6":{"start":{"line":10,"column":16},"end":{"line":10,"column":51}},"7":{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},"8":{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},"9":{"start":{"line":14,"column":20},"end":{"line":14,"column":49}},"10":{"start":{"line":17,"column":12},"end":{"line":17,"column":19}},"11":{"start":{"line":19,"column":12},"end":{"line":19,"column":22}},"12":{"start":{"line":24,"column":8},"end":{"line":31,"column":9}},"13":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"14":{"start":{"line":26,"column":16},"end":{"line":26,"column":45}},"15":{"start":{"line":28,"column":12},"end":{"line":28,"column":19}},"16":{"start":{"line":30,"column":12},"end":{"line":30,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":40},"end":{"line":21,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":34},"end":{"line":32,"column":5}},"line":23}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},"type":"if","locations":[{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},{"start":{},"end":{}}],"line":9},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},"type":"if","locations":[{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},{"start":{},"end":{}}],"line":13},"3":{"loc":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"type":"if","locations":[{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},{"start":{},"end":{}}],"line":25}},"s":{"0":3,"1":3,"2":2,"3":2,"4":2,"5":2,"6":1,"7":1,"8":0,"9":0,"10":1,"11":1,"12":7,"13":7,"14":0,"15":7,"16":0},"f":{"0":2,"1":7},"b":{"0":[1,1],"1":[0,1],"2":[0,0],"3":[0,7]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3512aaaf3ce9dd4ce54398a175a06aca096fdc42"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\errorHandler.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":34}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":56}},"2":{"start":{"line":5,"column":4},"end":{"line":51,"column":5}},"3":{"start":{"line":7,"column":12},"end":{"line":7,"column":24}},"4":{"start":{"line":8,"column":12},"end":{"line":8,"column":43}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":18}},"6":{"start":{"line":11,"column":12},"end":{"line":11,"column":24}},"7":{"start":{"line":12,"column":12},"end":{"line":12,"column":41}},"8":{"start":{"line":13,"column":12},"end":{"line":13,"column":18}},"9":{"start":{"line":15,"column":12},"end":{"line":15,"column":24}},"10":{"start":{"line":16,"column":12},"end":{"line":16,"column":44}},"11":{"start":{"line":17,"column":12},"end":{"line":17,"column":18}},"12":{"start":{"line":19,"column":12},"end":{"line":19,"column":24}},"13":{"start":{"line":20,"column":12},"end":{"line":20,"column":38}},"14":{"start":{"line":21,"column":12},"end":{"line":21,"column":18}},"15":{"start":{"line":23,"column":12},"end":{"line":23,"column":24}},"16":{"start":{"line":24,"column":12},"end":{"line":24,"column":41}},"17":{"start":{"line":25,"column":12},"end":{"line":25,"column":18}},"18":{"start":{"line":28,"column":12},"end":{"line":28,"column":24}},"19":{"start":{"line":29,"column":12},"end":{"line":29,"column":39}},"20":{"start":{"line":30,"column":12},"end":{"line":30,"column":18}},"21":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"22":{"start":{"line":33,"column":12},"end":{"line":33,"column":42}},"23":{"start":{"line":34,"column":12},"end":{"line":34,"column":18}},"24":{"start":{"line":36,"column":12},"end":{"line":36,"column":24}},"25":{"start":{"line":37,"column":12},"end":{"line":37,"column":59}},"26":{"start":{"line":38,"column":12},"end":{"line":38,"column":18}},"27":{"start":{"line":40,"column":12},"end":{"line":40,"column":24}},"28":{"start":{"line":41,"column":12},"end":{"line":41,"column":57}},"29":{"start":{"line":42,"column":12},"end":{"line":42,"column":18}},"30":{"start":{"line":44,"column":12},"end":{"line":44,"column":24}},"31":{"start":{"line":45,"column":12},"end":{"line":45,"column":58}},"32":{"start":{"line":46,"column":12},"end":{"line":46,"column":18}},"33":{"start":{"line":48,"column":12},"end":{"line":48,"column":24}},"34":{"start":{"line":49,"column":12},"end":{"line":49,"column":46}},"35":{"start":{"line":50,"column":12},"end":{"line":50,"column":18}},"36":{"start":{"line":52,"column":4},"end":{"line":52,"column":49}},"37":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}}},"fnMap":{"0":{"name":"errorHandler","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":21}},"loc":{"start":{"line":1,"column":43},"end":{"line":53,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":2,"column":34}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":34}}],"line":2},"1":{"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":56}},"type":"binary-expr","locations":[{"start":{"line":3,"column":18},"end":{"line":3,"column":29}},{"start":{"line":3,"column":33},"end":{"line":3,"column":56}}],"line":3},"2":{"loc":{"start":{"line":5,"column":4},"end":{"line":51,"column":5}},"type":"switch","locations":[{"start":{"line":6,"column":8},"end":{"line":9,"column":18}},{"start":{"line":10,"column":8},"end":{"line":13,"column":18}},{"start":{"line":14,"column":8},"end":{"line":17,"column":18}},{"start":{"line":18,"column":8},"end":{"line":21,"column":18}},{"start":{"line":22,"column":8},"end":{"line":25,"column":18}},{"start":{"line":26,"column":8},"end":{"line":26,"column":31}},{"start":{"line":27,"column":8},"end":{"line":30,"column":18}},{"start":{"line":31,"column":8},"end":{"line":34,"column":18}},{"start":{"line":35,"column":8},"end":{"line":38,"column":18}},{"start":{"line":39,"column":8},"end":{"line":42,"column":18}},{"start":{"line":43,"column":8},"end":{"line":46,"column":18}},{"start":{"line":47,"column":8},"end":{"line":50,"column":18}}],"line":5}},"s":{"0":17,"1":17,"2":17,"3":8,"4":8,"5":8,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":4,"19":4,"20":4,"21":1,"22":1,"23":1,"24":0,"25":0,"26":0,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":0,"34":0,"35":0,"36":17,"37":3},"f":{"0":17},"b":{"0":[17,17],"1":[17,8],"2":[8,1,1,0,0,3,4,1,0,1,1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9cf46918718a4f52d9cb9faa9a06c0589f7b6831"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\character.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\character.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":27,"column":2}},"2":{"start":{"line":16,"column":2},"end":{"line":25,"column":5}},"3":{"start":{"line":26,"column":2},"end":{"line":26,"column":19}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":27,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f45f2c00ea71f3135a107f479db8ca44f8b5327a"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\index.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\index.js","statementMap":{"0":{"start":{"line":3,"column":11},"end":{"line":3,"column":24}},"1":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":38}},"3":{"start":{"line":6,"column":16},"end":{"line":6,"column":34}},"4":{"start":{"line":7,"column":17},"end":{"line":7,"column":42}},"5":{"start":{"line":8,"column":12},"end":{"line":8,"column":49}},"6":{"start":{"line":9,"column":15},"end":{"line":9,"column":65}},"7":{"start":{"line":10,"column":11},"end":{"line":10,"column":13}},"8":{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},"9":{"start":{"line":14,"column":2},"end":{"line":14,"column":74}},"10":{"start":{"line":16,"column":2},"end":{"line":16,"column":87}},"11":{"start":{"line":19,"column":0},"end":{"line":32,"column":5}},"12":{"start":{"line":22,"column":4},"end":{"line":27,"column":6}},"13":{"start":{"line":30,"column":18},"end":{"line":30,"column":85}},"14":{"start":{"line":31,"column":4},"end":{"line":31,"column":27}},"15":{"start":{"line":34,"column":0},"end":{"line":38,"column":3}},"16":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"17":{"start":{"line":36,"column":4},"end":{"line":36,"column":32}},"18":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"19":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"20":{"start":{"line":43,"column":0},"end":{"line":43,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":21,"column":10},"end":{"line":21,"column":11}},"loc":{"start":{"line":21,"column":18},"end":{"line":28,"column":3}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":11},"end":{"line":29,"column":12}},"loc":{"start":{"line":29,"column":19},"end":{"line":32,"column":3}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":24},"end":{"line":34,"column":25}},"loc":{"start":{"line":34,"column":37},"end":{"line":38,"column":1}},"line":34}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":8,"column":49}},"type":"binary-expr","locations":[{"start":{"line":8,"column":12},"end":{"line":8,"column":32}},{"start":{"line":8,"column":36},"end":{"line":8,"column":49}}],"line":8},"1":{"loc":{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},"type":"if","locations":[{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},{"start":{"line":15,"column":7},"end":{"line":17,"column":1}}],"line":13},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":26,"column":37}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":29}},{"start":{"line":24,"column":6},"end":{"line":24,"column":23}},{"start":{"line":25,"column":6},"end":{"line":25,"column":30}},{"start":{"line":26,"column":6},"end":{"line":26,"column":37}}],"line":23},"3":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},{"start":{},"end":{}}],"line":35}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":0,"10":3,"11":3,"12":21,"13":18,"14":18,"15":3,"16":18,"17":18,"18":3,"19":3,"20":3},"f":{"0":21,"1":18,"2":18},"b":{"0":[3,0],"1":[0,3],"2":[21,21,18,18],"3":[18,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d39ffbf9a8ff33cde9535bed2298b82ea0fd2797"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\party.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\party.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":23,"column":2}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":32}},"3":{"start":{"line":16,"column":2},"end":{"line":21,"column":5}},"4":{"start":{"line":22,"column":2},"end":{"line":22,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":23,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fed1902f88d5c96b0ec953573ec59d52986bb71e"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\team.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\team.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":65,"column":2}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":36}},"3":{"start":{"line":14,"column":6},"end":{"line":14,"column":61}},"4":{"start":{"line":17,"column":2},"end":{"line":63,"column":5}},"5":{"start":{"line":64,"column":2},"end":{"line":64,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":65,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"60b9b0cbe9bdad66ca51234ec7cae449412839c2"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\type.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\type.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":23,"column":2}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":33}},"3":{"start":{"line":16,"column":2},"end":{"line":21,"column":5}},"4":{"start":{"line":22,"column":2},"end":{"line":22,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":23,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"67c795b9a30b0f6803a613f1e27800e5ed9b24cc"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\user.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":69,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":31}},"3":{"start":{"line":17,"column":2},"end":{"line":67,"column":5}},"4":{"start":{"line":68,"column":2},"end":{"line":68,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":69,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8eec527492bcde82dff11bee0fcbaf30deac26f8"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\weapon.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\weapon.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":28,"column":2}},"2":{"start":{"line":16,"column":2},"end":{"line":26,"column":5}},"3":{"start":{"line":27,"column":2},"end":{"line":27,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":28,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"158cb29787599ed7e53ce3954379898e285d2a9d"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\routes\\index.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":84},"end":{"line":1,"column":125}},"1":{"start":{"line":2,"column":38},"end":{"line":2,"column":79}},"2":{"start":{"line":3,"column":28},"end":{"line":3,"column":68}},"3":{"start":{"line":4,"column":27},"end":{"line":4,"column":67}},"4":{"start":{"line":5,"column":35},"end":{"line":5,"column":74}},"5":{"start":{"line":6,"column":15},"end":{"line":6,"column":42}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":35}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":29}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":27}},"10":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"12":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"13":{"start":{"line":18,"column":0},"end":{"line":18,"column":56}},"14":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"15":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"16":{"start":{"line":21,"column":0},"end":{"line":21,"column":54}},"17":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8a5808560a87c9259a506fca3edbf4e55260b1af"} +} diff --git a/coverage/lcov-report/IP-RMT50/app.js.html b/coverage/lcov-report/IP-RMT50/app.js.html new file mode 100644 index 0000000..064c5e5 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/app.js.html @@ -0,0 +1,133 @@ + + + + + + Code coverage report for IP-RMT50/app.js + + + + + + + + + +
+
+

All files / IP-RMT50 app.js

+
+ +
+ 91.66% + Statements + 11/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 91.66% + Lines + 11/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +173x +3x +3x +3x +3x +  +3x +3x +  +3x +  +  +  +3x +3x +  +3x
require('dotenv').config();
+const express = require('express');
+const app = express();
+const routes = require('./routes');
+const errorHandler = require('./middlewares/errorHandler');
+ 
+app.use(express.urlencoded({ extended: true }));
+app.use(express.json());
+ 
+app.get('/', (req, res) => {
+    res.send('Hello World!');
+});
+ 
+app.use(routes);
+app.use(errorHandler);
+ 
+module.exports = app;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/controllers/PartyController.js.html b/coverage/lcov-report/IP-RMT50/controllers/PartyController.js.html new file mode 100644 index 0000000..adf3a80 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/controllers/PartyController.js.html @@ -0,0 +1,328 @@ + + + + + + Code coverage report for IP-RMT50/controllers/PartyController.js + + + + + + + + + +
+
+

All files / IP-RMT50/controllers PartyController.js

+
+ +
+ 59.52% + Statements + 25/42 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 66.66% + Functions + 4/6 +
+ + +
+ 59.52% + Lines + 25/42 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +823x +  +3x +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +2x +2x +2x +1x +  +1x +1x +  +1x +  +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +1x +  +  +  +  +3x +3x +3x +3x +  +  +3x +  +  +1x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const { Party, Team } = require('../models');
+ 
+module.exports = {
+    async getParty(req, res, next) {
+        try {
+            const party = await Party.findAll({
+                where: { UserId: req.user.id },
+                attributes: { exclude: ['createdAt', 'updatedAt'] },
+                include: [{ model: Team, attributes: { exclude: ['id', 'PartyId', 'createdAt', 'updatedAt'] } }]
+            });
+            res.status(200).json({ party });
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async createParty(req, res, next) {
+        try {
+            const checking = await Party.findAll({ where: { UserId: req.user.id }, raw: true })
+            if (checking.length > 3) {
+                throw ({ name: `Party Full` });
+            };
+            const party = await Party.create({ UserId: req.user.id });
+            res.status(201).json({ party });
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async deleteParty(req, res, next) {
+        const { id } = req.params;
+        try {
+            const party = await Party.findByPk(id, { include: Team });
+            Eif (party.Teams.length > 0) {
+                throw ({ name: `cannot delete` })
+            };
+            await party.destroy();
+            res.status(200).json({ message: `Party with id ${party.id} has been deleted` });
+        } catch (err) {
+            next(err);
+        }
+    },
+ 
+    async createTeam(req, res, next) {
+        const { id } = req.params
+        try {
+            const checking = await Team.findAll({ where: { PartyId: id } });
+            Iif (checking.length > 4) {
+                throw ({ name: `Team Full` })
+            };
+            const team = await Team.create({
+                ...req.body, PartyId: id
+            });
+            res.status(201).json({ team });
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async updateTeam(req, res, next) {
+        const { CharacterId, WeaponId } = req.body;
+        const { teamId } = req.params;
+        try {
+            const team = await Team.findByPk(teamId);
+            await team.update({ CharacterId, WeaponId })
+            res.status(200).json({ team })
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async deleteTeam(req, res, next) {
+        const { teamId } = req.params;
+        try {
+            const team = await Team.findByPk(teamId);
+            team.destroy();
+            res.status(200).json({ message: `Team with id ${team.id} has been deleted` })
+        } catch (err) {
+            next(err);
+        };
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/controllers/PublicConroller.js.html b/coverage/lcov-report/IP-RMT50/controllers/PublicConroller.js.html new file mode 100644 index 0000000..eaad38e --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/controllers/PublicConroller.js.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for IP-RMT50/controllers/PublicConroller.js + + + + + + + + + +
+
+

All files / IP-RMT50/controllers PublicConroller.js

+
+ +
+ 76.92% + Statements + 10/13 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 76.92% + Lines + 10/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +253x +  +3x +  +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x +  +  +  +  + 
const { Weapon } = require('../models');
+ 
+module.exports = {
+    async getWeapons(req, res, next) {
+        try {
+            const data = await Weapon.findAll();
+            res.status(200).json({ data });
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async getWeaponById(req, res, next) {
+        try {
+            const { id } = req.params
+            const data = await Weapon.findByPk(id);
+            Iif (!data) {
+                throw ({ name: `404`, id: id })
+            }
+            res.status(200).json({ data })
+        } catch (err) {
+            next(err);
+        };
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/controllers/UserController.js.html b/coverage/lcov-report/IP-RMT50/controllers/UserController.js.html new file mode 100644 index 0000000..b4af6b8 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/controllers/UserController.js.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for IP-RMT50/controllers/UserController.js + + + + + + + + + +
+
+

All files / IP-RMT50/controllers UserController.js

+
+ +
+ 91.3% + Statements + 21/23 +
+ + +
+ 75% + Branches + 6/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 91.3% + Lines + 21/23 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +383x +3x +3x +  +3x +  +7x +7x +1x +  +6x +  +  +  +  +3x +3x +3x +1x +  +2x +1x +  +1x +1x +  +  +1x +1x +  +  +1x +1x +  +2x +  +  + 
const { comparePassword } = require('../helpers/bcrypt');
+const { signToken } = require('../helpers/jwt');
+const { User } = require('../models');
+ 
+module.exports = {
+    async register(req, res, next) {
+        try {
+            const user = await User.create(req.body);
+            res.status(201).json({ id: user.id, email: user.email });
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async login(req, res, next) {
+        try {
+            const { email, password } = req.body;
+            if (!email) {
+                throw ({ name: `email req` });
+            };
+            if (!password) {
+                throw ({ name: `pass req` });
+            };
+            const user = await User.findOne({ where: { email } });
+            Iif (!user) {
+                throw ({ name: `email false` })
+            };
+            const checkToken = comparePassword(password, user.password);
+            Iif (!checkToken) {
+                throw ({ name: `pass fail` })
+            };
+            const token = signToken({ id: user.id })
+            res.status(200).json({ access_token: token })
+        } catch (err) {
+            next(err);
+        };
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/controllers/index.html b/coverage/lcov-report/IP-RMT50/controllers/index.html new file mode 100644 index 0000000..91cf115 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/controllers/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for IP-RMT50/controllers + + + + + + + + + +
+
+

All files IP-RMT50/controllers

+
+ +
+ 71.79% + Statements + 56/78 +
+ + +
+ 68.75% + Branches + 11/16 +
+ + +
+ 80% + Functions + 8/10 +
+ + +
+ 71.79% + Lines + 56/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
PartyController.js +
+
59.52%25/4266.66%4/666.66%4/659.52%25/42
PublicConroller.js +
+
76.92%10/1350%1/2100%2/276.92%10/13
UserController.js +
+
91.3%21/2375%6/8100%2/291.3%21/23
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/helpers/bcrypt.js.html b/coverage/lcov-report/IP-RMT50/helpers/bcrypt.js.html new file mode 100644 index 0000000..71dddf1 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/helpers/bcrypt.js.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for IP-RMT50/helpers/bcrypt.js + + + + + + + + + +
+
+

All files / IP-RMT50/helpers bcrypt.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +123x +  +3x +4x +4x +  +  +3x +1x +  +  +3x
const bcrypt = require('bcrypt');
+ 
+const hashPassword = (password) => {
+    const salt = bcrypt.genSaltSync(10);
+    return bcrypt.hashSync(password, salt)
+}
+ 
+const comparePassword = (password, hashPassword) => {
+    return bcrypt.compareSync(password, hashPassword)
+}
+ 
+module.exports = { hashPassword, comparePassword }
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/helpers/index.html b/coverage/lcov-report/IP-RMT50/helpers/index.html new file mode 100644 index 0000000..277a2c1 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/helpers/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for IP-RMT50/helpers + + + + + + + + + +
+
+

All files IP-RMT50/helpers

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
bcrypt.js +
+
100%7/7100%0/0100%2/2100%7/7
jwt.js +
+
100%5/5100%0/0100%2/2100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/helpers/jwt.js.html b/coverage/lcov-report/IP-RMT50/helpers/jwt.js.html new file mode 100644 index 0000000..71c006b --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/helpers/jwt.js.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for IP-RMT50/helpers/jwt.js + + + + + + + + + +
+
+

All files / IP-RMT50/helpers jwt.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +123x +3x +  +3x +  +3x +  +  +  +16x +  + 
const { sign, verify } = require('jsonwebtoken')
+const secret = process.env.SECRET_KEY;
+ 
+module.exports = {
+    signToken(payload) {
+        return sign(payload, secret)
+    },
+ 
+    verifyToken(token) {
+       return  verify(token, secret)
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/index.html b/coverage/lcov-report/IP-RMT50/index.html new file mode 100644 index 0000000..344b811 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for IP-RMT50 + + + + + + + + + +
+
+

All files IP-RMT50

+
+ +
+ 91.66% + Statements + 11/12 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 91.66% + Lines + 11/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
app.js +
+
91.66%11/12100%0/00%0/191.66%11/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/middlewares/authentication.js.html b/coverage/lcov-report/IP-RMT50/middlewares/authentication.js.html new file mode 100644 index 0000000..5a9e26b --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/middlewares/authentication.js.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for IP-RMT50/middlewares/authentication.js + + + + + + + + + +
+
+

All files / IP-RMT50/middlewares authentication.js

+
+ +
+ 88.23% + Statements + 15/17 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 88.23% + Lines + 15/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +293x +3x +  +3x +  +19x +19x +19x +  +  +19x +19x +3x +  +16x +15x +15x +  +  +15x +  +  +  +15x +  +4x +  +  + 
const { verifyToken } = require("../helpers/jwt");
+const { User } = require('../models');
+ 
+module.exports = {
+    async authentication(req, res, next) {
+        try {
+            let access_token = req.headers.authorization;
+            Iif (!access_token) {
+                throw ({ name: `Unauthenticated` });
+            }
+            let [bearer, token] = access_token.split(' ');
+            if (bearer !== `Bearer`) {
+                throw ({ name: `Unauthenticated` });
+            };
+            let { id } = verifyToken(token);
+            let user = await User.findByPk(id);
+            Iif (!user) {
+                throw ({ name: `Unauthenticated` });
+            };
+            req.user = {
+                id: user.id,
+                role: user.role
+            };
+            next();
+        } catch (err) {
+            next(err)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/middlewares/authorization.js.html b/coverage/lcov-report/IP-RMT50/middlewares/authorization.js.html new file mode 100644 index 0000000..19597cf --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/middlewares/authorization.js.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for IP-RMT50/middlewares/authorization.js + + + + + + + + + +
+
+

All files / IP-RMT50/middlewares authorization.js

+
+ +
+ 76.47% + Statements + 13/17 +
+ + +
+ 50% + Branches + 4/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 76.47% + Lines + 13/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +333x +  +  +3x +  +2x +2x +2x +2x +1x +  +1x +  +  +  +  +1x +  +1x +  +  +  +  +7x +7x +  +  +7x +  +  +  +  + 
const { Party, Team } = require('../models');
+ 
+ 
+module.exports = {
+    async authorization(req, res, next) {
+        const id = req.params.id
+        try {
+            const party = await Party.findByPk(id, { include: Team });
+            if (!party) {
+                throw ({ name: `delete 404`, id });
+            };
+            Iif (req.user.role === `Staff`) {
+                if (party.UserId !== req.user.id) {
+                    throw ({ name: `Forbidden` })
+                }
+            }
+            next();
+        } catch (err) {
+            next(err);
+        };
+    },
+ 
+    async isAdmin(req, res, next) {
+        try {
+            Iif (req.user.role !== 'Admin') {
+                throw ({ name: `Forbidden` })
+            }
+            next();
+        } catch (err) {
+            next(err)
+        }
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/middlewares/errorHandler.js.html b/coverage/lcov-report/IP-RMT50/middlewares/errorHandler.js.html new file mode 100644 index 0000000..6307c86 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/middlewares/errorHandler.js.html @@ -0,0 +1,247 @@ + + + + + + Code coverage report for IP-RMT50/middlewares/errorHandler.js + + + + + + + + + +
+
+

All files / IP-RMT50/middlewares errorHandler.js

+
+ +
+ 68.42% + Statements + 26/38 +
+ + +
+ 75% + Branches + 12/16 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 68.42% + Lines + 26/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55  +17x +17x +  +17x +  +8x +8x +8x +  +1x +1x +1x +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +4x +4x +4x +  +1x +1x +1x +  +  +  +  +  +1x +1x +1x +  +1x +1x +1x +  +  +  +  +  +17x +  +  +3x
function errorHandler(err, req, res, next) {
+    let status = err.status || 500;
+    let message = err.message || `Internal Server Error`
+ 
+    switch (err.name) {
+        case `SequelizeValidationError`:
+            status = 400
+            message = err.errors[0].message
+            break;
+        case `email req`:
+            status = 401
+            message = `Email is required`
+            break;
+        case `pass req`:
+            status = 401
+            message = `Password is required`
+            break;
+        case `email false`:
+            status = 401
+            message = `Email is wrong`
+            break;
+        case `pass false`:
+            status = 401
+            message = `Password is wrong`
+            break;
+        case `Unauthenticated`:
+        case `JsonWebTokenError`:
+            status = 401
+            message = `Unauthenticated`
+            break;
+        case `Party Full`:
+            status = 400
+            message = `Your party is full`
+            break;
+        case `Team Full`:
+            status = 400
+            message = `Your team can only have 4 Character`
+            break;
+        case `delete 404`:
+            status = 404
+            message = `Party with id ${err.id} not found`
+            break;
+        case `cannot delete`:
+            status = 400
+            message = `Cannot delete party that has teams`
+            break;
+        case `Forbidden`:
+            status = 404
+            message = `You are not authorized`
+            break;
+    }
+    res.status(status).json({ message: message })
+}
+ 
+module.exports = errorHandler
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/middlewares/index.html b/coverage/lcov-report/IP-RMT50/middlewares/index.html new file mode 100644 index 0000000..fabcb04 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/middlewares/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for IP-RMT50/middlewares + + + + + + + + + +
+
+

All files IP-RMT50/middlewares

+
+ +
+ 75% + Statements + 54/72 +
+ + +
+ 66.66% + Branches + 20/30 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 75% + Lines + 54/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authentication.js +
+
88.23%15/1766.66%4/6100%1/188.23%15/17
authorization.js +
+
76.47%13/1750%4/8100%2/276.47%13/17
errorHandler.js +
+
68.42%26/3875%12/16100%1/168.42%26/38
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/character.js.html b/coverage/lcov-report/IP-RMT50/models/character.js.html new file mode 100644 index 0000000..d62fe23 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/character.js.html @@ -0,0 +1,163 @@ + + + + + + Code coverage report for IP-RMT50/models/character.js + + + + + + + + + +
+
+

All files / IP-RMT50/models character.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Character extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      // define association here
+    }
+  }
+  Character.init({
+    name: DataTypes.STRING,
+    rarity: DataTypes.STRING,
+    weapon: DataTypes.STRING,
+    vision: DataTypes.STRING,
+    wiki_url: DataTypes.STRING
+  }, {
+    sequelize,
+    modelName: 'Character',
+  });
+  return Character;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/index.html b/coverage/lcov-report/IP-RMT50/models/index.html new file mode 100644 index 0000000..b139945 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for IP-RMT50/models + + + + + + + + + +
+
+

All files IP-RMT50/models

+
+ +
+ 98% + Statements + 49/50 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 98% + Lines + 49/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
character.js +
+
100%4/4100%0/0100%2/2100%4/4
index.js +
+
95.23%20/2170%7/10100%3/395.23%20/21
party.js +
+
100%5/5100%0/0100%2/2100%5/5
team.js +
+
100%6/6100%0/0100%2/2100%6/6
type.js +
+
100%5/5100%0/0100%2/2100%5/5
user.js +
+
100%5/5100%0/0100%2/2100%5/5
weapon.js +
+
100%4/4100%0/0100%2/2100%4/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/index.js.html b/coverage/lcov-report/IP-RMT50/models/index.js.html new file mode 100644 index 0000000..a3ac84b --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/index.js.html @@ -0,0 +1,214 @@ + + + + + + Code coverage report for IP-RMT50/models/index.js + + + + + + + + + +
+
+

All files / IP-RMT50/models index.js

+
+ +
+ 95.23% + Statements + 20/21 +
+ + +
+ 70% + Branches + 7/10 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 95.23% + Lines + 20/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44  +  +3x +3x +3x +3x +3x +3x +3x +3x +  +  +3x +  +  +3x +  +  +3x +  +  +21x +  +  +  +  +  +  +  +18x +18x +  +  +3x +18x +18x +  +  +  +3x +3x +  +3x + 
'use strict';
+ 
+const fs = require('fs');
+const path = require('path');
+const Sequelize = require('sequelize');
+const process = require('process');
+const basename = path.basename(__filename);
+const env = process.env.NODE_ENV || 'development';
+const config = require(__dirname + '/../config/config.json')[env];
+const db = {};
+ 
+let sequelize;
+Iif (config.use_env_variable) {
+  sequelize = new Sequelize(process.env[config.use_env_variable], config);
+} else {
+  sequelize = new Sequelize(config.database, config.username, config.password, config);
+}
+ 
+fs
+  .readdirSync(__dirname)
+  .filter(file => {
+    return (
+      file.indexOf('.') !== 0 &&
+      file !== basename &&
+      file.slice(-3) === '.js' &&
+      file.indexOf('.test.js') === -1
+    );
+  })
+  .forEach(file => {
+    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
+    db[model.name] = model;
+  });
+ 
+Object.keys(db).forEach(modelName => {
+  Eif (db[modelName].associate) {
+    db[modelName].associate(db);
+  }
+});
+ 
+db.sequelize = sequelize;
+db.Sequelize = Sequelize;
+ 
+module.exports = db;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/party.js.html b/coverage/lcov-report/IP-RMT50/models/party.js.html new file mode 100644 index 0000000..48de7df --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/party.js.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for IP-RMT50/models/party.js + + + + + + + + + +
+
+

All files / IP-RMT50/models party.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +3x +3x +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Party extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      Party.hasMany(models.Team)
+    }
+  }
+  Party.init({
+    UserId: DataTypes.INTEGER
+  }, {
+    sequelize,
+    modelName: 'Party',
+  });
+  return Party;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/team.js.html b/coverage/lcov-report/IP-RMT50/models/team.js.html new file mode 100644 index 0000000..1f861dc --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/team.js.html @@ -0,0 +1,277 @@ + + + + + + Code coverage report for IP-RMT50/models/team.js + + + + + + + + + +
+
+

All files / IP-RMT50/models team.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65  +  +  +3x +3x +  +  +  +  +  +  +  +3x +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Team extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      Team.hasMany(models.Character)
+      Team.belongsTo(models.Party, { foreignKey: `PartyId` })
+    }
+  }
+  Team.init({
+    PartyId: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          args: true,
+          msg: `Party Id cannot be empty`
+        },
+        notNull: {
+          args: true,
+          msg: `Party Id is required`
+        }
+      }
+    },
+    CharacterId: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          args: true,
+          msg: `Character Id cannot be empty`
+        },
+        notNull: {
+          args: true,
+          msg: `Character Id is required`
+        }
+      }
+    },
+    WeaponId: {
+      type: DataTypes.INTEGER,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          args: true,
+          msg: `Weapon Id cannot be empty`
+        },
+        notNull: {
+          args: true,
+          msg: `Weapon Id is required`
+        }
+      }
+    }
+  }, {
+    sequelize,
+    modelName: 'Team',
+  });
+  return Team;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/type.js.html b/coverage/lcov-report/IP-RMT50/models/type.js.html new file mode 100644 index 0000000..4e88ed3 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/type.js.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for IP-RMT50/models/type.js + + + + + + + + + +
+
+

All files / IP-RMT50/models type.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +3x +3x +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Type extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      Type.hasMany(models.Weapon)
+    }
+  }
+  Type.init({
+    name: DataTypes.STRING
+  }, {
+    sequelize,
+    modelName: 'Type',
+  });
+  return Type;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/user.js.html b/coverage/lcov-report/IP-RMT50/models/user.js.html new file mode 100644 index 0000000..74660c5 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/user.js.html @@ -0,0 +1,289 @@ + + + + + + Code coverage report for IP-RMT50/models/user.js + + + + + + + + + +
+
+

All files / IP-RMT50/models user.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69  +  +  +3x +3x +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class User extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      // define association here
+      User.hasOne(models.Party)
+    }
+  }
+  User.init({
+    name: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          args: true,
+          msg: `Name cannot be empty`
+        },
+        notNull: {
+          args: true,
+          msg: `Name is required`
+        }
+      }
+    },
+    email: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          args: true,
+          msg: `Email cannot be empty`
+        },
+        notNull: {
+          args: true,
+          msg: `Email is required`
+        }
+      }
+    },
+    role: {
+      type: DataTypes.STRING,
+      defaultValue: `Staff`
+    },
+    password: {
+      type: DataTypes.STRING,
+      allowNull: false,
+      validate: {
+        notEmpty: {
+          args: true,
+          msg: `Password cannot be empty`
+        },
+        notNull: {
+          args: true,
+          msg: `Password is required`
+        }
+      }
+    }
+  }, {
+    sequelize,
+    modelName: 'User',
+  });
+  return User;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/models/weapon.js.html b/coverage/lcov-report/IP-RMT50/models/weapon.js.html new file mode 100644 index 0000000..3084e16 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/models/weapon.js.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for IP-RMT50/models/weapon.js + + + + + + + + + +
+
+

All files / IP-RMT50/models weapon.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +3x + 
'use strict';
+const {
+  Model
+} = require('sequelize');
+module.exports = (sequelize, DataTypes) => {
+  class Weapon extends Model {
+    /**
+     * Helper method for defining associations.
+     * This method is not a part of Sequelize lifecycle.
+     * The `models/index` file will call this method automatically.
+     */
+    static associate(models) {
+      // define association here
+    }
+  }
+  Weapon.init({
+    name: DataTypes.STRING,
+    rarity: DataTypes.INTEGER,
+    TypeId: DataTypes.INTEGER,
+    baseAttack: DataTypes.INTEGER,
+    effect: DataTypes.STRING,
+    imgUrl: DataTypes.STRING
+  }, {
+    sequelize,
+    modelName: 'Weapon',
+  });
+  return Weapon;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/routes/index.html b/coverage/lcov-report/IP-RMT50/routes/index.html new file mode 100644 index 0000000..302db54 --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/routes/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for IP-RMT50/routes + + + + + + + + + +
+
+

All files IP-RMT50/routes

+
+ +
+ 100% + Statements + 18/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 18/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js +
+
100%18/18100%0/0100%0/0100%18/18
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/IP-RMT50/routes/index.js.html b/coverage/lcov-report/IP-RMT50/routes/index.js.html new file mode 100644 index 0000000..8cdb93c --- /dev/null +++ b/coverage/lcov-report/IP-RMT50/routes/index.js.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for IP-RMT50/routes/index.js + + + + + + + + + +
+
+

All files / IP-RMT50/routes index.js

+
+ +
+ 100% + Statements + 18/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 18/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +233x +3x +3x +3x +3x +3x +  +3x +3x +3x +  +  +3x +  +3x +3x +3x +3x +3x +3x +3x +  +3x
const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam } = require('../controllers/PartyController');
+const { getWeapons, getWeaponById } = require('../controllers/PublicConroller');
+const { register, login } = require('../controllers/UserController');
+const { authentication } = require('../middlewares/authentication');
+const { authorization, isAdmin } = require('../middlewares/authorization');
+const router = require('express').Router()
+ 
+router.get('/weapons', getWeapons);
+router.get('/weapons/:id', getWeaponById);
+router.post('/login', login);
+ 
+ 
+router.use(authentication);
+ 
+router.post('/register', isAdmin, register);
+router.get('/party', getParty);
+router.post('/party', createParty);
+router.delete('/party/:id', authorization, deleteParty);
+router.post('/party/:id/team', createTeam);
+router.put('/party/:id/team/:teamId', updateTeam);
+router.delete('/party/:id/team/:teamId', deleteParty);
+ 
+module.exports = router
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..cc12130 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 82.64% + Statements + 200/242 +
+ + +
+ 67.85% + Branches + 38/56 +
+ + +
+ 91.17% + Functions + 31/34 +
+ + +
+ 82.64% + Lines + 200/242 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
IP-RMT50 +
+
91.66%11/12100%0/00%0/191.66%11/12
IP-RMT50/controllers +
+
71.79%56/7868.75%11/1680%8/1071.79%56/78
IP-RMT50/helpers +
+
100%12/12100%0/0100%4/4100%12/12
IP-RMT50/middlewares +
+
75%54/7266.66%20/30100%4/475%54/72
IP-RMT50/models +
+
98%49/5070%7/10100%15/1598%49/50
IP-RMT50/routes +
+
100%18/18100%0/0100%0/0100%18/18
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..2bb296a --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..9c5f799 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,519 @@ +TN: +SF:app.js +FN:10,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:5,3 +DA:7,3 +DA:8,3 +DA:10,3 +DA:11,0 +DA:14,3 +DA:15,3 +DA:17,3 +LF:12 +LH:11 +BRF:0 +BRH:0 +end_of_record +TN: +SF:controllers\PartyController.js +FN:4,(anonymous_0) +FN:17,(anonymous_1) +FN:30,(anonymous_2) +FN:44,(anonymous_3) +FN:60,(anonymous_4) +FN:72,(anonymous_5) +FNF:6 +FNH:4 +FNDA:1,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +DA:1,3 +DA:3,3 +DA:5,1 +DA:6,1 +DA:11,1 +DA:13,0 +DA:18,2 +DA:19,2 +DA:20,2 +DA:21,1 +DA:23,1 +DA:24,1 +DA:26,1 +DA:31,1 +DA:32,1 +DA:33,1 +DA:34,1 +DA:35,1 +DA:37,0 +DA:38,0 +DA:40,1 +DA:45,3 +DA:46,3 +DA:47,3 +DA:48,3 +DA:49,0 +DA:51,3 +DA:54,1 +DA:56,2 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:68,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:79,0 +LF:42 +LH:25 +BRDA:20,0,0,1 +BRDA:20,0,1,1 +BRDA:34,1,0,1 +BRDA:34,1,1,0 +BRDA:48,2,0,0 +BRDA:48,2,1,3 +BRF:6 +BRH:4 +end_of_record +TN: +SF:controllers\PublicConroller.js +FN:4,(anonymous_0) +FN:13,(anonymous_1) +FNF:2 +FNH:2 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +DA:1,3 +DA:3,3 +DA:5,1 +DA:6,1 +DA:7,1 +DA:9,0 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,0 +DA:20,1 +DA:22,0 +LF:13 +LH:10 +BRDA:17,0,0,0 +BRDA:17,0,1,1 +BRF:2 +BRH:1 +end_of_record +TN: +SF:controllers\UserController.js +FN:6,(anonymous_0) +FN:15,(anonymous_1) +FNF:2 +FNH:2 +FNDA:7,(anonymous_0) +FNDA:3,(anonymous_1) +DA:1,3 +DA:2,3 +DA:3,3 +DA:5,3 +DA:7,7 +DA:8,7 +DA:9,1 +DA:11,6 +DA:16,3 +DA:17,3 +DA:18,3 +DA:19,1 +DA:21,2 +DA:22,1 +DA:24,1 +DA:25,1 +DA:26,0 +DA:28,1 +DA:29,1 +DA:30,0 +DA:32,1 +DA:33,1 +DA:35,2 +LF:23 +LH:21 +BRDA:18,0,0,1 +BRDA:18,0,1,2 +BRDA:21,1,0,1 +BRDA:21,1,1,1 +BRDA:25,2,0,0 +BRDA:25,2,1,1 +BRDA:29,3,0,0 +BRDA:29,3,1,1 +BRF:8 +BRH:6 +end_of_record +TN: +SF:helpers\bcrypt.js +FN:3,(anonymous_0) +FN:8,(anonymous_1) +FNF:2 +FNH:2 +FNDA:4,(anonymous_0) +FNDA:1,(anonymous_1) +DA:1,3 +DA:3,3 +DA:4,4 +DA:5,4 +DA:8,3 +DA:9,1 +DA:12,3 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:helpers\jwt.js +FN:5,(anonymous_0) +FN:9,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:16,(anonymous_1) +DA:1,3 +DA:2,3 +DA:4,3 +DA:6,3 +DA:10,16 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:middlewares\authentication.js +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:19,(anonymous_0) +DA:1,3 +DA:2,3 +DA:4,3 +DA:6,19 +DA:7,19 +DA:8,19 +DA:9,0 +DA:11,19 +DA:12,19 +DA:13,3 +DA:15,16 +DA:16,15 +DA:17,15 +DA:18,0 +DA:20,15 +DA:24,15 +DA:26,4 +LF:17 +LH:15 +BRDA:8,0,0,0 +BRDA:8,0,1,19 +BRDA:12,1,0,3 +BRDA:12,1,1,16 +BRDA:17,2,0,0 +BRDA:17,2,1,15 +BRF:6 +BRH:4 +end_of_record +TN: +SF:middlewares\authorization.js +FN:5,(anonymous_0) +FN:23,(anonymous_1) +FNF:2 +FNH:2 +FNDA:2,(anonymous_0) +FNDA:7,(anonymous_1) +DA:1,3 +DA:4,3 +DA:6,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,1 +DA:12,1 +DA:13,0 +DA:14,0 +DA:17,1 +DA:19,1 +DA:24,7 +DA:25,7 +DA:26,0 +DA:28,7 +DA:30,0 +LF:17 +LH:13 +BRDA:9,0,0,1 +BRDA:9,0,1,1 +BRDA:12,1,0,0 +BRDA:12,1,1,1 +BRDA:13,2,0,0 +BRDA:13,2,1,0 +BRDA:25,3,0,0 +BRDA:25,3,1,7 +BRF:8 +BRH:4 +end_of_record +TN: +SF:middlewares\errorHandler.js +FN:1,errorHandler +FNF:1 +FNH:1 +FNDA:17,errorHandler +DA:2,17 +DA:3,17 +DA:5,17 +DA:7,8 +DA:8,8 +DA:9,8 +DA:11,1 +DA:12,1 +DA:13,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:19,0 +DA:20,0 +DA:21,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:28,4 +DA:29,4 +DA:30,4 +DA:32,1 +DA:33,1 +DA:34,1 +DA:36,0 +DA:37,0 +DA:38,0 +DA:40,1 +DA:41,1 +DA:42,1 +DA:44,1 +DA:45,1 +DA:46,1 +DA:48,0 +DA:49,0 +DA:50,0 +DA:52,17 +DA:55,3 +LF:38 +LH:26 +BRDA:2,0,0,17 +BRDA:2,0,1,17 +BRDA:3,1,0,17 +BRDA:3,1,1,8 +BRDA:5,2,0,8 +BRDA:5,2,1,1 +BRDA:5,2,2,1 +BRDA:5,2,3,0 +BRDA:5,2,4,0 +BRDA:5,2,5,3 +BRDA:5,2,6,4 +BRDA:5,2,7,1 +BRDA:5,2,8,0 +BRDA:5,2,9,1 +BRDA:5,2,10,1 +BRDA:5,2,11,0 +BRF:16 +BRH:12 +end_of_record +TN: +SF:models\character.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:16,3 +DA:26,3 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\index.js +FN:21,(anonymous_0) +FN:29,(anonymous_1) +FN:34,(anonymous_2) +FNF:3 +FNH:3 +FNDA:21,(anonymous_0) +FNDA:18,(anonymous_1) +FNDA:18,(anonymous_2) +DA:3,3 +DA:4,3 +DA:5,3 +DA:6,3 +DA:7,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:13,3 +DA:14,0 +DA:16,3 +DA:19,3 +DA:22,21 +DA:30,18 +DA:31,18 +DA:34,3 +DA:35,18 +DA:36,18 +DA:40,3 +DA:41,3 +DA:43,3 +LF:21 +LH:20 +BRDA:8,0,0,3 +BRDA:8,0,1,0 +BRDA:13,1,0,0 +BRDA:13,1,1,3 +BRDA:23,2,0,21 +BRDA:23,2,1,21 +BRDA:23,2,2,18 +BRDA:23,2,3,18 +BRDA:35,3,0,18 +BRDA:35,3,1,0 +BRF:10 +BRH:7 +end_of_record +TN: +SF:models\party.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:13,3 +DA:16,3 +DA:22,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\team.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:13,3 +DA:14,3 +DA:17,3 +DA:64,3 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\type.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:13,3 +DA:16,3 +DA:22,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\user.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:14,3 +DA:17,3 +DA:68,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:models\weapon.js +FN:5,(anonymous_0) +FN:12,(anonymous_1) +FNF:2 +FNH:2 +FNDA:3,(anonymous_0) +FNDA:3,(anonymous_1) +DA:4,3 +DA:5,3 +DA:16,3 +DA:27,3 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:routes\index.js +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:5,3 +DA:6,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:13,3 +DA:15,3 +DA:16,3 +DA:17,3 +DA:18,3 +DA:19,3 +DA:20,3 +DA:21,3 +DA:23,3 +LF:18 +LH:18 +BRF:0 +BRH:0 +end_of_record diff --git a/data/party.json b/data/party.json new file mode 100644 index 0000000..b609b38 --- /dev/null +++ b/data/party.json @@ -0,0 +1,30 @@ +[ + { + "id": 1, + "UserId": 1 + }, + { + "id": 2, + "UserId": 1 + }, + { + "id": 3, + "UserId": 1 + }, + { + "id": 4, + "UserId": 2 + }, + { + "id": 5, + "UserId": 2 + }, + { + "id": 6, + "UserId": 2 + }, + { + "id": 7, + "UserId": 2 + } +] \ No newline at end of file diff --git a/data/team.json b/data/team.json new file mode 100644 index 0000000..59a5d37 --- /dev/null +++ b/data/team.json @@ -0,0 +1,38 @@ +[ + { + "id": 1, + "CharacterId": 1, + "WeaponId": 4, + "PartyId": 1 + }, + { + "id": 2, + "CharacterId": 1, + "WeaponId": 4, + "PartyId": 1 + }, + { + "id": 3, + "CharacterId": 1, + "WeaponId": 4, + "PartyId": 1 + }, + { + "id": 4, + "CharacterId": 1, + "WeaponId": 4, + "PartyId": 1 + }, + { + "id": 5, + "CharacterId": 1, + "WeaponId": 4, + "PartyId": 2 + }, + { + "id": 6, + "CharacterId": 1, + "WeaponId": 4, + "PartyId": 2 + } +] \ No newline at end of file diff --git a/middlewares/authentication.js b/middlewares/authentication.js index 3bc5dc2..ba267f6 100644 --- a/middlewares/authentication.js +++ b/middlewares/authentication.js @@ -23,7 +23,6 @@ module.exports = { }; next(); } catch (err) { - console.log(err) next(err) } } diff --git a/middlewares/authorization.js b/middlewares/authorization.js index 74fb6d6..b9b7647 100644 --- a/middlewares/authorization.js +++ b/middlewares/authorization.js @@ -6,7 +6,6 @@ module.exports = { const id = req.params.id try { const party = await Party.findByPk(id, { include: Team }); - console.log(party) if (!party) { throw ({ name: `delete 404`, id }); }; diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js index 5b94622..6f1c792 100644 --- a/middlewares/errorHandler.js +++ b/middlewares/errorHandler.js @@ -25,7 +25,7 @@ function errorHandler(err, req, res, next) { break; case `Unauthenticated`: case `JsonWebTokenError`: - status = 404 + status = 401 message = `Unauthenticated` break; case `Party Full`: @@ -44,7 +44,7 @@ function errorHandler(err, req, res, next) { status = 400 message = `Cannot delete party that has teams` break; - case `Forbidden`: + case `Forbidden`: status = 404 message = `You are not authorized` break; diff --git a/models/user.js b/models/user.js index 27d6349..e66fc8a 100644 --- a/models/user.js +++ b/models/user.js @@ -21,7 +21,7 @@ module.exports = (sequelize, DataTypes) => { validate: { notEmpty: { args: true, - msg: `Name is required` + msg: `Name cannot be empty` }, notNull: { args: true, @@ -53,7 +53,7 @@ module.exports = (sequelize, DataTypes) => { validate: { notEmpty: { args: true, - msg: `Password is required` + msg: `Password cannot be empty` }, notNull: { args: true, diff --git a/package-lock.json b/package-lock.json index 212b0c0..4986106 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,1245 +17,3778 @@ "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", "sequelize": "^6.37.3", - "sequelize-cli": "^6.6.2" + "sequelize-cli": "^6.6.2", + "supertest": "^7.0.0" + }, + "devDependencies": { + "jest": "^29.7.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "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/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@babel/compat-data": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@babel/core": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "dev": true, "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, "engines": { - "node": ">=14" + "node": ">=6.9.0" } }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { - "@types/ms": "*" + "yallist": "^3.0.2" } }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", + "dev": true, "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">= 0.6" + "node": ">=6.9.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, "dependencies": { - "debug": "4" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { - "node": ">= 6.0.0" + "node": ">=6.9.0" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { - "node": ">=6.0" + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "node_modules/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">=6.9.0" } }, - "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "node_modules/@babel/helpers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "dev": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">= 10.0.0" + "node": ">=6.9.0" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "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.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=4" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.8.0" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/cli-color": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", - "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.64", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.15", - "timers-ext": "^0.1.7" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=0.10" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">= 0.8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "dependencies": { - "safe-buffer": "5.2.1" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, "dependencies": { - "object-assign": "^4", - "vary": "^1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">= 0.10" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=0.12" + "node": ">=6.9.0" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "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" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=12" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { "node": ">=12" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/dottie": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", - "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "safe-buffer": "^5.0.1" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, - "bin": { - "editorconfig": "bin/editorconfig" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.2.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=0.10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">=0.12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/event-emitter": { + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "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 + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "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.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001641", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", + "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "engines": { + "node": ">=14" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/editorconfig/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.823", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.823.tgz", + "integrity": "sha512-4h+oPeAiGQOHFyUJOqpoEcPj/xxlicxBzOErVeYVMMmAiXUXsGpsFd0QXBMaUUbnD8hhSfLf9uw+MlsoIA7j5w==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=10" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, "dependencies": { - "type": "^2.7.2" + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "peerDependenciesMeta": { - "debug": { + "supports-color": { "optional": true } } }, - "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/jackspeak": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.1.tgz", + "integrity": "sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, "dependencies": { - "minipass": "^3.0.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=12" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "detect-newline": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, "dependencies": { - "es-define-property": "^1.0.0" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, "dependencies": { - "function-bind": "^1.1.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=6.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" }, "peerDependenciesMeta": { - "supports-color": { + "jest-resolve": { "optional": true } } }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inflection": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", - "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", - "engines": [ - "node >= 0.4.0" - ] - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "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==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, "engines": { - "node": ">= 0.10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, "dependencies": { - "hasown": "^2.0.2" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/jackspeak": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.1.tgz", - "integrity": "sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-beautify": { @@ -1360,6 +3893,55 @@ "node": ">=14" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -1416,6 +3998,42 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -1494,6 +4112,15 @@ "semver": "bin/semver.js" } }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1525,6 +4152,12 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -1533,6 +4166,19 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -1563,6 +4209,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1640,6 +4295,12 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -1677,6 +4338,18 @@ } } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -1691,6 +4364,27 @@ "node": ">=6" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -1733,12 +4427,78 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/package-json-from-dist": { @@ -1746,6 +4506,24 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1754,6 +4532,15 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1876,6 +4663,45 @@ "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -1911,6 +4737,45 @@ "node": ">=0.10.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -1933,6 +4798,22 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -1969,6 +4850,12 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -2006,6 +4893,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", @@ -2281,6 +5198,40 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -2289,6 +5240,24 @@ "node": ">= 10.x" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -2305,6 +5274,19 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -2355,6 +5337,111 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/supertest": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -2382,6 +5469,20 @@ "node": ">=10" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/timers-ext": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", @@ -2394,6 +5495,33 @@ "node": ">=0.12" } }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2417,6 +5545,27 @@ "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2461,6 +5610,36 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2482,6 +5661,20 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/validator": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", @@ -2498,6 +5691,15 @@ "node": ">= 0.8" } }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2580,6 +5782,19 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -2625,6 +5840,18 @@ "engines": { "node": ">=10" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 2415803..8a363cf 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,21 @@ "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", "sequelize": "^6.37.3", - "sequelize-cli": "^6.6.2" + "sequelize-cli": "^6.6.2", + "supertest": "^7.0.0" }, "name": "ip-rmt50", "description": "", "version": "1.0.0", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest --watchAll --detectOpenHandles --coverage", + "dev": "nodemon bin/www" }, "keywords": [], "author": "", - "license": "ISC" + "license": "ISC", + "devDependencies": { + "jest": "^29.7.0" + } } diff --git a/routes/index.js b/routes/index.js index 9fa5148..2b76346 100644 --- a/routes/index.js +++ b/routes/index.js @@ -5,8 +5,8 @@ const { authentication } = require('../middlewares/authentication'); const { authorization, isAdmin } = require('../middlewares/authorization'); const router = require('express').Router() -router.get('/pub/weapons', getWeapons); -router.get('/pub/weapons/:id', getWeaponById); +router.get('/weapons', getWeapons); +router.get('/weapons/:id', getWeaponById); router.post('/login', login); From e2f1c1a43446dd2b534cdd86e453e90f59f5b0b7 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Wed, 10 Jul 2024 23:40:30 +0700 Subject: [PATCH 13/22] docs: updating docs --- README.md | 455 ++++++++++++++++++++++++++++++++- controllers/PartyController.js | 5 +- middlewares/errorHandler.js | 8 + 3 files changed, 464 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 03e6daa..a007b90 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,456 @@ ## Endpoints List of available endpoints: -- `GET /character` -- `GET /weapon` +- `POST /register` +- `POST /login` -### 1. GET /character \ No newline at end of file +- `GET /weapons` +- `GET /weapons/:id` + +- `GET /party` +- `POST /party` +- `DELETE /party/:id` +- `POST /party/:id/team` +- `PUT /party/:id/team/:teamId` +- `DELETE /party/:id/team/:teamId` + + +### 1. `POST /register` + +Description: + +- Add new user + +Request: +- req.body: + +```json +{ + "name": "string (required)", + "email": "string (required)", + "role": "string (required)", + "password": "string (required)" +} +``` + +Response (201 - Created) + +```json + [ + { + "id": "integer", + "email": "string", + } + ] +``` + +Response (400 - Bad Request) + +```json +{ + "message": "Validation error message" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 2. `POST /login` + +Description: + +- Login + +Request: +- req.body: + +```json +{ + "email": "string (required)", + "password": "string (required)" +} +``` + +Response (200 - OK) + +```json + [ + { + "access_token": "integer", + } + ] +``` + +Response (400 - Bad Request) + +```json +{ + "message": "Validation error message" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 3. `GET /weapons` + +Description: + +- Show all the weapons + +Response (200 - OK) + +```json + [ + { + "id": "integer", + "name": "string", + "rarity": "integer", + "TypeId": "integer", + "baseAttack": "integer", + "effect": "string", + "imgUrl": "string" + } + ] +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 4. `GET /weapons/:id` + +Description: + +- Show specifi weapons by id + +Request: +- params: + +```json +{ + "id": "integer (required)" +} +``` + +Response (200 - OK) + +```json + [ + { + "id": "integer", + "name": "string", + "rarity": "integer", + "TypeId": "integer", + "baseAttack": "integer", + "effect": "string", + "imgUrl": "string" + } + ] +``` + +Response (404 - Not Found) + +```json +{ + "message": "Weapon with id not found" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 5. `GET /party` + +Description: + +- Show all user's party + +Request: + +```json +{ + "req.user.id": "integer" +} +``` + +Response (200 - OK) + +```json +[ + { + "id": "integer", + "UserId": "integer", + "Teams": [ + { + "CharacterId": "integer", + "WeaponId": "integer" + } + ] + } +] + +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 6. `POST /party` + +Description: + +- Show all user's party + +Request: + +```json +{ + "req.user.id": "integer" +} +``` + +- req.body: + +```json +{ + "UserId": "integer" +} +``` + +Response (201 - Created) + +```json + [ + { + "id": "integer", + "UserId": "integer", + } + ] +``` +Response (400 - Bad Request) + +```json +{ + "message": "Your party is full" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 7. `DELETE /party/:id` + +Description: + +- Delete user's party by id + +Request: + +```json +{ + "req.user.id": "integer" +} +``` + +Response (200 - OK) + +```json + [ + { + "message": "string", + } + ] +``` + +Response (400 - Bad Request) + +```json +{ + "message": "Cannot delete party that has teams" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 8. `POST /party/:id/team` + +Description: + +- Add team into user's party + +Request: +- params: + +```json +{ + "id": "integer (required)" +} +``` + +- req.body: +```json +{ + "CharacterId": "integer (required)", + "WeaponId": "integer (required)" +} +``` + +Response (201 - Created) + +```json + [ + { + "id": "integer", + "CharacterId": "integer", + "WeaponId": "integer", + "PartyId": "integer", + } +] +``` + +Response (400 - Bad Request) + +```json +{ + "message": "Your team can only have 4 Character" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 9. `PUT /party/:id/team/:teamId` + +Description: + +- Update team from user's party + +Request: +- params: + +```json +{ + "id": "integer (required)" +} +``` + +- req.body: + +```json + [ + { + "CharacterId": "integer", + "WeaponId": "integer", + } +] +``` + +Response (200 - OK) + +```json + [ + { + "id": "integer", + "CharacterId": "integer", + "WeaponId": "integer", + "PartyId": "integer", + } +] +``` + +Response (400 - Bad Request) + +```json +{ + "message": "Your team can only have 4 Character" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` + +### 10. `DELETE /party/:id/team/:teamId` + +Description: + +- Delete team from user's party + +Request: +- params: + +```json +{ + "id": "integer (required)" +} +``` + +Response (200 - OK) + +```json + [ + { + "message": "Team with id has been deleted", + } +] +``` + +Response (400 - Bad Request) + +```json +{ + "message": "Team with id not found" +} +``` + +Response (500 - Internal Server Error) + +```json +{ + "message": "Internal server error" +} +``` diff --git a/controllers/PartyController.js b/controllers/PartyController.js index f9a3a16..e0abcd3 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -73,10 +73,13 @@ module.exports = { const { teamId } = req.params; try { const team = await Team.findByPk(teamId); + if (!team) { + throw ({ name: `TeamNotFound`, id: teamId }) + }; team.destroy(); res.status(200).json({ message: `Team with id ${team.id} has been deleted` }) } catch (err) { next(err); }; } -} \ No newline at end of file +} diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js index 6f1c792..2b720cb 100644 --- a/middlewares/errorHandler.js +++ b/middlewares/errorHandler.js @@ -44,6 +44,14 @@ function errorHandler(err, req, res, next) { status = 400 message = `Cannot delete party that has teams` break; + case `404`: + status = 404 + message = `Weapon with id ${err.id} not found` + break; + case `TeamNotFound`: + status = 404 + message = `Team with id ${err.id} not found` + break; case `Forbidden`: status = 404 message = `You are not authorized` From 7277c4c67d823c637d88ccbdabb36678458e6d95 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Thu, 11 Jul 2024 00:49:56 +0700 Subject: [PATCH 14/22] chore: deployment --- app.js | 4 ++++ config/config.json | 6 +----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app.js b/app.js index 8b9e697..e48a8f5 100644 --- a/app.js +++ b/app.js @@ -1,3 +1,7 @@ +if (process.env.NODE_ENV !== 'production') { + require('dotenv').config(); +} + require('dotenv').config(); const express = require('express'); const app = express(); diff --git a/config/config.json b/config/config.json index ed79e97..b72479c 100644 --- a/config/config.json +++ b/config/config.json @@ -15,10 +15,6 @@ "logging": false }, "production": { - "username": "root", - "password": null, - "database": "database_production", - "host": "127.0.0.1", - "dialect": "mysql" + "use_env_variable": "postgresql://postgres.qdmpuyahuizqllmemvct:ysf.mPYzkZ6@7!G@aws-0-ap-southeast-1.pooler.supabase.com:6543/postgres" } } \ No newline at end of file From 26fba161d591e06ebd4cf835596a0d40e13602cc Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Thu, 11 Jul 2024 10:05:57 +0700 Subject: [PATCH 15/22] chore: add-user --- controllers/UserController.js | 33 ++++++++++++++++++++++++++++++++- middlewares/authorization.js | 3 ++- middlewares/errorHandler.js | 6 +++++- routes/index.js | 6 ++++-- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/controllers/UserController.js b/controllers/UserController.js index f38ca42..1b8d81d 100644 --- a/controllers/UserController.js +++ b/controllers/UserController.js @@ -12,6 +12,15 @@ module.exports = { }; }, + async addUser(req, res, next) { + try { + const user = await User.create(req.body); + res.status(201).json({ id: user.id, email: user.email }); + } catch (err) { + next(err); + }; + }, + async login(req, res, next) { try { const { email, password } = req.body; @@ -34,5 +43,27 @@ module.exports = { } catch (err) { next(err); }; - } + }, + + async getUser(req, res, next) { + try { + const users = await User.findAll(); + res.status(200).json({ users }) + } catch (err) { + next(err); + }; + }, + + async getUserById(req, res, next) { + const { id } = req.params; + try { + const users = await User.findByPk(id); + if(!users){ + throw ({name: `UserNotFound`, id}) + } + res.status(200).json({ users }) + } catch (err) { + next(err); + }; + }, } \ No newline at end of file diff --git a/middlewares/authorization.js b/middlewares/authorization.js index b9b7647..d46426d 100644 --- a/middlewares/authorization.js +++ b/middlewares/authorization.js @@ -29,5 +29,6 @@ module.exports = { } catch (err) { next(err) } - } + }, + } \ No newline at end of file diff --git a/middlewares/errorHandler.js b/middlewares/errorHandler.js index 2b720cb..6837d21 100644 --- a/middlewares/errorHandler.js +++ b/middlewares/errorHandler.js @@ -48,7 +48,7 @@ function errorHandler(err, req, res, next) { status = 404 message = `Weapon with id ${err.id} not found` break; - case `TeamNotFound`: + case `TeamNotFound`: status = 404 message = `Team with id ${err.id} not found` break; @@ -56,6 +56,10 @@ function errorHandler(err, req, res, next) { status = 404 message = `You are not authorized` break; + case `UserNotFound`: + status = 404 + message = `User with id ${err.id} not found` + break; } res.status(status).json({ message: message }) } diff --git a/routes/index.js b/routes/index.js index 2b76346..0b3f810 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,6 +1,6 @@ const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); -const { register, login } = require('../controllers/UserController'); +const { register, login, getUser, getUserById, addUser } = require('../controllers/UserController'); const { authentication } = require('../middlewares/authentication'); const { authorization, isAdmin } = require('../middlewares/authorization'); const router = require('express').Router() @@ -8,10 +8,12 @@ const router = require('express').Router() router.get('/weapons', getWeapons); router.get('/weapons/:id', getWeaponById); router.post('/login', login); - +router.post('/add-user', addUser); router.use(authentication); +router.get('/users', getUser); +router.get('/users/:id', getUserById); router.post('/register', isAdmin, register); router.get('/party', getParty); router.post('/party', createParty); From 596b9665b68d9070c4c4ca7e2f46907dbdd2b9fd Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Thu, 11 Jul 2024 16:02:10 +0700 Subject: [PATCH 16/22] fix: config --- app.js | 2 ++ config/config.json | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index e48a8f5..88f6daf 100644 --- a/app.js +++ b/app.js @@ -3,6 +3,7 @@ if (process.env.NODE_ENV !== 'production') { } require('dotenv').config(); +const cors = require('cors') const express = require('express'); const app = express(); const routes = require('./routes'); @@ -15,6 +16,7 @@ app.get('/', (req, res) => { res.send('Hello World!'); }); +app.use(cors()) app.use(routes); app.use(errorHandler); diff --git a/config/config.json b/config/config.json index b72479c..20a8a5c 100644 --- a/config/config.json +++ b/config/config.json @@ -15,6 +15,5 @@ "logging": false }, "production": { - "use_env_variable": "postgresql://postgres.qdmpuyahuizqllmemvct:ysf.mPYzkZ6@7!G@aws-0-ap-southeast-1.pooler.supabase.com:6543/postgres" - } + "use_env_variable": "DATABASE_URL"} } \ No newline at end of file From 93874eea5c619300e9c8058bf3afc2d57af5cb1f Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Thu, 11 Jul 2024 16:53:08 +0700 Subject: [PATCH 17/22] feat: google login --- controllers/UserController.js | 29 +++++- package-lock.json | 191 +++++++++++++++++++++++++++++++++- package.json | 1 + routes/index.js | 3 +- 4 files changed, 220 insertions(+), 4 deletions(-) diff --git a/controllers/UserController.js b/controllers/UserController.js index 1b8d81d..53b9d78 100644 --- a/controllers/UserController.js +++ b/controllers/UserController.js @@ -1,6 +1,8 @@ const { comparePassword } = require('../helpers/bcrypt'); const { signToken } = require('../helpers/jwt'); const { User } = require('../models'); +const { OAuth2Client } = require('google-auth-library'); +const client = new OAuth2Client(); module.exports = { async register(req, res, next) { @@ -58,12 +60,35 @@ module.exports = { const { id } = req.params; try { const users = await User.findByPk(id); - if(!users){ - throw ({name: `UserNotFound`, id}) + if (!users) { + throw ({ name: `UserNotFound`, id }) } res.status(200).json({ users }) } catch (err) { next(err); }; }, + + async loginGoogle(req, res, next) { + try { + const ticket = await client.verifyIdToken({ + idToken: req.body.googleToken, + audience: "848600054102-tftpfkiph7b62bugt6284mloq4ckpau9.apps.googleusercontent.com", + }); + const payload = ticket.getPayload(); + const [user, created] = await User.findOrCreate({ + where: { email: payload.email }, + hooks: false, + defaults: { + name: payload.name, + email: payload.email, + password: Math.random().toString() + }, + }); + const access_token = signToken({ id: user.id }) + res.status(created ? 201 : 200).json({ access_token }) + } catch (err) { + next(err) + } + } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4986106..a389ce0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", + "google-auth-library": "^9.11.0", "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", "sequelize": "^6.37.3", @@ -1570,6 +1571,25 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcrypt": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", @@ -1583,6 +1603,14 @@ "node": ">= 10.0.0" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -2469,6 +2497,11 @@ "type": "^2.7.2" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2701,6 +2734,89 @@ "node": ">=10" } }, + "node_modules/gaxios": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.0.tgz", + "integrity": "sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2786,6 +2902,41 @@ "node": ">=4" } }, + "node_modules/google-auth-library": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.11.0.tgz", + "integrity": "sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-auth-library/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/google-auth-library/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -2802,6 +2953,37 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/gtoken/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/gtoken/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3061,7 +3243,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -3924,6 +4105,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", diff --git a/package.json b/package.json index 8a363cf..658a7d0 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.19.2", + "google-auth-library": "^9.11.0", "jsonwebtoken": "^9.0.2", "pg": "^8.12.0", "sequelize": "^6.37.3", diff --git a/routes/index.js b/routes/index.js index 0b3f810..92b87b2 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,6 +1,6 @@ const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); -const { register, login, getUser, getUserById, addUser } = require('../controllers/UserController'); +const { register, login, getUser, getUserById, addUser, loginGoogle } = require('../controllers/UserController'); const { authentication } = require('../middlewares/authentication'); const { authorization, isAdmin } = require('../middlewares/authorization'); const router = require('express').Router() @@ -8,6 +8,7 @@ const router = require('express').Router() router.get('/weapons', getWeapons); router.get('/weapons/:id', getWeaponById); router.post('/login', login); +router.post('/login/google', loginGoogle); router.post('/add-user', addUser); router.use(authentication); From ed8e2cd8f79490fee347398c752c369fafdb50ec Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Thu, 11 Jul 2024 22:28:09 +0700 Subject: [PATCH 18/22] chore: redux show character --- controllers/PartyController.js | 12 +++++++++++- migrations/20240709082154-create-character.js | 3 +++ models/character.js | 3 ++- routes/index.js | 3 ++- seeders/20240709041809-character-seed.js | 1 + 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/controllers/PartyController.js b/controllers/PartyController.js index e0abcd3..195980e 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -1,4 +1,4 @@ -const { Party, Team } = require('../models'); +const { Party, Team, Character } = require('../models'); module.exports = { async getParty(req, res, next) { @@ -14,6 +14,16 @@ module.exports = { }; }, + async getCharacter(req, res, next) { + try { + const data = await Character.findAll(); + res.status(200).json({ data }) + } catch (err) { + // next(err) + console.log(err) + } + }, + async createParty(req, res, next) { try { const checking = await Party.findAll({ where: { UserId: req.user.id }, raw: true }) diff --git a/migrations/20240709082154-create-character.js b/migrations/20240709082154-create-character.js index 63c16a5..58baf8a 100644 --- a/migrations/20240709082154-create-character.js +++ b/migrations/20240709082154-create-character.js @@ -24,6 +24,9 @@ module.exports = { wiki_url: { type: Sequelize.STRING }, + TeamId: { + type: Sequelize.STRING + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/models/character.js b/models/character.js index 987cf93..4365b89 100644 --- a/models/character.js +++ b/models/character.js @@ -18,7 +18,8 @@ module.exports = (sequelize, DataTypes) => { rarity: DataTypes.STRING, weapon: DataTypes.STRING, vision: DataTypes.STRING, - wiki_url: DataTypes.STRING + wiki_url: DataTypes.STRING, + TeamId: DataTypes.STRING }, { sequelize, modelName: 'Character', diff --git a/routes/index.js b/routes/index.js index 92b87b2..7b916b1 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,4 +1,4 @@ -const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam } = require('../controllers/PartyController'); +const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam, getCharacter } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); const { register, login, getUser, getUserById, addUser, loginGoogle } = require('../controllers/UserController'); const { authentication } = require('../middlewares/authentication'); @@ -13,6 +13,7 @@ router.post('/add-user', addUser); router.use(authentication); +router.get('/characters', getCharacter); router.get('/users', getUser); router.get('/users/:id', getUserById); router.post('/register', isAdmin, register); diff --git a/seeders/20240709041809-character-seed.js b/seeders/20240709041809-character-seed.js index 4680722..2104e16 100644 --- a/seeders/20240709041809-character-seed.js +++ b/seeders/20240709041809-character-seed.js @@ -13,6 +13,7 @@ module.exports = { const response = await axios.request(options) response.data.results.map((e) => { e.createdAt = e.updatedAt = new Date(); + e.TeamId = '' return e }) await queryInterface.bulkInsert('Characters', response.data.results); From 56f6fc89049a21f659a2925ca286d75e2c7311cf Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Fri, 12 Jul 2024 11:28:56 +0700 Subject: [PATCH 19/22] chore: add team and update team --- controllers/PartyController.js | 21 +++++++++++++++------ helpers/gemini.js | 28 ++++++++++++++++++++++++++++ package-lock.json | 9 +++++++++ package.json | 1 + routes/index.js | 21 +++++++++++++++++---- 5 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 helpers/gemini.js diff --git a/controllers/PartyController.js b/controllers/PartyController.js index 195980e..f6360f1 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -6,7 +6,7 @@ module.exports = { const party = await Party.findAll({ where: { UserId: req.user.id }, attributes: { exclude: ['createdAt', 'updatedAt'] }, - include: [{ model: Team, attributes: { exclude: ['id', 'PartyId', 'createdAt', 'updatedAt'] } }] + include: [{ model: Team, attributes: { exclude: ['createdAt', 'updatedAt'] } }] }); res.status(200).json({ party }); } catch (err) { @@ -19,15 +19,24 @@ module.exports = { const data = await Character.findAll(); res.status(200).json({ data }) } catch (err) { - // next(err) - console.log(err) + next(err) + } + }, + + async getCharacterById(req, res, next) { + const { id } = req.params + try { + const data = await Character.findByPk(id); + res.status(200).json({ data }) + } catch (err) { + next(err) } }, async createParty(req, res, next) { try { const checking = await Party.findAll({ where: { UserId: req.user.id }, raw: true }) - if (checking.length > 3) { + if (checking.length > 0) { throw ({ name: `Party Full` }); }; const party = await Party.create({ UserId: req.user.id }); @@ -55,11 +64,11 @@ module.exports = { const { id } = req.params try { const checking = await Team.findAll({ where: { PartyId: id } }); - if (checking.length > 4) { + if (checking.length > 3) { throw ({ name: `Team Full` }) }; const team = await Team.create({ - ...req.body, PartyId: id + ...req.body, PartyId: id, }); res.status(201).json({ team }); } catch (err) { diff --git a/helpers/gemini.js b/helpers/gemini.js new file mode 100644 index 0000000..88fd9cc --- /dev/null +++ b/helpers/gemini.js @@ -0,0 +1,28 @@ +const { GoogleGenerativeAI } = require("@google/generative-ai"); +require('dotenv').config() + +const gemini = async (character) => { + const genAI = new GoogleGenerativeAI(process.env.GOOGLE_AI_API_KEY); + + const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); + + + const prompt = `what is the best weapon for ${character} in Genshin Impact. Response must be in format JSON. like this:{ + "character":{ + "name":... + "recommended_Weapon":... + "base_Attackk":... + "imageUrl":... + } + }, + create without \`\`\`json and \`\`\`` + + const result = await model.generateContent(prompt); + const response = await result.response; + let text = response.text(); + // console.log(text); + text = JSON.parse(text.trim()) + return text; +} + +module.exports = gemini \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a389ce0..01f5fcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@google/generative-ai": "^0.14.1", "axios": "^1.7.2", "bcrypt": "^5.1.1", "cors": "^2.8.5", @@ -673,6 +674,14 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@google/generative-ai": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.14.1.tgz", + "integrity": "sha512-pevEyZCb0Oc+dYNlSberW8oZBm4ofeTD5wN01TowQMhTwdAbGAnJMtQzoklh6Blq2AKsx8Ox6FWa44KioZLZiA==", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", diff --git a/package.json b/package.json index 658a7d0..5e78182 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "@google/generative-ai": "^0.14.1", "axios": "^1.7.2", "bcrypt": "^5.1.1", "cors": "^2.8.5", diff --git a/routes/index.js b/routes/index.js index 7b916b1..18f50e0 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,19 +1,32 @@ -const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam, getCharacter } = require('../controllers/PartyController'); +const { getParty, createParty, createTeam, updateParty, deleteParty, updateTeam, getCharacter, getCharacterById, deleteTeam } = require('../controllers/PartyController'); const { getWeapons, getWeaponById } = require('../controllers/PublicConroller'); const { register, login, getUser, getUserById, addUser, loginGoogle } = require('../controllers/UserController'); const { authentication } = require('../middlewares/authentication'); const { authorization, isAdmin } = require('../middlewares/authorization'); const router = require('express').Router() +const gemini = require('../helpers/gemini') -router.get('/weapons', getWeapons); -router.get('/weapons/:id', getWeaponById); router.post('/login', login); router.post('/login/google', loginGoogle); router.post('/add-user', addUser); +router.post('/which-is-better', async (req, res, next) => { + try { + const { character } = req.body + let data = await gemini(character) + // console.log(data,'<<<<<<<<<<<<') + res.status(200).json(data) + } catch (err) { + console.log(err, '<<<') + } +}) + router.use(authentication); +router.get('/weapons', getWeapons); +router.get('/weapons/:id', getWeaponById); router.get('/characters', getCharacter); +router.get('/characters/:id', getCharacterById); router.get('/users', getUser); router.get('/users/:id', getUserById); router.post('/register', isAdmin, register); @@ -22,6 +35,6 @@ router.post('/party', createParty); router.delete('/party/:id', authorization, deleteParty); router.post('/party/:id/team', createTeam); router.put('/party/:id/team/:teamId', updateTeam); -router.delete('/party/:id/team/:teamId', deleteParty); +router.delete('/party/:id/team/:teamId', deleteTeam); module.exports = router \ No newline at end of file From 9142095b4b294e09175b0e7fe905e99449a41134 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Fri, 12 Jul 2024 11:53:12 +0700 Subject: [PATCH 20/22] fix: association --- models/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user.js b/models/user.js index e66fc8a..b049218 100644 --- a/models/user.js +++ b/models/user.js @@ -11,7 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - User.hasOne(models.Party) + User.hasOne(models.Party, { foreignKey: `UserId` }) } } User.init({ From 531da111f1280a903e668bb14dc1a7a5aada1f7f Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Fri, 12 Jul 2024 13:23:30 +0700 Subject: [PATCH 21/22] fix: url --- controllers/PartyController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/PartyController.js b/controllers/PartyController.js index f6360f1..d14b244 100644 --- a/controllers/PartyController.js +++ b/controllers/PartyController.js @@ -36,7 +36,7 @@ module.exports = { async createParty(req, res, next) { try { const checking = await Party.findAll({ where: { UserId: req.user.id }, raw: true }) - if (checking.length > 0) { + if (checking.length > 1) { throw ({ name: `Party Full` }); }; const party = await Party.create({ UserId: req.user.id }); From 097d0813fb78f2f7e2f347eeeea1fb53fc8360c0 Mon Sep 17 00:00:00 2001 From: gerfrimrp Date: Fri, 12 Jul 2024 16:56:56 +0700 Subject: [PATCH 22/22] test: fixing test --- .gitignore | 3 +- __test__/party.test.js | 259 +- __test__/public.test.js | 25 +- __test__/user.test.js | 173 +- client/.eslintrc.cjs | 21 + client/.firebase/hosting.ZGlzdA.cache | 3 + client/.firebaserc | 5 + client/.gitignore | 24 + client/README.md | 8 + client/firebase.json | 16 + client/index.html | 22 + client/package-lock.json | 4308 +++++++++++++++++ client/package.json | 34 + client/public/vite.svg | 1 + client/src/App.jsx | 13 + client/src/assets/react.svg | 1 + client/src/components/Carousel.jsx | 59 + client/src/components/CharacterCard.jsx | 31 + client/src/components/Navbar.jsx | 101 + client/src/components/PartyCard.jsx | 12 + client/src/components/TeamCard.jsx | 85 + client/src/components/WeaponCard.jsx | 31 + .../counter/character/characterSlice.js | 23 + client/src/features/counter/counterSlice.js | 26 + client/src/main.jsx | 9 + client/src/pages/AddParty.jsx | 26 + client/src/pages/AddTeam.jsx | 110 + client/src/pages/CharacterDetails.jsx | 40 + client/src/pages/Characters.jsx | 41 + client/src/pages/Demo.jsx | 29 + client/src/pages/EditTeam.jsx | 103 + client/src/pages/Homepage.jsx | 32 + client/src/pages/Login.jsx | 154 + client/src/pages/Party.jsx | 126 + client/src/pages/Register.jsx | 143 + client/src/pages/Weapon.jsx | 38 + client/src/pages/WeaponDetails.jsx | 38 + client/src/router.jsx | 121 + client/src/store.js | 10 + client/vite.config.js | 10 + controllers/UserController.js | 2 +- coverage.png | Bin 92626 -> 99415 bytes coverage/clover.xml | 325 +- coverage/coverage-final.json | 23 +- coverage/lcov-report/IP-RMT50/app.js.html | 36 +- .../controllers/PartyController.js.html | 157 +- .../controllers/PublicConroller.js.html | 2 +- .../controllers/UserController.js.html | 200 +- .../IP-RMT50/controllers/index.html | 56 +- .../IP-RMT50/helpers/bcrypt.js.html | 8 +- .../lcov-report/IP-RMT50/helpers/index.html | 31 +- .../lcov-report/IP-RMT50/helpers/jwt.js.html | 6 +- coverage/lcov-report/IP-RMT50/index.html | 30 +- .../middlewares/authentication.js.html | 26 +- .../middlewares/authorization.js.html | 21 +- .../IP-RMT50/middlewares/errorHandler.js.html | 118 +- .../IP-RMT50/middlewares/index.html | 34 +- .../IP-RMT50/models/character.js.html | 9 +- .../lcov-report/IP-RMT50/models/index.html | 2 +- .../lcov-report/IP-RMT50/models/index.js.html | 2 +- .../lcov-report/IP-RMT50/models/party.js.html | 2 +- .../lcov-report/IP-RMT50/models/team.js.html | 2 +- .../lcov-report/IP-RMT50/models/type.js.html | 2 +- .../lcov-report/IP-RMT50/models/user.js.html | 4 +- .../IP-RMT50/models/weapon.js.html | 2 +- .../lcov-report/IP-RMT50/routes/index.html | 42 +- .../lcov-report/IP-RMT50/routes/index.js.html | 106 +- coverage/lcov-report/index.html | 112 +- coverage/lcov.info | 482 +- data/party.json | 16 +- data/team.json | 8 +- 71 files changed, 7410 insertions(+), 770 deletions(-) create mode 100644 client/.eslintrc.cjs create mode 100644 client/.firebase/hosting.ZGlzdA.cache create mode 100644 client/.firebaserc create mode 100644 client/.gitignore create mode 100644 client/README.md create mode 100644 client/firebase.json create mode 100644 client/index.html create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/public/vite.svg create mode 100644 client/src/App.jsx create mode 100644 client/src/assets/react.svg create mode 100644 client/src/components/Carousel.jsx create mode 100644 client/src/components/CharacterCard.jsx create mode 100644 client/src/components/Navbar.jsx create mode 100644 client/src/components/PartyCard.jsx create mode 100644 client/src/components/TeamCard.jsx create mode 100644 client/src/components/WeaponCard.jsx create mode 100644 client/src/features/counter/character/characterSlice.js create mode 100644 client/src/features/counter/counterSlice.js create mode 100644 client/src/main.jsx create mode 100644 client/src/pages/AddParty.jsx create mode 100644 client/src/pages/AddTeam.jsx create mode 100644 client/src/pages/CharacterDetails.jsx create mode 100644 client/src/pages/Characters.jsx create mode 100644 client/src/pages/Demo.jsx create mode 100644 client/src/pages/EditTeam.jsx create mode 100644 client/src/pages/Homepage.jsx create mode 100644 client/src/pages/Login.jsx create mode 100644 client/src/pages/Party.jsx create mode 100644 client/src/pages/Register.jsx create mode 100644 client/src/pages/Weapon.jsx create mode 100644 client/src/pages/WeaponDetails.jsx create mode 100644 client/src/router.jsx create mode 100644 client/src/store.js create mode 100644 client/vite.config.js diff --git a/.gitignore b/.gitignore index 1dcef2d..cbb7231 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -.env \ No newline at end of file +.env +coverage \ No newline at end of file diff --git a/__test__/party.test.js b/__test__/party.test.js index dda67c1..1d71343 100644 --- a/__test__/party.test.js +++ b/__test__/party.test.js @@ -5,7 +5,8 @@ const { hashPassword } = require('../helpers/bcrypt'); const { signToken } = require('../helpers/jwt'); const queryInterface = sequelize.queryInterface; -let access_token = ''; +let access_token1 = ''; +let access_token2 = ''; const party = { UserId: 1 } @@ -33,8 +34,10 @@ beforeAll(async () => { }) await queryInterface.bulkInsert(`Users`, data, {}) - let user = await User.findOne({ where: { role: `Admin` } }); - access_token = signToken({ id: user.id }) + let user1 = await User.findOne({ where: { role: `Admin` } }); + let user2 = await User.findOne({ where: { role: `Staff` } }); + access_token1 = signToken({ id: user1.id }) + access_token2 = signToken({ id: user2.id }) await queryInterface.bulkInsert('Characters', [{ id: 1, @@ -59,116 +62,158 @@ beforeAll(async () => { console.log(err) } - // const team = require('../data/team.json').map((e) => { - // delete e.id - // e.createdAt = e.updatedAt = new Date() - // return e - // }) - // await queryInterface.bulkInsert('Teams', team, {}); + const team = require('../data/team.json').map((e) => { + delete e.id + e.createdAt = e.updatedAt = new Date() + return e + }) + await queryInterface.bulkInsert('Teams', team, {}); }) describe('Party', () => { describe('/party', () => { - test('should success show all party', async () => { - let { body, status } = await request(app) - .get('/party') - .set('Authorization', `Bearer ` + access_token) - expect(status).toBe(200) - expect(body).toHaveProperty('party') - }); - - test('should success create party', async () => { - let { body, status } = await request(app) - .post('/party') - .set('Authorization', `Bearer ` + access_token) - .send({ UserId: 2 }) - expect(status).toBe(201) - expect(body).toHaveProperty('party') - }); - - test('should success create team', async () => { - let { body, status } = await request(app) - .post('/party/1/team') - .set('Authorization', `Bearer ` + access_token) - .send({ CharacterId: 1, WeaponId: 1 }) - expect(status).toBe(201) - expect(body).toHaveProperty('team') - }); - - test('should fail delete party when party have teams', async () => { - let { body, status } = await request(app) - .delete('/party/1') - .set('Authorization', `Bearer ` + access_token) - expect(status).toBe(400) - expect(body).toHaveProperty('message', "Cannot delete party that has teams") - }); - - test('should fail created team when token is wrong', async () => { - let { body, status } = await request(app) - .post('/party/1/team') - .set('Authorization', `Bearer` + access_token) - .send({ - WeaponId: 1 - }) - expect(status).toBe(401) - expect(body).toHaveProperty('message', "Unauthenticated") - }); - - test('should fail delete party when party not found', async () => { - let { body, status } = await request(app) - .delete('/party/11') - .set('Authorization', `Bearer ` + access_token) - expect(status).toBe(404) - expect(body).toHaveProperty('message', "Party with id 11 not found") - }); - - test('should fail delete party when token not found', async () => { - let { body, status } = await request(app) - .delete('/party/1') - .set('Authorization', `Bearer` + access_token) - expect(status).toBe(401) - expect(body).toHaveProperty('message', "Unauthenticated") - }); - - test('should failed create party because party is full', async () => { - let { body, status } = await request(app) - .post('/party') - .set('Authorization', `Bearer ` + access_token) - .send({ UserId: 1 }) - expect(status).toBe(400) - expect(body).toHaveProperty('message', 'Your party is full') - }); - - test('should fail created team when Weapon is null/empty', async () => { - let { body, status } = await request(app) - .post('/party/1/team') - .set('Authorization', `Bearer ` + access_token) - .send({ - CharacterId: 1 - }) - expect(status).toBe(400) - expect(body).toHaveProperty('message', "Weapon Id is required") - }); - - test('should fail created team when Character is null/empty', async () => { - let { body, status } = await request(app) - .post('/party/1/team') - .set('Authorization', `Bearer ` + access_token) - .send({ - WeaponId: 1 - }) - expect(status).toBe(400) - expect(body).toHaveProperty('message', "Character Id is required") + describe('Success', () => { + test('should success show all party', async () => { + let { body, status } = await request(app) + .get('/party') + .set('Authorization', `Bearer ` + access_token1) + expect(status).toBe(200) + expect(body).toHaveProperty('party') + }); + + test('should success create party', async () => { + let { body, status } = await request(app) + .post('/party') + .set('Authorization', `Bearer ` + access_token2) + .send({ UserId: 1 }) + expect(status).toBe(201) + expect(body).toHaveProperty('party') + }); + + test('should success create team', async () => { + let { body, status } = await request(app) + .post('/party/5/team') + .set('Authorization', `Bearer ` + access_token1) + .send({ CharacterId: 1, WeaponId: 1 }) + expect(status).toBe(201) + expect(body).toHaveProperty('team') + }); + + test('should success create team', async () => { + let { body, status } = await request(app) + .put('/party/5/team/1') + .set('Authorization', `Bearer ` + access_token1) + .send({ CharacterId: 1, WeaponId: 1 }) + expect(status).toBe(200) + expect(body).toHaveProperty('team') + }); + + test('should success delete a party', async () => { + let { body, status } = await request(app) + .delete('/party/2') + .set('Authorization', `Bearer ` + access_token1) + expect(status).toBe(200) + expect(body).toHaveProperty('message', `Party with id 2 has been deleted`) + }); + }) + + describe('Failed', () => { + test('should fail show party because invalid token', async () => { + let { body, status } = await request(app) + .delete('/party/2') + .set('Authorization', `Bearer` + access_token2) + expect(status).toBe(401) + expect(body).toHaveProperty('message', `Unauthenticated`) + }); + + test('should fail delete party when party have teams', async () => { + let { body, status } = await request(app) + .delete('/party/3') + .set('Authorization', `Bearer ` + access_token1) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Cannot delete party that has teams`) + }); + + test('should fail created team when token is wrong', async () => { + let { body, status } = await request(app) + .post('/party/1/team') + .set('Authorization', `Bearer` + access_token1) + .send({ + WeaponId: 1 + }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', "Unauthenticated") + }); + + test('should fail delete party when party not found', async () => { + let { body, status } = await request(app) + .delete('/party/11') + .set('Authorization', `Bearer ` + access_token1) + expect(status).toBe(404) + expect(body).toHaveProperty('message', "Party with id 11 not found") + }); + + test('should fail delete party when token not found', async () => { + let { body, status } = await request(app) + .delete('/party/1') + .set('Authorization', `Bearer` + access_token1) + expect(status).toBe(401) + expect(body).toHaveProperty('message', "Unauthenticated") + }); + + test('should failed create party because party is full', async () => { + let { body, status } = await request(app) + .post('/party') + .set('Authorization', `Bearer ` + access_token1) + .send({ UserId: 2 }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', 'Your party is full') + }); + + test('should fail created team when team is full', async () => { + let { body, status } = await request(app) + .post('/party/1/team') + .set('Authorization', `Bearer ` + access_token1) + .send({ + CharacterId: 1, + WeaponId: 1 + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', "Your team can only have 4 Character") + }); + + test('should fail created team when Weapon is null/empty', async () => { + let { body, status } = await request(app) + .post('/party/2/team') + .set('Authorization', `Bearer ` + access_token1) + .send({ + CharacterId: 1 + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', "Weapon Id is required") + }); + + test('should fail created team when Character is null/empty', async () => { + let { body, status } = await request(app) + .post('/party/2/team') + .set('Authorization', `Bearer ` + access_token2) + .send({ + WeaponId: 1 + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', "Character Id is required") + }) + + test('should failed create party when token is wrong', async () => { + let { body, status } = await request(app) + .post('/party') + .set('Authorization', `Bearer` + `access_token1`) + .send({ UserId: 1 }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', 'Unauthenticated') + }); }) - test('should failed create party when token is wrong', async () => { - let { body, status } = await request(app) - .post('/party') - .set('Authorization', `Bearer` + `access_token`) - .send({ UserId: 1 }) - expect(status).toBe(401) - expect(body).toHaveProperty('message', 'Unauthenticated') - }); }) }) diff --git a/__test__/public.test.js b/__test__/public.test.js index 9bf53ae..81b66b0 100644 --- a/__test__/public.test.js +++ b/__test__/public.test.js @@ -1,11 +1,26 @@ const request = require('supertest'); const app = require('../app'); -const { sequelize } = require('../models'); +const { sequelize, User } = require('../models'); +const { hashPassword } = require('../helpers/bcrypt'); +const { signToken } = require('../helpers/jwt'); const queryInterface = sequelize.queryInterface; let weapon = [] beforeAll(async () => { + + const data = require('../data/user.json').map((e) => { + delete e.id; + e.password = hashPassword(e.password); + e.createdAt = e.updatedAt = new Date(); + return e + }) + await queryInterface.bulkInsert(`Users`, data, {}) + + let user = await User.findOne({ where: { role: `Admin` } }); + access_token = signToken({ id: user.id }) + + const type = require('../data/type.json').map((e) => { delete e.id e.createdAt = e.updatedAt = new Date() @@ -27,6 +42,7 @@ describe('Pub', () => { test(`should success show all weapon`, async () => { let { status, body } = await request(app) .get('/weapons') + .set('Authorization', `Bearer ` + access_token) expect(status).toBe(200) expect(body).toHaveProperty('data') }); @@ -34,6 +50,7 @@ describe('Pub', () => { test(`should success weapon by id`, async () => { let { status, body } = await request(app) .get('/weapons/2') + .set('Authorization', `Bearer ` + access_token) expect(status).toBe(200) expect(body).toHaveProperty('data') }); @@ -53,4 +70,10 @@ afterAll(async () => { restartIdentity: true, cascade: true }); + + await queryInterface.bulkDelete('Users', null, { + restartIdentity: true, + truncate: true, + cascade: true + }); }) \ No newline at end of file diff --git a/__test__/user.test.js b/__test__/user.test.js index be568d3..5c9db81 100644 --- a/__test__/user.test.js +++ b/__test__/user.test.js @@ -15,13 +15,20 @@ const staff = { password: `user2` }; -const register = { +const register1 = { name: 'testing1', email: 'testing1@mail.com', role: `Staff`, password: `testing1` } +const register2 = { + name: 'testing2', + email: 'testing2@mail.com', + role: `Staff`, + password: `testing2` +} + let access_token = ``; beforeAll(async () => { @@ -38,17 +45,65 @@ beforeAll(async () => { }); describe('User', () => { + describe('/users', () => { + describe('Success', () => { + test('should success show all user', async () => { + let { status, body } = await request(app) + .get('/users') + .set(`Authorization`, `Bearer ` + access_token) + expect(status).toBe(200) + expect(body).toHaveProperty(`users`) + }); + + test('should success show user by id', async () => { + let { status, body } = await request(app) + .get('/users/1') + .set(`Authorization`, `Bearer ` + access_token) + expect(status).toBe(200) + expect(body).toHaveProperty(`users`) + }); + }) + + describe('Failed', () => { + test('should fail show all user because invalid token', async () => { + let { status, body } = await request(app) + .get('/users') + .set(`Authorization`, `Bearer` + access_token) + expect(status).toBe(401) + expect(body).toHaveProperty(`message`, `Unauthenticated`) + }); + + test('should fail show user because user id not found', async () => { + let { status, body } = await request(app) + .get('/users/10') + .set(`Authorization`, `Bearer ` + access_token) + expect(status).toBe(404) + expect(body).toHaveProperty(`message`, `User with id 10 not found`) + }); + }) + }) + describe('/register', () => { describe('Success', () => { test('should success register new user', async () => { let { status, body } = await request(app) .post('/register') .set(`Authorization`, `Bearer ` + access_token) - .send(register) + .send(register1) + expect(status).toBe(201) + expect(body).toHaveProperty(`id`, expect.any(Number)) + expect(body).toHaveProperty(`email`, register1.email) + }); + + test('should success register new user', async () => { + let { status, body } = await request(app) + .post('/add-user') + .send(register2) expect(status).toBe(201) expect(body).toHaveProperty(`id`, expect.any(Number)) - expect(body).toHaveProperty(`email`, register.email) + expect(body).toHaveProperty(`email`, register2.email) }); + }); describe('Failed', () => { @@ -64,7 +119,7 @@ describe('User', () => { expect(body).toHaveProperty('message', `Name is required`) }); - test('should fail when name is null', async () => { + test('should fail when name is empty', async () => { let { body, status } = await request(app) .post('/register') .set('Authorization', 'Bearer ' + access_token) @@ -102,7 +157,7 @@ describe('User', () => { expect(body).toHaveProperty('message', `Email cannot be empty`) }); - test('should fail when password is null/empty', async () => { + test('should fail when password is null', async () => { let { body, status } = await request(app) .post('/register') .set('Authorization', 'Bearer ' + access_token) @@ -114,7 +169,7 @@ describe('User', () => { expect(body).toHaveProperty('message', `Password is required`) }); - test('should fail when password is null/empty', async () => { + test('should fail when password is empty', async () => { let { body, status } = await request(app) .post('/register') .set('Authorization', 'Bearer ' + access_token) @@ -127,11 +182,86 @@ describe('User', () => { expect(body).toHaveProperty('message', `Password cannot be empty`) }); + test('should fail when name is null', async () => { + let { body, status } = await request(app) + .post('/add-user') + .set('Authorization', 'Bearer ' + access_token) + .send({ + email: `test1@mail.com`, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Name is required`) + }); + + test('should fail when name is empty', async () => { + let { body, status } = await request(app) + .post('/add-user') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: ``, + email: `test1@mail.com`, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Name cannot be empty`) + }); + + test('should fail when email is null', async () => { + let { body, status } = await request(app) + .post('/add-user') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Email is required`) + }); + + test('should fail when email is empty', async () => { + let { body, status } = await request(app) + .post('/add-user') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + email: ``, + password: `test_1` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Email cannot be empty`) + }); + + test('should fail when password is null', async () => { + let { body, status } = await request(app) + .post('/add-user') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + email: `test1@mail.com` + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Password is required`) + }); + + test('should fail when password is empty', async () => { + let { body, status } = await request(app) + .post('/add-user') + .set('Authorization', 'Bearer ' + access_token) + .send({ + name: `test 1`, + email: `test1@mail.com`, + password: "" + }) + expect(status).toBe(400) + expect(body).toHaveProperty('message', `Password cannot be empty`) + }); + test('should fail when token is invalid', async () => { let { body, status } = await request(app) .post('/register') .set('Authorization', 'Bearer') - .send(register) + .send(register1) expect(status).toBe(401) expect(body).toHaveProperty('message', `Unauthenticated`) }); @@ -163,6 +293,17 @@ describe('User', () => { expect(body).toHaveProperty('message', 'Email is required') }); + test('should failed login when email is wrong', async () => { + let { body, status } = await request(app) + .post('/login') + .send({ + email: `false email`, + password: `user1` + }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', 'Email is wrong') + }); + test('should failed login when password is null', async () => { let { body, status } = await request(app) .post('/login') @@ -172,6 +313,24 @@ describe('User', () => { expect(status).toBe(401) expect(body).toHaveProperty('message', 'Password is required') }); + + test('should failed login when password is wrong', async () => { + let { body, status } = await request(app) + .post('/login') + .send({ + email: `user1@mail.com`, + password: `false password` + }) + expect(status).toBe(401) + expect(body).toHaveProperty('message', 'Password is wrong') + }); + + test('should failed login using google', async () => { + let { body, status } = await request(app) + .post('/login/google') + expect(status).toBe(500) + expect(body).toHaveProperty('message', 'The verifyIdToken method requires an ID Token') + }); }) }) }) diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs new file mode 100644 index 0000000..3e212e1 --- /dev/null +++ b/client/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/client/.firebase/hosting.ZGlzdA.cache b/client/.firebase/hosting.ZGlzdA.cache new file mode 100644 index 0000000..87d48e2 --- /dev/null +++ b/client/.firebase/hosting.ZGlzdA.cache @@ -0,0 +1,3 @@ +vite.svg,1719949663675,699a02e0e68a579f687d364bbbe7633161244f35af068220aee37b1b33dfb3c7 +index.html,1720765734147,e2f26a2812b97c0ac916f51ed26c11d2301ccb9c43ab2936c6f0a54944aaca64 +assets/index-BeHxujV-.js,1720765734147,d598c57923aadf49758a87c468fd9c338e57732b6d959698aeeacc580cc93f8c diff --git a/client/.firebaserc b/client/.firebaserc new file mode 100644 index 0000000..28b7b21 --- /dev/null +++ b/client/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "db-ip-20b01" + } +} diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,24 @@ +# 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? diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..f768e33 --- /dev/null +++ b/client/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/client/firebase.json b/client/firebase.json new file mode 100644 index 0000000..2c33c29 --- /dev/null +++ b/client/firebase.json @@ -0,0 +1,16 @@ +{ + "hosting": { + "public": "dist", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ], + "rewrites": [ + { + "source": "**", + "destination": "/index.html" + } + ] + } +} diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..91615e4 --- /dev/null +++ b/client/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + Vite + React + + + + +
+ + + + \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..f1bf15f --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,4308 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "@reduxjs/toolkit": "^2.2.6", + "axios": "^1.7.2", + "cors": "^2.8.5", + "google-auth-library": "^9.11.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-redux": "^9.1.2", + "react-router-dom": "^6.24.1", + "react-toastify": "^10.0.5", + "sweetalert2": "^11.12.2" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "vite": "^5.3.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", + "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.1.tgz", + "integrity": "sha512-mCOMec4BKd6BRGBZeSnGiIgwsbLGp3yhVqAD8H+PxiRNEHgDpZb8J1TnrSDlg97t0ySKMQJTHCWBCmBpSmkF6Q==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz", + "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz", + "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz", + "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz", + "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz", + "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz", + "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz", + "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz", + "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz", + "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz", + "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz", + "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz", + "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz", + "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz", + "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz", + "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz", + "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.13.tgz", + "integrity": "sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.9" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.6.13", + "@swc/core-darwin-x64": "1.6.13", + "@swc/core-linux-arm-gnueabihf": "1.6.13", + "@swc/core-linux-arm64-gnu": "1.6.13", + "@swc/core-linux-arm64-musl": "1.6.13", + "@swc/core-linux-x64-gnu": "1.6.13", + "@swc/core-linux-x64-musl": "1.6.13", + "@swc/core-win32-arm64-msvc": "1.6.13", + "@swc/core-win32-ia32-msvc": "1.6.13", + "@swc/core-win32-x64-msvc": "1.6.13" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.13.tgz", + "integrity": "sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.13.tgz", + "integrity": "sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.13.tgz", + "integrity": "sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.13.tgz", + "integrity": "sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.13.tgz", + "integrity": "sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.13.tgz", + "integrity": "sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.13.tgz", + "integrity": "sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.13.tgz", + "integrity": "sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.13.tgz", + "integrity": "sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.13.tgz", + "integrity": "sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", + "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", + "dev": true, + "dependencies": { + "@swc/core": "^1.5.7" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz", + "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaxios": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.0.tgz", + "integrity": "sha512-DSrkyMTfAnAm4ks9Go20QGOcXEyW/NmZhvTYBU2rb4afBB393WIMQPWPEDMl/k8xqiNN9HYq2zao3oWXsdl2Tg==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-auth-library": { + "version": "9.11.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.11.0.tgz", + "integrity": "sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw==", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "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==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-redux": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.1.tgz", + "integrity": "sha512-PTXFXGK2pyXpHzVo3rR9H7ip4lSPZZc0bHG5CARmj65fTT6qG7sTngmb6lcYu1gf3y/8KxORoy9yn59pGpCnpg==", + "dependencies": { + "@remix-run/router": "1.17.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.1.tgz", + "integrity": "sha512-U19KtXqooqw967Vw0Qcn5cOvrX5Ejo9ORmOtJMzYWtCT4/WOfFLIZGGsVLxcd9UkBO0mSTZtXqhZBsWlHr7+Sg==", + "dependencies": { + "@remix-run/router": "1.17.1", + "react-router": "6.24.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-toastify": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", + "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peerDependencies": { + "redux": "^5.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz", + "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.1", + "@rollup/rollup-android-arm64": "4.18.1", + "@rollup/rollup-darwin-arm64": "4.18.1", + "@rollup/rollup-darwin-x64": "4.18.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.1", + "@rollup/rollup-linux-arm-musleabihf": "4.18.1", + "@rollup/rollup-linux-arm64-gnu": "4.18.1", + "@rollup/rollup-linux-arm64-musl": "4.18.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1", + "@rollup/rollup-linux-riscv64-gnu": "4.18.1", + "@rollup/rollup-linux-s390x-gnu": "4.18.1", + "@rollup/rollup-linux-x64-gnu": "4.18.1", + "@rollup/rollup-linux-x64-musl": "4.18.1", + "@rollup/rollup-win32-arm64-msvc": "4.18.1", + "@rollup/rollup-win32-ia32-msvc": "4.18.1", + "@rollup/rollup-win32-x64-msvc": "4.18.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "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", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sweetalert2": { + "version": "11.12.2", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.12.2.tgz", + "integrity": "sha512-Rwv5iRYlApkDSXeX22aLhhWMlWPzFxnNBVLZajkFKYhaVEfQkMOPQQRhBtSFxKBPCoko9U3SccWm9hI4o3Id0Q==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..9a766f5 --- /dev/null +++ b/client/package.json @@ -0,0 +1,34 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@reduxjs/toolkit": "^2.2.6", + "axios": "^1.7.2", + "cors": "^2.8.5", + "google-auth-library": "^9.11.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-redux": "^9.1.2", + "react-router-dom": "^6.24.1", + "react-toastify": "^10.0.5", + "sweetalert2": "^11.12.2" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "vite": "^5.3.1" + } +} diff --git a/client/public/vite.svg b/client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/App.jsx b/client/src/App.jsx new file mode 100644 index 0000000..537a84d --- /dev/null +++ b/client/src/App.jsx @@ -0,0 +1,13 @@ +import { RouterProvider } from 'react-router-dom' +import router from './router' +import Swal from 'sweetalert2' +import { Provider } from 'react-redux'; +import store from './store.js' + +function App() { + return + ; + +} + +export default App diff --git a/client/src/assets/react.svg b/client/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/client/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/components/Carousel.jsx b/client/src/components/Carousel.jsx new file mode 100644 index 0000000..99a47ee --- /dev/null +++ b/client/src/components/Carousel.jsx @@ -0,0 +1,59 @@ +import React from 'react'; + +export default function Carousel() { + return ( +
+
+
+
+
+ First slide +
+
+ Second slide +
+
+ Third slide +
+
+ + +
+ ); +} diff --git a/client/src/components/CharacterCard.jsx b/client/src/components/CharacterCard.jsx new file mode 100644 index 0000000..ce395fc --- /dev/null +++ b/client/src/components/CharacterCard.jsx @@ -0,0 +1,31 @@ +import { Link, useNavigate } from 'react-router-dom' + +export default function CharacterCard({ character, index }) { + const star = 'https://w7.pngwing.com/pngs/149/21/png-transparent-graphics-star-illustration-star-angle-triangle-logo.png' + + const renderStars = (count) => { + const stars = []; + for (let i = 0; i < count; i++) { + stars.push(star); + } + return stars; + }; + + return <> +
+
{index + 1}
+ Card image cap +
+
{character.name}
+

{character.rarity === '5_star' ? renderStars(5) : renderStars(4)} +

+ + + +
+
+ + +} \ No newline at end of file diff --git a/client/src/components/Navbar.jsx b/client/src/components/Navbar.jsx new file mode 100644 index 0000000..35995e2 --- /dev/null +++ b/client/src/components/Navbar.jsx @@ -0,0 +1,101 @@ +import { Link, useNavigate } from "react-router-dom"; + + +export default function Navbar() { + const navigate = useNavigate() + const token = localStorage.getItem('access_token'); + const logout = () => { + localStorage.clear() + navigate('/login') + } + return <> + + +} + diff --git a/client/src/components/PartyCard.jsx b/client/src/components/PartyCard.jsx new file mode 100644 index 0000000..1ae89a9 --- /dev/null +++ b/client/src/components/PartyCard.jsx @@ -0,0 +1,12 @@ +import TeamCard from "./TeamCard"; + +export default function PartyCard({ party, fetchParty }) { + // console.log(party.Teams) + return
+ { + party.Teams.map((team) => { + return + }) + } +
+} \ No newline at end of file diff --git a/client/src/components/TeamCard.jsx b/client/src/components/TeamCard.jsx new file mode 100644 index 0000000..a5d982f --- /dev/null +++ b/client/src/components/TeamCard.jsx @@ -0,0 +1,85 @@ +import { useEffect, useState } from "react"; +import axios from 'axios' +import { Link, useNavigate } from "react-router-dom"; + +export default function TeamCard({ team, fetchParty }) { + const [character, setCharacter] = useState([]) + const navigate = useNavigate() + + const fetchCharacter = async () => { + try { + const { data } = await axios.get(`https://ip.gefri.xyz/characters/${team.CharacterId}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + // console.log(data) + setCharacter(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchCharacter(); + }, []) + + const [weapon, setWeapon] = useState([]) + + const fetchWeapon = async () => { + try { + const { data } = await axios.get(`https://ip.gefri.xyz/weapons/${team.WeaponId}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setWeapon(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchWeapon(); + }, []) + + const handleDelete = async () => { + try { + await axios({ + method: 'DELETE', + url: `https://ip.gefri.xyz/party/${team.PartyId}/team/${team.id}`, + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + } + }) + // navigate('/party') + fetchParty() + } catch (err) { + console.log(err) + } + } + + return <> +
+
{character.name}
+ Card image cap +
+
+ +
+

{weapon.name}

+

Base Attack : {weapon.baseAttack} Dps

+
+
+ + + + +
+
+ +} \ No newline at end of file diff --git a/client/src/components/WeaponCard.jsx b/client/src/components/WeaponCard.jsx new file mode 100644 index 0000000..85a7b2b --- /dev/null +++ b/client/src/components/WeaponCard.jsx @@ -0,0 +1,31 @@ +import { Link } from "react-router-dom"; + +export default function WeaponCard({ weapon, index }) { + const star = 'https://w7.pngwing.com/pngs/149/21/png-transparent-graphics-star-illustration-star-angle-triangle-logo.png' + + const renderStars = (count) => { + const stars = []; + for (let i = 0; i < count; i++) { + stars.push(star); + } + return stars; + }; + + return <> +
+
{index + 1}
+ Card image cap +
+
{weapon.name}
+

{weapon.rarity === '5_star' ? renderStars(5) : renderStars(4)} +

+ + + +
+
+ + +} \ No newline at end of file diff --git a/client/src/features/counter/character/characterSlice.js b/client/src/features/counter/character/characterSlice.js new file mode 100644 index 0000000..737f979 --- /dev/null +++ b/client/src/features/counter/character/characterSlice.js @@ -0,0 +1,23 @@ +import { createSlice } from "@reduxjs/toolkit"; + +const initialState = { + loading: false, + characters: [] +}; + +export const characterSlice = createSlice({ + name: `character`, + initialState, + reducers: { + setLoading: (state, { payload }) => { + state.loading = payload + }, + setCharacter: (state, { payload }) => { + state.characters = payload + } + } +}) + +export const { setLoading, setCharacter } = characterSlice.actions; + +export default characterSlice.reducer; \ No newline at end of file diff --git a/client/src/features/counter/counterSlice.js b/client/src/features/counter/counterSlice.js new file mode 100644 index 0000000..b9dab40 --- /dev/null +++ b/client/src/features/counter/counterSlice.js @@ -0,0 +1,26 @@ + +import { createSlice } from '@reduxjs/toolkit'; + +const initialState = { + value: 10, +}; + +export const counterSlice = createSlice({ + name: 'counter', + initialState: initialState, + reducers: { + increment: (state) => { + state.value += 1; + }, + decrement: (state) => { + state.value -= 1; + }, + incrementByAmount: (state, action) => { + state.value += action.payload; + } + } +}); + +export const { increment, decrement, incrementByAmount } = counterSlice.actions; + +export default counterSlice.reducer \ No newline at end of file diff --git a/client/src/main.jsx b/client/src/main.jsx new file mode 100644 index 0000000..51a8c58 --- /dev/null +++ b/client/src/main.jsx @@ -0,0 +1,9 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/client/src/pages/AddParty.jsx b/client/src/pages/AddParty.jsx new file mode 100644 index 0000000..d788210 --- /dev/null +++ b/client/src/pages/AddParty.jsx @@ -0,0 +1,26 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios' +import { useNavigate, useParams } from 'react-router-dom'; +import Swal from 'sweetalert2' + +export default function AddTeam() { + const [characters, setCharacter] = useState([]) + const fetchCharacter = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/characters', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setCharacter(data.data) + } catch (err) { + console.log(err); + } + } + + const [weapons, setWeapon] = useState([]) + + return + +}; + diff --git a/client/src/pages/AddTeam.jsx b/client/src/pages/AddTeam.jsx new file mode 100644 index 0000000..e7ab89e --- /dev/null +++ b/client/src/pages/AddTeam.jsx @@ -0,0 +1,110 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios' +import { useNavigate, useParams } from 'react-router-dom'; +import Swal from 'sweetalert2' + +export default function AddTeam() { + const [characters, setCharacter] = useState([]) + const fetchCharacter = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/characters', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setCharacter(data.data) + } catch (err) { + console.log(err); + } + } + + const [weapons, setWeapon] = useState([]) + const fetchWeapon = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/weapons', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setWeapon(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchCharacter(); + fetchWeapon() + }, []) + + const [udpateCharacter, setUpdateCharacter] = useState('') + const [updateWeapon, setUpdateWeapon] = useState('') + const navigate = useNavigate() + + const { id } = useParams() + const handleSubmit = async (e) => { + e.preventDefault() + try { + const { data } = await axios.post(`https://ip.gefri.xyz/party/${id}/team`, + { + CharacterId: udpateCharacter, + WeaponId: updateWeapon + }, + { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + navigate('/party') + } catch (err) { + // console.log(err.response); + Swal.fire({ + icon: "error", + title: "Oops...", + text: `${err.response.data.message}`, + footer: 'Why do I have this issue?' + }); + } + } + + useEffect(() => { + handleSubmit() + }, []) + + return (<> +
+
+
+ + +
+
+
+ + +
+
+ +
+
+ + ) +}; + diff --git a/client/src/pages/CharacterDetails.jsx b/client/src/pages/CharacterDetails.jsx new file mode 100644 index 0000000..e770ae4 --- /dev/null +++ b/client/src/pages/CharacterDetails.jsx @@ -0,0 +1,40 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; + + +export default function CharacterDetails() { + const { id } = useParams() + const [character, setCharacter] = useState([]) + const fetchCharacter = async () => { + try { + const { data } = await axios.get(`https://ip.gefri.xyz/characters/${id}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + // console.log(data.data) + setCharacter(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchCharacter(); + }, []) + + return <> +
+
+ +
+
+

Name : {character.name}

+

Rarity : {character.rarity}

+

Weapon : {character.weapon}

+

Vision : {character.vision}

+
+
+ +} \ No newline at end of file diff --git a/client/src/pages/Characters.jsx b/client/src/pages/Characters.jsx new file mode 100644 index 0000000..cdf2fee --- /dev/null +++ b/client/src/pages/Characters.jsx @@ -0,0 +1,41 @@ +import axios from "axios"; +import { useSelector, useDispatch } from "react-redux"; +import { setCharacter } from "../features/counter/character/characterSlice"; +import { useEffect } from "react"; +import CharacterCard from "../components/CharacterCard"; + + +export default function Character() { + const characters = useSelector(state => state.character.characters) + + const dispatch = useDispatch() + const fetchCharacter = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/characters', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + dispatch(setCharacter(data.data)) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchCharacter(); + }, []) + + return <> +
+ { + characters.map((character, index) => { + return <> + + + + }) + } +
+ +} \ No newline at end of file diff --git a/client/src/pages/Demo.jsx b/client/src/pages/Demo.jsx new file mode 100644 index 0000000..136d343 --- /dev/null +++ b/client/src/pages/Demo.jsx @@ -0,0 +1,29 @@ +import { useSelector, useDispatch } from "react-redux" +import { increment, decrement, incrementByAmount } from "../features/counter/counterSlice" + + +export default function Demo() { + const counter = useSelector((store) => { + console.log(store) + return store.counter.value + } + ) + + const dispatch = useDispatch(); + + return ( +
+
+

Genshin

+
+

Counter: {counter}

+
+ + + +
+
+ +
+ ) +} \ No newline at end of file diff --git a/client/src/pages/EditTeam.jsx b/client/src/pages/EditTeam.jsx new file mode 100644 index 0000000..1b43092 --- /dev/null +++ b/client/src/pages/EditTeam.jsx @@ -0,0 +1,103 @@ +import React, { useEffect, useState } from 'react'; +import axios from 'axios' +import { useNavigate, useParams } from 'react-router-dom'; + +export default function EditTeam() { + const [characters, setCharacter] = useState([]) + const fetchCharacter = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/characters', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setCharacter(data.data) + } catch (err) { + console.log(err); + } + } + + const [weapons, setWeapon] = useState([]) + const fetchWeapon = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/weapons', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setWeapon(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchCharacter(); + fetchWeapon() + }, []) + + const [udpateCharacter, setUpdateCharacter] = useState('') + const [updateWeapon, setUpdateWeapon] = useState('') + const navigate = useNavigate() + + const { id, teamId } = useParams() + const handleSubmit = async (e) => { + e.preventDefault() + try { + const { data } = await axios.put(`https://ip.gefri.xyz/party/${id}/team/${teamId}`, + { + CharacterId: udpateCharacter, + WeaponId: updateWeapon + }, + { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + navigate('/party') + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + handleSubmit() + }, []) + + return (<> +
+
+
+ + +
+
+
+ + +
+
+ +
+
+ + ) +}; + diff --git a/client/src/pages/Homepage.jsx b/client/src/pages/Homepage.jsx new file mode 100644 index 0000000..b848dfb --- /dev/null +++ b/client/src/pages/Homepage.jsx @@ -0,0 +1,32 @@ +import axios from "axios"; +import Card from "../components/Carousel"; +import Carousel from "../components/Carousel"; +import { useSelector, useDispatch } from "react-redux"; +import { setCharacter } from "../features/counter/character/characterSlice"; + +export default function Homepage() { + // const characters = useSelector(state => state.character.characters) + + // const dispatch = useDispatch() + + // const fetchCharacter = async () => { + // try { + // const { data } = await axios.get('/characters', { + // headers: { + // Authorization: `Bearer ${localStorage.getItem('access_token')}` + // }, + // }); + // console.log(data) + // dispatch(setCharacter(data)) + // } catch (err) { + // console.log(err); + // } + // } + + return <> +
+ +
+ + +} \ No newline at end of file diff --git a/client/src/pages/Login.jsx b/client/src/pages/Login.jsx new file mode 100644 index 0000000..c6fbd01 --- /dev/null +++ b/client/src/pages/Login.jsx @@ -0,0 +1,154 @@ +import { useEffect, useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import axios from "axios"; +import Swal from 'sweetalert2' + +export default function Login() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const navigate = useNavigate(); + + const handleSubmit = async (e) => { + e.preventDefault() + try { + const { data } = await axios({ + method: 'post', + url: 'https://ip.gefri.xyz/login', + data: { + email, + password + } + }); + localStorage.setItem('access_token', data.access_token) + navigate('/') + } catch (err) { + console.log(err) + Swal.fire({ + icon: "error", + title: "Oops...", + text: "Please check your input", + footer: 'Why do I have this issue?' + }); + } + } + + useEffect(() => { + window.google.accounts.id.initialize({ + client_id: "848600054102-tftpfkiph7b62bugt6284mloq4ckpau9.apps.googleusercontent.com", + callback: async (response) => { + const googleToken = response.credential; + try { + const { data } = await axios.post( + 'https://ip.gefri.xyz/login/google', + { + googleToken, + } + ) + localStorage.setItem('access_token', data.access_token); + // successToast('Login Success'); + navigate('/') + } catch (err) { + console.log(err) + } + + }, + }); + window.google.accounts.id.renderButton( + document.getElementById("buttonDiv"), + { theme: "outline", size: "large" } // customization attributes + ); + // window.google.accounts.id.prompt(); + }, []) + + return
+
+
+
+
+
+
+
+
+ logo +

Join Us and Make Your Own Party!

+
+ +
+
+ + setEmail(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
+ +
asd
+
+
+

Don't have an account?

+ + + +
+
+ +
+
+
+
+

We are more than just a company

+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed + do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

+
+
+
+
+
+
+
+
+ +} + diff --git a/client/src/pages/Party.jsx b/client/src/pages/Party.jsx new file mode 100644 index 0000000..b0688f1 --- /dev/null +++ b/client/src/pages/Party.jsx @@ -0,0 +1,126 @@ +import { useEffect, useState } from "react"; +import PartyCard from "../components/PartyCard"; +import axios from 'axios' +import { Link, useNavigate } from "react-router-dom"; +import Swal from 'sweetalert2' + +export default function Party() { + const [parties, setParty] = useState([]) + const fetchParty = async (e) => { + // e.preventDefault() + try { + const { data } = await axios.get('https://ip.gefri.xyz/party', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + // console.log(data.party) + setParty(data.party) + } catch (err) { + console.log(err); + } + } + useEffect(() => { + fetchParty(); + }, []) + let result = '' + const [character, setCharacter] = useState('') + const handleSubmit = async (e) => { + e.preventDefault() + try { + const data = await axios({ + method: `POST`, + url: 'https://ip.gefri.xyz/which-is-better', + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + data: { character } + }); + console.log(data.data.character.recommended_Weapon, 'di CLIENT') + // setCharacter(data.character.recommended_Weapon) + Swal.fire({ + + title: "This is the best weapon for " + character, + text: data.data.character.recommended_Weapon, + // icon: "question" + }); + } catch (err) { + console.log(data) + } + } + useEffect(() => { + // handleSubmit(); + }, []) + const navigate = useNavigate() + const handleClick = async (e) => { + e.preventDefault() + try { + const result = await axios({ + method: `POST`, + url: `https://ip.gefri.xyz/party`, + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }) + // console.log(result) + navigate('/party') + } catch (err) { + console.log(err) + } + } + + return <> +
+ +
+
+ + setCharacter(e.target.value)} + /> + + Input your character and we'll tell you the character's best weapon + +
+ + +
+ + {/*
+ + +
*/} +
+
+ 0 ? parties[0].id + '/team' : ''}`}> + + + + +
+
+ { + parties.map((party) => { + return
+ +
+ }) + } +
+ +} \ No newline at end of file diff --git a/client/src/pages/Register.jsx b/client/src/pages/Register.jsx new file mode 100644 index 0000000..e601bfc --- /dev/null +++ b/client/src/pages/Register.jsx @@ -0,0 +1,143 @@ +import { useEffect, useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import axios from "axios"; +import Swal from 'sweetalert2' + +export default function Register() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const navigate = useNavigate(); + + const handleSubmit = async (e) => { + e.preventDefault() + try { + const { data } = await axios({ + method: 'post', + url: 'https://ip.gefri.xyz/add-user', + data: { + name, + email, + password + } + }); + localStorage.setItem('access_token', data.access_token) + navigate('/') + } catch (err) { + console.log(err) + Swal.fire({ + icon: "error", + title: "Oops...", + text: "Please check your input", + footer: 'Why do I have this issue?' + }); + } + } + + useEffect(() => { + window.google.accounts.id.initialize({ + client_id: "848600054102-tftpfkiph7b62bugt6284mloq4ckpau9.apps.googleusercontent.com", + callback: async (response) => { + const googleToken = response.credential; + try { + const { data } = await axios.post( + 'https://ip.gefri.xyz/login/google', + { + googleToken, + } + ) + localStorage.setItem('access_token', data.access_token); + // successToast('Login Success'); + navigate('/') + } catch (err) { + console.log(err) + } + + }, + }); + window.google.accounts.id.renderButton( + document.getElementById("buttonDiv"), + { theme: "outline", size: "large" } // customization attributes + ); + // window.google.accounts.id.prompt(); + }, []) + + return
+
+
+
+
+
+
+
+
+ logo +

Join Us and Make Your Own Party!

+
+ +
+
+ + setEmail(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
+ +
asd
+
+ +
+ +
+
+
+
+

We are more than just a company

+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed + do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

+
+
+
+
+
+
+
+
+ +} + diff --git a/client/src/pages/Weapon.jsx b/client/src/pages/Weapon.jsx new file mode 100644 index 0000000..a9afa67 --- /dev/null +++ b/client/src/pages/Weapon.jsx @@ -0,0 +1,38 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import WeaponCard from "../components/WeaponCard"; + + +export default function Weapon() { + const [weapons, setWeapon] = useState([]) + + const fetchCharacter = async () => { + try { + const { data } = await axios.get('https://ip.gefri.xyz/weapons', { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setWeapon(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchCharacter(); + }, []) + + return <> +
+ { + weapons.map((weapon, index) => { + return <> + + + + }) + } +
+ +} \ No newline at end of file diff --git a/client/src/pages/WeaponDetails.jsx b/client/src/pages/WeaponDetails.jsx new file mode 100644 index 0000000..750b541 --- /dev/null +++ b/client/src/pages/WeaponDetails.jsx @@ -0,0 +1,38 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; + + +export default function WeaponDetails() { + const { id } = useParams() + const [weapon, setWeapon] = useState([]) + const fetchWeapon = async () => { + try { + const { data } = await axios.get(`https://ip.gefri.xyz/weapons/${id}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem('access_token')}` + }, + }); + setWeapon(data.data) + } catch (err) { + console.log(err); + } + } + + useEffect(() => { + fetchWeapon(); + }, []) + + return <> +
+
+ +
+
+

Name : {weapon.name}

+

Rarity : {weapon.rarity}

+

Effect : {weapon.effect}

+
+
+ +} \ No newline at end of file diff --git a/client/src/router.jsx b/client/src/router.jsx new file mode 100644 index 0000000..64e18b7 --- /dev/null +++ b/client/src/router.jsx @@ -0,0 +1,121 @@ +import { + createBrowserRouter, + RouterProvider, + Route, + Link, + useNavigate, +} from "react-router-dom"; +import Navbar from './components/Navbar.jsx'; +import Login from './pages/Login.jsx'; +import Homepage from './pages/Homepage.jsx'; +import Demo from "./pages/Demo.jsx"; +import Character from "./pages/Characters.jsx"; +import Weapon from "./pages/Weapon.jsx"; +import Party from "./pages/Party.jsx"; +import React from 'react' +import CharacterDetails from "./pages/CharacterDetails.jsx"; +import WeaponDetails from "./pages/WeaponDetails.jsx"; +import EditTeam from "./pages/EditTeam.jsx"; +import AddTeam from "./pages/AddTeam.jsx"; +import Register from "./pages/Register.jsx"; + + +const router = createBrowserRouter([ + { + path: "/", + element: ( + <> + +
+ +
+ + ) + }, + { + path: "/login", + element: ( + + ) + }, + { + path: "/add-user", + element: ( + + ) + }, + { + path: "/weapons", + element: (<> + + + + ) + }, + { + path: "/weapons/:id", + element: (<> + + + + ) + }, + { + path: "/characters", + element: (<> + + + + ) + }, + { + path: "/characters/:id", + element: (<> + + + + ) + }, + { + path: "/party", + element: (<> + + + + ) + }, + { + path: "/party/create", + element: (<> + + {/* */} + + ) + }, + { + path: "/demo", + element: (<> + + + + ) + }, + { + path: "/party/:id/team/:teamId", + element: (<> + + + + ) + }, + { + path: "/party/:id/team", + element: (<> + + + + ) + } +]); + +export default router \ No newline at end of file diff --git a/client/src/store.js b/client/src/store.js new file mode 100644 index 0000000..fd4f04f --- /dev/null +++ b/client/src/store.js @@ -0,0 +1,10 @@ +import { configureStore } from '@reduxjs/toolkit'; +import counterReducer from './features/counter/counterSlice' +import characterReducer from './features/counter/character/characterSlice' + +export default configureStore({ + reducer: { + counter: counterReducer, + character: characterReducer + } +}) \ No newline at end of file diff --git a/client/vite.config.js b/client/vite.config.js new file mode 100644 index 0000000..2ba14c3 --- /dev/null +++ b/client/vite.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + optimizeDeps: { + exclude: ['js-big-decimal'] + } +}) diff --git a/controllers/UserController.js b/controllers/UserController.js index 53b9d78..192a42c 100644 --- a/controllers/UserController.js +++ b/controllers/UserController.js @@ -38,7 +38,7 @@ module.exports = { }; const checkToken = comparePassword(password, user.password); if (!checkToken) { - throw ({ name: `pass fail` }) + throw ({ name: `pass false` }) }; const token = signToken({ id: user.id }) res.status(200).json({ access_token: token }) diff --git a/coverage.png b/coverage.png index 1cce7b9ea3160bf667b0f9a3dc23a2e61d826555..239a4656853d7b2411a878f37184f3bcc777bc50 100644 GIT binary patch literal 99415 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 DUx9?49R;Cl28KnVMX?u)f)Ycawqy^EUs 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

Sp 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

Loi5H6M7Nf6y#+|0Y~| zKWV_hxQlbI)Dq9FJhFEuUQJTIQCY{Kk-^E+j;kUDJ-#WW+9!oach|U zAs%0h^wgFQ=435GexJ@l@b}8vi1$y+*xr>7H zNmyUpKfgzr=Uvjvdc1U- zxZmvpF^0{h(m!9@vrVxB|1($Ak$T+puZR}=7yI`=Ff;f!tGwh7?zsfLXE7~c{UnKB zOyrNFSK(gURHR~5E7@t^Z5~|5A4OZYe-l|?^v3x6U`?U#uZ`7z@@llZb^q|0@dnTi zV3AgWJ||+ZdvWQXGz~o7K6{+D zs~;^&M>=&#-u=E$|7W z2GQL%o+~s&SUevZ^rv`y!PA2Q@7jq1d7lwI*X)N-f&Jt^^Zbmi(D(?^vj4D$|Btbf zv*w@n@TGU}jNJVz5*!lQ5Q|;2arF4m5xGBXToMq2jCZf))^nhNA}SAsuo=R`-_?E{ zc(-+P9&=6pk~??e>OI3PU02P4ZMlUzRhX^g*O`v!Fb~d%#{V=BW&UG=LPD8laParO zwPwZZzO}#@{)gTo2B=AffKSvX4b62cpDS5gPj>r;p-+bthKTV$qYVL*H;?=K7tp&V z|AXgf3!E0Z`P<->fd&})C}`%h9{Ptyv_q`_ z@B&R0Y8zQf@&DCQwl?Nqd~G`9hH-3XDjl!?BXkrObC1-z1(87XW^4Hk0J*C)z5cRv~ez_Ba0)&EABclPBv*vwS&F7~>5BeIh9M zWmowqT%&4b_fw4KuDPeI^25LCTs0V8=VsSJEI*00yj5_RAQ9)WVs2M3D|>^rc9V&; z%_I4gKFg!pI%xdi`$kyz=U)K=@vi{EX8)Jl_Uh5u_h*0Gyrlf2lx3TCHCu=Rjgfn) z7pO@v*;eK`$=|6-_Q?V;3OLo!xZ%_Ar|^W0q_&TSw@{Zg0Fh!2BJ=S3T`k}%%RKU@ zG3>z4pYZmvKy&&ARS7ND2G3uAj>?~OBXS-0-yKiCOcVcuFx}RI&8F`Xu(N4D z2AH=L$3|C>{_RNS$a|X+@Yk7MllhzQ8VhPt`ZGBh^p_+JA?vl9In!TjbV$mANmZWa zQFi?H9`AM&SP!*Voip+60Puq{x0v)j`e|*4ULqEj)*KYv}?6x{xbt^ZP$(u<9b& z5V(vO*TH{t>VJ&;Z%=)K0?|z0D~RqoC3Zr;ctFs_9h*(PhAAzFyXP|f=DKRDT7c$bO?DD?-O?CLnp!F5z728d`xuwfa#gra8@5g(& zdv6#&0}ays_SbZorK!m^T}IWqe@qaGMV;!udPir-7C$lawgrQZ5YDfZXLZ`^&Ux2E z{h?=I%-VEijBCl2OAu$9OTn9SK@0nX#59bbsw$c>v$P`vE=BUA&v%6n5XJL+CMr{>|Bl7<4IO8dq}NU-sI8PS(wxa{w=Z zu^Ln%((d(z7V|58(&U)rZ=&t5!qRbPb9I(-({t{2;m0L{8Uc$1O6{1)a`Z@ayq?=o zuUjBzwlp=k|1a$lu1_3}qkbMOOm!9?0htn@@d#}E;=zh}^3UQ@(7nG0t#}g2pRN{r zWdK(BH_L9oltB*v;JGpZdbw^d373GhJzaKjPanS89omztP7m;827I^?42mY4d0&ei;%Cm&qb^>sS zv7eg9o1f{~eiLfT0l(Z4|Jm)Ih73)?m5SGDFr22Pd`+_yO3h1zOB)KkXTW5NTK4OY zPNSy3ro6`fOnH5{|8vSKBBlJ|K?A8kYuKy$&3wuJk0u7AWtp_$vDNn@O49!#?c1(} zP2fTw$&r3|=FTyCs<^T0l*)>s*CVRl7l zkGr25d$8Ki@}*Td*m_kML715OMxLhGtL+XvMKCz6(@hh6Y<4ngkRqEBz(~s=`w8F{ zI~vLE;-RXg1_OIjnC$2(r)N>h)+5DViEkyicsTul;{MZF#`AZbwpaRRN9%yROdv`B zHMbZ}f-yCb3u&UWa{Ssobi>0%Ea2}6T!+A4cH|a-9r8+STi)LN%MM-bo7gPaEQ|Ue3%d){0bOh48@ui8$hmP(WJ^wbg5Y&2|0P|hCQeTSL zHgvWF7F>m@itqVc{?h-4K8+T`9(`GK`oqaNYt!y=Q{}tt$o0(s$nvlb#b$eCh8_jvK(dlEQC6e`lHh z5cCHWBhb>v=P6(P%J_l=Hvc4X|6x7%3orcqVTQk;Z^HuvSgHzK9Qhw<>Ek=tHo9H+ zeBZrexrwVY@!L)A>0ao~pqDSs${rtqh-v$iSkvznorE(a@ws6MxGGcsqB%#x@&qp( z1}`7Q#a~;L+n{kP5bgf-v{1@MyHR5XduQ{5E{5?aLo?g)2XuI^VmQBZJbQe1X7i)i zqz=o?_YOnaqC-*p!XE95j{u49+$TNH4GK9FF6-=JM7s#$*j?DYyOr^vjKc>x3{j)Y zvGd+5Y-g0Tkb$`}2iCZrt(JKGgl5*_j!*zaZD=9Um<(YA?1jYtuDPqGOaQzqv-B|QJ8AC7}zsi zrpi<(?*7#-gUF~J2e5nhOZQMBS!oEeJ)>?=g|!>RQ{Sv)oEp*SpDfKljq$nhLXDkZ z;_PGhjjJHRwu()+cs-!HH@csW`@lCQoVAQz*)+M#oIr* zAp2qvZ_nE3j8N3XQ8~eDf#ejYT_D1bUtD|@AGVe);m*T;c6>u;%J)pR=27Uvp@*su z0WGoXuC4=`to-|KVcUg(GPqPvYrVx*VKOctvUda+v0%*+vxsWV*qUohoIZtLMouIH z5`0;Ou4dfC$_yVZ%sJT|^o9um*YogXG=Os6)Bf!!kVl?TAq5u*|M6TTftlU|)f_bB zmoEft5?4)?umferMBBUE+*^n)+_B)tb9DJ5IqZR7$>+Wdk9H3Wgon%SyD+3VFJKlC zQmw&o&yyx4y@dP{bE%dWg_YITOd?3|JZ)YHdJ-jSy5g5F_-p)NTbOkM^*Jnqpiu7I z*Z28>vC+XOknT^JhDS9u^xLZ1&(@-!lo&{|QCzDuyy=H?EMxK|baJ&yyPw%8bU$p~ zT|!C)F6cL4=p+q9A?1<=+wSR!gy%3e-#U|>V_s7#<)ekS;=>anb5{>Yi3O~#h@x9= z3)Tbn1f%S3y~-;e_>St_$p&z~aus4V9lORQbjL>fg~xEsdsu3vY8*uDaAkL1_Uinr zzk%UZ6sS5zd5% z^OOx8{?WLd`-}~b3|E}d_*i#PmoK7#GpdS=h5;77V*Ul`S!7X#)F%)Kv!#cp8IA7l zZMy9V`JdC+s$J|(H0UviMOwTL2iFPk4bP&6=!;=3w66i$5*~TLfPdejN2}1(6xRgw z9$yT#+pXEEVyyO2NloqMH1f7xvQ~@72P`JfV;6-H#r6-`2O}X~q$D#S>gc*1QT& zDAUvS-{iN>a1V$JoX8x`S$g-ql2pimyFRe@MQ`x5R(P-}Iej5k*BVtOID=Gh?{KIG z4ZMWaJsEXt&)d`{H9FV-gA$-~e;>VzS@u_FIPO*#CxyP;!TobgtMZ{bobc>R3)Iorb!*Rdj`-|Ey!~_1o<}RM>$QGA15AQ02|x-Y#8A}q%;y+wzlxIeA-bOX-GmY$K@uV0(s zD)&#Or*jW#(~b%wd2ZhkTw5Nmi0t%1buyrqfR+;RwKFhVszIExe6$`L87wS5z@lqH zWIzY4pr)ozLp66jAI#BNDfa8l{AY8zM!t?q|91PipwiW+@GI$@s;>zUd`JLDe~)xw z|EDA(wjd;`xBX_n7y2D^-G?}-S3*h zC(Ib{5ADm8c@laqBli^8%#ruC>dGfB(=Tf$*q5}`-fHoO`zBkeJ!M2}+5*Cf^;_pq z8-mlr02-z(*rK3Kn5;eha$&fy4mCT^<;+ki(CvL_PBnOK;y(IKQ&(U+LH!Iny zT@kC@(W~B6V)#R9hnD$EO_BM4+e<$!TF4TNacyrm3Zv9N<8#g#`Qhw`!JBswhxvx` zN+^o3j^5q-Wtm(M*In|rQuebICbq{)_kPRqGqkuCy|`y4IMhDbp6|@r=B6!nSoFN1 zD&V7=qX;K-NXj=Fo|}zd*6f1}R*M|o_uK6TaIw=U+%l8*<} ziROvRY`JDI1tEvX>d+<~t{-KUSS?u)RREOXKgPkGFGu+uz7K zx9e)ovaB2;_|$3k!Ggbsj=83jU>h?2V>h{iBb_w7qf4 z{b|`)?lSAX*8@21kRQG`jy+yR0*wOBgOELu(xE{noz1JtuK*dJ6 z!9aaP{>_95{-HCGchSt6+4ztT;Qunf_ zXl$f+1T=n2<`a5X>V^Ch3cT_h4-+%z)@!iYM`lg>KHhkvPhbY;`bagLR+5#|6 z40P(LkDb?09}f$S0D{$XTv$0VSOVfd4fd!EXj^r({ja47C%&T=^k(V}#kO1Ca;!g= zMBUJSheZY5QbDpd2*_!XXX)qEpz482yMr79GPmAen%V44;o|_aOHz%J^RF$}-SWp{ z3?|>t(8J#{D#_+PzeuPSjgQ!y@YvV(DK7;Mt%6eZI~aaTtAVcW7d8hm8nY9f7kFh1 zl=5Vx!BqzCYPHV>(3oJf-(j|*0{3I@DDOuW^>+-;7CYtlyNyfr&?$x|tT0zKLdmQH zpDI8CLSg?~3=T+N`8Z zo+t*U8YPTh+qX@dEj@Mm1!bBP5cY^p{R*p#kD<@gsC3T5x&3Zuh>ut(stAVppw3EW*mm>qY>*!HcImBKf8I(!CBG ziutwU^EIEMAgv99dnm=u{RWC-V3Om8KYI3)wv+BItq2!ZBK=-5(POIw>*~XY&ze&_ zZWs)L@#noPm&_;c3|u-K&{|wfd#6GgxwzDJryJgehpd*1A*Yl*FzGLCaUnws--y7B zmY1I>jhX=A{|8X&pP>CrX995Ri(c1xfDQ zLVOG|cMFHVzKBW%3*HWXh|S?YFfibFcO%O9YytKtE@H8JGJJTkcU*~LgZlr~h~ugi zE~tn%Lnn3pDbcO71n*6)(}GeZd!-^0sRL-e-l%iu@^iL-L{uW^hK z;&0z*gk9q=8s3%+j-wR4JBjgn@sM^HQ)Po;fuEP)Oi--NnL{UBl_^BD`{i`<@$ig$ z67w@%(7Ts{|1xv?{{2^a2xZ2*?&!%Xjol7$DJ>!>T4nvKe2_t>(x1Ptdomogg3z*R$6gi>Y*2dp{y6EXN`g?C4QSGzv6X? zN7`6KQ)-3k(T_VvvlB?SEvsX>Y@q4p_+g6+&PaqQM#@(;C0*%PL!X{BoJ9ic)wTV= z6juqH-`T3;;e%~r1}8A1`9*}&mDrZ$noodePIXMhFE4hH3S-o;r!Um6RSDT1GZ_EU z9gG?H%A}dPUJga<~3)jZ1&mAnWUc)v}vFDO2_uSrFA)d=w8W( zMnZ9OgQ!6RA1awCaOWrW4Cj>b+|{QvzOthcE1qIl@o&& zVnpUyo&WMK<8X&sq$id@Tsk&ysbRBbfCd0V6EG|iXrL#a9L*=E4@Z;~Y==rwz$Y;4 zs-oUmqbq-dEjWxe=8o)e&OkCK6vaN zW@p`W0kY)=CZ5OJ*Rp<2JbzN$vQQ^O?0?O3VW})Uy=&@qdLuRY67wzZ@eaI9h`gOZ z$YD@A8av)0+VRK>RBmuVcons+)6A#kEkTy3w-pdD@`38n_C;x282&5ea|qLtFWFO4zDS&^>fAP!m4Zhuea_ zgRmt9p<(fY{mMoxDLHv~nrIhm4mB@qatX1Hy$p zfeMpD0~j^3A7V@Y@`Ur$99!5`&lR()KWVc= z43TN^_T75F^eg-8?7Um~fNx5LDzap~b7kfkQy2%q>Fwd%tp_p5beE?v(+-`YKacTbPtgb=gwvM=f%I&<<>Cbxn;!AsY8#==LjlV^4* z#5GUU8P2wz!2=>o4#>ghdl#yn;B#isScn5vBaYy5_e?-@(__=db9GKBus0|rR%_tu zjvx2Rv%6?Pd|_vuEs5vfb|EL7AARY zud(+4=!?RSjzQv=6Fp21%n6S{I-lFJ>V5G2-poXcwkOsVaK%RM=J=0xG zl3t=anM6vXs%nh1KDH@x$TtjcM#3oKfx z1M;oI3r=W{M%YrAJp_Nn=y(gKSuC+4-bLbgVz&#S2GLB4wB(vvJ9~`2=7k4oX!q6E z5SrNV|m02eIJXZV!fS*x%7?+6P)(N9hZ3Pn#QK;p)n)!?`Rv*RmSd6 zhX^MIWscv;zE6xFG5s|-J5-gzVoFitzL{w`v}NqB6>X-!44PBI7^jW@Gn$(LUd?Nh zZmC|q;q*tZ&V%t$J(_*{-EoQ@*b>Qe>l`#1Il7}+FEWI8>CjJ!tm@M*>lK|`?~ zEuNRE)2OpCBkcN)C5E&0Qr>4dtB-fXb0_&#ir_h+ef`sZqX#; zklQRd+z>T&_F|GXfV=n+xT+oerorV4G%#f5D;Cw<`SJ_dO;E~)z$6#$m#Zfwu|DwN4OJk~qk0=Vx*j_K&WCu_lJ!Tqb7#2DkSs@RfmwmH(T zf-UHXr-XGG=Ti!;W=IuJ^Ot#!HFLH3-fQfSa8z%B#$I&Y0PsA+G5!hiig|6b#B8v6 zKlkjA8FZ;kcCpNhE_(T(x4MO*EaZeoR-;-f)`L@JRHTt6?YK;a)J0=0Iz8S%NB%T( z+&N#~>J%KEz~K}FtdTaYndgcH$EGKNAm;883>~5u&%!^XQ zDPb*t?%l%?mAekSwgO(k;F~j!exwc0+hrj_dA1Jw#*v>2piNs!c{KJJUSwYB{PB4d zn&lJke6Fx1uZ!2jlyR0yjqlI~tVHs*AE!fP zhlh(y7rrVsvJj8;+yQ9!oKvxYrAC2qXw3)B8t)F~dq0kP8ic*-q5Pr4R$k3ey!vI@ zCs+Gnb;)8BBAsTwr`?YXbxvEy1=0!~)ZZqAyZVBdRrY*apBCTFPRyv_4yFD!G3H$C zS?3XBc~(=2B)&Lp^PP3=B&Kb9z$uok#5L^biD~)t+gdxL!x34uN!^@U%q8n%Pacjz z_ri=XwQC9v3{vC@-<@akxspcrym2<|IqPsAX*3p%hK? z>hua3@^qnrGmCc5wWx8m41+kNUJ-^ zOgPc2hV9puFs-e1Zn+(xS6LrDAc1oi1z;h&1TT;-WK;R?lbv)P4=8!CGwp7Bd9+}# z0yoHBDv`}d<~+?uTsPOzAyu2k`W)k8`R%EFMeJ&i9cU8|G}$6Ue8$1+x!Ch=uyIAp z!gUXn{3_8#COKwgkdryoL;iGZdnawHHH_>$SzzC9bZU3B89M8w@0ojsRd<%-lw|WL z6y(uEXiXx6gQs#tnY>CsIiRf@=F#zl*InjF3)?YxVtTEvemNOxCVL^1>N%#-c_&Yl zqrOmaY&xr42{8vo`ZvOfw;FS+5lgePd(m#o_duFfJIkWOj|K#J?s>ssDY7eNU)UT< z4*a^Bq)acoB-ydfO&mxsxfor$;mzmgjM%lRpo7mw%4RWV1G<51%v|eZ{(>f_oV+O0 z(=SD1?_TZ%%$0vVnla4|xF<)((%Kf>z7xzcQr33zz^zCwR>plLfU;VfioFS-Dyq0P zIpKO2a*b1GiGs$-)p&YzyF)mamsj8P(bS*#D_Hpijv%Q|uL@R3VGd+SJp*V!<*GXT z)mGWOncAAhX;nSv*b4)2@uT`JM_z?7E8eOvLQ7v>%xF2kQg!QxAIg6~IZ`7L9LbiR zcO8Wd{Wy)S@*44wy?FOFjCN<*C^tgO)EBj}&{wwh)h9%#p;K2jeK2TLR{vD{JXPm1 zme*JjzOLJj`l{na6QbB_JOtFJ-$&p{;ijA$hTO=`^^|?+{k4oOK}|#*l}|_Y)QzKi zHehYQ<2X#)?6NTivtT0JaX5EhHBNQjtwIFSd=@pw_h@HC_Yx0&o~y1+BDsRsetkD5 zapy;a#@&*SI!o;?8hIe+{Ir3)umR?99+%{CmgLiS?17~@p^L!8-Zz$H&yzKx<3m-S z!26P?mEQ}kJa^hp=Txdd!y0GiX&JF&gJnIC>X5lZf!x>c+uxoZ zey%3Lr%xG@!7Mo#Yn^{@Yn@Eno$Zz^7!#8Yx`ZI=1V(S)^m0|=I{$vb7q%(jbMMx?o+vw#)vlsNH6cEK=-)j6%YIc*Haef>~5f->}sPm=7(RdMyytmK{L4Kzgt?dMKE-U zp#cAOL-EkAADbTiekybmc=pliHnvdT1b0s&L{np)&ywjJSSSAojj}{WyB7lGLI7O#^unuN$T5G?d^LA$1Rj%?h$@Y?9mO`q`N-@$_(_yE+{(6Z6=a zO6&+sn6}uXdY#B`=)R=9qWq+|$RkT~&Pa1_+yz*g8_nxe*PrXZ`XK*&4bI`euEjX= z`da>Hm-f%^`2TfR{?~ssXE2^^t)cpX=6(+UDYEW7Q$^yfXNfm1$W?=-=nK(y37vdS zb-^X4g{FM5vK1~0ie^KObBJg<9oc+|mYb7_M^N=fqjI@+eL^B+ra>c--mW3EEJruq zCNf{Kxb~jY_-Eu@$yWl!5OsOw9M%Jq%|q}Fl#i0a``)4k#rb^G=!e#+vqVmfhJh5g zkAKh+#N~giHeirYHiw4Ix@8*7Hi{&wNGUQ3au}pA9HF^)F)Mewla3V`?TmdM*4)V! zlAt=h+$wogMuUPn(1ZfB;_I2hvP2kQd+S~IPS^9{uabDe^;L7^ht0<*s0 zgC8dYvyvxx+^()!(js(Padu*-g!m3FtSX~Hto9Yihb$^5%dom2n4+;HVAEWFvY_>? zbe3=;l1ZhBTh!~Uy2^4{*8Y%Dp$Ud(ywQ$}zEi6cUKNvP=oG!R$dlOjc!*Q}E?hOJ z@9T>T>-T+pb1)ow{Z>~9Kc7ykT(~-Trcio$JIPZ&{U+op)i9ww=_ZgKZ^xPx$gP(!9Oo|J4tfAw(W|GnIUM3lPPj`n?AKwpZxtkVNp3) zZAI-f@Euu@kKD%#`h17OwcOOE@{75_YJss!sA(h19q#C=0yP0ab#ZVKdvwlel*Fq$ z4I;N$Z3hxy#hGVS7SR|K4H!|+Amh0iGq)c(K8+}D^Ly?LCP`XkY$&b(xrK<=%X_;C zX4=yRmX3VoL>g*=EmA6CdJYE|vSS$`1H6qG$l09!or^d_*Bd?@{0A2j%}6h2vp1|J zmfCrTpt&M@=D^Y!_I~z*CVSvY&6(=wSC{WTQhwQ-pI7B7Udhp3G>z_MPX9J*A8wyX zr=mP?8EPT_PN|}{+x>^WZ)EfcG|odhIi4mpXuS&+1%-+IITqDU!82Ce=?GVKuqYjw zhPvxO%*XxU*n*ZUHN}XvFtYV2eDQ;p7@8{NgNb4hI-VVcZ^i~RwNTVTZAOx(M$aRv zRm0uAK#mrm@4>IZk1s|0E8kgM%ykj;#&F|~(<gOlk$K2X17^VaX_i;yoS%W zaqPB1W~UhAwOj@&lI*jqsj#us%(WE7gkg_~Pb^0Erz#kc?C{G?jAXWM^nt55@x52s z9(3cqYe~Ipvu=&-%_Od&w4&mn%6J9|66Yyd>XctpG7|2%$lOkI{>_DM~GlND5}UGP~d zd499Nt+PfJ;_B=)4TTQ#>}eKkF1JE~B+orJ9<4P8k^(n~;z}`t^wp<|G!ra$iH%|Y zy#B_Pm2#L7_jK;PnbftqFmAzUje`D^S_R+*a--T@Co>2(r+OCG1gz(SwL>NeC%xH` zW@qnYg;`64xA}@VzIA3;^>ywr>X_g`AM`>k9A9e@x0WC zH&Y;UBxY6Q?XyX&x3+2GYUblJZ2O1s91d$4ANLK6lbDUy^+y@dX_L`|vlqxbixj-T z(HoNq4)gQ1XBPy{;~FpS4!PbpN#LBGF_$eGGcY)j=>O~}PLy%Po$P#Jk<1n{YP3ez zxaFwTq+eyoPjYbEy^@_vi_H~3n_H!CyMrUGqS*$IMteXp|7bMJ7DrJ^iYt9?XYuA& zhLz)&DI~IwFr8;*w`%UApjbbbv>>;s99HZv5+FHtt!#UI;p{6Ry>hw1(Vt`y?s?`? z<>0b?XEM7$lh;Oz=7`I3B*CECM6$+8-Z29yRO7SQikr{g2?}3sd6dk(OY6jaAc0&{ zoqai7_$^g2&oaeOQ?Or6@L<2<`_3EY=IyLNf|n(BSRQX_x0<$_$MQ?6lXu>+t-4EX zgli{jCQx=KIZRJk+cx5pcY1glJ0{!Sj7%SC0QSCT^!8n@$=Oe?9Oj={#GK{8$%^Ez z;r{hI*Re^<^j6RgrvtCUTw1U)G%sV9&geilIvhT-8epkpBjb;G`601joWIx+WSL4R zHMU2QR&?`fnP{tj84RB&3b15^I%vORwGHNA<_qNhP>9II<=HMVTw$>GWGa}YU*u}|oOTA? z=FOU0Ly4>t)7Su3_dWViuG!*B2-z4r&T{hAUi0RFif2iL(+-;SvRU?SoVB#*UBW@)E= zpM!LPWvu*m#cMXFZjbQfQ>jY{y0iqdS6 zJ(BMpGEg5SAl+5ZL)4RgKi{>N)a#YG;`y-Ir}{K%kf*pnu;_I-9NOp8kw2sFAes{> z-J=N3P|yz3TpiOU+hB@1!eq9XsZ18P&9y)%FC{6izn%ZSQKv9>+ViGw?Jzt=K5s{B z(Al-haBz>ayOe8z-Kq|?M>Sg zX;PzU$ehgIOq_fZPsSP;Icyzmo{EoX5bRSeIgnd43BZv}=OaRr5*pGegNj6QX`vB^ zlq+l>bOw;mzjIiRuwBrjpu~P21B(&NA_^;artgj6l7>VGiCide!`Aoi3e^jHXz`R* z@RWREAQ{0)Jj!dN<;=z^hD=S3apo~RMIh~s=b@%RbkcUN)MnI1J}m^9rGhQ1Dn>td z_87=)BgDTKNwb*0K9w4`a#->jrzR2Y2!4}oWPddAF1g6T7ZtX}mFTcJLC8EvXqTh| z>j;~7WxQ2l=P!0KOis|7^=?)>dE(M6S-{aYj!B9p6|@EEExBRU z%qSZoGe#nl)Z{7KHd*(D!@lTM^ePE>wB!_vqUcn~@#qCFt{MCA>|!h4(TbCFavy#8 zj@`Tp3%e@8^VFwj1wK=Pd1eY*F5EUT9=&sE?f_iwG%;tyZXsX9Lla~!tN+#!MkwZb z_dSpkgedlDP<;%M4?3H>H~l)48~{`wg>Dk~k@V}UAEE7b#CR3SSpngHuZ2KQ;M5=oQ)ws*@@|m+rulo*_A@ez* zk_8->PF1&1J_fONYEYpoog6!EPt{ApBpakrpFE_i@n~5d??@dFjPqk22 zCh9G#nQt;@T0}TsFt$>ynOiBO{^9Cya(ts4cf*WJOUJf|3PPwcCi7+O&Ap~;s5R~As z+8eh#V{$Wf7>~{ZOgxhW^AgETy@($=->s>im!KJx=6bfBB5S;w^nkWNCT^9DCUtl= zjj+N9z@PYCXn8cIpFbflHZ4rQ^z}zW!0#jr0-E(^;UQySo1iyhcq~)MLctwpumKfk z-bVP7ZWRIFZlR7JY^v93WCa1`4U`te*uRh{knywHDOEPSsfy+vGL1}Tl7mmK zI?6T=I&`}Vs5YdE>bfhY)2Ozg{ZOygB*tXbV`Jwo&V;68^I$gyMUk~9PNpaay|mx- z?SAc|B->($WJWQe;jHrUtOF7!|D1Q0a8`(>!Ad_-Q4wO^)Gx4K*4iUsVm8o}Gb9x? zENUMBB&<=?fGV{X?(3X3QhC|_7_n?UNy+d@Y&q>cdE7Ym5cK^S7A&nZ3KP>R}n2aU@nkW_p<3aULC z=eY2P%@9`?QYTm*3_ENNe{Xh^HxWSU;dCW^2T~T%k%qHEF8iS;^e?XTX*%ykA3b-o z$g-nJb%G;C&N*L|MpIC8&?|kN%%>rHC+hj_lEoF0JTg6XoBjTN60~^&8UfubHiZGJ ze!L-}1XA)<$KOO&##=e$tUemMg<{<*VMG2d-#u4FLTEA@>+M}%0nLPM<>LxFMRU(5 zTRUZD@;kyD@Trmn+-kZrYhUPWy`>mee&lhlk?xhgx}k6A^g8sh*=d2StJc>9`y*xc~1r5>J8>!ZK?AzY5&o64@yl2OUZNaiw zHG;zqBzB&3)rztFcDW;@$7wl@mix6Zqa8>6Lv}Lx1UpcU$trDZ-K~MawQJ;gAwN+2 z=5&BBo11Hg#V&<8F|C)0_-S=VzDhoCFe_vpOnU-EKMqU?A48S5sCZaDW>|>_3}Qo~Nqj_xJ5b#}ICRVHe%D;w==OrrT1RAEQ)bg_`!TRKklM4es@-jlbsU0nxRjixi_J+&>gE{3e`luIhrLf>vv zDV=C$#If{ynR&pkJ)X;pZ@L-)vXABegElLlY@CN*DH%2G+xay#pM9RJNKVbn*$~LG z8#*<=L#mp$!A0Xt+a>7KYr$OGl~voOmHLybxHw`pC+)k6fl&&@+SGn zcbM;C_zoCybV==aR*^#u67g6iqBbO`XHGX&VJ~ zNnP8pZuHHsiiY zipJf_$()_yG@)!2qehLdCVi7!PTY8^7Nv9PV@J_(mfhF0hVB`foGxtWv}=Wa9-GnM z87s6IZO&l`w62{`*UNd280rR7eR7k*;DT(4ojjPt=MLx??-d_D1Oec~CEp_QMIB7V zWVRYBuaKEfa9s`qp-~0Od^>mR{o6c{z?5ka;gLEFvH4Sm{x zjkXW_CwyO7|+H^DM z4oAIW)k~epcoxX|fcXluws_}(ut7ZvM=U+4qSwV0F3>ux_zt)Anqu}})Bh~$#|hUe zamNuktoG7?abAkPo&Qo&XXzaypqajqa)wYfbCv>55=YL2o=oA_wU*3?rZ9eW@T!TC z8USdShV5e8Pu<48%Y!(kF%zO6?QghiYm8frw%#yO`WJ)AT(bd}*I4FM;sPf|$FX1! zTPex5Y9*xR@pXN3H+OMN*sn~eJF--ol=9c7Uz|hv9NCW(U8dW(Nty!E&3ntJu>;9L z<{fzc#94R4$#zRLtPUIAuudU1tfup*A&WB>umCj8296393*y+GoulaC1(t^_Cl6wd zp8&`A3sM1fDj#%bhh?ERVQO}b4))F9;__FYs#_!TGgkU3qrK?kyaK?Wo;@hGwK^x% z)b6!^b*n^#?A-fekA@MoA(k8BgZn4nCF-N&%{+5Q6jhd27_|w}D2gWb2PEUd8D*m# zAq=~mpNC{!==!7|>fzsO8_j@-2$1 zWG9!}+f&+^xFP6C79xIQRaTizs$lhDr`qP&#O9up{8J?xT+y@1jUOa(+GVjc89F4= zI!+@+)8otLXg_daPjPNBuvY2j_RUo>e;K}|kuWy5%%Rdjn8Qctly4iEDC>15<8cu} zlgjL=#XEhL%-)(|yJ8g#T9{(3viKase?B%R>q3->nK#Vz$rVUJ-42r)sNSlrzO`~X zJO(SZj3FRDKFbZs%keJi=_cEWOA7EA&R0w-DIWM8%Bud=8V*^Sq?@8@koRs?VI#6Pzqm27@)C zJ!)RTcC?HN688KV!_hwN&rCI|lUj_WR}U;{1dP=n(q?At*sZM1*&Yb45Kdgh#Z2lh zgOMc~3VhSa`D#k77c?m999a#^%H?tgtb_CEp!Vs9&;pNuL6T@fpm1j(rCtw#F#;!t z?$SwOl}Xy{Z5$-;sHx@TWJZ_(NH`@P#0xEPh~;mbJ!{NPr{jc^@EE%h+`1LeNUgt6 zDZ_jJ#-wxRFNDN5&Q^Bg2%hkKu6%^LOtz$0 zFlOelZZ=J{akG*oX;=)sqM?lNDaJ&=6-}uN0B_ciWEV#Vrm+1fiJ$1k2p|7Uln-2< z8uio(!mG?Gua?rgz~4DcU+oe9zMDKQ*fnf)L%bb&roeQf?|08&I`)A-Jk_`wIE7K9 z{D0gE`hu8h(yt(`t5O};TCwcwc@AyZZCR4butB3l%Wuw|R--G*`@Zk9F0`)7W>j~t zzeg<#K_4QT-gw~u}oYhK2_=+Qn}E}6XH^##z7F=F4iQ*ltW+fRJ>139}x zH4L@*_TK2@E3steE&Hg@0_hz&pO3cqf;&GBdiE&{utxizJMAGG^^3>cX(RcS8;Q1u zKBw*D*Ubhb?J&;kJm(@s%g@YiW%^ulhQ?7@I~(b9rymi>Ukw+;w$q*~dt$L^^W{zd zj{DYEk(ls(sZh1VhF5*@uhj|JX5SeUC$m;7NH^7UR~1Z~EU8B59%U&j!MWZ^YS*%f zD5#1LO4t>7R&~Cou%J(vlCeRSNZtl0U?Fg9)yR>fpn6YHaL^7dP z%n{mK9kB({&IuiMqB|OEJLyOrf68BG5F3g+izA}XaWhA zKf+Fxh#^p`-1i6{hJ#6xu)AC4TGGihF@ZaUbekOAM5mVlk^6+@AiBH@-#X6Duyku} zwf8>R1+PwkWzgMnZ-}sD?Q9S$$sbT$Z5#xChLZD%1q*x^_>c7l#lM$?bJhudR)G}= z8UH^@#??XhsU)CgDs~kKKwz~q2&)DNC4iA4KiSZsH-l)VtQAv@fWV=WinE)=Q$iW0 zO+JQhZ%2uW^WjI1x^!xnzOciprT#_^Sdk2gV2SVWg&LC2b!a*!31ps{na!n@O+R83 zR|TY)0vEQUsfY!(9Z!q8H*YOdw~IS?_h$<03@l9h0SNFhh|Pu(yExoLO)b8!FXo}B zrkvrki{LcNI^MVQjf2x)KUp=}H}2H0FgK95C0OpC+>hpWEe5&!6KMb@ZzwOyx{ieF zepgv}Ac|lK#GGN_&oUxwBZrESLcFp|(9DJW^uczYhPeiVu;G=A13t5giKEaaZyF<# zKj-4sh!Qn@rJhUvensQ?Y5f?qMj8^jy;Dc~vv_E}kN%6`d2EU6Z8biBBmnVPR-YU) zUR3t^;I8W;H$2Ow!02FQx;=DIcX^8)hT24#OQ;vObsY=RKbH zJ>K_tkN0`r=l^T2-*wJ){LbI+{C+>@b+SK=SMWB2dIpRibQ(w3-o_Wp*%mT*4h)k; zol&*WqAP2QU!k6hXWzR6Ly0EAWhN9&H4XlFa3<06@Ui^s%8(87mQi|!Uyk2Dbe5N0 zwq}X&fHT$R^_3lju&Rb#s_W!1E^tHEQ<4!$CKS)i*dJ@9$ocxlSS8@AWrjyx)>*OX zIdeRI$PZ`vZ$e8Qo)t!}_2Y#+0n6b;m-t+;24wSG637lES5iJjN(H|&)nCrCOu-VN zUyYw`23<`xFT;sMX5b^UlEv(U9utR$o$69QReMRe4fv&WK#HuRMzV4-{p z&loU;JQe-;!ajhi`Xe-R@~~=WXD<;NYNt>vf86pP#uZLW7Muo*%I*i(7EIK5SJicwP)e9s}thwDczrIG1}rYeEj zK-qTWTC=)xHMA)^nNheYFgqV;1t$50+K8$k!xh?-B}+x$KflyCJB3A#_v4RzOn0i6 zI*%}Z>8ZAurpHusaDj5KP8z%GR~bm~`{ z*veT>xzyWNH2Z`mBR}XL=SUTtl`ewq5-owp^2gGLaf*lj_w1dMli*Aw0j}=g5GI=KKr%#*1mg^%8KfLJV-hm5cS#C zZt~Oe$&RkG?chS+79jkOY~4PhbL^Ln{Vi!`$wAkw26ykJGx819bEK<%BV*~o9!btk z$G62T9Z-1ZMyB;IL$=G8S^zI4U^Vr%8hPpsOIUqrot2;eS}#u%tH55HD4$7{v~XZ$ zT+HolIHg)H5Z+O!JdAF@P89EB)=*bwib}(ybYqtq8jx@8_v1VaM+>}qS6bH$ts$pa zf$pfMXga2FB#?%lS{jKBECsTKD*;X5f8aA-G2H0MXJqNHazC;owf07+L8#CEC!Ro$ z_EuK(`=eth%K)ScKv{Qz#2p?vn7p^pS4HnL3*=Khg_-{xckXS0pLpz{-L00bm>AMG zg%zIay&uD-t=C@zLBPRPwZGP6^#%Hbzpx=w&VPpe`MVi_+i?J=nC3+e+n#AM4{aPB zR9K{q_Y|mk^N&{>US__v7>B(GgyT$!YSqlcnZIFXc9Y1CQSl@>_7vz?=Ux!AD~Wu2 z$rHh^KVM}sr+)LezoFmY0M90xxuDU&;V~i_nSZdw=S1TH*ZxHmfy-LZJ%wX?srkSs z^i;3dwN&8x6XMrey1)|`B8JJqJ1uLWQSW6`-x*m(aogZ1PhWOl5-z|bYiatWKd*+5 z4lCq@6#istO#ik4#tU~xn%BFa*QK?1kK*)D8e|B&Sf}I5f%1Zf=)4~GBm(SYq<#8? zOi-+B<8old~m;q>)^i5nRAj_ zEn)dd0WJYuL4eeELc+KUG(j|*)SH`v`B5WAC0Lo!eV5(Vq^{n*Lm2PeMpBnwqgVK- zk`3UC7lU@e*N|ms{$fExAzKsef>Z9{95Rh|9ZXCVX3)i63Dw;^&M~e)%nix3?t32- zaVkInu*>hk8b&|kgYlE5(?j%l7^}+%o9IYp6%*mE-M}_nOI`I!QQEtcw1j}NA-&G!Hdj6JgF^TTnN z1_6&6P1-3&%F-J)a38UpP%6sPCKQG6Wvxp;Q_0sqi@NXK9Vz&lJ;+Z@%5^{T*7(=w zO-s7XwUrZS&+z1)ESniMngAcfr{|KW${WfQCOXpO@pd$g+km(k(KPjNXPE(raP<7l zuO7|u4epm)_d=KTUr6qMg$ew((Ql;pAn1I?cJj%ud3Z8;MU1(ktgO!lcr^l7<4$<> zR0el|gFm|Lojh^pyj?mlbfc7Cb?LaV~{cc zD0%AUDlK-nt<~Y(bDr!H*ErmUh6_uCd%oj=QWfWO#n=jxeYj?!pLY+b^9ClLe$axV zkNk&lv<>iaBPBy*+tQt3%Mv_6r4QsF$iyi&W@4%nb7b~f@pv}VnyJy`&$%;b6FsMS z>Hv|sdP@9euDGm>jE2f(#L2nj_0zn-RqeXF%ID6y!Ir1<^nB%#T+N%Yl6@*;w+2j) znaZV>cB`0?sr;Daz;Xi2=$cTrNWws+V!GJ{l{;F&BD~hQ>-;3|X%Ff$u{g}va4{6S z!WAJxC{xUyD#;4L$*7Kh!B#lMCYJ{gt$33xVF^*FUW*%nZgrY@w)17jwp@u#VMyer zwXuBx+3UeSdelI{3NFb7UW=xOH6pqjNts`zURA99M>pFZLC^O&;lJujLZ$|)?ok>+ zVT^*@-;h9OVqS)B7a!dPwD*CI#RCcghxIFxXae{?Lb3!K|!IsYzxsHIq1j1em5nDyD@L++Q)fw8 z?)D_$GTxyIQux`{gBqFM!?bHqe&fPud(|{TuS1hXx~NnWbC2*4k;pBU%?DU}j;rdF zO|O09jSCggr`aqdj#!>L#1o5`KtkYm02#-vaX+m=#M&P8PIvUm%YMpy4eZ&>75S1-(0vaTT&jaS`q2Zt}zjMr;drU2*Zm1@B;hCbe+j;slc%J5C@Y;EB|vn z8)F%crr^cHWbw4A2%6BGxzJvoD>t{^wf72jtQrFk8`I#1S9G;N2C`24sLXLG5!KR>Y; zJM}!BE^XeWoreot?dzAmaLy_3MzG&yFCGM%GV;Ke+Y7eq3R*~DyVh!%jZ1r+rmsILj0qBC{gX*OTSE7k6@!?pu;ljU)i{`)cLXU=Kx{?RehBEf-I-a_pY*LPMM(nXN=>nG!~ zp=;7=8nY%q`L&!ho2h_8M)H%2;YNur*?-<*9$(CqdNs-iXVgA#NGWT4nB*OJOolXIE z=rc}l&XRy}*jQP;IU$_q{pzHzBqjH)>h{Qi!H=A1aQ)YJa%I%#8>MY^F*)Pr`g(oVr1@q}WvjI=C;wJh~!F*kYNWk-W5%vr4?wu*@+OLK$q%dKPa_lwr2$8dWI{yt>V zWo8+ndwcln@4I2+l_5ZC?mvF|4sHSWD;qnt_9Fqb%}G?!zt;aqvbC4-kF0VV^eLMf zX5W&7GaDlT4^?_jHB7qeuXZn~PJJy#BI~74d?~RBmbUvo;9Ck5bN68{R2#+Qt&TL4 z>7VxO;;A#K^<{SgGM~CFvoc(;s6gigM%|El4xCpWs(kT=g5Lmm?it+$Z0(&;0@Idn znp0Qu$co{vXLiPShwMkc#%I+vSc?X4^r`MsG7U@1aSp*v{574_@sizpNr8r6_lQjx zrTLnwFNoc&CM>x)TFcqOT|0|$&^6oMMp{;SE7$p1veMQEi;~G|RpRCk)Z_l2w|8j^ zWB9p4iz_&@B*;@{*#_uLxoVarP0qrrDa(oQA>< z+Q|>0O(tqw&mW4;p%u2L0~~I)*NGGH9W7ZF8we;)3sfHU(walaqI$f0>eqZ?zaIQ* z#IEC$sF8h6_m+YQgk&6gYQs#T;4QmUk`oqYbl*6Cu3un#`gEeXgu;E7aTU`xzgh9o zt?&zrjiuzVGoo^(cyxU+xB{UFnR7d|_O#X13I>o~FS>|B`&w+e#Pr`K&iN zv#W*x|Cf}~St03rYster-_i<}6?6Tq9_p&%qi!3LhyK|Gkgwqw)=vaFsqS|I=IIwg z$k3Xxct{t)34dLMNrv69cDj4&X<^Gok0j)X8u zUDUoHcXZ^l|9mnIQ-1%6p1HhaY7K^Ddc^7aQ(!7q7YiRGeHU`W3$?P;rZZL0_+?EN z4nJz%oz#zaa;rWGt&11`0n{$@(nft^U!FI|Qe}qZ;wFvSche-m*x7_KM-LULYHNBW zMprJkDBJdE1x<3b&U_|BQ~CHhF$3;BSGB5Kd{G?oJP1Zf2FwC}m$uSNWpq!&OL*FItcJPw?ry0?|#8~%@ zM%GTng6ncLWB9Igh%YXXbdwjlaX$3xtAouA{Xr*8QbypA?8_*a_wCXQo zqb~x`x@S7Op+4Z?3=X0_b|QeO$&(_YJhU3-Y{`Kcljpl(UdIUfc&n8zF0jsg0CxRS z|F2GZl#AZRsqX>-Bd8@j>yyOv`Bwik+;u{5G0agOXi_CQ*}!^5FDc&P#|>Hi<~?IH4_3!kAgcfvmKmz~hjG|<4PJBIuXb04~q literal 92626 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 diff --git a/coverage/clover.xml b/coverage/clover.xml index 38a3aef..c5a7fcc 100644 --- a/coverage/clover.xml +++ b/coverage/clover.xml @@ -1,71 +1,86 @@ - - - + + + - + - - + + - - + + - - + + - + + + + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -84,88 +99,127 @@ - + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + + + + + + + + + + + + + + + + - - + + - + - - - + + + - - - - - - + + + + + + - - - + + + - - - - + + + + - + - + @@ -174,34 +228,34 @@ - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + + - - - + + + @@ -211,8 +265,17 @@ - - + + + + + + + + + + + @@ -222,7 +285,7 @@ - + @@ -290,27 +353,41 @@ - + - + - + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 5fcb76b..24c7e66 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,18 +1,19 @@ -{"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\app.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":16},"end":{"line":2,"column":34}},"2":{"start":{"line":3,"column":12},"end":{"line":3,"column":21}},"3":{"start":{"line":4,"column":15},"end":{"line":4,"column":34}},"4":{"start":{"line":5,"column":21},"end":{"line":5,"column":58}},"5":{"start":{"line":7,"column":0},"end":{"line":7,"column":48}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":24}},"7":{"start":{"line":10,"column":0},"end":{"line":12,"column":3}},"8":{"start":{"line":11,"column":4},"end":{"line":11,"column":29}},"9":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"10":{"start":{"line":15,"column":0},"end":{"line":15,"column":22}},"11":{"start":{"line":17,"column":0},"end":{"line":17,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":27},"end":{"line":12,"column":1}},"line":10}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":0,"9":3,"10":3,"11":3},"f":{"0":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"238d41e6dec06e1da54c04581acc2c5d81a8ca2b"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PartyController.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PartyController.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":44}},"1":{"start":{"line":3,"column":0},"end":{"line":82,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":14,"column":9}},"3":{"start":{"line":6,"column":26},"end":{"line":10,"column":14}},"4":{"start":{"line":11,"column":12},"end":{"line":11,"column":44}},"5":{"start":{"line":13,"column":12},"end":{"line":13,"column":22}},"6":{"start":{"line":18,"column":8},"end":{"line":27,"column":9}},"7":{"start":{"line":19,"column":29},"end":{"line":19,"column":95}},"8":{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},"9":{"start":{"line":21,"column":16},"end":{"line":21,"column":47}},"10":{"start":{"line":23,"column":26},"end":{"line":23,"column":69}},"11":{"start":{"line":24,"column":12},"end":{"line":24,"column":44}},"12":{"start":{"line":26,"column":12},"end":{"line":26,"column":22}},"13":{"start":{"line":31,"column":23},"end":{"line":31,"column":33}},"14":{"start":{"line":32,"column":8},"end":{"line":41,"column":9}},"15":{"start":{"line":33,"column":26},"end":{"line":33,"column":69}},"16":{"start":{"line":34,"column":12},"end":{"line":36,"column":13}},"17":{"start":{"line":35,"column":16},"end":{"line":35,"column":49}},"18":{"start":{"line":37,"column":12},"end":{"line":37,"column":34}},"19":{"start":{"line":38,"column":12},"end":{"line":38,"column":92}},"20":{"start":{"line":40,"column":12},"end":{"line":40,"column":22}},"21":{"start":{"line":45,"column":23},"end":{"line":45,"column":33}},"22":{"start":{"line":46,"column":8},"end":{"line":57,"column":9}},"23":{"start":{"line":47,"column":29},"end":{"line":47,"column":75}},"24":{"start":{"line":48,"column":12},"end":{"line":50,"column":13}},"25":{"start":{"line":49,"column":16},"end":{"line":49,"column":45}},"26":{"start":{"line":51,"column":25},"end":{"line":53,"column":14}},"27":{"start":{"line":54,"column":12},"end":{"line":54,"column":43}},"28":{"start":{"line":56,"column":12},"end":{"line":56,"column":22}},"29":{"start":{"line":61,"column":42},"end":{"line":61,"column":50}},"30":{"start":{"line":62,"column":27},"end":{"line":62,"column":37}},"31":{"start":{"line":63,"column":8},"end":{"line":69,"column":9}},"32":{"start":{"line":64,"column":25},"end":{"line":64,"column":52}},"33":{"start":{"line":65,"column":12},"end":{"line":65,"column":56}},"34":{"start":{"line":66,"column":12},"end":{"line":66,"column":42}},"35":{"start":{"line":68,"column":12},"end":{"line":68,"column":22}},"36":{"start":{"line":73,"column":27},"end":{"line":73,"column":37}},"37":{"start":{"line":74,"column":8},"end":{"line":80,"column":9}},"38":{"start":{"line":75,"column":25},"end":{"line":75,"column":52}},"39":{"start":{"line":76,"column":12},"end":{"line":76,"column":27}},"40":{"start":{"line":77,"column":12},"end":{"line":77,"column":89}},"41":{"start":{"line":79,"column":12},"end":{"line":79,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":35},"end":{"line":15,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":38},"end":{"line":28,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":30,"column":4},"end":{"line":30,"column":5}},"loc":{"start":{"line":30,"column":38},"end":{"line":42,"column":5}},"line":30},"3":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":4},"end":{"line":44,"column":5}},"loc":{"start":{"line":44,"column":37},"end":{"line":58,"column":5}},"line":44},"4":{"name":"(anonymous_4)","decl":{"start":{"line":60,"column":4},"end":{"line":60,"column":5}},"loc":{"start":{"line":60,"column":37},"end":{"line":70,"column":5}},"line":60},"5":{"name":"(anonymous_5)","decl":{"start":{"line":72,"column":4},"end":{"line":72,"column":5}},"loc":{"start":{"line":72,"column":37},"end":{"line":81,"column":5}},"line":72}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},"type":"if","locations":[{"start":{"line":20,"column":12},"end":{"line":22,"column":13}},{"start":{},"end":{}}],"line":20},"1":{"loc":{"start":{"line":34,"column":12},"end":{"line":36,"column":13}},"type":"if","locations":[{"start":{"line":34,"column":12},"end":{"line":36,"column":13}},{"start":{},"end":{}}],"line":34},"2":{"loc":{"start":{"line":48,"column":12},"end":{"line":50,"column":13}},"type":"if","locations":[{"start":{"line":48,"column":12},"end":{"line":50,"column":13}},{"start":{},"end":{}}],"line":48}},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":2,"7":2,"8":2,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":0,"20":1,"21":3,"22":3,"23":3,"24":3,"25":0,"26":3,"27":1,"28":2,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0},"f":{"0":1,"1":2,"2":1,"3":3,"4":0,"5":0},"b":{"0":[1,1],"1":[1,0],"2":[0,3]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e5d8322b904fde76848f99a3c4e9ec98ff880216"} +{"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\app.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\app.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"1":{"start":{"line":2,"column":4},"end":{"line":2,"column":31}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"3":{"start":{"line":6,"column":13},"end":{"line":6,"column":28}},"4":{"start":{"line":7,"column":16},"end":{"line":7,"column":34}},"5":{"start":{"line":8,"column":12},"end":{"line":8,"column":21}},"6":{"start":{"line":9,"column":15},"end":{"line":9,"column":34}},"7":{"start":{"line":10,"column":21},"end":{"line":10,"column":58}},"8":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":24}},"10":{"start":{"line":15,"column":0},"end":{"line":17,"column":3}},"11":{"start":{"line":16,"column":4},"end":{"line":16,"column":29}},"12":{"start":{"line":19,"column":0},"end":{"line":19,"column":15}},"13":{"start":{"line":20,"column":0},"end":{"line":20,"column":16}},"14":{"start":{"line":21,"column":0},"end":{"line":21,"column":22}},"15":{"start":{"line":23,"column":0},"end":{"line":23,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":13},"end":{"line":15,"column":14}},"loc":{"start":{"line":15,"column":27},"end":{"line":17,"column":1}},"line":15}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"type":"if","locations":[{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},{"start":{},"end":{}}],"line":1}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":0,"12":3,"13":3,"14":3,"15":3},"f":{"0":0},"b":{"0":[3,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3f0ea21986f5fc26c3726b70849b12195e97b21a"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PartyController.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PartyController.js","statementMap":{"0":{"start":{"line":1,"column":35},"end":{"line":1,"column":55}},"1":{"start":{"line":3,"column":0},"end":{"line":104,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":14,"column":9}},"3":{"start":{"line":6,"column":26},"end":{"line":10,"column":14}},"4":{"start":{"line":11,"column":12},"end":{"line":11,"column":44}},"5":{"start":{"line":13,"column":12},"end":{"line":13,"column":22}},"6":{"start":{"line":18,"column":8},"end":{"line":23,"column":9}},"7":{"start":{"line":19,"column":25},"end":{"line":19,"column":50}},"8":{"start":{"line":20,"column":12},"end":{"line":20,"column":42}},"9":{"start":{"line":22,"column":12},"end":{"line":22,"column":21}},"10":{"start":{"line":27,"column":23},"end":{"line":27,"column":33}},"11":{"start":{"line":28,"column":8},"end":{"line":33,"column":9}},"12":{"start":{"line":29,"column":25},"end":{"line":29,"column":53}},"13":{"start":{"line":30,"column":12},"end":{"line":30,"column":42}},"14":{"start":{"line":32,"column":12},"end":{"line":32,"column":21}},"15":{"start":{"line":37,"column":8},"end":{"line":46,"column":9}},"16":{"start":{"line":38,"column":29},"end":{"line":38,"column":95}},"17":{"start":{"line":39,"column":12},"end":{"line":41,"column":13}},"18":{"start":{"line":40,"column":16},"end":{"line":40,"column":47}},"19":{"start":{"line":42,"column":26},"end":{"line":42,"column":69}},"20":{"start":{"line":43,"column":12},"end":{"line":43,"column":44}},"21":{"start":{"line":45,"column":12},"end":{"line":45,"column":22}},"22":{"start":{"line":50,"column":23},"end":{"line":50,"column":33}},"23":{"start":{"line":51,"column":8},"end":{"line":60,"column":9}},"24":{"start":{"line":52,"column":26},"end":{"line":52,"column":69}},"25":{"start":{"line":53,"column":12},"end":{"line":55,"column":13}},"26":{"start":{"line":54,"column":16},"end":{"line":54,"column":49}},"27":{"start":{"line":56,"column":12},"end":{"line":56,"column":34}},"28":{"start":{"line":57,"column":12},"end":{"line":57,"column":92}},"29":{"start":{"line":59,"column":12},"end":{"line":59,"column":22}},"30":{"start":{"line":64,"column":23},"end":{"line":64,"column":33}},"31":{"start":{"line":65,"column":8},"end":{"line":76,"column":9}},"32":{"start":{"line":66,"column":29},"end":{"line":66,"column":75}},"33":{"start":{"line":67,"column":12},"end":{"line":69,"column":13}},"34":{"start":{"line":68,"column":16},"end":{"line":68,"column":45}},"35":{"start":{"line":70,"column":25},"end":{"line":72,"column":14}},"36":{"start":{"line":73,"column":12},"end":{"line":73,"column":43}},"37":{"start":{"line":75,"column":12},"end":{"line":75,"column":22}},"38":{"start":{"line":80,"column":42},"end":{"line":80,"column":50}},"39":{"start":{"line":81,"column":27},"end":{"line":81,"column":37}},"40":{"start":{"line":82,"column":8},"end":{"line":88,"column":9}},"41":{"start":{"line":83,"column":25},"end":{"line":83,"column":52}},"42":{"start":{"line":84,"column":12},"end":{"line":84,"column":56}},"43":{"start":{"line":85,"column":12},"end":{"line":85,"column":42}},"44":{"start":{"line":87,"column":12},"end":{"line":87,"column":22}},"45":{"start":{"line":92,"column":27},"end":{"line":92,"column":37}},"46":{"start":{"line":93,"column":8},"end":{"line":102,"column":9}},"47":{"start":{"line":94,"column":25},"end":{"line":94,"column":52}},"48":{"start":{"line":95,"column":12},"end":{"line":97,"column":13}},"49":{"start":{"line":96,"column":16},"end":{"line":96,"column":60}},"50":{"start":{"line":98,"column":12},"end":{"line":98,"column":27}},"51":{"start":{"line":99,"column":12},"end":{"line":99,"column":89}},"52":{"start":{"line":101,"column":12},"end":{"line":101,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":35},"end":{"line":15,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":39},"end":{"line":24,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":5}},"loc":{"start":{"line":26,"column":43},"end":{"line":34,"column":5}},"line":26},"3":{"name":"(anonymous_3)","decl":{"start":{"line":36,"column":4},"end":{"line":36,"column":5}},"loc":{"start":{"line":36,"column":38},"end":{"line":47,"column":5}},"line":36},"4":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":4},"end":{"line":49,"column":5}},"loc":{"start":{"line":49,"column":38},"end":{"line":61,"column":5}},"line":49},"5":{"name":"(anonymous_5)","decl":{"start":{"line":63,"column":4},"end":{"line":63,"column":5}},"loc":{"start":{"line":63,"column":37},"end":{"line":77,"column":5}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":79,"column":4},"end":{"line":79,"column":5}},"loc":{"start":{"line":79,"column":37},"end":{"line":89,"column":5}},"line":79},"7":{"name":"(anonymous_7)","decl":{"start":{"line":91,"column":4},"end":{"line":91,"column":5}},"loc":{"start":{"line":91,"column":37},"end":{"line":103,"column":5}},"line":91}},"branchMap":{"0":{"loc":{"start":{"line":39,"column":12},"end":{"line":41,"column":13}},"type":"if","locations":[{"start":{"line":39,"column":12},"end":{"line":41,"column":13}},{"start":{},"end":{}}],"line":39},"1":{"loc":{"start":{"line":53,"column":12},"end":{"line":55,"column":13}},"type":"if","locations":[{"start":{"line":53,"column":12},"end":{"line":55,"column":13}},{"start":{},"end":{}}],"line":53},"2":{"loc":{"start":{"line":67,"column":12},"end":{"line":69,"column":13}},"type":"if","locations":[{"start":{"line":67,"column":12},"end":{"line":69,"column":13}},{"start":{},"end":{}}],"line":67},"3":{"loc":{"start":{"line":95,"column":12},"end":{"line":97,"column":13}},"type":"if","locations":[{"start":{"line":95,"column":12},"end":{"line":97,"column":13}},{"start":{},"end":{}}],"line":95}},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":2,"16":2,"17":2,"18":1,"19":1,"20":1,"21":1,"22":2,"23":2,"24":2,"25":2,"26":1,"27":1,"28":1,"29":1,"30":4,"31":4,"32":4,"33":4,"34":1,"35":3,"36":1,"37":3,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0},"f":{"0":1,"1":0,"2":0,"3":2,"4":2,"5":4,"6":1,"7":0},"b":{"0":[1,1],"1":[1,1],"2":[1,3],"3":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5b9ab6d98b6a71daba0449cf88e7688de5e0c9ca"} ,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PublicConroller.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\PublicConroller.js","statementMap":{"0":{"start":{"line":1,"column":19},"end":{"line":1,"column":39}},"1":{"start":{"line":3,"column":0},"end":{"line":25,"column":1}},"2":{"start":{"line":5,"column":8},"end":{"line":10,"column":9}},"3":{"start":{"line":6,"column":25},"end":{"line":6,"column":47}},"4":{"start":{"line":7,"column":12},"end":{"line":7,"column":43}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":22}},"6":{"start":{"line":14,"column":8},"end":{"line":23,"column":9}},"7":{"start":{"line":15,"column":27},"end":{"line":15,"column":37}},"8":{"start":{"line":16,"column":25},"end":{"line":16,"column":50}},"9":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"10":{"start":{"line":18,"column":16},"end":{"line":18,"column":47}},"11":{"start":{"line":20,"column":12},"end":{"line":20,"column":42}},"12":{"start":{"line":22,"column":12},"end":{"line":22,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":4},"end":{"line":4,"column":5}},"loc":{"start":{"line":4,"column":37},"end":{"line":11,"column":5}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":4},"end":{"line":13,"column":5}},"loc":{"start":{"line":13,"column":40},"end":{"line":24,"column":5}},"line":13}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},{"start":{},"end":{}}],"line":17}},"s":{"0":3,"1":3,"2":1,"3":1,"4":1,"5":0,"6":1,"7":1,"8":1,"9":1,"10":0,"11":1,"12":0},"f":{"0":1,"1":1},"b":{"0":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"36000bacbfc46aa23d7c4d8b1e8328b84fac3b0c"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\UserController.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\UserController.js","statementMap":{"0":{"start":{"line":1,"column":28},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":17},"end":{"line":3,"column":37}},"3":{"start":{"line":5,"column":0},"end":{"line":38,"column":1}},"4":{"start":{"line":7,"column":8},"end":{"line":12,"column":9}},"5":{"start":{"line":8,"column":25},"end":{"line":8,"column":52}},"6":{"start":{"line":9,"column":12},"end":{"line":9,"column":69}},"7":{"start":{"line":11,"column":12},"end":{"line":11,"column":22}},"8":{"start":{"line":16,"column":8},"end":{"line":36,"column":9}},"9":{"start":{"line":17,"column":40},"end":{"line":17,"column":48}},"10":{"start":{"line":18,"column":12},"end":{"line":20,"column":13}},"11":{"start":{"line":19,"column":16},"end":{"line":19,"column":46}},"12":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"13":{"start":{"line":22,"column":16},"end":{"line":22,"column":45}},"14":{"start":{"line":24,"column":25},"end":{"line":24,"column":65}},"15":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"16":{"start":{"line":26,"column":16},"end":{"line":26,"column":47}},"17":{"start":{"line":28,"column":31},"end":{"line":28,"column":71}},"18":{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},"19":{"start":{"line":30,"column":16},"end":{"line":30,"column":45}},"20":{"start":{"line":32,"column":26},"end":{"line":32,"column":52}},"21":{"start":{"line":33,"column":12},"end":{"line":33,"column":57}},"22":{"start":{"line":35,"column":12},"end":{"line":35,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":4},"end":{"line":6,"column":5}},"loc":{"start":{"line":6,"column":35},"end":{"line":13,"column":5}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":4},"end":{"line":15,"column":5}},"loc":{"start":{"line":15,"column":32},"end":{"line":37,"column":5}},"line":15}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":12},"end":{"line":20,"column":13}},"type":"if","locations":[{"start":{"line":18,"column":12},"end":{"line":20,"column":13}},{"start":{},"end":{}}],"line":18},"1":{"loc":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"type":"if","locations":[{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},{"start":{},"end":{}}],"line":21},"2":{"loc":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"type":"if","locations":[{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},{"start":{},"end":{}}],"line":25},"3":{"loc":{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},"type":"if","locations":[{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},{"start":{},"end":{}}],"line":29}},"s":{"0":3,"1":3,"2":3,"3":3,"4":7,"5":7,"6":1,"7":6,"8":3,"9":3,"10":3,"11":1,"12":2,"13":1,"14":1,"15":1,"16":0,"17":1,"18":1,"19":0,"20":1,"21":1,"22":2},"f":{"0":7,"1":3},"b":{"0":[1,2],"1":[1,1],"2":[0,1],"3":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d8dfeb03134da8db1c9c2e7a8765ebe6065d944f"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\bcrypt.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\bcrypt.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":3,"column":21},"end":{"line":6,"column":1}},"2":{"start":{"line":4,"column":17},"end":{"line":4,"column":39}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":42}},"4":{"start":{"line":8,"column":24},"end":{"line":10,"column":1}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":53}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":50}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":21},"end":{"line":3,"column":22}},"loc":{"start":{"line":3,"column":35},"end":{"line":6,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":25}},"loc":{"start":{"line":8,"column":52},"end":{"line":10,"column":1}},"line":8}},"branchMap":{},"s":{"0":3,"1":3,"2":4,"3":4,"4":3,"5":1,"6":3},"f":{"0":4,"1":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"67c0886d3ad0e39cf96e1707c953cdf5b6da99b6"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\jwt.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\jwt.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":12,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":6,"column":36}},"4":{"start":{"line":10,"column":7},"end":{"line":10,"column":36}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":23},"end":{"line":7,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":5}},"loc":{"start":{"line":9,"column":23},"end":{"line":11,"column":5}},"line":9}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":16},"f":{"0":3,"1":16},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1a8b946ca563d2d798cec8d7932cc74919b93050"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authentication.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authentication.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":29,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":27,"column":9}},"4":{"start":{"line":7,"column":31},"end":{"line":7,"column":56}},"5":{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},"6":{"start":{"line":9,"column":16},"end":{"line":9,"column":52}},"7":{"start":{"line":11,"column":34},"end":{"line":11,"column":57}},"8":{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},"9":{"start":{"line":13,"column":16},"end":{"line":13,"column":52}},"10":{"start":{"line":15,"column":25},"end":{"line":15,"column":43}},"11":{"start":{"line":16,"column":23},"end":{"line":16,"column":46}},"12":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"13":{"start":{"line":18,"column":16},"end":{"line":18,"column":52}},"14":{"start":{"line":20,"column":12},"end":{"line":23,"column":14}},"15":{"start":{"line":24,"column":12},"end":{"line":24,"column":19}},"16":{"start":{"line":26,"column":12},"end":{"line":26,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":41},"end":{"line":28,"column":5}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},{"start":{},"end":{}}],"line":17}},"s":{"0":3,"1":3,"2":3,"3":19,"4":19,"5":19,"6":0,"7":19,"8":19,"9":3,"10":16,"11":15,"12":15,"13":0,"14":15,"15":15,"16":4},"f":{"0":19},"b":{"0":[0,19],"1":[3,16],"2":[0,15]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0503cc6fc04a7cfe13d3d5b2593bf2ccf31b1e91"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authorization.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authorization.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":0},"end":{"line":33,"column":1}},"2":{"start":{"line":6,"column":19},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":8},"end":{"line":20,"column":9}},"4":{"start":{"line":8,"column":26},"end":{"line":8,"column":69}},"5":{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},"6":{"start":{"line":10,"column":16},"end":{"line":10,"column":51}},"7":{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},"8":{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},"9":{"start":{"line":14,"column":20},"end":{"line":14,"column":49}},"10":{"start":{"line":17,"column":12},"end":{"line":17,"column":19}},"11":{"start":{"line":19,"column":12},"end":{"line":19,"column":22}},"12":{"start":{"line":24,"column":8},"end":{"line":31,"column":9}},"13":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"14":{"start":{"line":26,"column":16},"end":{"line":26,"column":45}},"15":{"start":{"line":28,"column":12},"end":{"line":28,"column":19}},"16":{"start":{"line":30,"column":12},"end":{"line":30,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":40},"end":{"line":21,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":34},"end":{"line":32,"column":5}},"line":23}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},"type":"if","locations":[{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},{"start":{},"end":{}}],"line":9},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},"type":"if","locations":[{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},{"start":{},"end":{}}],"line":13},"3":{"loc":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"type":"if","locations":[{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},{"start":{},"end":{}}],"line":25}},"s":{"0":3,"1":3,"2":2,"3":2,"4":2,"5":2,"6":1,"7":1,"8":0,"9":0,"10":1,"11":1,"12":7,"13":7,"14":0,"15":7,"16":0},"f":{"0":2,"1":7},"b":{"0":[1,1],"1":[0,1],"2":[0,0],"3":[0,7]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3512aaaf3ce9dd4ce54398a175a06aca096fdc42"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\errorHandler.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":34}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":56}},"2":{"start":{"line":5,"column":4},"end":{"line":51,"column":5}},"3":{"start":{"line":7,"column":12},"end":{"line":7,"column":24}},"4":{"start":{"line":8,"column":12},"end":{"line":8,"column":43}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":18}},"6":{"start":{"line":11,"column":12},"end":{"line":11,"column":24}},"7":{"start":{"line":12,"column":12},"end":{"line":12,"column":41}},"8":{"start":{"line":13,"column":12},"end":{"line":13,"column":18}},"9":{"start":{"line":15,"column":12},"end":{"line":15,"column":24}},"10":{"start":{"line":16,"column":12},"end":{"line":16,"column":44}},"11":{"start":{"line":17,"column":12},"end":{"line":17,"column":18}},"12":{"start":{"line":19,"column":12},"end":{"line":19,"column":24}},"13":{"start":{"line":20,"column":12},"end":{"line":20,"column":38}},"14":{"start":{"line":21,"column":12},"end":{"line":21,"column":18}},"15":{"start":{"line":23,"column":12},"end":{"line":23,"column":24}},"16":{"start":{"line":24,"column":12},"end":{"line":24,"column":41}},"17":{"start":{"line":25,"column":12},"end":{"line":25,"column":18}},"18":{"start":{"line":28,"column":12},"end":{"line":28,"column":24}},"19":{"start":{"line":29,"column":12},"end":{"line":29,"column":39}},"20":{"start":{"line":30,"column":12},"end":{"line":30,"column":18}},"21":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"22":{"start":{"line":33,"column":12},"end":{"line":33,"column":42}},"23":{"start":{"line":34,"column":12},"end":{"line":34,"column":18}},"24":{"start":{"line":36,"column":12},"end":{"line":36,"column":24}},"25":{"start":{"line":37,"column":12},"end":{"line":37,"column":59}},"26":{"start":{"line":38,"column":12},"end":{"line":38,"column":18}},"27":{"start":{"line":40,"column":12},"end":{"line":40,"column":24}},"28":{"start":{"line":41,"column":12},"end":{"line":41,"column":57}},"29":{"start":{"line":42,"column":12},"end":{"line":42,"column":18}},"30":{"start":{"line":44,"column":12},"end":{"line":44,"column":24}},"31":{"start":{"line":45,"column":12},"end":{"line":45,"column":58}},"32":{"start":{"line":46,"column":12},"end":{"line":46,"column":18}},"33":{"start":{"line":48,"column":12},"end":{"line":48,"column":24}},"34":{"start":{"line":49,"column":12},"end":{"line":49,"column":46}},"35":{"start":{"line":50,"column":12},"end":{"line":50,"column":18}},"36":{"start":{"line":52,"column":4},"end":{"line":52,"column":49}},"37":{"start":{"line":55,"column":0},"end":{"line":55,"column":29}}},"fnMap":{"0":{"name":"errorHandler","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":21}},"loc":{"start":{"line":1,"column":43},"end":{"line":53,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":2,"column":34}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":34}}],"line":2},"1":{"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":56}},"type":"binary-expr","locations":[{"start":{"line":3,"column":18},"end":{"line":3,"column":29}},{"start":{"line":3,"column":33},"end":{"line":3,"column":56}}],"line":3},"2":{"loc":{"start":{"line":5,"column":4},"end":{"line":51,"column":5}},"type":"switch","locations":[{"start":{"line":6,"column":8},"end":{"line":9,"column":18}},{"start":{"line":10,"column":8},"end":{"line":13,"column":18}},{"start":{"line":14,"column":8},"end":{"line":17,"column":18}},{"start":{"line":18,"column":8},"end":{"line":21,"column":18}},{"start":{"line":22,"column":8},"end":{"line":25,"column":18}},{"start":{"line":26,"column":8},"end":{"line":26,"column":31}},{"start":{"line":27,"column":8},"end":{"line":30,"column":18}},{"start":{"line":31,"column":8},"end":{"line":34,"column":18}},{"start":{"line":35,"column":8},"end":{"line":38,"column":18}},{"start":{"line":39,"column":8},"end":{"line":42,"column":18}},{"start":{"line":43,"column":8},"end":{"line":46,"column":18}},{"start":{"line":47,"column":8},"end":{"line":50,"column":18}}],"line":5}},"s":{"0":17,"1":17,"2":17,"3":8,"4":8,"5":8,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":4,"19":4,"20":4,"21":1,"22":1,"23":1,"24":0,"25":0,"26":0,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":0,"34":0,"35":0,"36":17,"37":3},"f":{"0":17},"b":{"0":[17,17],"1":[17,8],"2":[8,1,1,0,0,3,4,1,0,1,1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9cf46918718a4f52d9cb9faa9a06c0589f7b6831"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\character.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\character.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":27,"column":2}},"2":{"start":{"line":16,"column":2},"end":{"line":25,"column":5}},"3":{"start":{"line":26,"column":2},"end":{"line":26,"column":19}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":27,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f45f2c00ea71f3135a107f479db8ca44f8b5327a"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\UserController.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\controllers\\UserController.js","statementMap":{"0":{"start":{"line":1,"column":28},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":17},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":25},"end":{"line":4,"column":55}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":33}},"5":{"start":{"line":7,"column":0},"end":{"line":94,"column":1}},"6":{"start":{"line":9,"column":8},"end":{"line":14,"column":9}},"7":{"start":{"line":10,"column":25},"end":{"line":10,"column":52}},"8":{"start":{"line":11,"column":12},"end":{"line":11,"column":69}},"9":{"start":{"line":13,"column":12},"end":{"line":13,"column":22}},"10":{"start":{"line":18,"column":8},"end":{"line":23,"column":9}},"11":{"start":{"line":19,"column":25},"end":{"line":19,"column":52}},"12":{"start":{"line":20,"column":12},"end":{"line":20,"column":69}},"13":{"start":{"line":22,"column":12},"end":{"line":22,"column":22}},"14":{"start":{"line":27,"column":8},"end":{"line":47,"column":9}},"15":{"start":{"line":28,"column":40},"end":{"line":28,"column":48}},"16":{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},"17":{"start":{"line":30,"column":16},"end":{"line":30,"column":46}},"18":{"start":{"line":32,"column":12},"end":{"line":34,"column":13}},"19":{"start":{"line":33,"column":16},"end":{"line":33,"column":45}},"20":{"start":{"line":35,"column":25},"end":{"line":35,"column":65}},"21":{"start":{"line":36,"column":12},"end":{"line":38,"column":13}},"22":{"start":{"line":37,"column":16},"end":{"line":37,"column":47}},"23":{"start":{"line":39,"column":31},"end":{"line":39,"column":71}},"24":{"start":{"line":40,"column":12},"end":{"line":42,"column":13}},"25":{"start":{"line":41,"column":16},"end":{"line":41,"column":46}},"26":{"start":{"line":43,"column":26},"end":{"line":43,"column":52}},"27":{"start":{"line":44,"column":12},"end":{"line":44,"column":57}},"28":{"start":{"line":46,"column":12},"end":{"line":46,"column":22}},"29":{"start":{"line":51,"column":8},"end":{"line":56,"column":9}},"30":{"start":{"line":52,"column":26},"end":{"line":52,"column":46}},"31":{"start":{"line":53,"column":12},"end":{"line":53,"column":43}},"32":{"start":{"line":55,"column":12},"end":{"line":55,"column":22}},"33":{"start":{"line":60,"column":23},"end":{"line":60,"column":33}},"34":{"start":{"line":61,"column":8},"end":{"line":69,"column":9}},"35":{"start":{"line":62,"column":26},"end":{"line":62,"column":49}},"36":{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},"37":{"start":{"line":64,"column":16},"end":{"line":64,"column":52}},"38":{"start":{"line":66,"column":12},"end":{"line":66,"column":43}},"39":{"start":{"line":68,"column":12},"end":{"line":68,"column":22}},"40":{"start":{"line":73,"column":8},"end":{"line":92,"column":9}},"41":{"start":{"line":74,"column":27},"end":{"line":77,"column":14}},"42":{"start":{"line":78,"column":28},"end":{"line":78,"column":47}},"43":{"start":{"line":79,"column":36},"end":{"line":87,"column":14}},"44":{"start":{"line":88,"column":33},"end":{"line":88,"column":59}},"45":{"start":{"line":89,"column":12},"end":{"line":89,"column":66}},"46":{"start":{"line":91,"column":12},"end":{"line":91,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":4},"end":{"line":8,"column":5}},"loc":{"start":{"line":8,"column":35},"end":{"line":15,"column":5}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":5}},"loc":{"start":{"line":17,"column":34},"end":{"line":24,"column":5}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":4},"end":{"line":26,"column":5}},"loc":{"start":{"line":26,"column":32},"end":{"line":48,"column":5}},"line":26},"3":{"name":"(anonymous_3)","decl":{"start":{"line":50,"column":4},"end":{"line":50,"column":5}},"loc":{"start":{"line":50,"column":34},"end":{"line":57,"column":5}},"line":50},"4":{"name":"(anonymous_4)","decl":{"start":{"line":59,"column":4},"end":{"line":59,"column":5}},"loc":{"start":{"line":59,"column":38},"end":{"line":70,"column":5}},"line":59},"5":{"name":"(anonymous_5)","decl":{"start":{"line":72,"column":4},"end":{"line":72,"column":5}},"loc":{"start":{"line":72,"column":38},"end":{"line":93,"column":5}},"line":72}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},"type":"if","locations":[{"start":{"line":29,"column":12},"end":{"line":31,"column":13}},{"start":{},"end":{}}],"line":29},"1":{"loc":{"start":{"line":32,"column":12},"end":{"line":34,"column":13}},"type":"if","locations":[{"start":{"line":32,"column":12},"end":{"line":34,"column":13}},{"start":{},"end":{}}],"line":32},"2":{"loc":{"start":{"line":36,"column":12},"end":{"line":38,"column":13}},"type":"if","locations":[{"start":{"line":36,"column":12},"end":{"line":38,"column":13}},{"start":{},"end":{}}],"line":36},"3":{"loc":{"start":{"line":40,"column":12},"end":{"line":42,"column":13}},"type":"if","locations":[{"start":{"line":40,"column":12},"end":{"line":42,"column":13}},{"start":{},"end":{}}],"line":40},"4":{"loc":{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},{"start":{},"end":{}}],"line":63},"5":{"loc":{"start":{"line":89,"column":23},"end":{"line":89,"column":42}},"type":"cond-expr","locations":[{"start":{"line":89,"column":33},"end":{"line":89,"column":36}},{"start":{"line":89,"column":39},"end":{"line":89,"column":42}}],"line":89}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":7,"7":7,"8":1,"9":6,"10":7,"11":7,"12":1,"13":6,"14":5,"15":5,"16":5,"17":1,"18":4,"19":1,"20":3,"21":3,"22":1,"23":2,"24":2,"25":1,"26":1,"27":1,"28":4,"29":1,"30":1,"31":1,"32":0,"33":2,"34":2,"35":2,"36":2,"37":1,"38":1,"39":1,"40":1,"41":1,"42":0,"43":0,"44":0,"45":0,"46":1},"f":{"0":7,"1":7,"2":5,"3":1,"4":2,"5":1},"b":{"0":[1,4],"1":[1,3],"2":[1,2],"3":[1,1],"4":[1,1],"5":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bc63acbc975a90845351a2d7d4426aef311b10b4"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\bcrypt.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\bcrypt.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":3,"column":21},"end":{"line":6,"column":1}},"2":{"start":{"line":4,"column":17},"end":{"line":4,"column":39}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":42}},"4":{"start":{"line":8,"column":24},"end":{"line":10,"column":1}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":53}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":50}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":21},"end":{"line":3,"column":22}},"loc":{"start":{"line":3,"column":35},"end":{"line":6,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":24},"end":{"line":8,"column":25}},"loc":{"start":{"line":8,"column":52},"end":{"line":10,"column":1}},"line":8}},"branchMap":{},"s":{"0":3,"1":3,"2":6,"3":6,"4":3,"5":2,"6":3},"f":{"0":6,"1":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"67c0886d3ad0e39cf96e1707c953cdf5b6da99b6"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\gemini.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\gemini.js","statementMap":{"0":{"start":{"line":1,"column":31},"end":{"line":1,"column":63}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":26}},"2":{"start":{"line":4,"column":15},"end":{"line":26,"column":1}},"3":{"start":{"line":5,"column":18},"end":{"line":5,"column":71}},"4":{"start":{"line":7,"column":18},"end":{"line":7,"column":73}},"5":{"start":{"line":10,"column":19},"end":{"line":18,"column":41}},"6":{"start":{"line":20,"column":19},"end":{"line":20,"column":54}},"7":{"start":{"line":21,"column":21},"end":{"line":21,"column":42}},"8":{"start":{"line":22,"column":15},"end":{"line":22,"column":30}},"9":{"start":{"line":24,"column":4},"end":{"line":24,"column":34}},"10":{"start":{"line":25,"column":4},"end":{"line":25,"column":16}},"11":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":15},"end":{"line":4,"column":16}},"loc":{"start":{"line":4,"column":36},"end":{"line":26,"column":1}},"line":4}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":3},"f":{"0":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0c1253854bf5ad2fb1ffa4cb4016fc399e269a2c"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\jwt.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\helpers\\jwt.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":12,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":6,"column":36}},"4":{"start":{"line":10,"column":7},"end":{"line":10,"column":36}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":23},"end":{"line":7,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":4},"end":{"line":9,"column":5}},"loc":{"start":{"line":9,"column":23},"end":{"line":11,"column":5}},"line":9}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":5,"4":24},"f":{"0":5,"1":24},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1a8b946ca563d2d798cec8d7932cc74919b93050"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authentication.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authentication.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":37}},"2":{"start":{"line":4,"column":0},"end":{"line":29,"column":1}},"3":{"start":{"line":6,"column":8},"end":{"line":27,"column":9}},"4":{"start":{"line":7,"column":31},"end":{"line":7,"column":56}},"5":{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},"6":{"start":{"line":9,"column":16},"end":{"line":9,"column":52}},"7":{"start":{"line":11,"column":34},"end":{"line":11,"column":57}},"8":{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},"9":{"start":{"line":13,"column":16},"end":{"line":13,"column":52}},"10":{"start":{"line":15,"column":25},"end":{"line":15,"column":43}},"11":{"start":{"line":16,"column":23},"end":{"line":16,"column":46}},"12":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"13":{"start":{"line":18,"column":16},"end":{"line":18,"column":52}},"14":{"start":{"line":20,"column":12},"end":{"line":23,"column":14}},"15":{"start":{"line":24,"column":12},"end":{"line":24,"column":19}},"16":{"start":{"line":26,"column":12},"end":{"line":26,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":41},"end":{"line":28,"column":5}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},"type":"if","locations":[{"start":{"line":8,"column":12},"end":{"line":10,"column":13}},{"start":{},"end":{}}],"line":8},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":14,"column":13}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":19,"column":13}},{"start":{},"end":{}}],"line":17}},"s":{"0":3,"1":3,"2":3,"3":29,"4":29,"5":29,"6":0,"7":29,"8":29,"9":5,"10":24,"11":23,"12":23,"13":0,"14":23,"15":23,"16":6},"f":{"0":29},"b":{"0":[0,29],"1":[5,24],"2":[0,23]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0503cc6fc04a7cfe13d3d5b2593bf2ccf31b1e91"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authorization.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\authorization.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":0},"end":{"line":34,"column":1}},"2":{"start":{"line":6,"column":19},"end":{"line":6,"column":32}},"3":{"start":{"line":7,"column":8},"end":{"line":20,"column":9}},"4":{"start":{"line":8,"column":26},"end":{"line":8,"column":69}},"5":{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},"6":{"start":{"line":10,"column":16},"end":{"line":10,"column":51}},"7":{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},"8":{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},"9":{"start":{"line":14,"column":20},"end":{"line":14,"column":49}},"10":{"start":{"line":17,"column":12},"end":{"line":17,"column":19}},"11":{"start":{"line":19,"column":12},"end":{"line":19,"column":22}},"12":{"start":{"line":24,"column":8},"end":{"line":31,"column":9}},"13":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"14":{"start":{"line":26,"column":16},"end":{"line":26,"column":45}},"15":{"start":{"line":28,"column":12},"end":{"line":28,"column":19}},"16":{"start":{"line":30,"column":12},"end":{"line":30,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":4},"end":{"line":5,"column":5}},"loc":{"start":{"line":5,"column":40},"end":{"line":21,"column":5}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":23,"column":4},"end":{"line":23,"column":5}},"loc":{"start":{"line":23,"column":34},"end":{"line":32,"column":5}},"line":23}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},"type":"if","locations":[{"start":{"line":9,"column":12},"end":{"line":11,"column":13}},{"start":{},"end":{}}],"line":9},"1":{"loc":{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},"type":"if","locations":[{"start":{"line":12,"column":12},"end":{"line":16,"column":13}},{"start":{},"end":{}}],"line":12},"2":{"loc":{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},"type":"if","locations":[{"start":{"line":13,"column":16},"end":{"line":15,"column":17}},{"start":{},"end":{}}],"line":13},"3":{"loc":{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},"type":"if","locations":[{"start":{"line":25,"column":12},"end":{"line":27,"column":13}},{"start":{},"end":{}}],"line":25}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":1,"7":2,"8":0,"9":0,"10":2,"11":1,"12":7,"13":7,"14":0,"15":7,"16":0},"f":{"0":3,"1":7},"b":{"0":[1,2],"1":[0,2],"2":[0,0],"3":[0,7]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"33e2b027836cb235655d1cd0d65237019c9f56a9"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\errorHandler.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\middlewares\\errorHandler.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":34}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":56}},"2":{"start":{"line":5,"column":4},"end":{"line":63,"column":5}},"3":{"start":{"line":7,"column":12},"end":{"line":7,"column":24}},"4":{"start":{"line":8,"column":12},"end":{"line":8,"column":43}},"5":{"start":{"line":9,"column":12},"end":{"line":9,"column":18}},"6":{"start":{"line":11,"column":12},"end":{"line":11,"column":24}},"7":{"start":{"line":12,"column":12},"end":{"line":12,"column":41}},"8":{"start":{"line":13,"column":12},"end":{"line":13,"column":18}},"9":{"start":{"line":15,"column":12},"end":{"line":15,"column":24}},"10":{"start":{"line":16,"column":12},"end":{"line":16,"column":44}},"11":{"start":{"line":17,"column":12},"end":{"line":17,"column":18}},"12":{"start":{"line":19,"column":12},"end":{"line":19,"column":24}},"13":{"start":{"line":20,"column":12},"end":{"line":20,"column":38}},"14":{"start":{"line":21,"column":12},"end":{"line":21,"column":18}},"15":{"start":{"line":23,"column":12},"end":{"line":23,"column":24}},"16":{"start":{"line":24,"column":12},"end":{"line":24,"column":41}},"17":{"start":{"line":25,"column":12},"end":{"line":25,"column":18}},"18":{"start":{"line":28,"column":12},"end":{"line":28,"column":24}},"19":{"start":{"line":29,"column":12},"end":{"line":29,"column":39}},"20":{"start":{"line":30,"column":12},"end":{"line":30,"column":18}},"21":{"start":{"line":32,"column":12},"end":{"line":32,"column":24}},"22":{"start":{"line":33,"column":12},"end":{"line":33,"column":42}},"23":{"start":{"line":34,"column":12},"end":{"line":34,"column":18}},"24":{"start":{"line":36,"column":12},"end":{"line":36,"column":24}},"25":{"start":{"line":37,"column":12},"end":{"line":37,"column":59}},"26":{"start":{"line":38,"column":12},"end":{"line":38,"column":18}},"27":{"start":{"line":40,"column":12},"end":{"line":40,"column":24}},"28":{"start":{"line":41,"column":12},"end":{"line":41,"column":57}},"29":{"start":{"line":42,"column":12},"end":{"line":42,"column":18}},"30":{"start":{"line":44,"column":12},"end":{"line":44,"column":24}},"31":{"start":{"line":45,"column":12},"end":{"line":45,"column":58}},"32":{"start":{"line":46,"column":12},"end":{"line":46,"column":18}},"33":{"start":{"line":48,"column":12},"end":{"line":48,"column":24}},"34":{"start":{"line":49,"column":12},"end":{"line":49,"column":58}},"35":{"start":{"line":50,"column":12},"end":{"line":50,"column":18}},"36":{"start":{"line":52,"column":12},"end":{"line":52,"column":24}},"37":{"start":{"line":53,"column":12},"end":{"line":53,"column":56}},"38":{"start":{"line":54,"column":12},"end":{"line":54,"column":18}},"39":{"start":{"line":56,"column":12},"end":{"line":56,"column":24}},"40":{"start":{"line":57,"column":12},"end":{"line":57,"column":46}},"41":{"start":{"line":58,"column":12},"end":{"line":58,"column":18}},"42":{"start":{"line":60,"column":12},"end":{"line":60,"column":24}},"43":{"start":{"line":61,"column":12},"end":{"line":61,"column":56}},"44":{"start":{"line":62,"column":12},"end":{"line":62,"column":18}},"45":{"start":{"line":64,"column":4},"end":{"line":64,"column":49}},"46":{"start":{"line":67,"column":0},"end":{"line":67,"column":29}}},"fnMap":{"0":{"name":"errorHandler","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":21}},"loc":{"start":{"line":1,"column":43},"end":{"line":65,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":17},"end":{"line":2,"column":34}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":34}}],"line":2},"1":{"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":56}},"type":"binary-expr","locations":[{"start":{"line":3,"column":18},"end":{"line":3,"column":29}},{"start":{"line":3,"column":33},"end":{"line":3,"column":56}}],"line":3},"2":{"loc":{"start":{"line":5,"column":4},"end":{"line":63,"column":5}},"type":"switch","locations":[{"start":{"line":6,"column":8},"end":{"line":9,"column":18}},{"start":{"line":10,"column":8},"end":{"line":13,"column":18}},{"start":{"line":14,"column":8},"end":{"line":17,"column":18}},{"start":{"line":18,"column":8},"end":{"line":21,"column":18}},{"start":{"line":22,"column":8},"end":{"line":25,"column":18}},{"start":{"line":26,"column":8},"end":{"line":26,"column":31}},{"start":{"line":27,"column":8},"end":{"line":30,"column":18}},{"start":{"line":31,"column":8},"end":{"line":34,"column":18}},{"start":{"line":35,"column":8},"end":{"line":38,"column":18}},{"start":{"line":39,"column":8},"end":{"line":42,"column":18}},{"start":{"line":43,"column":8},"end":{"line":46,"column":18}},{"start":{"line":47,"column":8},"end":{"line":50,"column":18}},{"start":{"line":51,"column":8},"end":{"line":54,"column":18}},{"start":{"line":55,"column":8},"end":{"line":58,"column":18}},{"start":{"line":59,"column":8},"end":{"line":62,"column":18}}],"line":5}},"s":{"0":30,"1":30,"2":30,"3":14,"4":14,"5":14,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":6,"19":6,"20":6,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":1,"43":1,"44":1,"45":30,"46":3},"f":{"0":30},"b":{"0":[30,30],"1":[30,14],"2":[14,1,1,1,1,5,6,1,1,1,1,0,0,0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"45ba7d7b3974b89513fde947c09090f596db2379"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\character.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\character.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":28,"column":2}},"2":{"start":{"line":16,"column":2},"end":{"line":26,"column":5}},"3":{"start":{"line":27,"column":2},"end":{"line":27,"column":19}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":28,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2b47374587e3b87bbeae069a0953d8db35a94336"} ,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\index.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\index.js","statementMap":{"0":{"start":{"line":3,"column":11},"end":{"line":3,"column":24}},"1":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":38}},"3":{"start":{"line":6,"column":16},"end":{"line":6,"column":34}},"4":{"start":{"line":7,"column":17},"end":{"line":7,"column":42}},"5":{"start":{"line":8,"column":12},"end":{"line":8,"column":49}},"6":{"start":{"line":9,"column":15},"end":{"line":9,"column":65}},"7":{"start":{"line":10,"column":11},"end":{"line":10,"column":13}},"8":{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},"9":{"start":{"line":14,"column":2},"end":{"line":14,"column":74}},"10":{"start":{"line":16,"column":2},"end":{"line":16,"column":87}},"11":{"start":{"line":19,"column":0},"end":{"line":32,"column":5}},"12":{"start":{"line":22,"column":4},"end":{"line":27,"column":6}},"13":{"start":{"line":30,"column":18},"end":{"line":30,"column":85}},"14":{"start":{"line":31,"column":4},"end":{"line":31,"column":27}},"15":{"start":{"line":34,"column":0},"end":{"line":38,"column":3}},"16":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"17":{"start":{"line":36,"column":4},"end":{"line":36,"column":32}},"18":{"start":{"line":40,"column":0},"end":{"line":40,"column":25}},"19":{"start":{"line":41,"column":0},"end":{"line":41,"column":25}},"20":{"start":{"line":43,"column":0},"end":{"line":43,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":21,"column":10},"end":{"line":21,"column":11}},"loc":{"start":{"line":21,"column":18},"end":{"line":28,"column":3}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":11},"end":{"line":29,"column":12}},"loc":{"start":{"line":29,"column":19},"end":{"line":32,"column":3}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":24},"end":{"line":34,"column":25}},"loc":{"start":{"line":34,"column":37},"end":{"line":38,"column":1}},"line":34}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":12},"end":{"line":8,"column":49}},"type":"binary-expr","locations":[{"start":{"line":8,"column":12},"end":{"line":8,"column":32}},{"start":{"line":8,"column":36},"end":{"line":8,"column":49}}],"line":8},"1":{"loc":{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},"type":"if","locations":[{"start":{"line":13,"column":0},"end":{"line":17,"column":1}},{"start":{"line":15,"column":7},"end":{"line":17,"column":1}}],"line":13},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":26,"column":37}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":29}},{"start":{"line":24,"column":6},"end":{"line":24,"column":23}},{"start":{"line":25,"column":6},"end":{"line":25,"column":30}},{"start":{"line":26,"column":6},"end":{"line":26,"column":37}}],"line":23},"3":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},{"start":{},"end":{}}],"line":35}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":0,"10":3,"11":3,"12":21,"13":18,"14":18,"15":3,"16":18,"17":18,"18":3,"19":3,"20":3},"f":{"0":21,"1":18,"2":18},"b":{"0":[3,0],"1":[0,3],"2":[21,21,18,18],"3":[18,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d39ffbf9a8ff33cde9535bed2298b82ea0fd2797"} ,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\party.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\party.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":23,"column":2}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":32}},"3":{"start":{"line":16,"column":2},"end":{"line":21,"column":5}},"4":{"start":{"line":22,"column":2},"end":{"line":22,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":23,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fed1902f88d5c96b0ec953573ec59d52986bb71e"} ,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\team.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\team.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":65,"column":2}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":36}},"3":{"start":{"line":14,"column":6},"end":{"line":14,"column":61}},"4":{"start":{"line":17,"column":2},"end":{"line":63,"column":5}},"5":{"start":{"line":64,"column":2},"end":{"line":64,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":65,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"60b9b0cbe9bdad66ca51234ec7cae449412839c2"} ,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\type.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\type.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":23,"column":2}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":33}},"3":{"start":{"line":16,"column":2},"end":{"line":21,"column":5}},"4":{"start":{"line":22,"column":2},"end":{"line":22,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":23,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"67c795b9a30b0f6803a613f1e27800e5ed9b24cc"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\user.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":69,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":31}},"3":{"start":{"line":17,"column":2},"end":{"line":67,"column":5}},"4":{"start":{"line":68,"column":2},"end":{"line":68,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":69,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8eec527492bcde82dff11bee0fcbaf30deac26f8"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\user.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\user.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":69,"column":2}},"2":{"start":{"line":14,"column":6},"end":{"line":14,"column":57}},"3":{"start":{"line":17,"column":2},"end":{"line":67,"column":5}},"4":{"start":{"line":68,"column":2},"end":{"line":68,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":69,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":15,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a88cf6671699930deee9ef27a8bc18a0773274f5"} ,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\weapon.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\models\\weapon.js","statementMap":{"0":{"start":{"line":4,"column":4},"end":{"line":4,"column":24}},"1":{"start":{"line":5,"column":0},"end":{"line":28,"column":2}},"2":{"start":{"line":16,"column":2},"end":{"line":26,"column":5}},"3":{"start":{"line":27,"column":2},"end":{"line":27,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":18}},"loc":{"start":{"line":5,"column":43},"end":{"line":28,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":4},"end":{"line":12,"column":5}},"loc":{"start":{"line":12,"column":29},"end":{"line":14,"column":5}},"line":12}},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3},"f":{"0":3,"1":3},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"158cb29787599ed7e53ce3954379898e285d2a9d"} -,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\routes\\index.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":84},"end":{"line":1,"column":125}},"1":{"start":{"line":2,"column":38},"end":{"line":2,"column":79}},"2":{"start":{"line":3,"column":28},"end":{"line":3,"column":68}},"3":{"start":{"line":4,"column":27},"end":{"line":4,"column":67}},"4":{"start":{"line":5,"column":35},"end":{"line":5,"column":74}},"5":{"start":{"line":6,"column":15},"end":{"line":6,"column":42}},"6":{"start":{"line":8,"column":0},"end":{"line":8,"column":35}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":42}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":29}},"9":{"start":{"line":13,"column":0},"end":{"line":13,"column":27}},"10":{"start":{"line":15,"column":0},"end":{"line":15,"column":44}},"11":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"12":{"start":{"line":17,"column":0},"end":{"line":17,"column":35}},"13":{"start":{"line":18,"column":0},"end":{"line":18,"column":56}},"14":{"start":{"line":19,"column":0},"end":{"line":19,"column":43}},"15":{"start":{"line":20,"column":0},"end":{"line":20,"column":50}},"16":{"start":{"line":21,"column":0},"end":{"line":21,"column":54}},"17":{"start":{"line":23,"column":0},"end":{"line":23,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":3,"17":3},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8a5808560a87c9259a506fca3edbf4e55260b1af"} +,"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\routes\\index.js": {"path":"C:\\Users\\alans\\OneDrive\\Desktop\\Hacktiv8\\Phase-2\\Week-3\\IP\\IP-RMT50\\routes\\index.js","statementMap":{"0":{"start":{"line":1,"column":128},"end":{"line":1,"column":169}},"1":{"start":{"line":2,"column":38},"end":{"line":2,"column":79}},"2":{"start":{"line":3,"column":72},"end":{"line":3,"column":112}},"3":{"start":{"line":4,"column":27},"end":{"line":4,"column":67}},"4":{"start":{"line":5,"column":35},"end":{"line":5,"column":74}},"5":{"start":{"line":6,"column":15},"end":{"line":6,"column":42}},"6":{"start":{"line":7,"column":15},"end":{"line":7,"column":43}},"7":{"start":{"line":9,"column":0},"end":{"line":9,"column":29}},"8":{"start":{"line":10,"column":0},"end":{"line":10,"column":42}},"9":{"start":{"line":11,"column":0},"end":{"line":11,"column":34}},"10":{"start":{"line":13,"column":0},"end":{"line":22,"column":2}},"11":{"start":{"line":14,"column":4},"end":{"line":21,"column":5}},"12":{"start":{"line":15,"column":30},"end":{"line":15,"column":38}},"13":{"start":{"line":16,"column":19},"end":{"line":16,"column":42}},"14":{"start":{"line":18,"column":8},"end":{"line":18,"column":34}},"15":{"start":{"line":20,"column":28},"end":{"line":20,"column":86}},"16":{"start":{"line":24,"column":0},"end":{"line":24,"column":27}},"17":{"start":{"line":26,"column":0},"end":{"line":26,"column":35}},"18":{"start":{"line":27,"column":0},"end":{"line":27,"column":42}},"19":{"start":{"line":28,"column":0},"end":{"line":28,"column":40}},"20":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"21":{"start":{"line":30,"column":0},"end":{"line":30,"column":30}},"22":{"start":{"line":31,"column":0},"end":{"line":31,"column":38}},"23":{"start":{"line":32,"column":0},"end":{"line":32,"column":44}},"24":{"start":{"line":33,"column":0},"end":{"line":33,"column":31}},"25":{"start":{"line":34,"column":0},"end":{"line":34,"column":35}},"26":{"start":{"line":35,"column":0},"end":{"line":35,"column":56}},"27":{"start":{"line":36,"column":0},"end":{"line":36,"column":43}},"28":{"start":{"line":37,"column":0},"end":{"line":37,"column":50}},"29":{"start":{"line":38,"column":0},"end":{"line":38,"column":53}},"30":{"start":{"line":40,"column":0},"end":{"line":47,"column":68}},"31":{"start":{"line":47,"column":85},"end":{"line":47,"column":38884}},"32":{"start":{"line":47,"column":89},"end":{"line":47,"column":38873}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":32},"end":{"line":13,"column":33}},"loc":{"start":{"line":13,"column":58},"end":{"line":22,"column":1}},"line":13},"1":{"name":"oo_cm","decl":{"start":{"line":47,"column":77},"end":{"line":47,"column":82}},"loc":{"start":{"line":47,"column":84},"end":{"line":47,"column":38885}},"line":47}},"branchMap":{"0":{"loc":{"start":{"line":47,"column":96},"end":{"line":47,"column":38872}},"type":"binary-expr","locations":[{"start":{"line":47,"column":96},"end":{"line":47,"column":133}},{"start":{"line":47,"column":137},"end":{"line":47,"column":38872}}],"line":47}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":0,"12":0,"13":0,"14":0,"15":0,"16":3,"17":3,"18":3,"19":3,"20":3,"21":3,"22":3,"23":3,"24":3,"25":3,"26":3,"27":3,"28":3,"29":3,"30":3,"31":0,"32":0},"f":{"0":0,"1":0},"b":{"0":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7ef5ec5fbcf9e46d36cfc06c41fd3900e3d59921"} } diff --git a/coverage/lcov-report/IP-RMT50/app.js.html b/coverage/lcov-report/IP-RMT50/app.js.html index 064c5e5..99d3b06 100644 --- a/coverage/lcov-report/IP-RMT50/app.js.html +++ b/coverage/lcov-report/IP-RMT50/app.js.html @@ -23,16 +23,16 @@

All files / IP-RMT50 ap
- 91.66% + 93.75% Statements - 11/12 + 15/16
- 100% + 50% Branches - 0/0 + 1/2
@@ -44,9 +44,9 @@

All files / IP-RMT50 ap
- 91.66% + 93.75% Lines - 11/12 + 15/16
@@ -79,7 +79,18 @@

All files / IP-RMT50 ap 14 15 16 -173x +17 +18 +19 +20 +21 +22 +233x +3x +  +  +3x +3x 3x 3x 3x @@ -94,8 +105,14 @@

All files / IP-RMT50 ap   3x 3x +3x   -3x
require('dotenv').config();
+3x
Eif (process.env.NODE_ENV !== 'production') {
+    require('dotenv').config();
+}
+ 
+require('dotenv').config();
+const cors = require('cors')
 const express = require('express');
 const app = express();
 const routes = require('./routes');
@@ -108,6 +125,7 @@ 

All files / IP-RMT50 ap res.send('Hello World!'); });   +app.use(cors()) app.use(routes); app.use(errorHandler);   @@ -118,7 +136,7 @@

All files / IP-RMT50 ap