From 687a3c922ca09aa55d2fb38501d9d0782bbbbe88 Mon Sep 17 00:00:00 2001 From: BinarySandia04 Date: Tue, 17 Mar 2026 00:22:54 +0100 Subject: [PATCH] Yes --- README.md | 4 +- aranroig/app/app.vue | 8 +- aranroig/app/assets/css/colors.scss | 12 +- aranroig/app/components/Container.vue | 1 + aranroig/app/components/Sprite.vue | 49 + aranroig/app/pages/index.vue | 73 +- aranroig/i18n/locales/ca.json | 0 aranroig/i18n/locales/en.json | 0 aranroig/i18n/locales/es.json | 0 aranroig/nuxt.config.ts | 12 + aranroig/public/sprites/alfadir/frame1.png | Bin 0 -> 24389 bytes backend/.env.example | 3 + backend/.gitignore | 16 + backend/package-lock.json | 1368 ++++++++++++++++++++ backend/package.json | 18 + backend/src/db.js | 14 + backend/src/index.js | 16 + ecosystem.config.js | 22 + 18 files changed, 1573 insertions(+), 43 deletions(-) create mode 100644 aranroig/app/components/Sprite.vue create mode 100644 aranroig/i18n/locales/ca.json create mode 100644 aranroig/i18n/locales/en.json create mode 100644 aranroig/i18n/locales/es.json create mode 100644 aranroig/public/sprites/alfadir/frame1.png create mode 100644 backend/.env.example create mode 100644 backend/.gitignore create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/src/db.js create mode 100644 backend/src/index.js create mode 100644 ecosystem.config.js diff --git a/README.md b/README.md index 1c066ea..ff522d1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # aranroig.com -Text +Code for the website! + +There is also code for the backend \ No newline at end of file diff --git a/aranroig/app/app.vue b/aranroig/app/app.vue index c0c5985..dcaec3b 100644 --- a/aranroig/app/app.vue +++ b/aranroig/app/app.vue @@ -25,13 +25,13 @@ onMounted(() => { \ No newline at end of file diff --git a/aranroig/app/assets/css/colors.scss b/aranroig/app/assets/css/colors.scss index 17d91ab..6a35bb6 100644 --- a/aranroig/app/assets/css/colors.scss +++ b/aranroig/app/assets/css/colors.scss @@ -1,11 +1,11 @@ $themes: ( dark: ( - background: #1e1e1e, - background-line: #2e2e2e, - background-fore: #0f0f10, - border-color: #5a5a5a, - text: #ffffff, - link: #ff7d74, + background: #141414, + background-line: #202324, + background-fore: #10141f, + border-color: #819796, + text: #ebede9, + link: #a4dddb, ), light: ( background: #ffffff, diff --git a/aranroig/app/components/Container.vue b/aranroig/app/components/Container.vue index 61409a8..1499585 100644 --- a/aranroig/app/components/Container.vue +++ b/aranroig/app/components/Container.vue @@ -15,6 +15,7 @@ $separation: 2px; .card{ position: relative; + margin: 15px; background: var(--color-background-fore); padding: 8px 24px; color: white; diff --git a/aranroig/app/components/Sprite.vue b/aranroig/app/components/Sprite.vue new file mode 100644 index 0000000..b292aed --- /dev/null +++ b/aranroig/app/components/Sprite.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/aranroig/app/pages/index.vue b/aranroig/app/pages/index.vue index 96ab93c..56d8347 100644 --- a/aranroig/app/pages/index.vue +++ b/aranroig/app/pages/index.vue @@ -1,9 +1,9 @@ - - \ No newline at end of file diff --git a/aranroig/i18n/locales/ca.json b/aranroig/i18n/locales/ca.json new file mode 100644 index 0000000..e69de29 diff --git a/aranroig/i18n/locales/en.json b/aranroig/i18n/locales/en.json new file mode 100644 index 0000000..e69de29 diff --git a/aranroig/i18n/locales/es.json b/aranroig/i18n/locales/es.json new file mode 100644 index 0000000..e69de29 diff --git a/aranroig/nuxt.config.ts b/aranroig/nuxt.config.ts index f4560a8..52a6f0f 100644 --- a/aranroig/nuxt.config.ts +++ b/aranroig/nuxt.config.ts @@ -7,4 +7,16 @@ export default defineNuxtConfig({ '~/assets/css/fonts.scss', '~/assets/css/main.scss' ], + +/* + i18n: { + locales: [ + { code: 'en', iso: 'en-US', name: 'English', file: 'en.json' }, + { code: 'es', iso: 'es-ES', name: 'Spanish', file: 'es.json' }, + { code: 'ca', iso: 'ca-ES', nane: 'Catalan', file: 'ca.json' } + ], + defaultLocale: 'en', + langDir: 'locales/' + }, + */ }) diff --git a/aranroig/public/sprites/alfadir/frame1.png b/aranroig/public/sprites/alfadir/frame1.png new file mode 100644 index 0000000000000000000000000000000000000000..210ba98ad11291e55c3e9e18f736d674eeb0a010 GIT binary patch literal 24389 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
sNfm)=w0SgQe<^F_FGU8< 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 literal 0 HcmV?d00001 diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..82f370c --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,3 @@ +PORT=5000 +DB_URI=mongodb://localhost:27017/ +NODE_ENV=development \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..5cda39e --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,16 @@ +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..fdac6f8 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,1368 @@ +{ + "name": "backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^17.3.1", + "express": "^5.2.1", + "mongoose": "^9.3.0", + "nodemon": "^3.1.14" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz", + "integrity": "sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-7.2.0.tgz", + "integrity": "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "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/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-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==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/kareem": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.2.0.tgz", + "integrity": "sha512-VS8MWZz/cT+SqBCpVfNN4zoVz5VskR3N4+sTmUXme55e9avQHntpwpNq0yjnosISXqwJ3AQVjlbI4Dyzv//JtA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mongodb": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.0.tgz", + "integrity": "sha512-kMfnKunbolQYwCIyrkxNJFB4Ypy91pYqua5NargS/f8ODNSJxT03ZU3n1JqL4mCzbSih8tvmMEMLpKTT7x5gCg==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^7.1.1", + "mongodb-connection-string-url": "^7.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.806.0", + "@mongodb-js/zstd": "^7.0.0", + "gcp-metadata": "^7.0.1", + "kerberos": "^7.0.0", + "mongodb-client-encryption": ">=7.0.0 <7.1.0", + "snappy": "^7.3.2", + "socks": "^2.8.6" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz", + "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^13.0.0", + "whatwg-url": "^14.1.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/mongoose": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.3.0.tgz", + "integrity": "sha512-Tv2p3DLBkftoGFp+VM/19k0t0RYPAAYjGIbCVGlV6Tf5Dnq6TICfYyeKeYvwQ06nK9sRDvymP3B+tjGHnUlaxw==", + "license": "MIT", + "dependencies": { + "kareem": "3.2.0", + "mongodb": "~7.1", + "mpath": "0.9.0", + "mquery": "6.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.0.tgz", + "integrity": "sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "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/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.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==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..6473717 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,18 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "", + "license": "ISC", + "author": "", + "type": "commonjs", + "main": "src/index.js", + "scripts": { + "dev": "nodemon src/index.js" + }, + "dependencies": { + "dotenv": "^17.3.1", + "express": "^5.2.1", + "mongoose": "^9.3.0", + "nodemon": "^3.1.14" + } +} diff --git a/backend/src/db.js b/backend/src/db.js new file mode 100644 index 0000000..6a0b81d --- /dev/null +++ b/backend/src/db.js @@ -0,0 +1,14 @@ +const mongoose = require("mongoose"); + +const connectDB = async () => { + try { + await mongoose.connect(process.env.DB_URI); + + console.log("MongoDB connected"); + } catch (error) { + console.error("MongoDB connection error:", error); + process.exit(1); + } +}; + +module.exports = connectDB; \ No newline at end of file diff --git a/backend/src/index.js b/backend/src/index.js new file mode 100644 index 0000000..68d0c26 --- /dev/null +++ b/backend/src/index.js @@ -0,0 +1,16 @@ +const express = require("express"); + +require('dotenv').config(); +const app = express(); +const connectDB = require("./db"); + +// connect database +connectDB(); + +app.get("/", (req, res) => { + res.send("Hello from Proxmox container!"); +}); + +app.listen(5000, () => { + console.log("Server running on port 5000"); +}); \ No newline at end of file diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..b192be5 --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,22 @@ +module.exports = { + apps: [ + { + name: "backend", + cwd: "./backend", + script: "npm", + args: "start", + env: { + NODE_ENV: "production" + } + }, + { + name: "frontend", + cwd: "./aranroig", + script: "npm", + args: "start", + env: { + NODE_ENV: "production" + } + } + ] +}; \ No newline at end of file