From 58f62194c8d8119ebf73d0e4dd8d0bff437dbd3e Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Tue, 12 Mar 2024 22:51:17 +0700 Subject: [PATCH 01/36] feat:create sequelize --- Server/.gitignore | 2 + Server/app.js | 0 Server/config/config.json | 23 + Server/models/index.js | 43 + Server/package-lock.json | 1703 +++++++++++++++++++++++++++++++++++++ Server/package.json | 8 + 6 files changed, 1779 insertions(+) create mode 100644 Server/.gitignore create mode 100644 Server/app.js create mode 100644 Server/config/config.json create mode 100644 Server/models/index.js create mode 100644 Server/package-lock.json create mode 100644 Server/package.json diff --git a/Server/.gitignore b/Server/.gitignore new file mode 100644 index 0000000..70167ab --- /dev/null +++ b/Server/.gitignore @@ -0,0 +1,2 @@ +node_modules +notes.txt diff --git a/Server/app.js b/Server/app.js new file mode 100644 index 0000000..e69de29 diff --git a/Server/config/config.json b/Server/config/config.json new file mode 100644 index 0000000..0f858c6 --- /dev/null +++ b/Server/config/config.json @@ -0,0 +1,23 @@ +{ + "development": { + "username": "root", + "password": null, + "database": "database_development", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "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" + } +} diff --git a/Server/models/index.js b/Server/models/index.js new file mode 100644 index 0000000..024200e --- /dev/null +++ b/Server/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/Server/package-lock.json b/Server/package-lock.json new file mode 100644 index 0000000..211f2dc --- /dev/null +++ b/Server/package-lock.json @@ -0,0 +1,1703 @@ +{ + "name": "Server", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "nodemon": "^3.1.0", + "pg": "^8.11.3", + "sequelize": "^6.37.1", + "sequelize-cli": "^6.6.2" + } + }, + "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/@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", + "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.11.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz", + "integrity": "sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/validator": { + "version": "13.11.9", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.9.tgz", + "integrity": "sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==" + }, + "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/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/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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "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/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.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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/cliui/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/cliui/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/cliui/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/cliui/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/cliui/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/cliui/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/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/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/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": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/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/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/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/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/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/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/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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-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/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/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/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "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-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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "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" + } + }, + "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": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "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.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "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.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sequelize": { + "version": "6.37.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", + "integrity": "sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw==", + "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-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", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "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/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/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/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/string-width-cjs/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/string-width-cjs/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/string-width-cjs/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/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/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/strip-ansi-cjs/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/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/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/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "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/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.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "engines": { + "node": ">= 0.10" + } + }, + "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/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/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/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/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/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" + } + }, + "node_modules/yargs/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/yargs/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/yargs/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/yargs/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" + } + } + } +} diff --git a/Server/package.json b/Server/package.json new file mode 100644 index 0000000..b5d769a --- /dev/null +++ b/Server/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "nodemon": "^3.1.0", + "pg": "^8.11.3", + "sequelize": "^6.37.1", + "sequelize-cli": "^6.6.2" + } +} From ba037e639a90dccb85de1dbae1abc4f376bd91d4 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Tue, 12 Mar 2024 22:52:45 +0700 Subject: [PATCH 02/36] feat:create user controller --- Server/Controllers/UserController.js | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 Server/Controllers/UserController.js diff --git a/Server/Controllers/UserController.js b/Server/Controllers/UserController.js new file mode 100644 index 0000000..8a5d085 --- /dev/null +++ b/Server/Controllers/UserController.js @@ -0,0 +1,5 @@ +class UserController{ + +} + +module.exports = UserController \ No newline at end of file From c8b42ea6fecaa6ef9a7519ea8be2f7bdd2a97628 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Tue, 12 Mar 2024 22:58:24 +0700 Subject: [PATCH 03/36] feat:error handler --- Server/app.js | 29 ++++++++++++++++++++++++++++ Server/middlewares/authentication.js | 0 Server/middlewares/authorization.js | 0 Server/middlewares/errorHandler.js | 29 ++++++++++++++++++++++++++++ Server/package-lock.json | 29 ++++++++++++++++++++++++++++ Server/package.json | 1 + 6 files changed, 88 insertions(+) create mode 100644 Server/middlewares/authentication.js create mode 100644 Server/middlewares/authorization.js create mode 100644 Server/middlewares/errorHandler.js diff --git a/Server/app.js b/Server/app.js index e69de29..9bd4984 100644 --- a/Server/app.js +++ b/Server/app.js @@ -0,0 +1,29 @@ +if(process.env.NODE_ENV !== 'production'){ + + require("dotenv").config(); + } + + + const express = require("express"); + const errorHandler = require("./middlewares/errorHandler"); + + const app = express(); + const PORT = process.env.PORT || 3000; + const router = require("./routes") + const cors = require("cors") + + app.use(express.urlencoded({ extended: true })); + app.use(express.json()); + app.use(router) + app.use(cors()) + //errorHandler + app.use(errorHandler) + + app.listen(PORT, () => { + console.log(`Listening on PORT ${PORT}`); + }); + + module.exports = app + + + \ No newline at end of file diff --git a/Server/middlewares/authentication.js b/Server/middlewares/authentication.js new file mode 100644 index 0000000..e69de29 diff --git a/Server/middlewares/authorization.js b/Server/middlewares/authorization.js new file mode 100644 index 0000000..e69de29 diff --git a/Server/middlewares/errorHandler.js b/Server/middlewares/errorHandler.js new file mode 100644 index 0000000..3c719ea --- /dev/null +++ b/Server/middlewares/errorHandler.js @@ -0,0 +1,29 @@ +module.exports = (error, req, res, next) => { + let status = error.status || 500; + let message = error.message || "Internal Server Error"; + + switch (error.name) { + case "SequelizeUniqueConstraintError": + case "SequelizeValidationError": + status = 400; + message = error.errors[0].message; + break; + case "Unauthenticated": + case "JsonWebTokenError": + status = 401; + message = "Unauthenticated"; + break; + case "Unauthorized": + status = 403; + message = "Forbidden"; + break; + case "NotFound": + status = 404; + message = "Data not found"; + break; + } + res.status(status).json({ + message: message, + }); + }; + \ No newline at end of file diff --git a/Server/package-lock.json b/Server/package-lock.json index 211f2dc..9a3d2f8 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "dependencies": { + "cors": "^2.8.5", "nodemon": "^3.1.0", "pg": "^8.11.3", "sequelize": "^6.37.1", @@ -316,6 +317,18 @@ "proto-list": "~1.2.1" } }, + "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", @@ -922,6 +935,14 @@ "node": ">=0.10.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/packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", @@ -1510,6 +1531,14 @@ "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/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/Server/package.json b/Server/package.json index b5d769a..74ccd0d 100644 --- a/Server/package.json +++ b/Server/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "cors": "^2.8.5", "nodemon": "^3.1.0", "pg": "^8.11.3", "sequelize": "^6.37.1", From 9036aa2c5d812f97604387cec429475073f7ca54 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Tue, 12 Mar 2024 23:01:08 +0700 Subject: [PATCH 04/36] feat:app --- Server/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/app.js b/Server/app.js index 9bd4984..c556889 100644 --- a/Server/app.js +++ b/Server/app.js @@ -9,7 +9,7 @@ if(process.env.NODE_ENV !== 'production'){ const app = express(); const PORT = process.env.PORT || 3000; - const router = require("./routes") + const router = require("./router") const cors = require("cors") app.use(express.urlencoded({ extended: true })); From e31052c92d84e0b220ee20c5c5f3c030caced95b Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Tue, 12 Mar 2024 23:07:48 +0700 Subject: [PATCH 05/36] feat:package --- Server/app.js | 6 +- Server/package-lock.json | 870 +++++++++++++++++++++++++++++++++++++++ Server/package.json | 18 +- 3 files changed, 890 insertions(+), 4 deletions(-) diff --git a/Server/app.js b/Server/app.js index c556889..7fa3a11 100644 --- a/Server/app.js +++ b/Server/app.js @@ -1,7 +1,7 @@ -if(process.env.NODE_ENV !== 'production'){ +// if(process.env.NODE_ENV !== 'production'){ - require("dotenv").config(); - } +// require("dotenv").config(); +// } const express = require("express"); diff --git a/Server/package-lock.json b/Server/package-lock.json index 9a3d2f8..bdc915c 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -5,7 +5,12 @@ "packages": { "": { "dependencies": { + "axios": "^1.6.7", + "bcryptjs": "^2.4.3", "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.18.3", + "jsonwebtoken": "^9.0.2", "nodemon": "^3.1.0", "pg": "^8.11.3", "sequelize": "^6.37.1", @@ -76,6 +81,18 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -110,6 +127,16 @@ "node": ">= 8" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/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", @@ -118,11 +145,26 @@ "node": ">= 4.0.0" } }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "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==" }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -136,6 +178,42 @@ "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/body-parser/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/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -156,6 +234,11 @@ "node": ">=8" } }, + "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-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -164,6 +247,32 @@ "node": ">=4" } }, + "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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -295,6 +404,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "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", @@ -317,6 +437,38 @@ "proto-list": "~1.2.1" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -370,6 +522,58 @@ } } }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.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", @@ -380,6 +584,14 @@ "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", @@ -419,11 +631,43 @@ "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/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/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/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -480,6 +724,11 @@ "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", @@ -494,6 +743,14 @@ "node": ">=0.10" } }, + "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", @@ -503,6 +760,60 @@ "es5-ext": "~0.10.14" } }, + "node_modules/express": { + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "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.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/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/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -522,6 +833,55 @@ "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/finalhandler/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/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -537,6 +897,35 @@ "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", + "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", @@ -580,6 +969,24 @@ "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/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -634,6 +1041,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -647,6 +1065,39 @@ "node": ">=4" } }, + "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/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -658,6 +1109,32 @@ "node": ">= 0.4" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -671,11 +1148,24 @@ "node >= 0.4.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/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -799,11 +1289,86 @@ "graceful-fs": "^4.1.6" } }, + "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/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/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -823,6 +1388,14 @@ "es5-ext": "~0.10.2" } }, + "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/memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", @@ -838,6 +1411,49 @@ "timers-ext": "^0.1.7" } }, + "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", @@ -881,6 +1497,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "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/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -943,11 +1567,38 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/packet-reader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, + "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-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -984,6 +1635,11 @@ "node": "14 || >=16.14" } }, + "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.11.3", "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", @@ -1118,11 +1774,64 @@ "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", + "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/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/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, + "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/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1163,6 +1872,30 @@ "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, + "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.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -1177,6 +1910,47 @@ "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/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/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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.1", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.1.tgz", @@ -1267,6 +2041,41 @@ "node": ">= 10.0.0" } }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.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/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1286,6 +2095,23 @@ "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==", + "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": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -1316,6 +2142,14 @@ "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-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -1446,6 +2280,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/toposort-class": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", @@ -1486,6 +2328,18 @@ "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, + "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/umzug": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.3.0.tgz", @@ -1515,6 +2369,22 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", diff --git a/Server/package.json b/Server/package.json index 74ccd0d..2ee5b23 100644 --- a/Server/package.json +++ b/Server/package.json @@ -1,9 +1,25 @@ { "dependencies": { + "axios": "^1.6.7", + "bcryptjs": "^2.4.3", "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.18.3", + "jsonwebtoken": "^9.0.2", "nodemon": "^3.1.0", "pg": "^8.11.3", "sequelize": "^6.37.1", "sequelize-cli": "^6.6.2" - } + }, + "name": "server", + "version": "1.0.0", + "main": "app.js", + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "" } From 61b106817c27d73c7cb42582aeb050b8e31460c0 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Wed, 13 Mar 2024 15:47:18 +0700 Subject: [PATCH 06/36] feat:data --- Server/.env.example | 0 Server/.gitignore | 1 + Server/Controllers/UserController.js | 53 ++++++++++ Server/config/config.json | 20 ++-- Server/data/Products.json | 142 +++++++++++++++++++++++++++ Server/data/Proof.json | 6 ++ Server/data/User.json | 12 +++ 7 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 Server/.env.example create mode 100644 Server/data/Products.json create mode 100644 Server/data/Proof.json create mode 100644 Server/data/User.json diff --git a/Server/.env.example b/Server/.env.example new file mode 100644 index 0000000..e69de29 diff --git a/Server/.gitignore b/Server/.gitignore index 70167ab..cc4ab20 100644 --- a/Server/.gitignore +++ b/Server/.gitignore @@ -1,2 +1,3 @@ node_modules notes.txt +.env \ No newline at end of file diff --git a/Server/Controllers/UserController.js b/Server/Controllers/UserController.js index 8a5d085..324766e 100644 --- a/Server/Controllers/UserController.js +++ b/Server/Controllers/UserController.js @@ -1,5 +1,58 @@ + + class UserController{ + // static async addUser(req, res, next) { + // try { + // const { email, password } = req.body; + // let user = await User.create({ + // email, + // password, + // }); + // res.status(201).json({ id: user.id, email: user.email }); + // } catch (error) { + + // next(error) + // } + // } + // static async loginUser(req, res, next) { + // try { + // let { email, password } = req.body; + // if (!email) { + // throw { + // name: "CustomError", + // status: 400, + // message: "Email is required", + // }; + // } + + // if (!password) { + // throw { + // name: "CustomError", + // status: 400, + // message: "Password is required", + // }; + // } + + // let user = await User.findOne({ + // where: { + // email: email, + // }, + // }); + // if (!user || !comparePassword(password, user.password)) { + // throw { + // name: "CustomError", + // status: 400, + // message: "Invalid Email/Password", + // }; + // } + + // let token = signToken({ id: user.id }); + // res.status(200).json({ access_token: token }); + // } catch (error) { + // next(error) + // } + // } } module.exports = UserController \ No newline at end of file diff --git a/Server/config/config.json b/Server/config/config.json index 0f858c6..42d8bc1 100644 --- a/Server/config/config.json +++ b/Server/config/config.json @@ -1,17 +1,17 @@ { "development": { - "username": "root", - "password": null, - "database": "database_development", - "host": "127.0.0.1", - "dialect": "mysql" + "username": "postgres", + "password": "postgres", + "database": "ApotikDB", + "host": "localhost", + "dialect": "postgres" }, "test": { - "username": "root", - "password": null, - "database": "database_test", - "host": "127.0.0.1", - "dialect": "mysql" + "username": "postgres", + "password": "postgres", + "database": "ApotikDB_test", + "host": "localhost", + "dialect": "postgres" }, "production": { "username": "root", diff --git a/Server/data/Products.json b/Server/data/Products.json new file mode 100644 index 0000000..e207314 --- /dev/null +++ b/Server/data/Products.json @@ -0,0 +1,142 @@ +[ + { + "name": "Paracetamol", + "price": 20000, + "Description": "Paracetamol is used to treat mild to moderate pain. It is also used to treat mild to moderate fever.", + "imageUrl": "https://pimpharma.com/wp-content/uploads/2023/02/paracetamol-box-1.png", + "Usage": "Take one tablet twice a day for a full 24 hours." + }, + { + "name": "Ibuprofen", + "price": 25000, + "Description": "Ibuprofen is a nonsteroidal anti-inflammatory drug (NSAID). It is used for relief of symptoms of arthritis, primary dysmenorrhea, fever, and as an analgesic, especially where there is an inflammatory component.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRUBrGHYsejZ6ivD_zo03k4XtfPS_0tnXvklw&usqp=CAU", + "Usage": "Take one tablet every 4 to 6 hours as needed." + }, + { + "name": "Aspirin", + "price": 18000, + "Description": "Aspirin is used to reduce fever and relieve mild to moderate pain from conditions such as muscle aches, toothaches, common cold, and headaches.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTidW2RhjwUP1jmsjhs8GITZ6CBhb5edeG3eQ&usqp=CAU", + "Usage": "Take one tablet every 4 to 6 hours as needed." + }, + { + "name": "Cetirizine", + "price": 30000, + "Description": "Cetirizine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfynZRtzlfaqpnzWdIiT7w3pOyGUCVHyMAkg&usqp=CAU", + "Usage": "Take one tablet daily, preferably in the evening." + }, + { + "name": "Loperamide", + "price": 22000, + "Description": "Loperamide is used to control sudden diarrhea and symptoms of diarrhea, including traveler's diarrhea.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-smXY19ksm5gJYM4KysRKhoTpjaaC6cjQHw&usqp=CAU", + "Usage": "Take 2 tablets initially, then 1 tablet after each loose stool." + }, + { + "name": "Ranitidine", + "price": 28000, + "Description": "Ranitidine is used to treat ulcers of the stomach and intestines and prevent them from coming back after they have healed. This medication is also used to treat certain stomach and throat (esophagus) problems (such as erosive esophagitis, gastroesophageal reflux disease-GERD, Zollinger-Ellison syndrome). It works by decreasing the amount of acid your stomach makes. It relieves symptoms such as cough that doesn't go away, stomach pain, heartburn, and difficulty swallowing.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQHOe8UqV2C_ATjt8roMGqvaGCJsgBM25-k8Q&usqp=CAU", + "Usage": "Take one tablet twice daily." + }, + { + "name": "Omeprazole", + "price": 35000, + "Description": "Omeprazole is used to treat certain stomach and esophagus problems (such as acid reflux, ulcers). It works by decreasing the amount of acid your stomach makes. It relieves symptoms such as heartburn, difficulty swallowing, and persistent cough.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZH7aUS1EFKxFzM5DTqDLUNf-LzV0KjG0iGg&usqp=CAU", + "Usage": "Take one tablet daily, before a meal." + }, + { + "name": "Diphenhydramine", + "price": 23000, + "Description": "Diphenhydramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, itching, watery eyes, itchy eyes/nose/throat, cough, runny nose, and sneezing. It is also used to prevent and treat nausea, vomiting, and dizziness caused by motion sickness.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0zU1m4aTsoHAFlrwNuh5JHY8iDmX58RDsrw&usqp=CAU", + "Usage": "Take one tablet every 4 to 6 hours as needed." + }, + { + "name": "Loratadine", + "price": 32000, + "Description": "Loratadine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSSrWFVi3jkYGqdPmVWJOv19xgu7RpROW6rzA&usqp=CAU", + "Usage": "Take one tablet daily." + }, + { + "name": "Fexofenadine", + "price": 34000, + "Description": "Fexofenadine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSknX52cLZQB1w6ySzvrzpDqW7taHIfYumovg&usqp=CAU", + "Usage": "Take one tablet daily." + }, + { + "name": "Simethicone", + "price": 25000, + "Description": "Simethicone is used to relieve symptoms of extra gas such as belching, bloating, and feelings of pressure/discomfort in the stomach/gut. It is also used to relieve symptoms of gas-related stomach discomfort (such as heartburn, sour stomach, and acid indigestion).", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDOOeOELfyAg8U_dCggZif5lGQsh7LRirPWg&usqp=CAU", + "Usage": "Take 1 to 2 tablets four times a day after meals and at bedtime, or as directed by your doctor." + }, + { + "name": "Chlorpheniramine", + "price": 27000, + "Description": "Chlorpheniramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, itching, watery eyes, itchy eyes/nose/throat, cough, runny nose, and sneezing. It is also used to prevent and treat nausea, vomiting, and dizziness caused by motion sickness.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTS1gqkYYOzz3Mfz0-b9eXIY5OmSpbXvtkaeg&usqp=CAU", + "Usage": "Take one tablet every 4 to 6 hours as needed." + }, + { + "name": "Dextromethorphan", + "price": 26000, + "Description": "Dextromethorphan is a cough suppressant used to relieve cough. It is usually used for a short term to control coughing associated with the flu, a cold, or due to inhaled irritants.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQXiosgRSZ7pLV1W7MLJuQVqBrqxbJCpyUzw&usqp=CAU", + "Usage": "Take one tablet every 4 to 6 hours as needed." + }, + { + "name": "Guaifenesin", + "price": 24000, + "Description": "Guaifenesin is used to relieve chest congestion. It works by thinning and loosening mucus in the airways, clearing congestion, and making breathing easier.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3pal_1YsaFAjVuqVaVVPjZJHBNWhLEC3uwQ&usqp=CAU", + "Usage": "Take one tablet every 4 hours as needed." + }, + { + "name": "Hydrocortisone", + "price": 40000, + "Description": "Hydrocortisone is used to treat redness, swelling, itching, and discomfort of various skin conditions. It is also used to treat conditions such as arthritis, blood/hormone/immune system disorders, allergic reactions, certain skin and eye conditions, breathing problems, certain bowel disorders, and certain cancers.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQom21EjqX-Tit2mC4JNfLTQNHsY-vi786Q0Q&usqp=CAU", + "Usage": "Apply a thin film to the affected area 2 to 4 times daily." + }, + { + "name": "Clotrimazole", + "price": 38000, + "Description": "Clotrimazole is used to treat skin infections such as athlete's foot, jock itch, ringworm, and other fungal skin infections (candidiasis). This medication is also used to treat a skin condition known as pityriasis (tinea versicolor), a fungal infection that causes a lightening or darkening of the skin of the neck, chest, arms, or legs.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8eCTjyqWiTWhuP8nlAlPahrdfeL-l2BRLow&usqp=CAU", + "Usage": "Apply a thin layer of cream to the affected area once or twice daily." + }, + { + "name": "Mupirocin", + "price": 36000, + "Description": "Mupirocin is used to treat certain skin infections (such as impetigo). It is an antibiotic. It works by stopping the growth of certain bacteria.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT89Nx4qht6c5nTXVf6bk68PVYGkHRT3ATnRg&usqp=CAU", + "Usage": "Apply a small amount of ointment to the affected area 3 times daily for 10 days." + }, + { + "name": "Benzoyl Peroxide", + "price": 30000, + "Description": "Benzoyl peroxide is used to treat acne. It works by killing the bacteria that cause acne, drying the acne pimples, and helping the skin to peel.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQru8xntHgz_49C1Bz4EWuLqzRLwvdQHesZ0Q&usqp=CAU", + "Usage": "Apply a thin layer to the affected area once or twice daily." + }, + { + "name": "Salicylic Acid", + "price": 32000, + "Description": "Salicylic acid is used to treat acne and other skin conditions. It works by causing the skin to swell, soften, and then peel, which helps to unclog pores, clear up pimples, and prevent new ones from forming.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRVyzIMFP5X2Psv3Fs0kRHmZvYXyDZ53ldF-C8l-nsA4xFRcYqk8En9Dpz_fxY1iccxOSg&usqp=CAU", + "Usage": "Apply a thin layer to the affected area once or twice daily." + }, + { + "name": "Retinol", + "price": 38000, + "Description": "Retinol is used to improve the appearance and texture of the skin. It promotes skin renewal and enhances collagen production, helping to reduce the appearance of wrinkles, fine lines, and other signs of aging.", + "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWHlceZQke-DVPOYWHkuvWyAg4ncd_HSSfXQ&usqp=CAU", + "Usage": "Apply a small amount to the face and neck in the evening, after cleansing." + } +] diff --git a/Server/data/Proof.json b/Server/data/Proof.json new file mode 100644 index 0000000..e1e1265 --- /dev/null +++ b/Server/data/Proof.json @@ -0,0 +1,6 @@ +[ + { + "imageUrl": "https://akunta.id/webconten-assets/BLOG/Blog%2015/kwitansi.png", + "UserId": 1 + } +] \ No newline at end of file diff --git a/Server/data/User.json b/Server/data/User.json new file mode 100644 index 0000000..d0a3ecd --- /dev/null +++ b/Server/data/User.json @@ -0,0 +1,12 @@ +[ + { + "username": "user1", + "email": "user@mail.com", + "password": "password" + }, + { + "username": "user2", + "email": "user1@mail.com", + "password": "password" + } +] \ No newline at end of file From 3f6593f26d4d11865e8ff794aaeee9af8412f1ef Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Wed, 13 Mar 2024 16:38:49 +0700 Subject: [PATCH 07/36] feat:seeding --- Server/data/Products.json | 80 +++++++++---------- Server/data/Proof.json | 2 +- .../migrations/20240313090227-create-user.js | 38 +++++++++ .../20240313090245-create-product.js | 45 +++++++++++ .../migrations/20240313090253-create-proof.js | 40 ++++++++++ Server/models/product.js | 62 ++++++++++++++ Server/models/proof.js | 45 +++++++++++ Server/models/user.js | 62 ++++++++++++++ Server/seeders/20240313090426-User.js | 36 +++++++++ Server/seeders/20240313090436-Product.js | 36 +++++++++ Server/seeders/20240313090443-Proof.js | 36 +++++++++ 11 files changed, 441 insertions(+), 41 deletions(-) create mode 100644 Server/migrations/20240313090227-create-user.js create mode 100644 Server/migrations/20240313090245-create-product.js create mode 100644 Server/migrations/20240313090253-create-proof.js create mode 100644 Server/models/product.js create mode 100644 Server/models/proof.js create mode 100644 Server/models/user.js create mode 100644 Server/seeders/20240313090426-User.js create mode 100644 Server/seeders/20240313090436-Product.js create mode 100644 Server/seeders/20240313090443-Proof.js diff --git a/Server/data/Products.json b/Server/data/Products.json index e207314..2b7428f 100644 --- a/Server/data/Products.json +++ b/Server/data/Products.json @@ -2,141 +2,141 @@ { "name": "Paracetamol", "price": 20000, - "Description": "Paracetamol is used to treat mild to moderate pain. It is also used to treat mild to moderate fever.", + "description": "Paracetamol is used to treat mild to moderate pain. It is also used to treat mild to moderate fever.", "imageUrl": "https://pimpharma.com/wp-content/uploads/2023/02/paracetamol-box-1.png", - "Usage": "Take one tablet twice a day for a full 24 hours." + "usage": "Take one tablet twice a day for a full 24 hours." }, { "name": "Ibuprofen", "price": 25000, - "Description": "Ibuprofen is a nonsteroidal anti-inflammatory drug (NSAID). It is used for relief of symptoms of arthritis, primary dysmenorrhea, fever, and as an analgesic, especially where there is an inflammatory component.", + "description": "Ibuprofen is a nonsteroidal anti-inflammatory drug (NSAID). It is used for relief of symptoms of arthritis, primary dysmenorrhea, fever, and as an analgesic, especially where there is an inflammatory component.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRUBrGHYsejZ6ivD_zo03k4XtfPS_0tnXvklw&usqp=CAU", - "Usage": "Take one tablet every 4 to 6 hours as needed." + "usage": "Take one tablet every 4 to 6 hours as needed." }, { "name": "Aspirin", "price": 18000, - "Description": "Aspirin is used to reduce fever and relieve mild to moderate pain from conditions such as muscle aches, toothaches, common cold, and headaches.", + "description": "Aspirin is used to reduce fever and relieve mild to moderate pain from conditions such as muscle aches, toothaches, common cold, and headaches.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTidW2RhjwUP1jmsjhs8GITZ6CBhb5edeG3eQ&usqp=CAU", - "Usage": "Take one tablet every 4 to 6 hours as needed." + "usage": "Take one tablet every 4 to 6 hours as needed." }, { "name": "Cetirizine", "price": 30000, - "Description": "Cetirizine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", + "description": "Cetirizine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTfynZRtzlfaqpnzWdIiT7w3pOyGUCVHyMAkg&usqp=CAU", - "Usage": "Take one tablet daily, preferably in the evening." + "usage": "Take one tablet daily, preferably in the evening." }, { "name": "Loperamide", "price": 22000, - "Description": "Loperamide is used to control sudden diarrhea and symptoms of diarrhea, including traveler's diarrhea.", + "description": "Loperamide is used to control sudden diarrhea and symptoms of diarrhea, including traveler's diarrhea.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR-smXY19ksm5gJYM4KysRKhoTpjaaC6cjQHw&usqp=CAU", - "Usage": "Take 2 tablets initially, then 1 tablet after each loose stool." + "usage": "Take 2 tablets initially, then 1 tablet after each loose stool." }, { "name": "Ranitidine", "price": 28000, - "Description": "Ranitidine is used to treat ulcers of the stomach and intestines and prevent them from coming back after they have healed. This medication is also used to treat certain stomach and throat (esophagus) problems (such as erosive esophagitis, gastroesophageal reflux disease-GERD, Zollinger-Ellison syndrome). It works by decreasing the amount of acid your stomach makes. It relieves symptoms such as cough that doesn't go away, stomach pain, heartburn, and difficulty swallowing.", + "description": "Ranitidine is used to treat ulcers of the stomach and intestines and prevent them from coming back after they have healed. This medication is also used to treat certain stomach and throat (esophagus) problems (such as erosive esophagitis, gastroesophageal reflux disease-GERD, Zollinger-Ellison syndrome). It works by decreasing the amount of acid your stomach makes. It relieves symptoms such as cough that doesn't go away, stomach pain, heartburn, and difficulty swallowing.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQHOe8UqV2C_ATjt8roMGqvaGCJsgBM25-k8Q&usqp=CAU", - "Usage": "Take one tablet twice daily." + "usage": "Take one tablet twice daily." }, { "name": "Omeprazole", "price": 35000, - "Description": "Omeprazole is used to treat certain stomach and esophagus problems (such as acid reflux, ulcers). It works by decreasing the amount of acid your stomach makes. It relieves symptoms such as heartburn, difficulty swallowing, and persistent cough.", + "description": "Omeprazole is used to treat certain stomach and esophagus problems (such as acid reflux, ulcers). It works by decreasing the amount of acid your stomach makes. It relieves symptoms such as heartburn, difficulty swallowing, and persistent cough.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZH7aUS1EFKxFzM5DTqDLUNf-LzV0KjG0iGg&usqp=CAU", - "Usage": "Take one tablet daily, before a meal." + "usage": "Take one tablet daily, before a meal." }, { "name": "Diphenhydramine", "price": 23000, - "Description": "Diphenhydramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, itching, watery eyes, itchy eyes/nose/throat, cough, runny nose, and sneezing. It is also used to prevent and treat nausea, vomiting, and dizziness caused by motion sickness.", + "description": "Diphenhydramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, itching, watery eyes, itchy eyes/nose/throat, cough, runny nose, and sneezing. It is also used to prevent and treat nausea, vomiting, and dizziness caused by motion sickness.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0zU1m4aTsoHAFlrwNuh5JHY8iDmX58RDsrw&usqp=CAU", - "Usage": "Take one tablet every 4 to 6 hours as needed." + "usage": "Take one tablet every 4 to 6 hours as needed." }, { "name": "Loratadine", "price": 32000, - "Description": "Loratadine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", + "description": "Loratadine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSSrWFVi3jkYGqdPmVWJOv19xgu7RpROW6rzA&usqp=CAU", - "Usage": "Take one tablet daily." + "usage": "Take one tablet daily." }, { "name": "Fexofenadine", "price": 34000, - "Description": "Fexofenadine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", + "description": "Fexofenadine is an antihistamine used to relieve allergy symptoms such as watery eyes, runny nose, itching eyes/nose, sneezing, hives, and itching.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSknX52cLZQB1w6ySzvrzpDqW7taHIfYumovg&usqp=CAU", - "Usage": "Take one tablet daily." + "usage": "Take one tablet daily." }, { "name": "Simethicone", "price": 25000, - "Description": "Simethicone is used to relieve symptoms of extra gas such as belching, bloating, and feelings of pressure/discomfort in the stomach/gut. It is also used to relieve symptoms of gas-related stomach discomfort (such as heartburn, sour stomach, and acid indigestion).", + "description": "Simethicone is used to relieve symptoms of extra gas such as belching, bloating, and feelings of pressure/discomfort in the stomach/gut. It is also used to relieve symptoms of gas-related stomach discomfort (such as heartburn, sour stomach, and acid indigestion).", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSDOOeOELfyAg8U_dCggZif5lGQsh7LRirPWg&usqp=CAU", - "Usage": "Take 1 to 2 tablets four times a day after meals and at bedtime, or as directed by your doctor." + "usage": "Take 1 to 2 tablets four times a day after meals and at bedtime, or as directed by your doctor." }, { "name": "Chlorpheniramine", "price": 27000, - "Description": "Chlorpheniramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, itching, watery eyes, itchy eyes/nose/throat, cough, runny nose, and sneezing. It is also used to prevent and treat nausea, vomiting, and dizziness caused by motion sickness.", + "description": "Chlorpheniramine is an antihistamine used to relieve symptoms of allergy, hay fever, and the common cold. These symptoms include rash, itching, watery eyes, itchy eyes/nose/throat, cough, runny nose, and sneezing. It is also used to prevent and treat nausea, vomiting, and dizziness caused by motion sickness.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTS1gqkYYOzz3Mfz0-b9eXIY5OmSpbXvtkaeg&usqp=CAU", - "Usage": "Take one tablet every 4 to 6 hours as needed." + "usage": "Take one tablet every 4 to 6 hours as needed." }, { "name": "Dextromethorphan", "price": 26000, - "Description": "Dextromethorphan is a cough suppressant used to relieve cough. It is usually used for a short term to control coughing associated with the flu, a cold, or due to inhaled irritants.", + "description": "Dextromethorphan is a cough suppressant used to relieve cough. It is usually used for a short term to control coughing associated with the flu, a cold, or due to inhaled irritants.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQXiosgRSZ7pLV1W7MLJuQVqBrqxbJCpyUzw&usqp=CAU", - "Usage": "Take one tablet every 4 to 6 hours as needed." + "usage": "Take one tablet every 4 to 6 hours as needed." }, { "name": "Guaifenesin", "price": 24000, - "Description": "Guaifenesin is used to relieve chest congestion. It works by thinning and loosening mucus in the airways, clearing congestion, and making breathing easier.", + "description": "Guaifenesin is used to relieve chest congestion. It works by thinning and loosening mucus in the airways, clearing congestion, and making breathing easier.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ3pal_1YsaFAjVuqVaVVPjZJHBNWhLEC3uwQ&usqp=CAU", - "Usage": "Take one tablet every 4 hours as needed." + "usage": "Take one tablet every 4 hours as needed." }, { "name": "Hydrocortisone", "price": 40000, - "Description": "Hydrocortisone is used to treat redness, swelling, itching, and discomfort of various skin conditions. It is also used to treat conditions such as arthritis, blood/hormone/immune system disorders, allergic reactions, certain skin and eye conditions, breathing problems, certain bowel disorders, and certain cancers.", + "description": "Hydrocortisone is used to treat redness, swelling, itching, and discomfort of various skin conditions. It is also used to treat conditions such as arthritis, blood/hormone/immune system disorders, allergic reactions, certain skin and eye conditions, breathing problems, certain bowel disorders, and certain cancers.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQom21EjqX-Tit2mC4JNfLTQNHsY-vi786Q0Q&usqp=CAU", - "Usage": "Apply a thin film to the affected area 2 to 4 times daily." + "usage": "Apply a thin film to the affected area 2 to 4 times daily." }, { "name": "Clotrimazole", "price": 38000, - "Description": "Clotrimazole is used to treat skin infections such as athlete's foot, jock itch, ringworm, and other fungal skin infections (candidiasis). This medication is also used to treat a skin condition known as pityriasis (tinea versicolor), a fungal infection that causes a lightening or darkening of the skin of the neck, chest, arms, or legs.", + "description": "Clotrimazole is used to treat skin infections such as athlete's foot, jock itch, ringworm, and other fungal skin infections (candidiasis). This medication is also used to treat a skin condition known as pityriasis (tinea versicolor), a fungal infection that causes a lightening or darkening of the skin of the neck, chest, arms, or legs.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8eCTjyqWiTWhuP8nlAlPahrdfeL-l2BRLow&usqp=CAU", - "Usage": "Apply a thin layer of cream to the affected area once or twice daily." + "usage": "Apply a thin layer of cream to the affected area once or twice daily." }, { "name": "Mupirocin", "price": 36000, - "Description": "Mupirocin is used to treat certain skin infections (such as impetigo). It is an antibiotic. It works by stopping the growth of certain bacteria.", + "description": "Mupirocin is used to treat certain skin infections (such as impetigo). It is an antibiotic. It works by stopping the growth of certain bacteria.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcT89Nx4qht6c5nTXVf6bk68PVYGkHRT3ATnRg&usqp=CAU", - "Usage": "Apply a small amount of ointment to the affected area 3 times daily for 10 days." + "usage": "Apply a small amount of ointment to the affected area 3 times daily for 10 days." }, { "name": "Benzoyl Peroxide", "price": 30000, - "Description": "Benzoyl peroxide is used to treat acne. It works by killing the bacteria that cause acne, drying the acne pimples, and helping the skin to peel.", + "description": "Benzoyl peroxide is used to treat acne. It works by killing the bacteria that cause acne, drying the acne pimples, and helping the skin to peel.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQru8xntHgz_49C1Bz4EWuLqzRLwvdQHesZ0Q&usqp=CAU", - "Usage": "Apply a thin layer to the affected area once or twice daily." + "usage": "Apply a thin layer to the affected area once or twice daily." }, { "name": "Salicylic Acid", "price": 32000, - "Description": "Salicylic acid is used to treat acne and other skin conditions. It works by causing the skin to swell, soften, and then peel, which helps to unclog pores, clear up pimples, and prevent new ones from forming.", + "description": "Salicylic acid is used to treat acne and other skin conditions. It works by causing the skin to swell, soften, and then peel, which helps to unclog pores, clear up pimples, and prevent new ones from forming.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRVyzIMFP5X2Psv3Fs0kRHmZvYXyDZ53ldF-C8l-nsA4xFRcYqk8En9Dpz_fxY1iccxOSg&usqp=CAU", - "Usage": "Apply a thin layer to the affected area once or twice daily." + "usage": "Apply a thin layer to the affected area once or twice daily." }, { "name": "Retinol", "price": 38000, - "Description": "Retinol is used to improve the appearance and texture of the skin. It promotes skin renewal and enhances collagen production, helping to reduce the appearance of wrinkles, fine lines, and other signs of aging.", + "description": "Retinol is used to improve the appearance and texture of the skin. It promotes skin renewal and enhances collagen production, helping to reduce the appearance of wrinkles, fine lines, and other signs of aging.", "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSWHlceZQke-DVPOYWHkuvWyAg4ncd_HSSfXQ&usqp=CAU", - "Usage": "Apply a small amount to the face and neck in the evening, after cleansing." + "usage": "Apply a small amount to the face and neck in the evening, after cleansing." } ] diff --git a/Server/data/Proof.json b/Server/data/Proof.json index e1e1265..9f893d7 100644 --- a/Server/data/Proof.json +++ b/Server/data/Proof.json @@ -1,6 +1,6 @@ [ { "imageUrl": "https://akunta.id/webconten-assets/BLOG/Blog%2015/kwitansi.png", - "UserId": 1 + "userId": 1 } ] \ No newline at end of file diff --git a/Server/migrations/20240313090227-create-user.js b/Server/migrations/20240313090227-create-user.js new file mode 100644 index 0000000..e06afed --- /dev/null +++ b/Server/migrations/20240313090227-create-user.js @@ -0,0 +1,38 @@ +'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 + }, + username: { + type: Sequelize.STRING, + allowNull: true + }, + email: { + type: Sequelize.STRING, + allowNull: false, + unique: true, + }, + password: { + type: Sequelize.STRING, + allowNull: false, + }, + 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/Server/migrations/20240313090245-create-product.js b/Server/migrations/20240313090245-create-product.js new file mode 100644 index 0000000..3d0b402 --- /dev/null +++ b/Server/migrations/20240313090245-create-product.js @@ -0,0 +1,45 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Products', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING, + allowNull: false + }, + price: { + type: Sequelize.INTEGER, + allowNull: false + }, + description: { + type: Sequelize.TEXT, + allowNull: false + }, + imageUrl: { + type: Sequelize.STRING, + allowNull: false + }, + usage: { + type: Sequelize.STRING, + allowNull: false + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Products'); + } +}; \ No newline at end of file diff --git a/Server/migrations/20240313090253-create-proof.js b/Server/migrations/20240313090253-create-proof.js new file mode 100644 index 0000000..0a6a2d0 --- /dev/null +++ b/Server/migrations/20240313090253-create-proof.js @@ -0,0 +1,40 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Proofs', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + imageUrl: { + type: Sequelize.STRING, + allowNull: false + }, + userId: { + type: Sequelize.INTEGER, + allowNull: false, + references:{ + model:'Users', + key:'id' + }, + onUpdate:'CASCADE', + onDelete:'CASCADE' + + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Proofs'); + } +}; \ No newline at end of file diff --git a/Server/models/product.js b/Server/models/product.js new file mode 100644 index 0000000..16d1dfb --- /dev/null +++ b/Server/models/product.js @@ -0,0 +1,62 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Product 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 + } + } + Product.init({ + name: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: {msg:"Name is required"}, + notEmpty: {msg:"Name is required"}, + }, + }, + price: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notNull: {msg:"Price is required"}, + notEmpty: {msg:"Price is required"}, + }, + }, + description: { + type:DataTypes.TEXT, + allowNull: false, + validate: { + notNull: {msg:"Description is required"}, + notEmpty: {msg:"Description is required"}, + }, + }, + imageUrl: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: {msg:"ImageUrl is required"}, + notEmpty: {msg:"ImageUrl is required"}, + }, + }, + usage: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: {msg:"Usage is required"}, + notEmpty: {msg:"Usage is required"}, + }, + }, + }, { + sequelize, + modelName: 'Product', + }); + return Product; +}; \ No newline at end of file diff --git a/Server/models/proof.js b/Server/models/proof.js new file mode 100644 index 0000000..9e40ef7 --- /dev/null +++ b/Server/models/proof.js @@ -0,0 +1,45 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Proof 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 + Proof.belongsTo(models.User, {foreignKey: 'userId'}) + } + } + Proof.init({ + imageUrl: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: {msg:"ImageUrl is required"}, + notEmpty: {msg:"ImageUrl is required"}, + }, + }, + userId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notNull: {msg:"UserId is required"}, + notEmpty: {msg:"UserId is required"}, + }, + references:{ + model:'User', + key:'id' + }, + onUpdate:'CASCADE', + onDelete:'CASCADE' + } + }, { + sequelize, + modelName: 'Proof', + }); + return Proof; +}; \ No newline at end of file diff --git a/Server/models/user.js b/Server/models/user.js new file mode 100644 index 0000000..708ffc2 --- /dev/null +++ b/Server/models/user.js @@ -0,0 +1,62 @@ +'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.hasMany(models.Proof, {foreignKey: 'userId'}) + } + } + User.init({ + username: { + type: DataTypes.STRING, + }, + email: { + type: DataTypes.STRING, + allowNull: false, + unique: { + args: true, + msg: "Email must be unique", + }, + validate: { + notNull: { + msg: "Email is required", + args: true, + }, + notEmpty: { + msg: "Email is required", + args: true, + }, + isEmail: { + args: true, + msg: "Invalid email format", + }, + }, + }, + password: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notNull: { + msg: "Password is required", + args: true, + }, + notEmpty: { + msg: "Password is required", + args: true, + }, + }, + }, + }, { + sequelize, + modelName: 'User', + }); + return User; +}; \ No newline at end of file diff --git a/Server/seeders/20240313090426-User.js b/Server/seeders/20240313090426-User.js new file mode 100644 index 0000000..e220f8d --- /dev/null +++ b/Server/seeders/20240313090426-User.js @@ -0,0 +1,36 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + const data = require('../data/User.json') + .map((el)=>{ + el.createdAt = el.updatedAt = new Date() + return el + }) + await queryInterface.bulkInsert('Users', data, {}) + }, + + async down (queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Users', null, { + truncate: true, + restartIdentity: true, + cascade: true + }) + } +}; diff --git a/Server/seeders/20240313090436-Product.js b/Server/seeders/20240313090436-Product.js new file mode 100644 index 0000000..018c69d --- /dev/null +++ b/Server/seeders/20240313090436-Product.js @@ -0,0 +1,36 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + const data = require('../data/Products.json') + .map((el)=>{ + el.createdAt = el.updatedAt = new Date() + return el + }) + await queryInterface.bulkInsert('Products', data, {}) + }, + + async down (queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Products', null, { + truncate: true, + restartIdentity: true, + cascade: true + }) + } +}; diff --git a/Server/seeders/20240313090443-Proof.js b/Server/seeders/20240313090443-Proof.js new file mode 100644 index 0000000..aaf1e2b --- /dev/null +++ b/Server/seeders/20240313090443-Proof.js @@ -0,0 +1,36 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + const data = require('../data/Proof.json') + .map((el)=>{ + el.createdAt = el.updatedAt = new Date() + return el + }) + await queryInterface.bulkInsert('Proofs', data, {}) + }, + + async down (queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + await queryInterface.bulkDelete('Proofs', null, { + truncate: true, + restartIdentity: true, + cascade: true + }) + } +}; From 6b7f4b7cba840cfe63257d89eb782226073f402c Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Wed, 13 Mar 2024 16:45:00 +0700 Subject: [PATCH 08/36] feat:helpers --- Server/helpers/bcrypt.js | 7 +++++++ Server/helpers/jwt.js | 15 +++++++++++++++ Server/models/user.js | 6 ++++++ 3 files changed, 28 insertions(+) create mode 100644 Server/helpers/bcrypt.js create mode 100644 Server/helpers/jwt.js diff --git a/Server/helpers/bcrypt.js b/Server/helpers/bcrypt.js new file mode 100644 index 0000000..55be7cf --- /dev/null +++ b/Server/helpers/bcrypt.js @@ -0,0 +1,7 @@ +const {hashSync, compareSync} = require("bcryptjs") + +module.exports= { + hashPassword: (password) => hashSync(password, 10), + comparePassword: (password, db_password)=> + compareSync(password, db_password), +}; \ No newline at end of file diff --git a/Server/helpers/jwt.js b/Server/helpers/jwt.js new file mode 100644 index 0000000..d0022e3 --- /dev/null +++ b/Server/helpers/jwt.js @@ -0,0 +1,15 @@ +const jsonwebtoken = require("jsonwebtoken"); +const secret = process.env.JWT_SECRET + +function signToken(payload){ + return jsonwebtoken.sign(payload, secret) +} + +function verifyToken(token){ + return jsonwebtoken.verify(token, secret) +} + +module.exports={ + signToken, + verifyToken +} \ No newline at end of file diff --git a/Server/models/user.js b/Server/models/user.js index 708ffc2..7a5e096 100644 --- a/Server/models/user.js +++ b/Server/models/user.js @@ -2,6 +2,7 @@ const { Model } = require('sequelize'); +const { hashPassword } = require("../helpers/bcrypt"); module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -55,6 +56,11 @@ module.exports = (sequelize, DataTypes) => { }, }, }, { + hooks: { + beforeCreate(user) { + user.password = hashPassword(user.password); + }, + }, sequelize, modelName: 'User', }); From 6de323d08d308a15bf8e598f59a11313fdcf8ee2 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Wed, 13 Mar 2024 20:31:15 +0700 Subject: [PATCH 09/36] feat:Crud --- Server/Controllers/ProductController.js | 67 +++++++++++++++++ Server/Controllers/PublicController.js | 41 ++++++++++ Server/Controllers/UserController.js | 99 +++++++++++++------------ Server/router/index.js | 28 +++++++ Server/router/public.js | 4 + 5 files changed, 190 insertions(+), 49 deletions(-) create mode 100644 Server/Controllers/ProductController.js create mode 100644 Server/Controllers/PublicController.js create mode 100644 Server/router/index.js create mode 100644 Server/router/public.js diff --git a/Server/Controllers/ProductController.js b/Server/Controllers/ProductController.js new file mode 100644 index 0000000..bfe9684 --- /dev/null +++ b/Server/Controllers/ProductController.js @@ -0,0 +1,67 @@ +const {Product, User} = require("../models") + +class ProductController{ + static async getAllProduct(req, res, next) { + try { + const products = await Product.findAll({ + include: { + model: User, + attributes: {exclude: ['password']} + } + }) + res.json(products) + }catch (error) { + next(error) + } + } + + static async getProductById(req, res, next) { + try { + const {id} = req.params + const product = await Product.findByPk(id) + if(!product){ + throw { + name: "NotFound", + } + } + res.json(product) + }catch (error) { + next(error) + } + } + + static async createProduct(req, res, next) { + try { + const product = await Product.create({ + ...req.body, + userId: req.user.id + }) + res.status(201).json(product) + }catch (error) { + next(error) + } + } + + static async deleteProductById(req, res, next) { + try { + const {id} = req.params + const product = await Product.findByPk(id) + if(!product){ + throw { + name: "NotFound", + } + } + await product.destroy({ + where: { + id: id + } + }) + res.status(200).json({message: "Product has been deleted"}) + }catch(error) { + next(error) + } + } + +} + +module.exports = ProductController \ No newline at end of file diff --git a/Server/Controllers/PublicController.js b/Server/Controllers/PublicController.js new file mode 100644 index 0000000..7de1f91 --- /dev/null +++ b/Server/Controllers/PublicController.js @@ -0,0 +1,41 @@ +const {Product} = require("../models") +class PublicController{ + static async getAllProduct(req, res, next) { + try { + let {search} = req.query + let whereCondition = {} + if (search) { + whereCondition.name = { + [Op.like]: `%${search}%` + } + } + + const data = await Product.findAll({ + where: whereCondition + }) + + res.status(200).json(data) + }catch (error) { + next(error) + } + } + + static async getAllProductById(req, res, next) { + try { + const {id} = req.params + const product = await Product.findByPk(id) + if(!product){ + throw { + name: "NotFound", + } + }else{ + res.status(200).json(product) + } + }catch (error) { + next(error) + } + } + +} + +module.exports = PublicController \ No newline at end of file diff --git a/Server/Controllers/UserController.js b/Server/Controllers/UserController.js index 324766e..4d98811 100644 --- a/Server/Controllers/UserController.js +++ b/Server/Controllers/UserController.js @@ -1,58 +1,59 @@ - +const { User } = require("../models"); +const { hashPassword, comparePassword } = require("../helpers/bcrypt"); +const { signToken } = require("../helpers/jwt"); class UserController{ - // static async addUser(req, res, next) { - // try { - // const { email, password } = req.body; - // let user = await User.create({ - // email, - // password, - // }); - // res.status(201).json({ id: user.id, email: user.email }); - // } catch (error) { - - // next(error) - // } - // } + static async addUser(req, res, next) { + try { + const { email, password } = req.body; + let user = await User.create({ + email, + password, + }); + res.status(201).json({ id: user.id, email: user.email }); + } catch (error) { + next(error) + } + } - // static async loginUser(req, res, next) { - // try { - // let { email, password } = req.body; - // if (!email) { - // throw { - // name: "CustomError", - // status: 400, - // message: "Email is required", - // }; - // } + static async loginUser(req, res, next) { + try { + let { email, password } = req.body; + if (!email) { + throw { + name: "CustomError", + status: 400, + message: "Email is required", + }; + } - // if (!password) { - // throw { - // name: "CustomError", - // status: 400, - // message: "Password is required", - // }; - // } + if (!password) { + throw { + name: "CustomError", + status: 400, + message: "Password is required", + }; + } - // let user = await User.findOne({ - // where: { - // email: email, - // }, - // }); - // if (!user || !comparePassword(password, user.password)) { - // throw { - // name: "CustomError", - // status: 400, - // message: "Invalid Email/Password", - // }; - // } + let user = await User.findOne({ + where: { + email: email, + }, + }); + if (!user || !comparePassword(password, user.password)) { + throw { + name: "CustomError", + status: 400, + message: "Invalid Email/Password", + }; + } - // let token = signToken({ id: user.id }); - // res.status(200).json({ access_token: token }); - // } catch (error) { - // next(error) - // } - // } + let token = signToken({ id: user.id }); + res.status(200).json({ access_token: token }); + } catch (error) { + next(error) + } + } } module.exports = UserController \ No newline at end of file diff --git a/Server/router/index.js b/Server/router/index.js new file mode 100644 index 0000000..bdbe92a --- /dev/null +++ b/Server/router/index.js @@ -0,0 +1,28 @@ +const express = require ("express"); +const UserController = require("../Controllers/UserController"); +const router = express.Router(); + + +router.post("/register", UserController.addUser) +router.post("/login", UserController.loginUser) + +router.use("/public",require("./public")); + + +router.use("product",require("./product")); + + + + + + + + + + + + + + + +module.exports = router \ No newline at end of file diff --git a/Server/router/public.js b/Server/router/public.js new file mode 100644 index 0000000..8f5dcab --- /dev/null +++ b/Server/router/public.js @@ -0,0 +1,4 @@ +const express = require("express"); +const router = express.Router(); + +router.get("/products") \ No newline at end of file From 6743ad46268f467c87f864c5033a701331a6bb42 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Wed, 13 Mar 2024 22:35:07 +0700 Subject: [PATCH 10/36] fix:crud --- Server/Controllers/ProductController.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Server/Controllers/ProductController.js b/Server/Controllers/ProductController.js index bfe9684..9bf54e4 100644 --- a/Server/Controllers/ProductController.js +++ b/Server/Controllers/ProductController.js @@ -56,12 +56,13 @@ class ProductController{ id: id } }) - res.status(200).json({message: "Product has been deleted"}) + res.status(200).json({message: `Product ${product.name} has been deleted`}) }catch(error) { next(error) } } + } module.exports = ProductController \ No newline at end of file From a1fcfbe1b28797622bdd0d963da1ea40ad11157a Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Wed, 13 Mar 2024 23:51:10 +0700 Subject: [PATCH 11/36] fix:Crud --- Server/Controllers/ProductController.js | 108 +++++++++++------------- Server/middlewares/authentication.js | 33 ++++++++ Server/router/index.js | 2 +- Server/router/public.js | 6 +- 4 files changed, 89 insertions(+), 60 deletions(-) diff --git a/Server/Controllers/ProductController.js b/Server/Controllers/ProductController.js index 9bf54e4..51f8f22 100644 --- a/Server/Controllers/ProductController.js +++ b/Server/Controllers/ProductController.js @@ -1,68 +1,60 @@ -const {Product, User} = require("../models") +const { Product, User } = require("../models"); -class ProductController{ - static async getAllProduct(req, res, next) { - try { - const products = await Product.findAll({ - include: { - model: User, - attributes: {exclude: ['password']} - } - }) - res.json(products) - }catch (error) { - next(error) - } +class ProductController { + static async getAllProduct(req, res, next) { + try { + const products = await Product.findAll(); + res.json(products); + } catch (error) { + next(error); } + } - static async getProductById(req, res, next) { - try { - const {id} = req.params - const product = await Product.findByPk(id) - if(!product){ - throw { - name: "NotFound", - } - } - res.json(product) - }catch (error) { - next(error) - } + static async getProductById(req, res, next) { + try { + const { id } = req.params; + const product = await Product.findByPk(id); + if (!product) { + throw { + name: "NotFound", + }; + } + res.json(product); + } catch (error) { + next(error); } + } - static async createProduct(req, res, next) { - try { - const product = await Product.create({ - ...req.body, - userId: req.user.id - }) - res.status(201).json(product) - }catch (error) { - next(error) - } + static async createProduct(req, res, next) { + try { + const product = await Product.create({...req.body}); + res.status(201).json(product); + } catch (error) { + next(error); } + } - static async deleteProductById(req, res, next) { - try { - const {id} = req.params - const product = await Product.findByPk(id) - if(!product){ - throw { - name: "NotFound", - } - } - await product.destroy({ - where: { - id: id - } - }) - res.status(200).json({message: `Product ${product.name} has been deleted`}) - }catch(error) { - next(error) - } + static async deleteProductById(req, res, next) { + try { + const { id } = req.params; + const product = await Product.findByPk(id); + if (!product) { + throw { + name: "NotFound", + }; + } + await product.destroy({ + where: { + id: id, + }, + }); + res + .status(200) + .json({ message: `Product ${product.name} has been deleted` }); + } catch (error) { + next(error); } - - + } } -module.exports = ProductController \ No newline at end of file +module.exports = ProductController; diff --git a/Server/middlewares/authentication.js b/Server/middlewares/authentication.js index e69de29..f778b38 100644 --- a/Server/middlewares/authentication.js +++ b/Server/middlewares/authentication.js @@ -0,0 +1,33 @@ +const { User } = require("../models"); +const { verifyToken } = require("../helpers/jwttoken"); + +async function authentication(req, res, next) { + + try { + let access_token = req.headers.authorization; + if (!access_token) { + throw { name: "Unauthenticated" }; + } + + let [type, token] = access_token.split(" "); + if (type !== `Bearer`) { + throw { name: "Unauthenticated" }; + } + + let payload = verifyToken(token); + let user = await User.findByPk(payload.id); + if (!user) { + throw { name: "Unauthenticated" }; + } + + req.user = { + id: user.id, + email: user.email, + }; + next(); + } catch (error) { + next(error); + } +} + +module.exports = authentication; diff --git a/Server/router/index.js b/Server/router/index.js index bdbe92a..428ca21 100644 --- a/Server/router/index.js +++ b/Server/router/index.js @@ -9,7 +9,7 @@ router.post("/login", UserController.loginUser) router.use("/public",require("./public")); -router.use("product",require("./product")); +router.use("products",require("./products")); diff --git a/Server/router/public.js b/Server/router/public.js index 8f5dcab..54340c2 100644 --- a/Server/router/public.js +++ b/Server/router/public.js @@ -1,4 +1,8 @@ const express = require("express"); +const PublicController = require("../Controllers/PublicController"); const router = express.Router(); -router.get("/products") \ No newline at end of file +router.get("/products", PublicController.getAllProduct); +router.get("/products/:id", PublicController.getAllProductById); + +module.exports = router \ No newline at end of file From 1ec18ed94bc52defca93a90fe31a80b3e876f408 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 02:03:23 +0700 Subject: [PATCH 12/36] fix:crud --- Server/.env.example | 4 ++ Server/Controllers/CartController.js | 55 +++++++++++++++++++ Server/Controllers/ProductController.js | 32 +---------- Server/Controllers/ProofController.js | 39 +++++++++++++ Server/app.js | 6 +- Server/data/cart.json | 6 ++ Server/middlewares/authorization.js | 0 .../migrations/20240313175505-create-cart.js | 31 +++++++++++ Server/models/cart.js | 52 ++++++++++++++++++ Server/models/product.js | 1 + Server/models/user.js | 1 + Server/router/cart.js | 14 +++++ Server/router/index.js | 5 +- Server/router/product.js | 16 ++++++ Server/router/proof.js | 13 +++++ 15 files changed, 240 insertions(+), 35 deletions(-) create mode 100644 Server/Controllers/CartController.js create mode 100644 Server/Controllers/ProofController.js create mode 100644 Server/data/cart.json delete mode 100644 Server/middlewares/authorization.js create mode 100644 Server/migrations/20240313175505-create-cart.js create mode 100644 Server/models/cart.js create mode 100644 Server/router/cart.js create mode 100644 Server/router/product.js create mode 100644 Server/router/proof.js diff --git a/Server/.env.example b/Server/.env.example index e69de29..a8a4bb2 100644 --- a/Server/.env.example +++ b/Server/.env.example @@ -0,0 +1,4 @@ +JWT_SECRET = +cloud_name: +api_key: +api_secret: \ No newline at end of file diff --git a/Server/Controllers/CartController.js b/Server/Controllers/CartController.js new file mode 100644 index 0000000..a118917 --- /dev/null +++ b/Server/Controllers/CartController.js @@ -0,0 +1,55 @@ +const { Cart, Product } = require("../models"); + +class CartController{ + static async getAllItems(req, res, next) { + try { + const items = await Cart.findAll({ + include: { + model: Product, + } + }); + res.json(items); + } catch (error) { + next(error); + } + } + + static async getItemById(req, res, next) { + try { + const { id } = req.params; + const items = await Cart.findByPk(id); + res.json(items); + } catch (error) { + next(error); + } + } + + static async createItems(req, res, next) { + try { + + const items = await Cart.create({...req.body}); + res.status(201).json(items); + } catch (error) { + next(error); + } + } + + static async deleteItemById(req, res, next) { + const { id } = req.params; + try { + const items = await Cart.findByPk(id); + await items.destroy({ + where: { + id: id, + }, + }); + res + .status(200) + .json({ message: `Item has been deleted` }); + } catch (error) { + next(error); + } + } +} + +module.exports = CartController \ No newline at end of file diff --git a/Server/Controllers/ProductController.js b/Server/Controllers/ProductController.js index 51f8f22..a7c64ad 100644 --- a/Server/Controllers/ProductController.js +++ b/Server/Controllers/ProductController.js @@ -1,4 +1,4 @@ -const { Product, User } = require("../models"); +const { Product} = require("../models"); class ProductController { static async getAllProduct(req, res, next) { @@ -25,36 +25,6 @@ class ProductController { } } - static async createProduct(req, res, next) { - try { - const product = await Product.create({...req.body}); - res.status(201).json(product); - } catch (error) { - next(error); - } - } - - static async deleteProductById(req, res, next) { - try { - const { id } = req.params; - const product = await Product.findByPk(id); - if (!product) { - throw { - name: "NotFound", - }; - } - await product.destroy({ - where: { - id: id, - }, - }); - res - .status(200) - .json({ message: `Product ${product.name} has been deleted` }); - } catch (error) { - next(error); - } - } } module.exports = ProductController; diff --git a/Server/Controllers/ProofController.js b/Server/Controllers/ProofController.js new file mode 100644 index 0000000..7f5944c --- /dev/null +++ b/Server/Controllers/ProofController.js @@ -0,0 +1,39 @@ +const { Proof } = require("../models"); + +const cloud_name = process.env.cloud_name; +const api_key = process.env.api_key; +const api_secret = process.env.api_secret; + +const cloudinary = require("cloudinary").v2; +cloudinary.config({ + cloud_name: cloud_name, + api_key: api_key, + api_secret: api_secret, +}); + +class ProofController { + + static async createProof(req, res, next) { + + try { + console.log(req.file); + console.log(req.body); + const mimetype = req.file.mimetype; + const data = Buffer.from(req.file.buffer).toString("base64"); + const dataURL = `data:${mimetype};base64,${data}`; + const timestamp = new Date().getTime(); + const publicId = `image_${timestamp}`; + const file = await cloudinary.uploader.upload(dataURL, { + public_id: publicId, + }); + await Proof.create({ + imageUrl: file.secure_url, + userId: req.body.userId + }) + res.status(201).json({message: "Proof has been created"}); + } catch (error) { + next(error); + } + } +} +module.exports = ProofController; diff --git a/Server/app.js b/Server/app.js index 7fa3a11..c556889 100644 --- a/Server/app.js +++ b/Server/app.js @@ -1,7 +1,7 @@ -// if(process.env.NODE_ENV !== 'production'){ +if(process.env.NODE_ENV !== 'production'){ -// require("dotenv").config(); -// } + require("dotenv").config(); + } const express = require("express"); diff --git a/Server/data/cart.json b/Server/data/cart.json new file mode 100644 index 0000000..e19a5d3 --- /dev/null +++ b/Server/data/cart.json @@ -0,0 +1,6 @@ +[ + { + "userId": 1, + "productId": 1 + } +] \ No newline at end of file diff --git a/Server/middlewares/authorization.js b/Server/middlewares/authorization.js deleted file mode 100644 index e69de29..0000000 diff --git a/Server/migrations/20240313175505-create-cart.js b/Server/migrations/20240313175505-create-cart.js new file mode 100644 index 0000000..4987786 --- /dev/null +++ b/Server/migrations/20240313175505-create-cart.js @@ -0,0 +1,31 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('Carts', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + userId: { + type: Sequelize.INTEGER + }, + productId: { + type: Sequelize.INTEGER + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('Carts'); + } +}; \ No newline at end of file diff --git a/Server/models/cart.js b/Server/models/cart.js new file mode 100644 index 0000000..ca20c37 --- /dev/null +++ b/Server/models/cart.js @@ -0,0 +1,52 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class Cart 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 + Cart.belongsTo(models.User, {foreignKey: 'userId'}) + Cart.belongsTo(models.Product, {foreignKey: 'productId'}) + } + } + Cart.init({ + userId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notNull: {msg:"UserId is required"}, + notEmpty: {msg:"UserId is required"}, + }, + references:{ + model:'User', + key:'id' + }, + onUpdate:'CASCADE', + onDelete:'CASCADE' + }, + productId: { + type: DataTypes.INTEGER, + allowNull: false, + validate: { + notNull: {msg:"ProductId is required"}, + notEmpty: {msg:"ProductId is required"}, + }, + references:{ + model:'Product', + key:'id' + }, + onUpdate:'CASCADE', + onDelete:'CASCADE' + } + }, { + sequelize, + modelName: 'Cart', + }); + return Cart; +}; \ No newline at end of file diff --git a/Server/models/product.js b/Server/models/product.js index 16d1dfb..8718e74 100644 --- a/Server/models/product.js +++ b/Server/models/product.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Product.hasMany(models.Cart, {foreignKey: 'productId'}) } } Product.init({ diff --git a/Server/models/user.js b/Server/models/user.js index 7a5e096..01b0bb6 100644 --- a/Server/models/user.js +++ b/Server/models/user.js @@ -13,6 +13,7 @@ module.exports = (sequelize, DataTypes) => { static associate(models) { // define association here User.hasMany(models.Proof, {foreignKey: 'userId'}) + User.hasMany(models.Cart, {foreignKey: 'userId'}) } } User.init({ diff --git a/Server/router/cart.js b/Server/router/cart.js new file mode 100644 index 0000000..3500720 --- /dev/null +++ b/Server/router/cart.js @@ -0,0 +1,14 @@ +const express = require("express"); +const router = express.Router(); +const CartController = require("../Controllers/CartController"); + +const authentication = require("../middlewares/authentication"); + +router.use(authentication); + +router.get("/", CartController.getAllItems); + +router.post("/", CartController.createItems); +router.delete("/:id", CartController.deleteItemById); + +module.exports = router \ No newline at end of file diff --git a/Server/router/index.js b/Server/router/index.js index 428ca21..0d24e9e 100644 --- a/Server/router/index.js +++ b/Server/router/index.js @@ -8,8 +8,11 @@ router.post("/login", UserController.loginUser) router.use("/public",require("./public")); +router.use("/products",require("./products")); -router.use("products",require("./products")); +router.use("/cart",require("./cart")); + +router.use("/proof",require("./proof")); diff --git a/Server/router/product.js b/Server/router/product.js new file mode 100644 index 0000000..78e0d3a --- /dev/null +++ b/Server/router/product.js @@ -0,0 +1,16 @@ +const express = require("express"); +const router = express.Router(); +const authentication = require("../middlewares/authentication"); +const ProductController = require("../Controllers/ProductController"); + + + +router.use(authentication) + + +router.get("/", ProductController.getAllProduct); +router.get("/:id", ProductController.getProductById); + + + +module.exports = router \ No newline at end of file diff --git a/Server/router/proof.js b/Server/router/proof.js new file mode 100644 index 0000000..5fde04c --- /dev/null +++ b/Server/router/proof.js @@ -0,0 +1,13 @@ +const express = require("express"); +const router = express.Router(); + + +const authentication = require("../middlewares/authentication"); + +const ProofController = require("../Controllers/ProofController"); + +router.use(authentication) + +router.post("/", ProofController.createProof); + +module.exports = router From 696951e4045cd38050a495d3fbb96d62cc3e9fc8 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 11:13:53 +0700 Subject: [PATCH 13/36] feat:Oauth --- Server/Controllers/UserController.js | 34 ++++- Server/package-lock.json | 214 ++++++++++++++++++++++++++- Server/package.json | 2 +- Server/router/index.js | 1 + 4 files changed, 247 insertions(+), 4 deletions(-) diff --git a/Server/Controllers/UserController.js b/Server/Controllers/UserController.js index 4d98811..19e58e0 100644 --- a/Server/Controllers/UserController.js +++ b/Server/Controllers/UserController.js @@ -1,6 +1,7 @@ const { User } = require("../models"); const { hashPassword, comparePassword } = require("../helpers/bcrypt"); const { signToken } = require("../helpers/jwt"); +const client = new OAuth2Client(); class UserController{ static async addUser(req, res, next) { @@ -44,7 +45,7 @@ class UserController{ throw { name: "CustomError", status: 400, - message: "Invalid Email/Password", + message: "Invalid email/password", }; } @@ -54,6 +55,37 @@ class UserController{ next(error) } } + + static async googleLogin(req, res, next) { + const { googleToken } = req.body; + console.log(req.body, "<<< req.body googleLogin"); + try { + const ticket = await client.verifyIdToken({ + idToken: googleToken, + audience: + "865229472588-jh2fdnjo4rrr79po2q9ng93k628h4gbi.apps.googleusercontent.com", + }); + const { email, name } = ticket.getPayload(); + const password = Math.random().toString(); + const [user, created] = await User.findOrCreate({ + where: { email }, + defaults: { + name, + email, + password, + }, + + }); + console.log({ user, created }, "<<< user created googleLogin"); + + const access_token = signToken({ id: user.id }); + res + .status(200) + .json({ message: "Logged in as " + user.email, access_token }); + } catch (err) { + next(err); + } + } } module.exports = UserController \ No newline at end of file diff --git a/Server/package-lock.json b/Server/package-lock.json index bdc915c..126be16 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -1,21 +1,27 @@ { - "name": "Server", + "name": "server", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "server", + "version": "1.0.0", + "license": "ISC", "dependencies": { "axios": "^1.6.7", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", + "google-auth-library": "^9.7.0", "jsonwebtoken": "^9.0.2", "nodemon": "^3.1.0", "pg": "^8.11.3", "sequelize": "^6.37.1", "sequelize-cli": "^6.6.2" - } + }, + "devDependencies": {} }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -93,6 +99,17 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -160,11 +177,38 @@ "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/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" }, + "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/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -822,6 +866,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/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -961,6 +1010,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gaxios": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.3.0.tgz", + "integrity": "sha512-p+ggrQw3fBwH2F5N/PAI4k/G/y1art5OxKpb2J2chwNNHM4hHuAOtivjPuirMF4KNKwTTUal/lPfL2+7h2mEcg==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "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-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1041,6 +1116,41 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/google-auth-library": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.7.0.tgz", + "integrity": "sha512-I/AvzBiUXDzLOy4iIZ2W+Zq33W4lcukQv1nl7C8WUA6SQwyQwUwu3waNmWNAvzds//FG8SZ+DnKnW/2k6mQS8A==", + "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", @@ -1057,6 +1167,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": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1124,6 +1265,18 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1228,6 +1381,17 @@ "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==", + "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", @@ -1278,6 +1442,14 @@ "node": ">=14" } }, + "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/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -1510,6 +1682,25 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, + "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/nodemon": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", @@ -2323,6 +2514,11 @@ "node": "*" } }, + "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": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", @@ -2409,6 +2605,20 @@ "node": ">= 0.8" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/Server/package.json b/Server/package.json index 2ee5b23..5db4261 100644 --- a/Server/package.json +++ b/Server/package.json @@ -5,6 +5,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", + "google-auth-library": "^9.7.0", "jsonwebtoken": "^9.0.2", "nodemon": "^3.1.0", "pg": "^8.11.3", @@ -14,7 +15,6 @@ "name": "server", "version": "1.0.0", "main": "app.js", - "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/Server/router/index.js b/Server/router/index.js index 0d24e9e..f9d65b9 100644 --- a/Server/router/index.js +++ b/Server/router/index.js @@ -5,6 +5,7 @@ const router = express.Router(); router.post("/register", UserController.addUser) router.post("/login", UserController.loginUser) +router.post("/google-login", UserController.googleLogin) router.use("/public",require("./public")); From 6e7c2345ca06a72e621002a25df71091d05003a0 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 11:23:00 +0700 Subject: [PATCH 14/36] fix:cloudinary --- Server/Controllers/UserController.js | 3 ++- Server/middlewares/authentication.js | 2 +- Server/package-lock.json | 25 +++++++++++++++++++++++-- Server/package.json | 1 + Server/router/index.js | 7 +++++-- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Server/Controllers/UserController.js b/Server/Controllers/UserController.js index 19e58e0..01511ab 100644 --- a/Server/Controllers/UserController.js +++ b/Server/Controllers/UserController.js @@ -1,6 +1,7 @@ const { User } = require("../models"); const { hashPassword, comparePassword } = require("../helpers/bcrypt"); const { signToken } = require("../helpers/jwt"); +const {OAuth2Client} = require("google-auth-library") const client = new OAuth2Client(); class UserController{ @@ -63,7 +64,7 @@ class UserController{ const ticket = await client.verifyIdToken({ idToken: googleToken, audience: - "865229472588-jh2fdnjo4rrr79po2q9ng93k628h4gbi.apps.googleusercontent.com", + "888996035254-qqqrffv50i0tk2i45ja7j75g1ii9nlkg.apps.googleusercontent.com", }); const { email, name } = ticket.getPayload(); const password = Math.random().toString(); diff --git a/Server/middlewares/authentication.js b/Server/middlewares/authentication.js index f778b38..01deab8 100644 --- a/Server/middlewares/authentication.js +++ b/Server/middlewares/authentication.js @@ -1,5 +1,5 @@ const { User } = require("../models"); -const { verifyToken } = require("../helpers/jwttoken"); +const { verifyToken } = require("../helpers/jwt"); async function authentication(req, res, next) { diff --git a/Server/package-lock.json b/Server/package-lock.json index 126be16..5fe945b 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "axios": "^1.6.7", "bcryptjs": "^2.4.3", + "cloudinary": "^2.0.3", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", @@ -20,8 +21,7 @@ "pg": "^8.11.3", "sequelize": "^6.37.1", "sequelize-cli": "^6.6.2" - }, - "devDependencies": {} + } }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -432,6 +432,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/cloudinary": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.0.3.tgz", + "integrity": "sha512-2JPxAUuV4iHwiW4ATSOZvii6+BhhKI9+9KscgUkxJPKa6V6wOnZJHlYyovBGrrIbIgEdmGSZgqEsLfD0wWBhBg==", + "dependencies": { + "lodash": "^4.17.21", + "q": "^1.5.1" + }, + "engines": { + "node": ">=9" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1987,6 +1999,15 @@ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", diff --git a/Server/package.json b/Server/package.json index 5db4261..cd2186d 100644 --- a/Server/package.json +++ b/Server/package.json @@ -2,6 +2,7 @@ "dependencies": { "axios": "^1.6.7", "bcryptjs": "^2.4.3", + "cloudinary": "^2.0.3", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", diff --git a/Server/router/index.js b/Server/router/index.js index f9d65b9..92c5776 100644 --- a/Server/router/index.js +++ b/Server/router/index.js @@ -2,14 +2,17 @@ const express = require ("express"); const UserController = require("../Controllers/UserController"); const router = express.Router(); - router.post("/register", UserController.addUser) router.post("/login", UserController.loginUser) router.post("/google-login", UserController.googleLogin) +router.get("/", (req, res) => { + res.send("Hello World!"); + }); + router.use("/public",require("./public")); -router.use("/products",require("./products")); +router.use("/products",require("./product")); router.use("/cart",require("./cart")); From ac0ed03130c1542752f482719a0f35f6b40dbec5 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 12:54:57 +0700 Subject: [PATCH 15/36] feat:utils --- Client/.eslintrc.cjs | 21 + Client/.gitignore | 24 + Client/README.md | 8 + Client/index.html | 13 + Client/package-lock.json | 4984 +++++++++++++++++++++++++++++++++++ Client/package.json | 32 + Client/postcss.config.js | 6 + Client/public/vite.svg | 1 + Client/src/App.css | 42 + Client/src/App.jsx | 23 + Client/src/assets/react.svg | 1 + Client/src/index.css | 74 + Client/src/main.jsx | 10 + Client/src/utils/axios.js | 7 + Client/src/utils/toast.js | 17 + Client/tailwind.config.js | 12 + Client/vite.config.js | 7 + 17 files changed, 5282 insertions(+) create mode 100644 Client/.eslintrc.cjs create mode 100644 Client/.gitignore create mode 100644 Client/README.md create mode 100644 Client/index.html create mode 100644 Client/package-lock.json create mode 100644 Client/package.json create mode 100644 Client/postcss.config.js create mode 100644 Client/public/vite.svg create mode 100644 Client/src/App.css create mode 100644 Client/src/App.jsx create mode 100644 Client/src/assets/react.svg create mode 100644 Client/src/index.css create mode 100644 Client/src/main.jsx create mode 100644 Client/src/utils/axios.js create mode 100644 Client/src/utils/toast.js create mode 100644 Client/tailwind.config.js create mode 100644 Client/vite.config.js 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/.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/index.html b/Client/index.html new file mode 100644 index 0000000..0c589ec --- /dev/null +++ b/Client/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/Client/package-lock.json b/Client/package-lock.json new file mode 100644 index 0000000..bb14a12 --- /dev/null +++ b/Client/package-lock.json @@ -0,0 +1,4984 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "axios": "^1.6.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", + "toastify-js": "^1.12.0" + }, + "devDependencies": { + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.18", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "vite": "^5.1.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "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==", + "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.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "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==", + "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" + }, + "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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@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/@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.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "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/@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/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.7.tgz", + "integrity": "sha512-I7a9sUxB+z+UCf6KudqrQH/RgLal/S+E+t4uBdbggycLyJe7WvBgPrQlcN5UpEuD9YC2PJ0CN6kgD6ARStg+pg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.7", + "@swc/core-darwin-x64": "1.4.7", + "@swc/core-linux-arm-gnueabihf": "1.4.7", + "@swc/core-linux-arm64-gnu": "1.4.7", + "@swc/core-linux-arm64-musl": "1.4.7", + "@swc/core-linux-x64-gnu": "1.4.7", + "@swc/core-linux-x64-musl": "1.4.7", + "@swc/core-win32-arm64-msvc": "1.4.7", + "@swc/core-win32-ia32-msvc": "1.4.7", + "@swc/core-win32-x64-msvc": "1.4.7" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.7.tgz", + "integrity": "sha512-IhfP2Mrrh9WcdlBJQbPNBhfdOhW/SC910SiuzvxaLgJmzq1tw6TVDNUz4Zf85TbK5uzgR0emtPc9hTGxynl57A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.7.tgz", + "integrity": "sha512-MO01pnxJDS6st5IiqyTnAOz9kpAPP/O4lzEUH9E80XdXBzwptS5hNTM0egBlqueWDFrPM26RI81JLtyTU7kR8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.7.tgz", + "integrity": "sha512-+cDaXW6PZqGhXIq9C4xE+/QuyUsLkXf8d8uSXep+rZYDl4YHS9Fi7HpZQnqLX6al/iVhwe3VnxHMGw50gxcr/g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.7.tgz", + "integrity": "sha512-RNnVHRKhEtA3pM34wgb3Vumf5M6/XlWzFdkHEMZIkOKyNSUhZiv8X3tsEK+n1rZQWIDkvlw4YyHtB8vK18WdCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.7.tgz", + "integrity": "sha512-p7Xm4Pib02d1SFS9XXMoOcCTDIkFWMspspptPX00VcjAdZYnXWujWGuD2W+KN1gq5syHB1g3TsYs9LP2dGsKqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.7.tgz", + "integrity": "sha512-ViI5jy03cFYPETsye1J+oPbHE4v8oIDN34qebzvgHUlNKOXfc1ig0Zha5oQnKp3zj1rmjcSLIMqK++WR021G5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.7.tgz", + "integrity": "sha512-Nf3Axcx/ILl7XE44eidNNPF39rg/KIeqg2545vrOXJG02iu7pEjZuu8wm6w+23BpP4COjZJymlg9LzPT1ZBD5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.7.tgz", + "integrity": "sha512-MFkJEaC59AO2HpndmHhCkaj8NJus5etjMtBphOe9em7jmmfdQ7mLenKHbZ/CspHNl8yNPO9Qzpa/at2838x+RQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.7.tgz", + "integrity": "sha512-nwrfERocUei9sxqd6URrWcEC3KDcTBD+beMerB9idvuzy4rcm5k1O1ClUlZ9pJOZn+vMN1tqZjLze4hJMT9STQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.7.tgz", + "integrity": "sha512-d5T8Z/axAml8FTA+T9RS2mwJDNIbSSz5jcEiWaGuKVDIoSZib2HpMvnMydOGsIrmjfS1Z4ZhdAawivPhAZ3M8Q==", + "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.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "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.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.65", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.65.tgz", + "integrity": "sha512-98TsY0aW4jqx/3RqsUXwMDZSWR1Z4CUlJNue8ueS2/wcxZOsz4xmW1X8ieaWVRHcmmQM3R8xVA4XWB3dJnWwDQ==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.22.tgz", + "integrity": "sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, + "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.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.107" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "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/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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "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/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "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.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.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.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "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/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "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/autoprefixer": { + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "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/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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/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/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/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/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "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/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.704", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.704.tgz", + "integrity": "sha512-OK01+86Qvby1V6cTiowVbhp25aX4DLZnwar+NocAOXdzKAByd+jq5156bmo4kHwevWMknznW18Y/Svfk2dU91A==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "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", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.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.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "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.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "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.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "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.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.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.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "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.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", + "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", + "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.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "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/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-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "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/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "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/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "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/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==", + "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.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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/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/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==", + "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-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.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "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-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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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": { + "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-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-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/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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-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/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/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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": "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/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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-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/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/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "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.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "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/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "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/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "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.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "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-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "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/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==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "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.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "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-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.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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==", + "dev": true + }, + "node_modules/string-width/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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "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-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==", + "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/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/tailwindcss": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "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/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/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/toastify-js": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/toastify-js/-/toastify-js-1.12.0.tgz", + "integrity": "sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "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/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "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.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.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/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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "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/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==", + "dev": true, + "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/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==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "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..c4857f7 --- /dev/null +++ b/Client/package.json @@ -0,0 +1,32 @@ +{ + "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": { + "axios": "^1.6.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.3", + "toastify-js": "^1.12.0" + }, + "devDependencies": { + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.18", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "postcss": "^8.4.35", + "tailwindcss": "^3.4.1", + "vite": "^5.1.6" + } +} diff --git a/Client/postcss.config.js b/Client/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/Client/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} 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.css b/Client/src/App.css new file mode 100644 index 0000000..3fb3548 --- /dev/null +++ b/Client/src/App.css @@ -0,0 +1,42 @@ +/* #root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} */ diff --git a/Client/src/App.jsx b/Client/src/App.jsx new file mode 100644 index 0000000..4564dd2 --- /dev/null +++ b/Client/src/App.jsx @@ -0,0 +1,23 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' + + +function App() { + + return ( + <> + +

Vite + React

+ + ) +} + +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/index.css b/Client/src/index.css new file mode 100644 index 0000000..53739ca --- /dev/null +++ b/Client/src/index.css @@ -0,0 +1,74 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + + + +/* :root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} */ diff --git a/Client/src/main.jsx b/Client/src/main.jsx new file mode 100644 index 0000000..54b39dd --- /dev/null +++ b/Client/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/Client/src/utils/axios.js b/Client/src/utils/axios.js new file mode 100644 index 0000000..f7ed308 --- /dev/null +++ b/Client/src/utils/axios.js @@ -0,0 +1,7 @@ +import axios from "axios"; + +const instance = axios.create({ + baseURL: "http://localhost:3000", +}) + +export default instance \ No newline at end of file diff --git a/Client/src/utils/toast.js b/Client/src/utils/toast.js new file mode 100644 index 0000000..623917d --- /dev/null +++ b/Client/src/utils/toast.js @@ -0,0 +1,17 @@ +import Toastify from 'toastify-js'; + +export default function showToast(message ) { + Toastify({ + text: message, + duration: 3000, + close: true, + gravity: "top", + position: "right", + stopOnFocus: true, + style: { + background: + "linear-gradient(90deg, rgba(237,113,148,1) 0%, rgba(217,8,73,1) 35%, rgba(93,4,6,1) 100%)", + }, + onClick: function () {}, + }).showToast(); +} \ No newline at end of file diff --git a/Client/tailwind.config.js b/Client/tailwind.config.js new file mode 100644 index 0000000..d37737f --- /dev/null +++ b/Client/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/Client/vite.config.js b/Client/vite.config.js new file mode 100644 index 0000000..861b04b --- /dev/null +++ b/Client/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 2a9480b593aac1e220ad875ab16ebe08f2bb1f42 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 13:14:47 +0700 Subject: [PATCH 16/36] feat:register --- Client/src/components/Button.jsx | 13 ++++ Client/src/components/Register.jsx | 112 +++++++++++++++++++++++++++++ Client/src/utils/axios.js | 4 +- 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 Client/src/components/Button.jsx create mode 100644 Client/src/components/Register.jsx diff --git a/Client/src/components/Button.jsx b/Client/src/components/Button.jsx new file mode 100644 index 0000000..f9d2953 --- /dev/null +++ b/Client/src/components/Button.jsx @@ -0,0 +1,13 @@ + +// eslint-disable-next-line react/prop-types +export default function Button ({name, onClick, buttonClass, buttonType}){ + return( + + ) +} \ No newline at end of file diff --git a/Client/src/components/Register.jsx b/Client/src/components/Register.jsx new file mode 100644 index 0000000..76f73ef --- /dev/null +++ b/Client/src/components/Register.jsx @@ -0,0 +1,112 @@ +import Button from "./Button"; +import { useNavigate } from "react-router-dom"; +import { useState } from "react"; +import serverRequest from "../utils/axios"; +import Toastify from "../utils/toast"; +export default function Register(){ + const navigate = useNavigate() + const [userData,setUserData] = useState({ + username: "", + email: "", + password: "", + }) + + const onHandleRegister = async (e) =>{ + e.preventDefault() + try { + let { data } = await serverRequest({ + method: "POST", + url: "/register", + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + data: userData + }) + navigate("/login") + Toastify(`Successfully register ${data.username}`, "success") + } catch (error) { + Toastify(error.response?.data?.message || error.message, "error") + } + } + + const onChangeRegister = (e) =>{ + const key = e.target.name + const value = e.target.value + setUserData({...userData,[key]:value}) + } + + return( +
+
+
+
+
+

Register User

+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+ +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/Client/src/utils/axios.js b/Client/src/utils/axios.js index f7ed308..243eca2 100644 --- a/Client/src/utils/axios.js +++ b/Client/src/utils/axios.js @@ -1,7 +1,7 @@ import axios from "axios"; -const instance = axios.create({ +const serverRequest = axios.create({ baseURL: "http://localhost:3000", }) -export default instance \ No newline at end of file +export default serverRequest \ No newline at end of file From b7f512fa45940bab828bb413ebcf9c642c5bf22d Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 13:24:54 +0700 Subject: [PATCH 17/36] feat:errorpage --- Client/src/App.css | 18 ++++++++++++++++ Client/src/App.jsx | 21 +++---------------- Client/src/assets/home.png | Bin 0 -> 1599 bytes Client/src/assets/login.png | Bin 0 -> 1161 bytes Client/src/components/Navbar.jsx | 31 ++++++++++++++++++++++++++++ Client/src/components/Preloader.jsx | 19 +++++++++++++++++ Client/src/layouts/RootLayout.jsx | 7 +++++++ Client/src/routers/index.js | 10 +++++++++ Client/src/views/ErrorPage.jsx | 16 ++++++++++++++ Client/src/views/NotFound.jsx | 13 ++++++++++++ 10 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 Client/src/assets/home.png create mode 100644 Client/src/assets/login.png create mode 100644 Client/src/components/Navbar.jsx create mode 100644 Client/src/components/Preloader.jsx create mode 100644 Client/src/layouts/RootLayout.jsx create mode 100644 Client/src/routers/index.js create mode 100644 Client/src/views/ErrorPage.jsx create mode 100644 Client/src/views/NotFound.jsx diff --git a/Client/src/App.css b/Client/src/App.css index 3fb3548..8440edf 100644 --- a/Client/src/App.css +++ b/Client/src/App.css @@ -40,3 +40,21 @@ .read-the-docs { color: #888; } */ + +#preloader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 9999; + background-color: #fff; + opacity: 0.8; +} + +#preloader .loading { + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); +} \ No newline at end of file diff --git a/Client/src/App.jsx b/Client/src/App.jsx index 4564dd2..5a02494 100644 --- a/Client/src/App.jsx +++ b/Client/src/App.jsx @@ -1,23 +1,8 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' - +import { RouterProvider } from "react-router-dom" +import router from "../src/routers" function App() { - - return ( - <> - -

Vite + React

- - ) + return } export default App diff --git a/Client/src/assets/home.png b/Client/src/assets/home.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2a839be44896853888058a4645f9f4b964c430 GIT binary patch literal 1599 zcmV-F2Eh4=P)4Vcu8@u!Sg{6E93mjGK}y$~NPS-l-Q}ZV0kv>_V>y zke_+aTE$b?dRk5?q`%}z+V8yY`#k64oPH=ui4rABlqgY99($RG9v$KAqc3vH&s~boP+4j zIM>S);Ec22Opx4lk_T4na3#3EJkFRi!MxFvV6HsQsB(&Xl#RrmL8>a^T&{?NXm5&2=>qTnGBN zlCG3};sg%#l`mY@9qdKEsr_z}HU;jnvSJsP`Fk5OPjMYV$uZuukgqyW`<`34P z2wUrPlC=>QrLH!@%t1Z#6sYgRTN~l3F-vEuPG|g3$b1S=CcSk!v#D7NGW&qG`VXru z)Q9ml^m5IugS(d{x6Zhymxs+^>veRu&ULA4&{=Tz-Z`wC0`6YM+&c5A*>jDnY^uy^ z&{<5)o)ItGUkgt!j;1i*91epajh~(iall-6I84>yFqhMHO<^V*d$NCA4Ihn(MR6v&w_b8p&pj1*vQ9;ZILE_rFX_ z2(L%un&H{Ql1E$lNfQrG57!OP+uq6N*Xp%s3E^!EakVW3t=%lOh8RD#!n@fTLT?K( zD|Kxl7Ft6jWkd4z53{8$#8_*Hc_TxJKgG+usq$KgXKRSXREFu>bve@B!?yMy=i9qM zbTr71?LC?QqkFrlJR0QEvbsyMrmQh$pZ0DhkF4-oNk${OIFEjWWQbaiDfIl%HN$T z91r3!hwyiyb*jwBb-&7@U*&8^M-IE3BjP2V;w>3EyO=(q5;E6GcH_FrUzSbOE)XqW z3kGqhCzwcIQ%~@-s%D-7g(BdmO6}tNWqG~}`2T+jtaKk)(cK9m`5X?jCFp0Y+t0kQ z?q@F8nRyDV50nM`=)q2|r!p@DJ4tG(*JAm7SR(9)l)A%yrqkawKOgk8vrQ>7B$H(O zH}`R-wBrQQ-z^V}`1n220cI&h&Pti(UMvra9;2b(%WqL1zw~tw>-T|3DRR;|C9`CY z`uJ7uCGWwBV<1wB9NTgZw}VJ2a%{_a@(75OBFDCzFFg+;rO2@@=PPX>%DKN4tZ2P* zuF9(|AX4(|&sO>RC~M7Y%^*^W9NTif{v3#uBFDCzrw@ZD*Zxx~_l-4i=5!O&=~)?) zYfZc*wd<90Ro*xRA|*%OXyihO~nMM#PIr3H`)6)NDBkt8|vJ1R>D)Qr x_~l)&nPhnbe%J|{NjX0WB}$YiQ9{|g`~%T6vpYy5HhusA002ovPDHLkV1nKjCEx%6 literal 0 HcmV?d00001 diff --git a/Client/src/assets/login.png b/Client/src/assets/login.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff506904a62821c792f0b94e502221e14ca917a GIT binary patch literal 1161 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Se- zr;B4q#hkaZZs&`nN*vqIt@4lC%gf_NUU~S%1r@7qFLrs8xX?7$Wp%`q*eVBMpDAWB zYc5>Mg_!Kg68r&Cs^+UylRc{-23wC`8~PpTrW@Obz67G zfAg$6Y4iTfp7Yk5cTc`~QetwjpXJjj!G8Z|ezH@ZQr?jgr~UtlEK~TzGhu3G+k;o~3U9L0saTXcRP55Uf&kI`O)Ds zN8AsnzB}e_F(>A!`hypzw>yGlPR}~l_Hg16NiUvP;*RdQ)=^lu*pU(~X z?H>1R<>IGbrf2Kt zs}}y%G5>F|d7r)WT-7t4_Le_{kBaDi(|=aB>!)P+8V;7T_GSMS?)v$+zf*|Kd%8TN zUH~YxZV{u|H`bT$_>HcMKPju9pto}8)cHZo`H*C^J--2*oXXcXgXxpu-~{rlJsgs} zmdk=u#^=x8V7j=+xvfhDM9FOOkjG>Z8mWFaz5Yq;KxCR&3FfwZi(RjusvHn;mYwNEBN((Wfbd% z%wJktDfT^Xn%|EVa@q}s`rMrQx#!Fe`u0BEtod+pY}$lKp`Rf;tsE|SKVKp~Pr%B@ z%;fFDs$++LoC$lDZu3CPd*x~53oKh0JYD@<);T3K F0RZoOICKC2 literal 0 HcmV?d00001 diff --git a/Client/src/components/Navbar.jsx b/Client/src/components/Navbar.jsx new file mode 100644 index 0000000..5e7ea7c --- /dev/null +++ b/Client/src/components/Navbar.jsx @@ -0,0 +1,31 @@ +import { Link, useNavigate } from "react-router-dom" +import Button from "./Button" +import home from "../assets/home.png" +import login from "../assets/login.png" +export default function Navbar() { + const navigate = useNavigate(); + return ( + <> +
+
+
+
+
+
+
+
+ + ) +} \ No newline at end of file diff --git a/Client/src/components/Preloader.jsx b/Client/src/components/Preloader.jsx new file mode 100644 index 0000000..fccfda4 --- /dev/null +++ b/Client/src/components/Preloader.jsx @@ -0,0 +1,19 @@ +import "../../src/App.css" +export default function Preloader() { + return ( + <> +
+
+ +
+
+ + ) +} \ No newline at end of file diff --git a/Client/src/layouts/RootLayout.jsx b/Client/src/layouts/RootLayout.jsx new file mode 100644 index 0000000..2d1ad34 --- /dev/null +++ b/Client/src/layouts/RootLayout.jsx @@ -0,0 +1,7 @@ +export default function RootLayout() { + return ( + <> + + + ) +} \ No newline at end of file diff --git a/Client/src/routers/index.js b/Client/src/routers/index.js new file mode 100644 index 0000000..1737b45 --- /dev/null +++ b/Client/src/routers/index.js @@ -0,0 +1,10 @@ +const { createBrowserRouter } = require("react-router-dom"); +const { default: RootLayout } = require("../layouts/RootLayout"); + +const router = createBrowserRouter([ + { + path: "/", + element: , + errorElement + } +]) \ No newline at end of file diff --git a/Client/src/views/ErrorPage.jsx b/Client/src/views/ErrorPage.jsx new file mode 100644 index 0000000..17cb2e0 --- /dev/null +++ b/Client/src/views/ErrorPage.jsx @@ -0,0 +1,16 @@ +import { useRouteError } from "react-router-dom"; + +export default function ErrorPage() { + const error = useRouteError(); + console.error(error); + + return ( +
+

Oops!

+

Sorry, an unexpected error has occurred.

+

+ {error.statusText || error.message} +

+
+ ); +} \ No newline at end of file diff --git a/Client/src/views/NotFound.jsx b/Client/src/views/NotFound.jsx new file mode 100644 index 0000000..4add71b --- /dev/null +++ b/Client/src/views/NotFound.jsx @@ -0,0 +1,13 @@ +import { useRouteError } from "react-router-dom"; + +export default function ErrorPage() { + const error = useRouteError(); + console.error(error); + + return ( +
+

Oops!

+

404 : Page Not Found

+
+ ); +} \ No newline at end of file From 5dcf087eb5314e865fc52e8ae86f6c90a8992c4f Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 14:52:47 +0700 Subject: [PATCH 18/36] fix:data --- Client/index.html | 2 +- Client/src/components/MainContent.jsx | 45 +++++++++++++++++++++++++++ Client/src/components/ProductCard.jsx | 29 +++++++++++++++++ Client/src/components/Register.jsx | 1 + Client/src/layouts/RootLayout.jsx | 8 ++++- Client/src/routers/index.js | 35 +++++++++++++++++---- Client/src/views/PublicPage.jsx | 7 +++++ Client/src/views/RegisterPage.jsx | 11 +++++++ 8 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 Client/src/components/MainContent.jsx create mode 100644 Client/src/components/ProductCard.jsx create mode 100644 Client/src/views/PublicPage.jsx create mode 100644 Client/src/views/RegisterPage.jsx diff --git a/Client/index.html b/Client/index.html index 0c589ec..9e5487f 100644 --- a/Client/index.html +++ b/Client/index.html @@ -4,7 +4,7 @@ - Vite + React + MedShop
diff --git a/Client/src/components/MainContent.jsx b/Client/src/components/MainContent.jsx new file mode 100644 index 0000000..da22c30 --- /dev/null +++ b/Client/src/components/MainContent.jsx @@ -0,0 +1,45 @@ +import { useEffect, useState } from "react" +import { useNavigate } from "react-router-dom"; +import serverRequest from "../utils/axios"; +import ProductCard from "./ProductCard"; + + + +const Main = () => { + // const navigate = useNavigate(); + const [pubData, setPubData] = useState([]) + const fetchPubData = async () => { + try { + let {data} = await serverRequest({ + url: `/public/products`, + method: "GET" + }) + setPubData(data) + } catch (error) { + console.log(error); + } + } + + useEffect(() => { + fetchPubData() + },[]) + + const products = pubData.map((product,index) => { + return + }) + return ( + <> +
+
+
+ {products} +
+
+
+ + ) +} + +export default Main \ No newline at end of file diff --git a/Client/src/components/ProductCard.jsx b/Client/src/components/ProductCard.jsx new file mode 100644 index 0000000..9b5ac2d --- /dev/null +++ b/Client/src/components/ProductCard.jsx @@ -0,0 +1,29 @@ +import Button from "./Button" + +const ProductCard = ({ name, price, imageUrl, description, usage , updatedAt}) => { + return ( +
+
+ imgUrl +
+
{name}
+

{price}

+
+
+ +
+
+ Last updated {updatedAt} +
+
+
+ ) +} + +export default ProductCard; \ No newline at end of file diff --git a/Client/src/components/Register.jsx b/Client/src/components/Register.jsx index 76f73ef..deb5cb8 100644 --- a/Client/src/components/Register.jsx +++ b/Client/src/components/Register.jsx @@ -3,6 +3,7 @@ import { useNavigate } from "react-router-dom"; import { useState } from "react"; import serverRequest from "../utils/axios"; import Toastify from "../utils/toast"; + export default function Register(){ const navigate = useNavigate() const [userData,setUserData] = useState({ diff --git a/Client/src/layouts/RootLayout.jsx b/Client/src/layouts/RootLayout.jsx index 2d1ad34..13cbc17 100644 --- a/Client/src/layouts/RootLayout.jsx +++ b/Client/src/layouts/RootLayout.jsx @@ -1,7 +1,13 @@ +import { Outlet } from "react-router-dom"; +import Navbar from "../components/Navbar"; + export default function RootLayout() { return ( <> - + +
+ +
) } \ No newline at end of file diff --git a/Client/src/routers/index.js b/Client/src/routers/index.js index 1737b45..d180441 100644 --- a/Client/src/routers/index.js +++ b/Client/src/routers/index.js @@ -1,10 +1,33 @@ -const { createBrowserRouter } = require("react-router-dom"); -const { default: RootLayout } = require("../layouts/RootLayout"); +import { createBrowserRouter, redirect } from "react-router-dom"; +import RootLayout from "../layouts/RootLayout"; +import ErrorPage from "../views/ErrorPage"; +import RegisterPage from "../views/RegisterPage"; +import Public from "../views/PublicPage"; const router = createBrowserRouter([ { - path: "/", - element: , - errorElement + path: "/public", + element: + // loader: () => { + // if (localStorage.token) { + // return redirect("/products") + // } else { + // return null + // } + // }, + // children: [ + // { + // index:true, + // loader: () => { + // return redirect("/public") + // }, + // }, + // { + // path: "/public", + // element: + // } + // ] } -]) \ No newline at end of file +]) + +export default router; \ No newline at end of file diff --git a/Client/src/views/PublicPage.jsx b/Client/src/views/PublicPage.jsx new file mode 100644 index 0000000..5fdde30 --- /dev/null +++ b/Client/src/views/PublicPage.jsx @@ -0,0 +1,7 @@ +import Main from "../components/MainContent"; + +export default function Public(){ + return ( +
+ ) +} \ No newline at end of file diff --git a/Client/src/views/RegisterPage.jsx b/Client/src/views/RegisterPage.jsx new file mode 100644 index 0000000..a8d995b --- /dev/null +++ b/Client/src/views/RegisterPage.jsx @@ -0,0 +1,11 @@ +import Preloader from "../components/Preloader"; +import Register from "../components/Register"; + +export default function RegisterPage() { + return ( + <> + + + + ) +} \ No newline at end of file From ead0b1918852ed7d691153c119e8e3763f97ecac Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 15:09:58 +0700 Subject: [PATCH 19/36] refactor:package --- Server/config/config.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Server/config/config.json b/Server/config/config.json index 42d8bc1..76ff8f9 100644 --- a/Server/config/config.json +++ b/Server/config/config.json @@ -11,13 +11,10 @@ "password": "postgres", "database": "ApotikDB_test", "host": "localhost", - "dialect": "postgres" + "dialect": "postgres", + "logging": false }, "production": { - "username": "root", - "password": null, - "database": "database_production", - "host": "127.0.0.1", - "dialect": "mysql" + "use_env_variable": "DATABASE_URL" } } From 9c21e5939e47e576d068bc960f74feae87219882 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 15:28:00 +0700 Subject: [PATCH 20/36] feat:bin --- Server/app.js | 6 +++--- Server/bin/www | 6 ++++++ Server/package.json | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 Server/bin/www diff --git a/Server/app.js b/Server/app.js index c556889..59b3f6c 100644 --- a/Server/app.js +++ b/Server/app.js @@ -19,9 +19,9 @@ if(process.env.NODE_ENV !== 'production'){ //errorHandler app.use(errorHandler) - app.listen(PORT, () => { - console.log(`Listening on PORT ${PORT}`); - }); + // app.listen(PORT, () => { + // console.log(`Listening on PORT ${PORT}`); + // }); module.exports = app diff --git a/Server/bin/www b/Server/bin/www new file mode 100644 index 0000000..8bec753 --- /dev/null +++ b/Server/bin/www @@ -0,0 +1,6 @@ +const app = require("../app") +const PORT = process.env.PORT || 3000; + +app.listen(PORT, ()=> { + console.log(`Is Running on port ${PORT}`); +}) \ No newline at end of file diff --git a/Server/package.json b/Server/package.json index cd2186d..f490697 100644 --- a/Server/package.json +++ b/Server/package.json @@ -17,7 +17,9 @@ "version": "1.0.0", "main": "app.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest --detectOpenHandles --forceExit --runInBand", + "start": "node bin/www", + "dev": "nodemon bin/www" }, "keywords": [], "author": "", From de1c382f178539ab11f94ece95bea07883ce370e Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 21:35:03 +0700 Subject: [PATCH 21/36] feat:router --- Client/index.html | 17 ++- Client/package-lock.json | 25 ++++ Client/package.json | 1 + Client/src/App.jsx | 6 +- Client/src/assets/IDEA_logo.svg | 35 ++++++ Client/src/assets/login.png | Bin 1161 -> 325914 bytes Client/src/assets/logo.jpg | Bin 0 -> 18383 bytes Client/src/assets/medical.png | Bin 0 -> 11589 bytes Client/src/components/Login.jsx | 125 ++++++++++++++++++++ Client/src/components/MainContent.jsx | 14 ++- Client/src/components/Navbar.jsx | 65 ++++++---- Client/src/components/ProductCard.jsx | 60 ++++++---- Client/src/components/ProductDetailCard.jsx | 40 +++++++ Client/src/main.jsx | 6 +- Client/src/routers/index.js | 33 ------ Client/src/routers/index.jsx | 66 +++++++++++ Client/src/utils/axios.js | 2 +- Client/src/views/AuthenticationPage.jsx | 9 ++ Client/src/views/PublicDetailPage.jsx | 11 ++ Client/src/views/PublicPage.jsx | 4 + 20 files changed, 427 insertions(+), 92 deletions(-) create mode 100644 Client/src/assets/IDEA_logo.svg create mode 100644 Client/src/assets/logo.jpg create mode 100644 Client/src/assets/medical.png create mode 100644 Client/src/components/Login.jsx create mode 100644 Client/src/components/ProductDetailCard.jsx delete mode 100644 Client/src/routers/index.js create mode 100644 Client/src/routers/index.jsx create mode 100644 Client/src/views/AuthenticationPage.jsx create mode 100644 Client/src/views/PublicDetailPage.jsx diff --git a/Client/index.html b/Client/index.html index 9e5487f..2e2524f 100644 --- a/Client/index.html +++ b/Client/index.html @@ -2,12 +2,27 @@ - + + + MedShop
+ + + diff --git a/Client/package-lock.json b/Client/package-lock.json index bb14a12..0a6ece1 100644 --- a/Client/package-lock.json +++ b/Client/package-lock.json @@ -8,6 +8,7 @@ "name": "client", "version": "0.0.0", "dependencies": { + "@tabler/icons-react": "^3.0.3", "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -1030,6 +1031,30 @@ "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", "dev": true }, + "node_modules/@tabler/icons": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.0.3.tgz", + "integrity": "sha512-jcumpc/BqyAitWVzgZ0GgDmA915h4RbWIALcSEWbzdxEZRSMmuJdUPEoPZayUd57x374viFSCkwk0CMuMQFeJw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.0.3.tgz", + "integrity": "sha512-3YUafkLCmdJ0Nr/2vWO8++nWhLe1OeAka0lGr9rvZIoaUMwPyNGQJFPe/zYUyICOANqMnKpovUSeHNEyizk6Mw==", + "dependencies": { + "@tabler/icons": "3.0.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", diff --git a/Client/package.json b/Client/package.json index c4857f7..edbc03f 100644 --- a/Client/package.json +++ b/Client/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@tabler/icons-react": "^3.0.3", "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/Client/src/App.jsx b/Client/src/App.jsx index 5a02494..81a8652 100644 --- a/Client/src/App.jsx +++ b/Client/src/App.jsx @@ -1,8 +1,10 @@ import { RouterProvider } from "react-router-dom" -import router from "../src/routers" +import router from "./routers/index" function App() { - return + return ( + + ) } export default App diff --git a/Client/src/assets/IDEA_logo.svg b/Client/src/assets/IDEA_logo.svg new file mode 100644 index 0000000..cc25574 --- /dev/null +++ b/Client/src/assets/IDEA_logo.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Client/src/assets/login.png b/Client/src/assets/login.png index 5ff506904a62821c792f0b94e502221e14ca917a..b819dccbe6b3d0241c36ee2bda7553232828d909 100644 GIT binary patch literal 325914 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

rJTGQe65LdL2ybMUy-Nw9ZFS1&>NA_) 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 E1wJWB`Tzg` literal 1161 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Se- zr;B4q#hkaZZs&`nN*vqIt@4lC%gf_NUU~S%1r@7qFLrs8xX?7$Wp%`q*eVBMpDAWB zYc5>Mg_!Kg68r&Cs^+UylRc{-23wC`8~PpTrW@Obz67G zfAg$6Y4iTfp7Yk5cTc`~QetwjpXJjj!G8Z|ezH@ZQr?jgr~UtlEK~TzGhu3G+k;o~3U9L0saTXcRP55Uf&kI`O)Ds zN8AsnzB}e_F(>A!`hypzw>yGlPR}~l_Hg16NiUvP;*RdQ)=^lu*pU(~X z?H>1R<>IGbrf2Kt zs}}y%G5>F|d7r)WT-7t4_Le_{kBaDi(|=aB>!)P+8V;7T_GSMS?)v$+zf*|Kd%8TN zUH~YxZV{u|H`bT$_>HcMKPju9pto}8)cHZo`H*C^J--2*oXXcXgXxpu-~{rlJsgs} zmdk=u#^=x8V7j=+xvfhDM9FOOkjG>Z8mWFaz5Yq;KxCR&3FfwZi(RjusvHn;mYwNEBN((Wfbd% z%wJktDfT^Xn%|EVa@q}s`rMrQx#!Fe`u0BEtod+pY}$lKp`Rf;tsE|SKVKp~Pr%B@ z%;fFDs$++LoC$lDZu3CPd*x~53oKh0JYD@<);T3K F0RZoOICKC2 diff --git a/Client/src/assets/logo.jpg b/Client/src/assets/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46b201de554e32733fec90a496a1fa054e0cbc49 GIT binary patch literal 18383 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 Up7}1VqZmpFAZXoaz5V>Z0DW+50ssI2 literal 0 HcmV?d00001 diff --git a/Client/src/assets/medical.png b/Client/src/assets/medical.png new file mode 100644 index 0000000000000000000000000000000000000000..effe77d89f1c3fec3dc7e5bd2feecaa60f8bd5a0 GIT binary patch literal 11589 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 IM!!wHe9v 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 { + const key = event.target.name; + const value = event.target.value; + + setUserData({ + ...userData, + [key]: value + }) +} +const handleSubmit = async (event) => { + event.preventDefault(); + + try { + let { data } = await serverRequest({ + url: "/login", + method: "POST", + data: userData, + }); + localStorage.setItem("token", data.access_token); + navigate("/owner"); + } catch (error) { + console.log(error) + toast(error.response?.data?.message || error.message, "error") + } +} + return ( +

+
+
+

Login Options

+ + Log in with your personal data, or signup to enjoy all the benefits + +
+
+
+
+ career_portal +
+
+
+
+

Log in to your account

+ Log in on your profile +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+
+ +
+
+
+
+
+
+
+ ) + } diff --git a/Client/src/components/MainContent.jsx b/Client/src/components/MainContent.jsx index da22c30..d85ca7b 100644 --- a/Client/src/components/MainContent.jsx +++ b/Client/src/components/MainContent.jsx @@ -6,7 +6,7 @@ import ProductCard from "./ProductCard"; const Main = () => { - // const navigate = useNavigate(); + const navigate = useNavigate(); const [pubData, setPubData] = useState([]) const fetchPubData = async () => { try { @@ -20,6 +20,10 @@ const Main = () => { } } + const handleOnDetail = (id) => { + navigate(`/publicDetail/${id}`) + } + useEffect(() => { fetchPubData() },[]) @@ -27,17 +31,19 @@ const Main = () => { const products = pubData.map((product,index) => { return + updatedAt={product.updatedAt} handleOnDetail={() => handleOnDetail(product.id)}/> }) return ( <> -
-
+
+
{products}
+ + ) } diff --git a/Client/src/components/Navbar.jsx b/Client/src/components/Navbar.jsx index 5e7ea7c..6a9eea0 100644 --- a/Client/src/components/Navbar.jsx +++ b/Client/src/components/Navbar.jsx @@ -1,31 +1,50 @@ -import { Link, useNavigate } from "react-router-dom" -import Button from "./Button" -import home from "../assets/home.png" -import login from "../assets/login.png" +import { Link, useNavigate } from "react-router-dom"; +import Button from "./Button"; +import logo from "../assets/logo.jpg"; +import login from "../assets/login.png"; +import medical from "../assets/medical.png"; + export default function Navbar() { const navigate = useNavigate(); return ( - <> -
-
-
+
+ +
- - ) -} \ No newline at end of file + + ); +} diff --git a/Client/src/components/ProductCard.jsx b/Client/src/components/ProductCard.jsx index 9b5ac2d..40aa53c 100644 --- a/Client/src/components/ProductCard.jsx +++ b/Client/src/components/ProductCard.jsx @@ -1,29 +1,39 @@ -import Button from "./Button" +import { Link } from "react-router-dom"; +import Button from "./Button"; -const ProductCard = ({ name, price, imageUrl, description, usage , updatedAt}) => { - return ( -
-
- imgUrl -
-
{name}
-

{price}

-
-
- -
-
- Last updated {updatedAt} -
+const ProductCard = ({ id, name, price, imageUrl, description, usage, updatedAt, handleOnDetail }) => { + const handleClick = () => { + handleOnDetail(id); + }; + + return ( +
+
+ + Product + +
+
{name}
+

{price}

+
+
+ Last updated {updatedAt}
- ) -} +
+
+ ); +}; -export default ProductCard; \ No newline at end of file +export default ProductCard; diff --git a/Client/src/components/ProductDetailCard.jsx b/Client/src/components/ProductDetailCard.jsx new file mode 100644 index 0000000..7042c20 --- /dev/null +++ b/Client/src/components/ProductDetailCard.jsx @@ -0,0 +1,40 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; + +export default function ProductDetail() { + const [data, setData] = useState([]); + let { id } = useParams(); + + useEffect(() => { + const fetchData = async () => { + try { + let { data } = await axios.get(`https://medshop.carloshakim.online/public/products/${id}`); + setData(data); + } catch (error) { + console.log(error); + } + }; + fetchData(); + }, []); + + return ( +
+
+ Product +
+
{data.name}
+

{data.price}

+

{data.usage}

+

{data.description}

+ +
+
+ Last updated {data.updatedAt} +
+
+
+ ); +} diff --git a/Client/src/main.jsx b/Client/src/main.jsx index 54b39dd..3658acf 100644 --- a/Client/src/main.jsx +++ b/Client/src/main.jsx @@ -1,10 +1,10 @@ -import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.jsx' import './index.css' +import "toastify-js" ReactDOM.createRoot(document.getElementById('root')).render( - + // - , + // , ) diff --git a/Client/src/routers/index.js b/Client/src/routers/index.js deleted file mode 100644 index d180441..0000000 --- a/Client/src/routers/index.js +++ /dev/null @@ -1,33 +0,0 @@ -import { createBrowserRouter, redirect } from "react-router-dom"; -import RootLayout from "../layouts/RootLayout"; -import ErrorPage from "../views/ErrorPage"; -import RegisterPage from "../views/RegisterPage"; -import Public from "../views/PublicPage"; - -const router = createBrowserRouter([ - { - path: "/public", - element: - // loader: () => { - // if (localStorage.token) { - // return redirect("/products") - // } else { - // return null - // } - // }, - // children: [ - // { - // index:true, - // loader: () => { - // return redirect("/public") - // }, - // }, - // { - // path: "/public", - // element: - // } - // ] - } -]) - -export default router; \ No newline at end of file diff --git a/Client/src/routers/index.jsx b/Client/src/routers/index.jsx new file mode 100644 index 0000000..32f7c7a --- /dev/null +++ b/Client/src/routers/index.jsx @@ -0,0 +1,66 @@ +import { createBrowserRouter, redirect } from "react-router-dom"; +import RootLayout from "../layouts/RootLayout"; +import ErrorPage from "../views/ErrorPage"; +import RegisterPage from "../views/RegisterPage"; +import Public from "../views/PublicPage"; +import Authentication from "../views/AuthenticationPage"; +import PublicDetailPage from "../views/PublicDetailPage"; +import AuthenticationPage from "../views/AuthenticationPage"; + + +const router = createBrowserRouter([ + { + path: "/", + element: , + errorElement: , + loader: () => { + if (localStorage.token) { + return redirect("/products") + } else { + return null + } + }, + children: [ + { + index:true, + loader: () => { + return redirect("/public") + }, + }, + { + path: "/public", + element: + }, + { + path: "/publicDetail/:id", + element: + } + ], + }, + { + path: "/products", + element: , + loader:() => { + if (localStorage.token) { + return null + } else { + return redirect("/") + } + }, + children: [ + { + index:true, + loader: () => { + return redirect("/public/products") + } + }, + { + path: "products", + element: + } + ] + } + +]); + +export default router; \ No newline at end of file diff --git a/Client/src/utils/axios.js b/Client/src/utils/axios.js index 243eca2..ae23ca0 100644 --- a/Client/src/utils/axios.js +++ b/Client/src/utils/axios.js @@ -1,7 +1,7 @@ import axios from "axios"; const serverRequest = axios.create({ - baseURL: "http://localhost:3000", + baseURL: "https://medshop.carloshakim.online/", }) export default serverRequest \ No newline at end of file diff --git a/Client/src/views/AuthenticationPage.jsx b/Client/src/views/AuthenticationPage.jsx new file mode 100644 index 0000000..595d6f7 --- /dev/null +++ b/Client/src/views/AuthenticationPage.jsx @@ -0,0 +1,9 @@ +import { Outlet } from "react-router-dom"; + +export default function AuthenticationPage(){ + return( + <> + + + ) +} \ No newline at end of file diff --git a/Client/src/views/PublicDetailPage.jsx b/Client/src/views/PublicDetailPage.jsx new file mode 100644 index 0000000..b5483bd --- /dev/null +++ b/Client/src/views/PublicDetailPage.jsx @@ -0,0 +1,11 @@ +import Navbar from "../components/Navbar"; +import ProductDetail from "../components/ProductDetailCard"; + +export default function PublicDetailPage(){ + return ( + <> + + + + ) +} \ No newline at end of file diff --git a/Client/src/views/PublicPage.jsx b/Client/src/views/PublicPage.jsx index 5fdde30..0f6db79 100644 --- a/Client/src/views/PublicPage.jsx +++ b/Client/src/views/PublicPage.jsx @@ -1,7 +1,11 @@ import Main from "../components/MainContent"; +import Navbar from "../components/Navbar"; export default function Public(){ return ( + <> +
+ ) } \ No newline at end of file From 5eef3d5b8d4464a23721bcecca76fc850e14e2ff Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 22:15:54 +0700 Subject: [PATCH 22/36] fix:client --- Client/src/components/Navbar.jsx | 2 +- Client/src/components/ProductCard.jsx | 8 ++--- Client/src/components/ProductDetailCard.jsx | 14 +++++--- Client/src/routers/index.jsx | 39 +-------------------- Client/src/views/PublicDetailPage.jsx | 2 -- Client/src/views/PublicPage.jsx | 2 -- Server/app.js | 4 +-- 7 files changed, 16 insertions(+), 55 deletions(-) diff --git a/Client/src/components/Navbar.jsx b/Client/src/components/Navbar.jsx index 6a9eea0..5f9d61b 100644 --- a/Client/src/components/Navbar.jsx +++ b/Client/src/components/Navbar.jsx @@ -2,7 +2,7 @@ import { Link, useNavigate } from "react-router-dom"; import Button from "./Button"; import logo from "../assets/logo.jpg"; import login from "../assets/login.png"; -import medical from "../assets/medical.png"; + export default function Navbar() { const navigate = useNavigate(); diff --git a/Client/src/components/ProductCard.jsx b/Client/src/components/ProductCard.jsx index 40aa53c..2cea7f4 100644 --- a/Client/src/components/ProductCard.jsx +++ b/Client/src/components/ProductCard.jsx @@ -2,9 +2,9 @@ import { Link } from "react-router-dom"; import Button from "./Button"; const ProductCard = ({ id, name, price, imageUrl, description, usage, updatedAt, handleOnDetail }) => { - const handleClick = () => { - handleOnDetail(id); - }; +// const handleClick = () => { +// handleOnDetail(id); +// }; return (
@@ -14,7 +14,7 @@ const ProductCard = ({ id, name, price, imageUrl, description, usage, updatedAt, src={imageUrl} className="w-full h-48 object-cover cursor-pointer" alt="Product" - onClick={handleClick} + // onClick={handleClick} />
diff --git a/Client/src/components/ProductDetailCard.jsx b/Client/src/components/ProductDetailCard.jsx index 7042c20..77ff0ef 100644 --- a/Client/src/components/ProductDetailCard.jsx +++ b/Client/src/components/ProductDetailCard.jsx @@ -1,16 +1,20 @@ -import axios from "axios"; import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; +import serverRequest from "../utils/axios"; export default function ProductDetail() { const [data, setData] = useState([]); - let { id } = useParams(); - + let {id} = useParams(); + console.log(id); useEffect(() => { const fetchData = async () => { try { - let { data } = await axios.get(`https://medshop.carloshakim.online/public/products/${id}`); - setData(data); + let { pubData } = await serverRequest({ + url: `/public/products/${id}`, + method: "GET", + }) + console.log(pubData); + setData(pubData) } catch (error) { console.log(error); } diff --git a/Client/src/routers/index.jsx b/Client/src/routers/index.jsx index 32f7c7a..95febc1 100644 --- a/Client/src/routers/index.jsx +++ b/Client/src/routers/index.jsx @@ -13,54 +13,17 @@ const router = createBrowserRouter([ path: "/", element: , errorElement: , - loader: () => { - if (localStorage.token) { - return redirect("/products") - } else { - return null - } - }, children: [ { - index:true, - loader: () => { - return redirect("/public") - }, - }, - { - path: "/public", + path: "/", element: }, { path: "/publicDetail/:id", element: } - ], - }, - { - path: "/products", - element: , - loader:() => { - if (localStorage.token) { - return null - } else { - return redirect("/") - } - }, - children: [ - { - index:true, - loader: () => { - return redirect("/public/products") - } - }, - { - path: "products", - element: - } ] } - ]); export default router; \ No newline at end of file diff --git a/Client/src/views/PublicDetailPage.jsx b/Client/src/views/PublicDetailPage.jsx index b5483bd..fed0c9e 100644 --- a/Client/src/views/PublicDetailPage.jsx +++ b/Client/src/views/PublicDetailPage.jsx @@ -1,10 +1,8 @@ -import Navbar from "../components/Navbar"; import ProductDetail from "../components/ProductDetailCard"; export default function PublicDetailPage(){ return ( <> - ) diff --git a/Client/src/views/PublicPage.jsx b/Client/src/views/PublicPage.jsx index 0f6db79..78e8e8c 100644 --- a/Client/src/views/PublicPage.jsx +++ b/Client/src/views/PublicPage.jsx @@ -1,10 +1,8 @@ import Main from "../components/MainContent"; -import Navbar from "../components/Navbar"; export default function Public(){ return ( <> -
) diff --git a/Server/app.js b/Server/app.js index 59b3f6c..6c0c6f7 100644 --- a/Server/app.js +++ b/Server/app.js @@ -1,5 +1,4 @@ if(process.env.NODE_ENV !== 'production'){ - require("dotenv").config(); } @@ -8,14 +7,13 @@ if(process.env.NODE_ENV !== 'production'){ const errorHandler = require("./middlewares/errorHandler"); const app = express(); - const PORT = process.env.PORT || 3000; const router = require("./router") const cors = require("cors") app.use(express.urlencoded({ extended: true })); app.use(express.json()); - app.use(router) app.use(cors()) + app.use(router) //errorHandler app.use(errorHandler) From f9f531b1ccd6f095986b6ba79c284dd8e2f0090b Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Thu, 14 Mar 2024 23:43:24 +0700 Subject: [PATCH 23/36] feat:registerlogin --- Client/src/components/Login.jsx | 30 +-- Client/src/components/Navbar.jsx | 4 + Client/src/components/ProductCard.jsx | 18 +- Client/src/components/ProductDetailCard.jsx | 57 +++--- Client/src/components/Register.jsx | 196 ++++++++++---------- Client/src/routers/index.jsx | 26 ++- Client/src/views/AboutUs.jsx | 20 ++ Client/src/views/ContactForm.jsx | 0 Client/src/views/ContactUs.jsx | 55 ++++++ Client/src/views/LoginPage.jsx | 11 ++ 10 files changed, 281 insertions(+), 136 deletions(-) create mode 100644 Client/src/views/AboutUs.jsx create mode 100644 Client/src/views/ContactForm.jsx create mode 100644 Client/src/views/ContactUs.jsx create mode 100644 Client/src/views/LoginPage.jsx diff --git a/Client/src/components/Login.jsx b/Client/src/components/Login.jsx index 302f51b..60e4473 100644 --- a/Client/src/components/Login.jsx +++ b/Client/src/components/Login.jsx @@ -2,7 +2,8 @@ import { useState } from "react"; import serverRequest from "../utils/axios"; import toast from "../utils/toast" import { useNavigate } from "react-router-dom"; - +import Button from "./Button"; +import { Link } from "react-router-dom"; export default function Login() { const navigate = useNavigate(); const [ userData, setUserData ] = useState({ @@ -29,7 +30,7 @@ const handleSubmit = async (event) => { data: userData, }); localStorage.setItem("token", data.access_token); - navigate("/owner"); + navigate("/public"); } catch (error) { console.log(error) toast(error.response?.data?.message || error.message, "error") @@ -50,15 +51,15 @@ const handleSubmit = async (event) => {
career_portal
-

Log in to your account

+

Log in to your account

Log in on your profile
@@ -108,12 +109,19 @@ const handleSubmit = async (event) => {
- + + +
+

+ Don't Have an Account? Register +

diff --git a/Client/src/components/Navbar.jsx b/Client/src/components/Navbar.jsx index 5f9d61b..d5d612c 100644 --- a/Client/src/components/Navbar.jsx +++ b/Client/src/components/Navbar.jsx @@ -24,6 +24,10 @@ export default function Navbar() {
+ +
Last updated {updatedAt}
+
); }; diff --git a/Client/src/components/ProductDetailCard.jsx b/Client/src/components/ProductDetailCard.jsx index 77ff0ef..14b1602 100644 --- a/Client/src/components/ProductDetailCard.jsx +++ b/Client/src/components/ProductDetailCard.jsx @@ -1,44 +1,55 @@ import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; -import serverRequest from "../utils/axios"; - +import axios from "axios"; +import Button from "./Button"; +import { useNavigate } from "react-router-dom"; export default function ProductDetail() { - const [data, setData] = useState([]); + const [dataProduct, setDataProduct] = useState([]); let {id} = useParams(); - console.log(id); + const navigate = useNavigate(); useEffect(() => { const fetchData = async () => { try { - let { pubData } = await serverRequest({ - url: `/public/products/${id}`, - method: "GET", - }) + let pubData = await axios.get(`https://medshop.carloshakim.online/public/products/${id}`) console.log(pubData); - setData(pubData) + setDataProduct(pubData.data) } catch (error) { console.log(error); } }; fetchData(); }, []); + console.log(id); return ( -
-
- Product -
-
{data.name}
-

{data.price}

-

{data.usage}

-

{data.description}

- -
-
- Last updated {data.updatedAt} +
+ + +
+
+
+ Product +
+

{dataProduct.name}

+

Price: {dataProduct.price}

+

Description: {dataProduct.description}

+

Usage: {dataProduct.usage}

+
+ Last updated {dataProduct.updatedAt} +
+
+
); + + + } diff --git a/Client/src/components/Register.jsx b/Client/src/components/Register.jsx index deb5cb8..2182224 100644 --- a/Client/src/components/Register.jsx +++ b/Client/src/components/Register.jsx @@ -1,19 +1,19 @@ -import Button from "./Button"; import { useNavigate } from "react-router-dom"; import { useState } from "react"; import serverRequest from "../utils/axios"; import Toastify from "../utils/toast"; - -export default function Register(){ - const navigate = useNavigate() - const [userData,setUserData] = useState({ +import Button from "./Button"; +import { Link } from "react-router-dom"; +export default function Register() { + const navigate = useNavigate(); + const [userData, setUserData] = useState({ username: "", email: "", password: "", - }) + }); - const onHandleRegister = async (e) =>{ - e.preventDefault() + const onHandleRegister = async (e) => { + e.preventDefault(); try { let { data } = await serverRequest({ method: "POST", @@ -21,93 +21,103 @@ export default function Register(){ headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, }, - data: userData - }) - navigate("/login") - Toastify(`Successfully register ${data.username}`, "success") + data: userData, + }); + navigate("/login"); + Toastify(`Successfully register ${data.username}`, "success"); } catch (error) { - Toastify(error.response?.data?.message || error.message, "error") + Toastify( + error.response?.data?.message || error.message, + "error" + ); } - } + }; - const onChangeRegister = (e) =>{ - const key = e.target.name - const value = e.target.value - setUserData({...userData,[key]:value}) - } + const onChangeRegister = (e) => { + const key = e.target.name; + const value = e.target.value; + setUserData({ ...userData, [key]: value }); + }; - return( -
-
-
-
-
-

Register User

-
-
- - -
- -
-
-
- - -
- -
-
-
- - -
- -
- -
+ return ( +
+

Register User

+
+
+ + +
+
+ + +
+
+ + +
+
+
-
-
-
- ) -} \ No newline at end of file +

+ Already Have an Account? Login +

+ +
+ ); +} diff --git a/Client/src/routers/index.jsx b/Client/src/routers/index.jsx index 95febc1..861036c 100644 --- a/Client/src/routers/index.jsx +++ b/Client/src/routers/index.jsx @@ -6,6 +6,9 @@ import Public from "../views/PublicPage"; import Authentication from "../views/AuthenticationPage"; import PublicDetailPage from "../views/PublicDetailPage"; import AuthenticationPage from "../views/AuthenticationPage"; +import AboutUs from "../views/AboutUs"; +import ContactUs from "../views/ContactUs"; +import LoginPage from "../views/LoginPage"; const router = createBrowserRouter([ @@ -21,8 +24,29 @@ const router = createBrowserRouter([ { path: "/publicDetail/:id", element: - } + }, + { + path: "/about", + element: + }, + { + path: "/contact", + element: + }, + { + path: "/products", + element: + }, + ] + }, + { + path: "/login", + element: + }, + { + path: "/register", + element: } ]); diff --git a/Client/src/views/AboutUs.jsx b/Client/src/views/AboutUs.jsx new file mode 100644 index 0000000..ecb1b7d --- /dev/null +++ b/Client/src/views/AboutUs.jsx @@ -0,0 +1,20 @@ + + +export default function AboutUs() { + return ( +
+

Selamat datang di MedShop

+

+ Destinasi Anda untuk kesehatan dan kesejahteraan. Kami menyediakan + akses mudah dan aman ke berbagai produk kesehatan berkualitas tinggi, + mulai dari obat-obatan hingga produk perawatan diri. +

+

+ Dengan layanan yang cepat dan ramah, kami bertekad untuk memastikan Anda + mendapatkan perawatan yang Anda butuhkan dengan nyaman dan efisien. + Temukan solusi kesehatan terbaik untuk Anda dan keluarga di Apotik + Online kami. +

+
+ ); +} diff --git a/Client/src/views/ContactForm.jsx b/Client/src/views/ContactForm.jsx new file mode 100644 index 0000000..e69de29 diff --git a/Client/src/views/ContactUs.jsx b/Client/src/views/ContactUs.jsx new file mode 100644 index 0000000..b5b5399 --- /dev/null +++ b/Client/src/views/ContactUs.jsx @@ -0,0 +1,55 @@ +import { useState } from "react"; + +export default function ContactUs() { + const [isSubmitted, setIsSubmitted] = useState(false); + + const handleSubmit = (e) => { + e.preventDefault(); + + setIsSubmitted(true); + }; + + return ( +
+ {!isSubmitted ? ( + <> +

Hubungi Kami

+

+ Apakah Anda memiliki pertanyaan atau masukan? Jangan ragu untuk + menghubungi kami melalui formulir kontak di bawah ini. +

+
+
+ + +
+ + +
+ + ) : ( +
+

Terima Kasih!

+

Pesan Anda telah berhasil dikirim. Kami akan segera merespons.

+
+ )} +
+ ); +} diff --git a/Client/src/views/LoginPage.jsx b/Client/src/views/LoginPage.jsx new file mode 100644 index 0000000..bf097bb --- /dev/null +++ b/Client/src/views/LoginPage.jsx @@ -0,0 +1,11 @@ +import Preloader from "../components/Preloader"; +import Login from "../components/Login"; + +export default function LoginPage() { + return ( + <> + + + + ) +} \ No newline at end of file From b0c6ddf9ea562cabe13cdfa597591d0bcc1c4fb2 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 00:52:47 +0700 Subject: [PATCH 24/36] fix:client --- Client/src/assets/logout.jpg | Bin 0 -> 26766 bytes Client/src/components/Login.jsx | 13 ++- Client/src/components/NavbarProduct.jsx | 58 +++++++++++++ Client/src/components/ProductCard.jsx | 19 +++-- Client/src/components/Register.jsx | 7 ++ Client/src/components/UserCart.jsx | 6 ++ Client/src/components/UserMain.jsx | 54 ++++++++++++ Client/src/components/UserProductCard.jsx | 43 ++++++++++ .../src/components/UserProductDetailCard.jsx | 57 +++++++++++++ Client/src/routers/index.jsx | 78 ++++++++++++++++-- Client/src/views/AuthenticationPage.jsx | 2 + Client/src/views/UserAboutUs.jsx | 21 +++++ Client/src/views/UserCartPage.jsx | 6 ++ Client/src/views/UserContactUs.jsx | 55 ++++++++++++ Client/src/views/UserProductDetailPage.jsx | 9 ++ Client/src/views/UserProductPage.jsx | 10 +++ 16 files changed, 425 insertions(+), 13 deletions(-) create mode 100644 Client/src/assets/logout.jpg create mode 100644 Client/src/components/NavbarProduct.jsx create mode 100644 Client/src/components/UserCart.jsx create mode 100644 Client/src/components/UserMain.jsx create mode 100644 Client/src/components/UserProductCard.jsx create mode 100644 Client/src/components/UserProductDetailCard.jsx create mode 100644 Client/src/views/UserAboutUs.jsx create mode 100644 Client/src/views/UserCartPage.jsx create mode 100644 Client/src/views/UserContactUs.jsx create mode 100644 Client/src/views/UserProductDetailPage.jsx create mode 100644 Client/src/views/UserProductPage.jsx diff --git a/Client/src/assets/logout.jpg b/Client/src/assets/logout.jpg new file mode 100644 index 0000000000000000000000000000000000000000..314ebbc0306ccff40f7b4256b73b6279a97d2751 GIT binary patch literal 26766 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 { data: userData, }); localStorage.setItem("token", data.access_token); - navigate("/public"); + navigate("/products"); } catch (error) { console.log(error) toast(error.response?.data?.message || error.message, "error") @@ -48,6 +48,13 @@ const handleSubmit = async (event) => {
+
{ name={"Login"} buttonClass={"bg-blue-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded text-sm"} buttonType={"submit"} - onClick={() => navigate("/public")} + onClick={() => navigate("/products")} >

- Don't Have an Account? Register + Dont Have an Account? Register

diff --git a/Client/src/components/NavbarProduct.jsx b/Client/src/components/NavbarProduct.jsx new file mode 100644 index 0000000..52a33c0 --- /dev/null +++ b/Client/src/components/NavbarProduct.jsx @@ -0,0 +1,58 @@ +import { Link, useNavigate } from "react-router-dom"; +import Button from "./Button"; +import logo from "../assets/logo.jpg"; +import logout from "../assets/logout.jpg"; + +export default function NavbarProduct() { + const navigate = useNavigate(); + + const handleLogout = () => { + localStorage.removeItem("token"); + navigate("/login"); + } + return ( +
+
+
+ + home + + MedShop +
+
+ + logout + +
+
+
+
+
+
+
+ + +
+
+
+
+ ); +} diff --git a/Client/src/components/ProductCard.jsx b/Client/src/components/ProductCard.jsx index 2abb4c2..658fa62 100644 --- a/Client/src/components/ProductCard.jsx +++ b/Client/src/components/ProductCard.jsx @@ -1,14 +1,22 @@ -import { Link } from "react-router-dom"; import Button from "./Button"; - +import { useNavigate } from "react-router-dom"; +import showToast from "../utils/toast"; +// eslint-disable-next-line react/prop-types, no-unused-vars const ProductCard = ({ id, name, price, imageUrl, description, usage, updatedAt, handleOnDetail }) => { - const handleClick = () => { + const navigate = useNavigate(); + const handleClick = () => { handleOnDetail(id); }; + const handleOnCart = () => { + if(!localStorage.getItem("token")){ + showToast("Please login first", "error") + navigate("/login") + } + } return (
- +
Add to Cart @@ -33,7 +42,7 @@ const ProductCard = ({ id, name, price, imageUrl, description, usage, updatedAt, Last updated {updatedAt}
- +
); }; diff --git a/Client/src/components/Register.jsx b/Client/src/components/Register.jsx index 2182224..7cde744 100644 --- a/Client/src/components/Register.jsx +++ b/Client/src/components/Register.jsx @@ -42,6 +42,13 @@ export default function Register() { return (

Register User

+
{ + const navigate = useNavigate(); + const [pubData, setPubData] = useState([]) + const fetchPubData = async () => { + try { + let {data} = await serverRequest({ + url: `/products`, + method: "GET", + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + } + }) + setPubData(data) + } catch (error) { + console.log(error); + } + } + + const handleOnDetail = (id) => { + navigate(`/products/productDetail/${id}`) + } + + useEffect(() => { + fetchPubData() + },[]) + + const products = pubData.map((product,index) => { + return handleOnDetail(product.id)}/> + }) + return ( + <> +
+
+
+ {products} +
+
+
+ + + + ) +} + +export default UserMain \ No newline at end of file diff --git a/Client/src/components/UserProductCard.jsx b/Client/src/components/UserProductCard.jsx new file mode 100644 index 0000000..ab06296 --- /dev/null +++ b/Client/src/components/UserProductCard.jsx @@ -0,0 +1,43 @@ +import Button from "./Button"; +import { useNavigate } from "react-router-dom"; +// eslint-disable-next-line react/prop-types +const UserProductCard = ({ id, name, price, imageUrl, updatedAt, handleOnDetail }) => { + const navigate = useNavigate(); + const handleClick = () => { + handleOnDetail(id); + }; + + return ( +
+ +
+ Product +
+
{name}
+

{price}

+
+ +
+
+
+ Last updated {updatedAt} +
+
+ +
+ ); +}; + +export default UserProductCard; diff --git a/Client/src/components/UserProductDetailCard.jsx b/Client/src/components/UserProductDetailCard.jsx new file mode 100644 index 0000000..a762494 --- /dev/null +++ b/Client/src/components/UserProductDetailCard.jsx @@ -0,0 +1,57 @@ +import { useEffect, useState } from "react"; +import { useParams } from "react-router-dom"; +import axios from "axios"; +import Button from "./Button"; +import { useNavigate } from "react-router-dom"; +export default function UserProductDetail() { + const [dataProduct, setDataProduct] = useState([]); + let {id} = useParams(); + const navigate = useNavigate(); + useEffect(() => { + const fetchData = async () => { + try { + let pubData = await axios.get(`https://medshop.carloshakim.online/public/products/${id}`,{headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }}) + console.log(pubData); + setDataProduct(pubData.data) + } catch (error) { + console.log(error); + } + }; + fetchData(); + }, []); + console.log(id); + + return ( +
+ + +
+
+
+ Product +
+

{dataProduct.name}

+

Price: {dataProduct.price}

+

Description: {dataProduct.description}

+

Usage: {dataProduct.usage}

+
+
+
+ Last updated {dataProduct.updatedAt} +
+
+
+
+ ); + + + +} diff --git a/Client/src/routers/index.jsx b/Client/src/routers/index.jsx index 861036c..54e8d4c 100644 --- a/Client/src/routers/index.jsx +++ b/Client/src/routers/index.jsx @@ -5,10 +5,14 @@ import RegisterPage from "../views/RegisterPage"; import Public from "../views/PublicPage"; import Authentication from "../views/AuthenticationPage"; import PublicDetailPage from "../views/PublicDetailPage"; -import AuthenticationPage from "../views/AuthenticationPage"; import AboutUs from "../views/AboutUs"; import ContactUs from "../views/ContactUs"; import LoginPage from "../views/LoginPage"; +import User from "../views/UserProductPage"; +import UserDetailPage from "../views/UserProductDetailPage"; +import UserAboutUs from "../views/UserAboutUs"; +import UserContactUs from "../views/UserContactUs"; +import UserCartPage from "../views/UserCartPage"; const router = createBrowserRouter([ @@ -16,6 +20,13 @@ const router = createBrowserRouter([ path: "/", element: , errorElement: , + loader: () => { + if(localStorage.token){ + return redirect("/products") + }else{ + return null + } + }, children: [ { path: "/", @@ -33,13 +44,49 @@ const router = createBrowserRouter([ path: "/contact", element: }, + + ] + }, + { + path: "products", + element: , + loader: () => { + if(!localStorage.token){ + return redirect("/login"); + }else{ + return null + } + }, + children: [ { - path: "/products", - element: + index: true, + loader: () => { + return redirect("/products/product") + } }, - + { + path: "product", + element: + }, + { + path: `productDetail/:id`, + element: + }, + { + path: "UserAbout", + element: + }, + { + path: "UserContact", + element: + }, + { + path: "myCart", + element: + } ] }, + { path: "/login", element: @@ -47,7 +94,28 @@ const router = createBrowserRouter([ { path: "/register", element: - } + }, + + // { + // path: "/products", + // element: , + // loader: () => { + // if(!localStorage.token){ + // return redirect("/login"); + // }else{ + // return null + // } + // }, + // children: [ + // { + // index: true, + // loader: () => { + // return redirect("/products/product") + // } + // }, + // { + // ] + // } ]); export default router; \ No newline at end of file diff --git a/Client/src/views/AuthenticationPage.jsx b/Client/src/views/AuthenticationPage.jsx index 595d6f7..20738c9 100644 --- a/Client/src/views/AuthenticationPage.jsx +++ b/Client/src/views/AuthenticationPage.jsx @@ -1,8 +1,10 @@ import { Outlet } from "react-router-dom"; +import NavbarProduct from "../components/NavbarProduct"; export default function AuthenticationPage(){ return( <> + ) diff --git a/Client/src/views/UserAboutUs.jsx b/Client/src/views/UserAboutUs.jsx new file mode 100644 index 0000000..481fafa --- /dev/null +++ b/Client/src/views/UserAboutUs.jsx @@ -0,0 +1,21 @@ + + +export default function UserAboutUs() { + return ( +
+

Selamat datang di MedShop

+

+ Destinasi Anda untuk kesehatan dan kesejahteraan. Kami menyediakan + akses mudah dan aman ke berbagai produk kesehatan berkualitas tinggi, + mulai dari obat-obatan hingga produk perawatan diri. +

+

+ Dengan layanan yang cepat dan ramah, kami bertekad untuk memastikan Anda + mendapatkan perawatan yang Anda butuhkan dengan nyaman dan efisien. + Temukan solusi kesehatan terbaik untuk Anda dan keluarga di Apotik + Online kami. +

+
+ ); + } + \ No newline at end of file diff --git a/Client/src/views/UserCartPage.jsx b/Client/src/views/UserCartPage.jsx new file mode 100644 index 0000000..5ce59f3 --- /dev/null +++ b/Client/src/views/UserCartPage.jsx @@ -0,0 +1,6 @@ +export default function UserCartPage(){ + return ( + <> + + ) +} \ No newline at end of file diff --git a/Client/src/views/UserContactUs.jsx b/Client/src/views/UserContactUs.jsx new file mode 100644 index 0000000..e751ceb --- /dev/null +++ b/Client/src/views/UserContactUs.jsx @@ -0,0 +1,55 @@ +import { useState } from "react"; + +export default function UserContactUs() { + const [isSubmitted, setIsSubmitted] = useState(false); + + const handleSubmit = (e) => { + e.preventDefault(); + + setIsSubmitted(true); + }; + + return ( +
+ {!isSubmitted ? ( + <> +

Hubungi Kami

+

+ Apakah Anda memiliki pertanyaan atau masukan? Jangan ragu untuk + menghubungi kami melalui formulir kontak di bawah ini. +

+ +
+ + +
+ + + + + ) : ( +
+

Terima Kasih!

+

Pesan Anda telah berhasil dikirim. Kami akan segera merespons.

+
+ )} +
+ ); +} diff --git a/Client/src/views/UserProductDetailPage.jsx b/Client/src/views/UserProductDetailPage.jsx new file mode 100644 index 0000000..3360e85 --- /dev/null +++ b/Client/src/views/UserProductDetailPage.jsx @@ -0,0 +1,9 @@ +import UserProductDetail from "../components/UserProductDetailCard"; + +export default function UserDetailPage(){ + return ( + <> + + + ) +} \ No newline at end of file diff --git a/Client/src/views/UserProductPage.jsx b/Client/src/views/UserProductPage.jsx new file mode 100644 index 0000000..3d8da9d --- /dev/null +++ b/Client/src/views/UserProductPage.jsx @@ -0,0 +1,10 @@ +import UserMain from "../components/UserMain"; + + +export default function User(){ + return ( + <> + + + ) +} \ No newline at end of file From 297f8819c523e14ece98f81d058fc02eeb6a5b27 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 01:50:22 +0700 Subject: [PATCH 25/36] fix:login --- Server/Controllers/UserController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Server/Controllers/UserController.js b/Server/Controllers/UserController.js index 01511ab..850d44a 100644 --- a/Server/Controllers/UserController.js +++ b/Server/Controllers/UserController.js @@ -51,7 +51,7 @@ class UserController{ } let token = signToken({ id: user.id }); - res.status(200).json({ access_token: token }); + res.status(200).json({ access_token: token , userId: user.id}); } catch (error) { next(error) } From 88c4bc0f998b81a13d9960dd9720eee8414f323e Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 01:52:49 +0700 Subject: [PATCH 26/36] fix:Data --- Client/src/components/Login.jsx | 1 + Client/src/components/NavbarProduct.jsx | 6 + Client/src/components/UserAddCart.jsx | 120 ++++++++++++++++++ Client/src/components/UserCart.jsx | 29 ++++- .../src/components/UserProductDetailCard.jsx | 2 +- 5 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 Client/src/components/UserAddCart.jsx diff --git a/Client/src/components/Login.jsx b/Client/src/components/Login.jsx index f219dca..66d4043 100644 --- a/Client/src/components/Login.jsx +++ b/Client/src/components/Login.jsx @@ -30,6 +30,7 @@ const handleSubmit = async (event) => { data: userData, }); localStorage.setItem("token", data.access_token); + localStorage.setItem("userId", data.userId); navigate("/products"); } catch (error) { console.log(error) diff --git a/Client/src/components/NavbarProduct.jsx b/Client/src/components/NavbarProduct.jsx index 52a33c0..a8a3b54 100644 --- a/Client/src/components/NavbarProduct.jsx +++ b/Client/src/components/NavbarProduct.jsx @@ -53,6 +53,12 @@ export default function NavbarProduct() { +
+
); } diff --git a/Client/src/components/UserAddCart.jsx b/Client/src/components/UserAddCart.jsx new file mode 100644 index 0000000..a21aa95 --- /dev/null +++ b/Client/src/components/UserAddCart.jsx @@ -0,0 +1,120 @@ +import axios from "axios"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { set } from "../../../Server/app"; + +export default function UserAddCart() { + const navigate = useNavigate(); + const [cart, setCart] = useState({ + id: "", + name: "", + price: "", + imageUrl: "", + description: "", + usage: "", + updatedAt: "", +}); + + const onHandleAddCart = async (e,userId,productId) => { + e.preventDefault(); + try { + const cart = { userId, productId }; + + let data = await axios.post("https://medshop.carloshakim.online/cart", cart, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + setCart(data.data); + navigate("/cart"); + } catch (error) { + console.log(error); + } + }; + + const onChangeAddCart = (e) => { + const key = e.target.name; + const value = e.target.value; + setCart({ ...cart, [key]: value }); + }; + + return ( +
+

Add Item to Cart

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ ); +} diff --git a/Client/src/components/UserCart.jsx b/Client/src/components/UserCart.jsx index 0b21ee9..0440747 100644 --- a/Client/src/components/UserCart.jsx +++ b/Client/src/components/UserCart.jsx @@ -1,6 +1,27 @@ -export default function UserCart(){ - +import { useEffect, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import Button from "./Button"; +import axios from "axios"; +export default function UserCart() { + const [cartItems, setCartItems] = useState([]); + const [isDeleted, setIsDeleted] = useState(false); + const {id} = useParams() + const navigate = useNavigate(); + + useEffect(() => { + const fetchData = async () => { + try { + let userData = await axios.get(`https://medshop.carloshakim.online/cart}`) + console.log(userData); + setCartItems(userData.data) + } catch (error) { + console.log(error); + } + }; + fetchData(); + }) return ( - + <> + ) -} \ No newline at end of file +} diff --git a/Client/src/components/UserProductDetailCard.jsx b/Client/src/components/UserProductDetailCard.jsx index a762494..bf523e6 100644 --- a/Client/src/components/UserProductDetailCard.jsx +++ b/Client/src/components/UserProductDetailCard.jsx @@ -10,7 +10,7 @@ export default function UserProductDetail() { useEffect(() => { const fetchData = async () => { try { - let pubData = await axios.get(`https://medshop.carloshakim.online/public/products/${id}`,{headers: { + let pubData = await axios.get(`https://medshop.carloshakim.online/products/${id}`,{headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, }}) console.log(pubData); From f1984b14f99807a35de17baa8bde4b91e910d1ab Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 01:54:14 +0700 Subject: [PATCH 27/36] fix:data --- Client/src/components/UserAddCart.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/Client/src/components/UserAddCart.jsx b/Client/src/components/UserAddCart.jsx index a21aa95..4ce33b6 100644 --- a/Client/src/components/UserAddCart.jsx +++ b/Client/src/components/UserAddCart.jsx @@ -1,7 +1,6 @@ import axios from "axios"; import { useState } from "react"; import { useNavigate } from "react-router-dom"; -import { set } from "../../../Server/app"; export default function UserAddCart() { const navigate = useNavigate(); From ac269546502a80c6e86be5634e0bc9b57e51f158 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 11:42:53 +0700 Subject: [PATCH 28/36] fix:put --- Server/Controllers/CartController.js | 13 +++++++++++++ Server/data/cart.json | 3 ++- Server/migrations/20240313175505-create-cart.js | 4 ++++ Server/models/cart.js | 3 +++ Server/router/cart.js | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Server/Controllers/CartController.js b/Server/Controllers/CartController.js index a118917..2e1305c 100644 --- a/Server/Controllers/CartController.js +++ b/Server/Controllers/CartController.js @@ -50,6 +50,19 @@ class CartController{ next(error); } } + + static async updateItemById(req, res, next) { + const { id } = req.params; + try { + const items = await Cart.findByPk(id); + await items.update(req.body); + res + .status(200) + .json({ message: `Item has been updated` }); + } catch (error) { + next(error); + } + } } module.exports = CartController \ No newline at end of file diff --git a/Server/data/cart.json b/Server/data/cart.json index e19a5d3..ac50fd5 100644 --- a/Server/data/cart.json +++ b/Server/data/cart.json @@ -1,6 +1,7 @@ [ { "userId": 1, - "productId": 1 + "productId": 1, + "quantity": 1 } ] \ No newline at end of file diff --git a/Server/migrations/20240313175505-create-cart.js b/Server/migrations/20240313175505-create-cart.js index 4987786..351dc72 100644 --- a/Server/migrations/20240313175505-create-cart.js +++ b/Server/migrations/20240313175505-create-cart.js @@ -15,6 +15,10 @@ module.exports = { productId: { type: Sequelize.INTEGER }, + quantity: { + type: Sequelize.INTEGER, + defaultValue: 0 + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/Server/models/cart.js b/Server/models/cart.js index ca20c37..463f01f 100644 --- a/Server/models/cart.js +++ b/Server/models/cart.js @@ -43,6 +43,9 @@ module.exports = (sequelize, DataTypes) => { }, onUpdate:'CASCADE', onDelete:'CASCADE' + }, + quantity: { + type: DataTypes.INTEGER, } }, { sequelize, diff --git a/Server/router/cart.js b/Server/router/cart.js index 3500720..38782cc 100644 --- a/Server/router/cart.js +++ b/Server/router/cart.js @@ -9,6 +9,7 @@ router.use(authentication); router.get("/", CartController.getAllItems); router.post("/", CartController.createItems); +router.put("/:id", CartController.updateItemById); router.delete("/:id", CartController.deleteItemById); module.exports = router \ No newline at end of file From c9a93536f5063b719cf9f56d86a39683a209e7d1 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 13:22:25 +0700 Subject: [PATCH 29/36] fix:proof --- Server/Controllers/ProofController.js | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/Server/Controllers/ProofController.js b/Server/Controllers/ProofController.js index 7f5944c..ced34e0 100644 --- a/Server/Controllers/ProofController.js +++ b/Server/Controllers/ProofController.js @@ -12,25 +12,23 @@ cloudinary.config({ }); class ProofController { - static async createProof(req, res, next) { - try { - console.log(req.file); - console.log(req.body); - const mimetype = req.file.mimetype; - const data = Buffer.from(req.file.buffer).toString("base64"); - const dataURL = `data:${mimetype};base64,${data}`; + const file = req.body.image; const timestamp = new Date().getTime(); const publicId = `image_${timestamp}`; - const file = await cloudinary.uploader.upload(dataURL, { + + const result = await cloudinary.uploader.upload(file, { public_id: publicId, }); + + await Proof.create({ - imageUrl: file.secure_url, - userId: req.body.userId - }) - res.status(201).json({message: "Proof has been created"}); + imageUrl: result.secure_url, + userId: req.body.userId + }); + + res.status(201).json({ message: "Proof has been created" }); } catch (error) { next(error); } From 244f923c3a9e4cb1311eafd182753c582eb490aa Mon Sep 17 00:00:00 2001 From: root Date: Fri, 15 Mar 2024 06:23:50 +0000 Subject: [PATCH 30/36] fix:data --- Server/Controllers/ProofController.js | 13 ++++++------- Server/app.js | 2 +- Server/ecosystem.config.js | 17 +++++++++++++++++ Server/migrations/20240313175505-create-cart.js | 4 ++-- 4 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 Server/ecosystem.config.js diff --git a/Server/Controllers/ProofController.js b/Server/Controllers/ProofController.js index 7f5944c..74530e8 100644 --- a/Server/Controllers/ProofController.js +++ b/Server/Controllers/ProofController.js @@ -1,4 +1,4 @@ -const { Proof } = require("../models"); +c:onst { Proof } = require("../models"); const cloud_name = process.env.cloud_name; const api_key = process.env.api_key; @@ -19,8 +19,7 @@ class ProofController { console.log(req.file); console.log(req.body); const mimetype = req.file.mimetype; - const data = Buffer.from(req.file.buffer).toString("base64"); - const dataURL = `data:${mimetype};base64,${data}`; + const data = Buffe const dataURL = `data:${mimetype};base64,${data}`; const timestamp = new Date().getTime(); const publicId = `image_${timestamp}`; const file = await cloudinary.uploader.upload(dataURL, { @@ -33,7 +32,7 @@ class ProofController { res.status(201).json({message: "Proof has been created"}); } catch (error) { next(error); - } - } -} -module.exports = ProofController; + } + }} +odule.exports = ProofCon:q +troller; diff --git a/Server/app.js b/Server/app.js index 6c0c6f7..2816805 100644 --- a/Server/app.js +++ b/Server/app.js @@ -24,4 +24,4 @@ if(process.env.NODE_ENV !== 'production'){ module.exports = app - \ No newline at end of file + diff --git a/Server/ecosystem.config.js b/Server/ecosystem.config.js new file mode 100644 index 0000000..c905704 --- /dev/null +++ b/Server/ecosystem.config.js @@ -0,0 +1,17 @@ + module.exports = { + apps: [ + { + name: "medshop", + script: "./bin/www", + env:{ + NODE_ENV: "production", + PORT: 80, + JWT_SECRET:"rahasia", + cloud_name:"dpmwni4tm", + api_key:134972379139894, + api_secret:"xjCSBxEh5RFiwnZ0UQGLfL4W-as", + DATABASE_URL:"postgres://postgres.jrmpziprwxhdohgikgkl:rt7VCXCE7IYpDra8@aws-0-ap-southeast-1.pooler.supabase.com:5432/postgres", + }, + }, + ], +}; diff --git a/Server/migrations/20240313175505-create-cart.js b/Server/migrations/20240313175505-create-cart.js index 351dc72..12e2d4f 100644 --- a/Server/migrations/20240313175505-create-cart.js +++ b/Server/migrations/20240313175505-create-cart.js @@ -17,7 +17,7 @@ module.exports = { }, quantity: { type: Sequelize.INTEGER, - defaultValue: 0 + defaultValue: 1 }, createdAt: { allowNull: false, @@ -32,4 +32,4 @@ module.exports = { async down(queryInterface, Sequelize) { await queryInterface.dropTable('Carts'); } -}; \ No newline at end of file +}; From 8f454efb51c4b486033e19fd33a7a5221b0090c4 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 14:25:13 +0700 Subject: [PATCH 31/36] fix:oauth --- Client/index.html | 2 + Client/package-lock.json | 16 +++ Client/package.json | 1 + Client/src/components/CheckOut.jsx | 49 +++++++++ Client/src/components/Done.jsx | 18 ++++ Client/src/components/Login.jsx | 32 +++++- Client/src/components/UserAddCart.jsx | 119 ---------------------- Client/src/components/UserCart.jsx | 118 +++++++++++++++++++-- Client/src/components/UserMain.jsx | 2 +- Client/src/components/UserProductCard.jsx | 117 +++++++++++++++------ Client/src/routers/index.jsx | 14 ++- 11 files changed, 323 insertions(+), 165 deletions(-) create mode 100644 Client/src/components/CheckOut.jsx create mode 100644 Client/src/components/Done.jsx delete mode 100644 Client/src/components/UserAddCart.jsx diff --git a/Client/index.html b/Client/index.html index 2e2524f..5964cba 100644 --- a/Client/index.html +++ b/Client/index.html @@ -12,6 +12,8 @@ /> + + MedShop diff --git a/Client/package-lock.json b/Client/package-lock.json index 0a6ece1..4e1a1b8 100644 --- a/Client/package-lock.json +++ b/Client/package-lock.json @@ -12,6 +12,7 @@ "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.0", "react-router-dom": "^6.22.3", "toastify-js": "^1.12.0" }, @@ -3866,6 +3867,21 @@ "react": "^18.2.0" } }, + "node_modules/react-hook-form": { + "version": "7.51.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.0.tgz", + "integrity": "sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/Client/package.json b/Client/package.json index edbc03f..6e26824 100644 --- a/Client/package.json +++ b/Client/package.json @@ -14,6 +14,7 @@ "axios": "^1.6.7", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-hook-form": "^7.51.0", "react-router-dom": "^6.22.3", "toastify-js": "^1.12.0" }, diff --git a/Client/src/components/CheckOut.jsx b/Client/src/components/CheckOut.jsx new file mode 100644 index 0000000..0ebde7c --- /dev/null +++ b/Client/src/components/CheckOut.jsx @@ -0,0 +1,49 @@ +import { useState } from "react"; +import axios from "axios"; +import { useNavigate } from "react-router-dom"; + +export default function CheckOut() { + const [file, setFile] = useState(null); + const navigate = useNavigate(); + + const handleOnUpload = async () => { + try { + const formData = new FormData(); + formData.append("image", file); + formData.append("name", "pokee"); + + await axios.post(`https://medshop.carloshakim.online/proof`, formData, { + headers: { + "Content-Type": "multipart/form-data", + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + + navigate('/products/done'); + } catch (error) { + console.error(error); + } + }; + + return ( +
+
+

Upload Proof of Purchase

+
+ setFile(e.target.files[0])} + type="file" + className="border border-gray-300 p-2 w-full" + id="inputGroupFile02" + /> +
+ +
+
+ ); +} diff --git a/Client/src/components/Done.jsx b/Client/src/components/Done.jsx new file mode 100644 index 0000000..5615041 --- /dev/null +++ b/Client/src/components/Done.jsx @@ -0,0 +1,18 @@ +import Button from "./Button"; +import { useNavigate } from "react-router-dom"; + +export default function Done() { + const navigate = useNavigate(); + + return ( +
+

Thank you for your purchase!

+
+ ); +} diff --git a/Client/src/components/Login.jsx b/Client/src/components/Login.jsx index 66d4043..e84c421 100644 --- a/Client/src/components/Login.jsx +++ b/Client/src/components/Login.jsx @@ -4,6 +4,8 @@ import toast from "../utils/toast" import { useNavigate } from "react-router-dom"; import Button from "./Button"; import { Link } from "react-router-dom"; +import showToast from "../utils/toast"; +import { useEffect } from "react"; export default function Login() { const navigate = useNavigate(); const [ userData, setUserData ] = useState({ @@ -37,6 +39,31 @@ const handleSubmit = async (event) => { toast(error.response?.data?.message || error.message, "error") } } + +const handleCredentialResponse = async ({ credential }) => { + const { data } = await serverRequest.post("/google-login", { + googleToken: credential, + }); + localStorage.setItem("token", data.access_token); + showToast(data.message); + navigate("/products/product"); +}; + +useEffect(() => { + + // eslint-disable-next-line no-undef + google.accounts.id.initialize({ + client_id: "888996035254-qqqrffv50i0tk2i45ja7j75g1ii9nlkg.apps.googleusercontent.com", + callback: handleCredentialResponse, + }); + // eslint-disable-next-line no-undef + google.accounts.id.renderButton(document.getElementById("buttonDiv"), { + theme: "outline", + size: "large", + }); + +}, []); + return (
{ buttonType={"submit"} onClick={() => navigate("/products")} > -

@@ -132,6 +158,10 @@ const handleSubmit = async (event) => {

+
- or -
+
+
+
diff --git a/Client/src/components/UserAddCart.jsx b/Client/src/components/UserAddCart.jsx deleted file mode 100644 index 4ce33b6..0000000 --- a/Client/src/components/UserAddCart.jsx +++ /dev/null @@ -1,119 +0,0 @@ -import axios from "axios"; -import { useState } from "react"; -import { useNavigate } from "react-router-dom"; - -export default function UserAddCart() { - const navigate = useNavigate(); - const [cart, setCart] = useState({ - id: "", - name: "", - price: "", - imageUrl: "", - description: "", - usage: "", - updatedAt: "", -}); - - const onHandleAddCart = async (e,userId,productId) => { - e.preventDefault(); - try { - const cart = { userId, productId }; - - let data = await axios.post("https://medshop.carloshakim.online/cart", cart, { - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - }, - }); - setCart(data.data); - navigate("/cart"); - } catch (error) { - console.log(error); - } - }; - - const onChangeAddCart = (e) => { - const key = e.target.name; - const value = e.target.value; - setCart({ ...cart, [key]: value }); - }; - - return ( -
-

Add Item to Cart

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
- ); -} diff --git a/Client/src/components/UserCart.jsx b/Client/src/components/UserCart.jsx index 0440747..ce56264 100644 --- a/Client/src/components/UserCart.jsx +++ b/Client/src/components/UserCart.jsx @@ -1,27 +1,127 @@ import { useEffect, useState } from "react"; -import { useNavigate, useParams } from "react-router-dom"; -import Button from "./Button"; +import { useNavigate } from "react-router-dom"; import axios from "axios"; + export default function UserCart() { const [cartItems, setCartItems] = useState([]); const [isDeleted, setIsDeleted] = useState(false); - const {id} = useParams() + const [quantities, setQuantities] = useState({}); + const [showDeleteNotification, setShowDeleteNotification] = useState(false); + const [showUpdateNotification, setShowUpdateNotification] = useState(false); + const navigate = useNavigate(); useEffect(() => { const fetchData = async () => { try { - let userData = await axios.get(`https://medshop.carloshakim.online/cart}`) + let userData = await axios.get(`https://medshop.carloshakim.online/cart`, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); console.log(userData); - setCartItems(userData.data) + setCartItems(userData.data); + setQuantities( + userData.data.reduce((acc, cart) => { + acc[cart.id] = cart.quantity; + return acc; + }, {}) + ); } catch (error) { console.log(error); } }; fetchData(); - }) + }, [isDeleted, showDeleteNotification, showUpdateNotification]); + + const handleDelete = async (id) => { + try { + await axios.delete(`https://medshop.carloshakim.online/cart/${id}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + setIsDeleted(true); + setShowDeleteNotification(true); + setTimeout(() => { + setShowDeleteNotification(false); + }, 2000); + } catch (error) { + console.log(error); + } + }; + + const handleQuantityChange = (id, value) => { + setQuantities({ + ...quantities, + [id]: value, + }); + }; + + const handleUpdateQuantity = async (id) => { + try { + await axios.put( + `https://medshop.carloshakim.online/cart/${id}`, + { quantity: quantities[id] }, + { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + } + ); + setIsDeleted(true); + setShowUpdateNotification(true); + setTimeout(() => { + setShowUpdateNotification(false); + }, 2000); + } catch (error) { + console.log(error); + } + }; + + const handleCheckout = () => { + navigate("/products/checkout"); + }; + return ( - <> - - ) +
+ {showDeleteNotification && ( +
+ Item deleted from cart. +
+ )} + {showUpdateNotification && ( +
+ Cart updated successfully. +
+ )} +
+

Your Cart

+ +
+
+ {cartItems.map((cart) => ( +
+ {cart.Product.name} +
+
{cart.Product.name}
+

{cart.Product.price}

+
+ handleQuantityChange(cart.id, e.target.value)} + /> +
+ + +
+
+
+
+ ))} +
+
+ ); } diff --git a/Client/src/components/UserMain.jsx b/Client/src/components/UserMain.jsx index 5a03983..570b378 100644 --- a/Client/src/components/UserMain.jsx +++ b/Client/src/components/UserMain.jsx @@ -32,7 +32,7 @@ const UserMain = () => { },[]) const products = pubData.map((product,index) => { - return handleOnDetail(product.id)}/> }) diff --git a/Client/src/components/UserProductCard.jsx b/Client/src/components/UserProductCard.jsx index ab06296..b584739 100644 --- a/Client/src/components/UserProductCard.jsx +++ b/Client/src/components/UserProductCard.jsx @@ -1,43 +1,94 @@ +import { useEffect, useState } from "react"; import Button from "./Button"; import { useNavigate } from "react-router-dom"; -// eslint-disable-next-line react/prop-types +import axios from "axios"; + const UserProductCard = ({ id, name, price, imageUrl, updatedAt, handleOnDetail }) => { const navigate = useNavigate(); - const handleClick = () => { - handleOnDetail(id); - }; + const handleClick = () => { + handleOnDetail(id); + }; + + const [data, setData] = useState([]); + useEffect(() => { + const fetchData = async () => { + try { + let response = await axios.get(`https://medshop.carloshakim.online/cart`, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + setData(response.data); + } catch (error) { + console.log(error); + } + }; + fetchData(); + }, []); + + const isProductInCart = data.some((item) => item.Product.id === id); + const [isAddedToCart, setIsAddedToCart] = useState(false); - return ( -
- -
- Product -
-
{name}
-

{price}

-
- + const handleAddCoin = async (id) => { + try { + if (isProductInCart) { + setIsAddedToCart(true); + setTimeout(() => { + setIsAddedToCart(false); + }, 2000); + return; + } + let response = await axios.post( + `https://medshop.carloshakim.online/cart`, + { productId: id, userId: localStorage.getItem("userId") }, + { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + } + ); + console.log(response); + navigate("/products/myCart"); + } catch (error) { + console.log(error); + } + }; + + return ( +
+
+ Product +
+
{name}
+

{price}

+
+ +
+
+
+ Last updated {updatedAt} +
+ {isAddedToCart && ( +
+ Product is already added to cart. +
+ )}
-
- Last updated {updatedAt} -
-
- -
- ); + ); }; export default UserProductCard; diff --git a/Client/src/routers/index.jsx b/Client/src/routers/index.jsx index 54e8d4c..957c0e3 100644 --- a/Client/src/routers/index.jsx +++ b/Client/src/routers/index.jsx @@ -12,7 +12,9 @@ import User from "../views/UserProductPage"; import UserDetailPage from "../views/UserProductDetailPage"; import UserAboutUs from "../views/UserAboutUs"; import UserContactUs from "../views/UserContactUs"; -import UserCartPage from "../views/UserCartPage"; +import UserCart from "../components/UserCart"; +import CheckOut from "../components/CheckOut"; +import Done from "../components/Done"; const router = createBrowserRouter([ @@ -82,7 +84,15 @@ const router = createBrowserRouter([ }, { path: "myCart", - element: + element: + }, + { + path: "checkout", + element: + }, + { + path: "done", + element: } ] }, From 808f1f19ce41409a6a6e824cf7d7532e95830a12 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 14:48:15 +0700 Subject: [PATCH 32/36] fix:data --- Server/router/cart.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Server/router/cart.js b/Server/router/cart.js index 38782cc..3e0a5d7 100644 --- a/Server/router/cart.js +++ b/Server/router/cart.js @@ -7,6 +7,7 @@ const authentication = require("../middlewares/authentication"); router.use(authentication); router.get("/", CartController.getAllItems); +router.get("/:id", CartController.getItemById); router.post("/", CartController.createItems); router.put("/:id", CartController.updateItemById); From 8ebfc67e57ae9ce205277d8ad15ebd705ced1236 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 15:35:03 +0700 Subject: [PATCH 33/36] fix:cloud --- Server/Controllers/ProofController.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Server/Controllers/ProofController.js b/Server/Controllers/ProofController.js index ced34e0..2bb2765 100644 --- a/Server/Controllers/ProofController.js +++ b/Server/Controllers/ProofController.js @@ -14,21 +14,21 @@ cloudinary.config({ class ProofController { static async createProof(req, res, next) { try { - const file = req.body.image; - const timestamp = new Date().getTime(); - const publicId = `image_${timestamp}`; + if (!req.file) throw { name: "CustomError", status: 400, message: "Image is required" }; + + const mimetype = req.file.mimetype; + const data = Buffer.from(req.file.buffer).toString('base64'); + const dataURI = `data:${mimetype};base64,${data}`; - const result = await cloudinary.uploader.upload(file, { - public_id: publicId, + const result = await cloudinary.uploader.upload(dataURI, { + public_id: "poke", }); + const proof = await Proof.findByPk(req.params.id); + if (!proof) throw { name: "NotFound" }; - await Proof.create({ - imageUrl: result.secure_url, - userId: req.body.userId - }); - - res.status(201).json({ message: "Proof has been created" }); + await proof.update({ imgUrl: result.secure_url }); + res.status(200).json({ message: `Image successfully updated` }); } catch (error) { next(error); } From d84b82da26a9545bae622c0b20b04d0e1e51221f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 15 Mar 2024 09:04:10 +0000 Subject: [PATCH 34/36] fix:data --- Server/Controllers/CartController.js | 2 +- Server/Controllers/ProofController.js | 39 +++++++++++++-------------- Server/router/cart.js | 4 +-- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Server/Controllers/CartController.js b/Server/Controllers/CartController.js index 2e1305c..635cbb8 100644 --- a/Server/Controllers/CartController.js +++ b/Server/Controllers/CartController.js @@ -65,4 +65,4 @@ class CartController{ } } -module.exports = CartController \ No newline at end of file +module.exports = CartController diff --git a/Server/Controllers/ProofController.js b/Server/Controllers/ProofController.js index 74530e8..a02928c 100644 --- a/Server/Controllers/ProofController.js +++ b/Server/Controllers/ProofController.js @@ -1,4 +1,4 @@ -c:onst { Proof } = require("../models"); +const { Proof } = require("../models"); const cloud_name = process.env.cloud_name; const api_key = process.env.api_key; @@ -13,26 +13,25 @@ cloudinary.config({ class ProofController { - static async createProof(req, res, next) { - - try { - console.log(req.file); - console.log(req.body); - const mimetype = req.file.mimetype; - const data = Buffe const dataURL = `data:${mimetype};base64,${data}`; - const timestamp = new Date().getTime(); - const publicId = `image_${timestamp}`; - const file = await cloudinary.uploader.upload(dataURL, { - public_id: publicId, - }); - await Proof.create({ - imageUrl: file.secure_url, - userId: req.body.userId - }) - res.status(201).json({message: "Proof has been created"}); + static async createProof(req, res,next){ + try { + if (!req.file) throw { name: "CustomError", status: 400, message: "Image is required" }; + + const mimetype = req.file.mimetype; + const data = Buffer.from(req.file.buffer).toString('base64'); + const dataURI = `data:${mimetype};base64,${data}`; + + const result = await cloudinary.uploader.upload(dataURI, { + public_id: "poke", + }); + + const proof = await Proof.findByPk(req.params.id); + if (!proof) throw { name: "NotFound" }; + + await proof.create({ imgUrl: result.secure_url }); + res.status(201).json({ message: `Image successfully created` }); } catch (error) { next(error); } }} -odule.exports = ProofCon:q -troller; +module.exports = ProofController; diff --git a/Server/router/cart.js b/Server/router/cart.js index 38782cc..59659c0 100644 --- a/Server/router/cart.js +++ b/Server/router/cart.js @@ -7,9 +7,9 @@ const authentication = require("../middlewares/authentication"); router.use(authentication); router.get("/", CartController.getAllItems); - +router.get("/:id", CartController.getItemById); router.post("/", CartController.createItems); router.put("/:id", CartController.updateItemById); router.delete("/:id", CartController.deleteItemById); -module.exports = router \ No newline at end of file +module.exports = router From 94a66e4620c95f21d0e02da901a6a212205b86f3 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 16:24:38 +0700 Subject: [PATCH 35/36] fix:data --- Server/Controllers/CartController.js | 4 ++++ Server/Controllers/ProofController.js | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Server/Controllers/CartController.js b/Server/Controllers/CartController.js index 2e1305c..cd1c96a 100644 --- a/Server/Controllers/CartController.js +++ b/Server/Controllers/CartController.js @@ -4,6 +4,10 @@ class CartController{ static async getAllItems(req, res, next) { try { const items = await Cart.findAll({ + where: { + userId: req.user.id + }, + include: { model: Product, } diff --git a/Server/Controllers/ProofController.js b/Server/Controllers/ProofController.js index 2bb2765..6bac026 100644 --- a/Server/Controllers/ProofController.js +++ b/Server/Controllers/ProofController.js @@ -27,8 +27,8 @@ class ProofController { const proof = await Proof.findByPk(req.params.id); if (!proof) throw { name: "NotFound" }; - await proof.update({ imgUrl: result.secure_url }); - res.status(200).json({ message: `Image successfully updated` }); + await proof.create({ imgUrl: result.secure_url }); + res.status(201).json({ message: `Image successfully created` }); } catch (error) { next(error); } From ddb61ceb43520cabf27bfa1dade93ba051978883 Mon Sep 17 00:00:00 2001 From: carloshakim00 Date: Fri, 15 Mar 2024 16:29:22 +0700 Subject: [PATCH 36/36] fix:data --- Client/package-lock.json | 57 +++++++++++++++++++++++ Client/package.json | 2 + Client/src/App.jsx | 1 - Client/src/components/CheckOut.jsx | 39 +++++++++------- Client/src/components/Leaflet.jsx | 23 +++++++++ Client/src/components/Login.jsx | 4 +- Client/src/components/UserProductCard.jsx | 1 + Client/src/store.js | 1 + Client/src/utils/toast.js | 16 ++++--- Client/src/views/AboutUs.jsx | 2 + Client/src/views/UserAboutUs.jsx | 2 + 11 files changed, 123 insertions(+), 25 deletions(-) create mode 100644 Client/src/components/Leaflet.jsx create mode 100644 Client/src/store.js diff --git a/Client/package-lock.json b/Client/package-lock.json index 4e1a1b8..cd2260a 100644 --- a/Client/package-lock.json +++ b/Client/package-lock.json @@ -8,8 +8,10 @@ "name": "client", "version": "0.0.0", "dependencies": { + "@reduxjs/toolkit": "^2.2.1", "@tabler/icons-react": "^3.0.3", "axios": "^1.6.7", + "leaflet": "^1.9.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.0", @@ -645,6 +647,29 @@ "node": ">=14" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz", + "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "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.15.3", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", @@ -2633,6 +2658,15 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz", + "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==", + "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", @@ -3151,6 +3185,11 @@ "json-buffer": "3.0.1" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3939,6 +3978,19 @@ "node": ">=8.10.0" } }, + "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.5", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", @@ -3978,6 +4030,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/reselect": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", + "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", diff --git a/Client/package.json b/Client/package.json index 6e26824..6097d7d 100644 --- a/Client/package.json +++ b/Client/package.json @@ -10,8 +10,10 @@ "preview": "vite preview" }, "dependencies": { + "@reduxjs/toolkit": "^2.2.1", "@tabler/icons-react": "^3.0.3", "axios": "^1.6.7", + "leaflet": "^1.9.4", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.0", diff --git a/Client/src/App.jsx b/Client/src/App.jsx index 81a8652..c79ac7c 100644 --- a/Client/src/App.jsx +++ b/Client/src/App.jsx @@ -1,6 +1,5 @@ import { RouterProvider } from "react-router-dom" import router from "./routers/index" - function App() { return ( diff --git a/Client/src/components/CheckOut.jsx b/Client/src/components/CheckOut.jsx index 0ebde7c..878469c 100644 --- a/Client/src/components/CheckOut.jsx +++ b/Client/src/components/CheckOut.jsx @@ -7,31 +7,38 @@ export default function CheckOut() { const navigate = useNavigate(); const handleOnUpload = async () => { - try { - const formData = new FormData(); - formData.append("image", file); - formData.append("name", "pokee"); - - await axios.post(`https://medshop.carloshakim.online/proof`, formData, { - headers: { - "Content-Type": "multipart/form-data", - Authorization: `Bearer ${localStorage.getItem("token")}`, - }, - }); - - navigate('/products/done'); - } catch (error) { - console.error(error); + if(file){ + try { + const formData = new FormData(); + formData.append("image", file); + formData.append("name", "pokee"); + + await axios.post(`https://medshop.carloshakim.online/proof`, formData, { + headers: { + "Content-Type": "multipart/form-data", + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + + navigate('/products/done'); + } catch (error) { + console.error(error); + } } }; + const handleChangeInput = (event) => { + if(event.target.files && event.target.files[0]) { + setFile(event.target.files[0]); + } + } return (

Upload Proof of Purchase

setFile(e.target.files[0])} + onChange={handleChangeInput} type="file" className="border border-gray-300 p-2 w-full" id="inputGroupFile02" diff --git a/Client/src/components/Leaflet.jsx b/Client/src/components/Leaflet.jsx new file mode 100644 index 0000000..8277a99 --- /dev/null +++ b/Client/src/components/Leaflet.jsx @@ -0,0 +1,23 @@ +import { useEffect } from 'react'; +import 'leaflet/dist/leaflet.css'; +import L from 'leaflet'; + +function Map() { + useEffect(() => { + const map = L.map('map').setView([3.5897, 98.6731], 13); + + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(map); + + L.marker([3.5897, 98.6731]).addTo(map) + .bindPopup('Medan, Indonesia') + .openPopup(); + }, []); + + return ( +
+ ); +} + +export default Map; diff --git a/Client/src/components/Login.jsx b/Client/src/components/Login.jsx index e84c421..074f362 100644 --- a/Client/src/components/Login.jsx +++ b/Client/src/components/Login.jsx @@ -153,12 +153,12 @@ useEffect(() => { >
-

+

Dont Have an Account? Register

-
- or -
+
- or -
diff --git a/Client/src/components/UserProductCard.jsx b/Client/src/components/UserProductCard.jsx index b584739..aadc0a3 100644 --- a/Client/src/components/UserProductCard.jsx +++ b/Client/src/components/UserProductCard.jsx @@ -3,6 +3,7 @@ import Button from "./Button"; import { useNavigate } from "react-router-dom"; import axios from "axios"; +// eslint-disable-next-line react/prop-types const UserProductCard = ({ id, name, price, imageUrl, updatedAt, handleOnDetail }) => { const navigate = useNavigate(); const handleClick = () => { diff --git a/Client/src/store.js b/Client/src/store.js new file mode 100644 index 0000000..8413d07 --- /dev/null +++ b/Client/src/store.js @@ -0,0 +1 @@ +import configure \ No newline at end of file diff --git a/Client/src/utils/toast.js b/Client/src/utils/toast.js index 623917d..7c714c0 100644 --- a/Client/src/utils/toast.js +++ b/Client/src/utils/toast.js @@ -1,17 +1,21 @@ import Toastify from 'toastify-js'; -export default function showToast(message ) { +export default function showToast(message) { Toastify({ text: message, duration: 3000, close: true, - gravity: "top", - position: "right", - stopOnFocus: true, + gravity: 'top', + position: 'right', + stopOnFocus: true, style: { background: - "linear-gradient(90deg, rgba(237,113,148,1) 0%, rgba(217,8,73,1) 35%, rgba(93,4,6,1) 100%)", + 'linear-gradient(90deg, rgba(237,113,148,1) 0%, rgba(217,8,73,1) 35%, rgba(93,4,6,1) 100%)', + position: 'absolute', + top: '10px', + right: '10px', + zIndex: '9999', }, onClick: function () {}, }).showToast(); -} \ No newline at end of file +} diff --git a/Client/src/views/AboutUs.jsx b/Client/src/views/AboutUs.jsx index ecb1b7d..db6d4bc 100644 --- a/Client/src/views/AboutUs.jsx +++ b/Client/src/views/AboutUs.jsx @@ -1,3 +1,4 @@ +import Map from "../components/Leaflet"; export default function AboutUs() { @@ -15,6 +16,7 @@ export default function AboutUs() { Temukan solusi kesehatan terbaik untuk Anda dan keluarga di Apotik Online kami.

+
); } diff --git a/Client/src/views/UserAboutUs.jsx b/Client/src/views/UserAboutUs.jsx index 481fafa..5ee80b3 100644 --- a/Client/src/views/UserAboutUs.jsx +++ b/Client/src/views/UserAboutUs.jsx @@ -1,3 +1,4 @@ +import Map from "../components/Leaflet"; export default function UserAboutUs() { @@ -15,6 +16,7 @@ export default function UserAboutUs() { Temukan solusi kesehatan terbaik untuk Anda dan keluarga di Apotik Online kami.

+
); }