├── assets
├── splash.png
├── adaptive-icon.png
├── images
│ ├── table.jpg
│ ├── flowerpfp.jpg
│ └── profiliblu.jpg
├── fonts
│ ├── Inter-Black.ttf
│ ├── Inter-Bold.ttf
│ ├── Inter-Light.ttf
│ ├── Inter-Thin.ttf
│ ├── Inter-Medium.ttf
│ ├── Inter-Regular.ttf
│ ├── Inter-SemiBold.ttf
│ ├── Inter-ExtraBold.ttf
│ └── Inter-ExtraLight.ttf
├── i18n
│ ├── translations
│ │ ├── index.ts
│ │ ├── en.json
│ │ ├── al.json
│ │ └── fr.json
│ └── i18n.config.js
└── axios.js
├── tsconfig.json
├── backend
├── .env
├── dbTodo.js
├── package.json
├── controllers
│ └── todoController.js
├── server.js
└── package-lock.json
├── babel.config.js
├── Components
├── Calendar.js
├── theme.js
├── data.js
├── ThemeProvider.js
├── images.js
└── task.js
├── .vscode
└── settings.json
├── metro.config.js
├── screens
├── index.js
├── Profile.js
├── Settings.js
├── Home.js
├── Portfolio.js
└── EditProfile.js
├── azure-pipelines.yml
├── .gitignore
├── app.json
├── README.md
├── package.json
└── App.js
/assets/splash.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/adaptive-icon.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {},
3 | "extends": "expo/tsconfig.base"
4 | }
5 |
--------------------------------------------------------------------------------
/assets/images/table.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/images/table.jpg
--------------------------------------------------------------------------------
/assets/fonts/Inter-Black.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-Black.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-Light.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-Thin.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-Thin.ttf
--------------------------------------------------------------------------------
/assets/images/flowerpfp.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/images/flowerpfp.jpg
--------------------------------------------------------------------------------
/assets/images/profiliblu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/images/profiliblu.jpg
--------------------------------------------------------------------------------
/assets/fonts/Inter-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-Medium.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-SemiBold.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-ExtraBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-ExtraBold.ttf
--------------------------------------------------------------------------------
/assets/fonts/Inter-ExtraLight.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alteakapxhiu/TaskPro/HEAD/assets/fonts/Inter-ExtraLight.ttf
--------------------------------------------------------------------------------
/backend/.env:
--------------------------------------------------------------------------------
1 | PORT=8000
2 | DB_URL='mongodb+srv://alteakapxhiu:5november2004@cluster0.bt5t38r.mongodb.net/ToDos?retryWrites=true&w=majority
3 | '
4 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | module.exports = function(api) {
4 | api.cache(true);
5 | return {
6 | presets: ['babel-preset-expo'],
7 | };
8 | };
9 |
--------------------------------------------------------------------------------
/Components/Calendar.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | const Cal = () => {
4 | return (
5 |
Cal
6 | )
7 | }
8 | export default Cal
--------------------------------------------------------------------------------
/assets/i18n/translations/index.ts:
--------------------------------------------------------------------------------
1 | export {default as en} from './en.json'
2 | export {default as al} from './al.json'
3 | export {default as fr} from './fr.json'
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "vscode-pets.petSize": "medium",
3 | "vscode-pets.theme": "none",
4 | "vscode-pets.throwBallWithMouse": true,
5 | "vscode-pets.petColor": "akita"
6 | }
--------------------------------------------------------------------------------
/assets/axios.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | const instance = axios.create({
4 | baseURL: 'http://10.0.2.2:8000',
5 | timeout: 10000, // Increase timeout to 15 seconds
6 | });
7 |
8 | export default instance;
9 |
--------------------------------------------------------------------------------
/metro.config.js:
--------------------------------------------------------------------------------
1 | const { getDefaultConfig } = require('expo/metro-config');
2 |
3 | const defaultConfig = getDefaultConfig(__dirname);
4 |
5 | module.exports = {
6 | ...defaultConfig,
7 | resolver: {
8 | sourceExts: ['js','json','ts','tsx','jsx','cjs'],
9 | },
10 | };
--------------------------------------------------------------------------------
/screens/index.js:
--------------------------------------------------------------------------------
1 | import Home from "./Home"
2 | import Settings from "./Settings"
3 | import Portfolio from "./Portfolio"
4 | import Profile from "./Profile"
5 | import EditProfile from "./EditProfile"
6 | import '../assets/i18n/i18n.config'
7 |
8 | export{
9 | Home,
10 | Portfolio,
11 | Profile,
12 | Settings,
13 | EditProfile,
14 | }
--------------------------------------------------------------------------------
/Components/theme.js:
--------------------------------------------------------------------------------
1 | import { background } from "./data";
2 |
3 | // themes.js
4 | export const lightTheme = {
5 | backgroundColor: '#1A1A1A',
6 | color: '#FAFAFA',
7 | // Add other properties as needed
8 | };
9 |
10 | export const darkColors = {
11 | backgroundColor: '#FAFAFA',
12 | color: '#1A1A1A',
13 | // Add other properties as needed
14 | };
15 |
--------------------------------------------------------------------------------
/backend/dbTodo.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 |
3 | const todoSchema = mongoose.Schema(
4 | {
5 | text: {
6 | type: String,
7 | required: true
8 | },
9 | completed: {
10 | type: Boolean,
11 | required: true
12 | },
13 | },
14 | { timestamps: true }
15 | );
16 |
17 | module.exports = mongoose.model('Todo', todoSchema);
18 |
--------------------------------------------------------------------------------
/Components/data.js:
--------------------------------------------------------------------------------
1 | import images from "./images";
2 |
3 |
4 | export const imagesDataURL = [ 'https://i0.wp.com/i.pinimg.com/474x/b7/cf/46/b7cf46c96e503fdec995645e70d95705.jpg' ]
5 | export const images1DataURL = [ 'https://i.pinimg.com/474x/74/0e/cb/740ecb78aa4c10cb0a2170ea2350c337.jpg' ]
6 | export const profile = ['https://i.pinimg.com/474x/74/0e/cb/740ecb78aa4c10cb0a2170ea2350c337.jpg']
7 | export const background = [ 'https://i.pinimg.com/474x/74/0e/cb/740ecb78aa4c10cb0a2170ea2350c337.jpg' ]
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "main": "server.js",
5 | "scripts": {
6 | "test": "echo \"Error: no test specified\" && exit 1",
7 | "start": "node server.js"
8 | },
9 | "author": "Altea",
10 | "license": "ISC",
11 | "description": "",
12 | "dependencies": {
13 | "axios-retry": "^4.4.1",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.4.5",
16 | "express": "^4.19.2",
17 | "mongoose": "^8.5.1"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/azure-pipelines.yml:
--------------------------------------------------------------------------------
1 | # Node.js
2 | # Build a general Node.js project with npm.
3 | # Add steps that analyze code, save build artifacts, deploy, and more:
4 | # https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
5 |
6 | trigger:
7 | - main
8 |
9 | pool:
10 | vmImage: ubuntu-latest
11 |
12 | steps:
13 | - task: NodeTool@0
14 | inputs:
15 | versionSpec: '10.x'
16 | displayName: 'Install Node.js'
17 |
18 | - script: |
19 | npm install
20 | npm run build
21 | displayName: 'npm install and build'
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
2 |
3 | # dependencies
4 | node_modules/
5 |
6 | # Expo
7 | .expo/
8 | dist/
9 | web-build/
10 |
11 | # Native
12 | *.orig.*
13 | *.jks
14 | *.p8
15 | *.p12
16 | *.key
17 | *.mobileprovision
18 |
19 | # Metro
20 | .metro-health-check*
21 |
22 | # debug
23 | npm-debug.*
24 | yarn-debug.*
25 | yarn-error.*
26 |
27 | # macOS
28 | .DS_Store
29 | *.pem
30 |
31 | # local env files
32 | .env*.local
33 |
34 | # typescript
35 | *.tsbuildinfo
36 |
--------------------------------------------------------------------------------
/Components/ThemeProvider.js:
--------------------------------------------------------------------------------
1 | // ThemeContext.js
2 | import React, { createContext, useContext, useState } from 'react';
3 |
4 | const ThemeContext = createContext();
5 |
6 | export const ThemeProvider = ({ children }) => {
7 | const [darkMode, setDarkMode] = useState(false);
8 |
9 | const toggleDarkMode = () => {
10 | setDarkMode((prevMode) => !prevMode);
11 | };
12 |
13 | return (
14 |
15 | {children}
16 |
17 | );
18 | };
19 |
20 | export const useTheme = () => useContext(ThemeContext);
21 |
--------------------------------------------------------------------------------
/Components/images.js:
--------------------------------------------------------------------------------
1 | {/*const profile = require("../assets/images/profile.jpg");
2 | const cover = require("../assets/images/cover.jpg");
3 | const photo1 = require("../assets/images/photo1.jpg");
4 | const photo2 = require("../assets/images/photo2.jpg");
5 | const photo3 = require("../assets/images/photo3.jpg");
6 | const photo4 = require("../assets/images/photo4.jpg");
7 | const photo5 = require("../assets/images/photo5.jpg");
8 | const photo6 = require("../assets/images/photo6.jpg");
9 |
10 | export default {
11 | profile,
12 | cover,
13 | photo1,
14 | photo2,
15 | photo3,
16 | photo4,
17 | photo5,
18 | photo6
19 | }*/}
20 |
21 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "expo": {
3 | "name": "todoList",
4 | "slug": "todoList",
5 | "version": "1.0.0",
6 | "orientation": "portrait",
7 |
8 | "userInterfaceStyle": "light",
9 | "splash": {
10 | "image": "./assets/splash.png",
11 | "resizeMode": "contain",
12 | "backgroundColor": "#ffffff"
13 | },
14 | "ios": {
15 | "supportsTablet": true
16 | },
17 | "android": {
18 | "adaptiveIcon": {
19 | "foregroundImage": "./assets/adaptive-icon.png",
20 | "backgroundColor": "#ffffff"
21 | }
22 | },
23 | "web": {
24 | "favicon": "./assets/favicon.png"
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/backend/controllers/todoController.js:
--------------------------------------------------------------------------------
1 | // controllers/todoController.js
2 | const getTodos = (req, res) => {
3 | // Logic to get todos
4 | res.send('Get todos');
5 | };
6 |
7 | const createTodo = (req, res) => {
8 | // Logic to create a todo
9 | res.send('Create todo');
10 | };
11 |
12 | const updateTodo = (req, res) => {
13 | // Logic to update a todo
14 | res.send(`Update todo with id ${req.params.id}`);
15 | };
16 |
17 | const deleteTodos = (req, res) => {
18 | // Logic to delete a todo
19 | res.send(`Delete todo with id ${req.params.id}`);
20 | };
21 |
22 | module.exports = {
23 | getTodos,
24 | createTodo,
25 | updateTodo,
26 | deleteTodos,
27 | };
28 |
--------------------------------------------------------------------------------
/assets/i18n/i18n.config.js:
--------------------------------------------------------------------------------
1 | import i18next from 'i18next';
2 | import { initReactI18next } from 'react-i18next';
3 | import en from '../i18n/translations/en.json';
4 | import fr from '../i18n/translations/fr.json';
5 | import al from '../i18n/translations/al.json';
6 |
7 | const resources = {
8 | en: {
9 | translation: en,
10 | },
11 | fr: {
12 | translation: fr,
13 | },
14 | al: {
15 | translation: al,
16 | },
17 | };
18 |
19 | i18next
20 | .use(initReactI18next)
21 | .init({
22 | debug: true,
23 | lng: 'al', // default language
24 | fallbackLng: 'en', // fallback language
25 | interpolation: {
26 | escapeValue: false, // react already safes from xss
27 | },
28 | resources,
29 | });
30 |
31 | export default i18next;
32 |
--------------------------------------------------------------------------------
/assets/i18n/translations/en.json:
--------------------------------------------------------------------------------
1 | {"TaskTittle":"Quick Note",
2 | "Subtittle" : "What will you achieve today?",
3 | "TaskInputField" : "Drop a thought..",
4 | "Work":"Work",
5 | "Personal":"Personal",
6 | "School":"School",
7 | "Settings":"Settings",
8 | "Profili":"Profile",
9 | "SSubtittle":"Update your preferences here",
10 | "Preferences":"Preferences",
11 | "Help":"Help",
12 | "Content":"Content",
13 | "Gjuha":"Language",
14 | "Ndrysho Sfondin":"Dark Mode",
15 | "Perdor Wi-Fi":"Use Wi-Fi",
16 | "Raporto nje problem":"Report a problem",
17 | "Me Kontakto":"Contact Me",
18 | "Ruaj":"Save",
19 | "Shkarko":"Download",
20 | "Ndrysho Profilin":" Edit Profile",
21 | "Siguria":"Security",
22 | "Njoftimet":"Notifications",
23 | "Privatesia":"Privacy",
24 | "Perditesoni kredencialet tuaja ketu":"Edit profile settings",
25 | "Kalendari":"Calendar",
26 | "Perzgjidhni eventet gjate dites suaj ketu":"Select your most important events here",
27 | "Emri i eventit":"Event Name",
28 | "Zgjidh daten e eventit":"Choose event date",
29 | "SHTO EVENTIN":"ADD EVENT",
30 | "Sot s'ka asnje event te shenuar":"Today there is no event marked",
31 | "Emri":"Name",
32 | "Fjalekalimi":"Password",
33 | "Datelindje":"Birthday",
34 | "Vendi":"Country",
35 | "Ruaj Ndryshimet":"Save Changes",
36 | "ZGJIDH":"SELECT"
37 |
38 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ToDoList and Agenda Tracker App
2 |
3 | ## Preview of Main Components and Functionalities
4 |
5 | * 📱 **REACT-NATIVE (EXPO)**
6 | * 🟢 **NODEJS**
7 | * 🍃 **MONGODB**
8 |
9 | This is a React Native app built with Expo. Follow the instructions below to clone and run the app on your local machine.
10 |
11 | ## Pre-Installations
12 |
13 | Before you begin, ensure you have pre installed :
14 |
15 | - **Node.js**: Download and install the latest version of [Node.js](https://nodejs.org/).
16 | - **npm**: npm comes with Node.js. Alternatively, you can use [Yarn](https://yarnpkg.com/).
17 | - **Expo CLI**: Install Expo CLI globally using npm or Yarn.
18 |
19 | ```
20 | npm install -g expo-cli
21 | # or
22 | yarn global add expo-cli
23 |
24 | ## Getting Started
25 | Follow these steps to set up the project locally:
26 |
27 | 1. **Clone the repository**
28 |
29 | Open your terminal and run the following command:
30 |
31 |
32 | git clone https://github.com/alteakapxhiu/TaskPro.git
33 | cd TaskPro
34 | Install dependencies
35 |
36 |
37 | npm install
38 | # or
39 | yarn install
40 |
41 | 3.Start the Expo development server
42 | Run the following command to start the Expo development server:
43 |
44 | expo start
45 |
--------------------------------------------------------------------------------
/backend/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const cors = require('cors');
3 | const mongoose = require('mongoose');
4 | const dotenv = require('dotenv');
5 |
6 | const {
7 | getTodos,
8 | createTodo,
9 | updateTodo,
10 | deleteTodos,
11 | } = require('./controllers/todoController');
12 |
13 |
14 | dotenv.config();
15 |
16 | // App config
17 | const app = express();
18 | const PORT = process.env.PORT || 8000;
19 |
20 | // Middleware
21 | app.use(cors());
22 | app.use(express.json());
23 |
24 | // Database connection
25 | const uri = process.env.DB_URL;
26 | mongoose.connect(uri)
27 | .then(() => {
28 | console.log("DB Connected");
29 | app.listen(PORT, '0.0.0.0', () => {
30 | console.log(`Server started at port ${PORT}`);
31 | });
32 | })
33 | .catch(err => {
34 | console.error("DB Connection Error:", err);
35 | });
36 |
37 | // Routes
38 | app.get('/', (req, res) => {
39 | res.send('Server is running');
40 | });
41 |
42 | // API ENDPOINTS
43 | app.get('/todos', getTodos);
44 | app.post('/todos', createTodo);
45 | app.put('/todos/:id', updateTodo);
46 | app.delete('/todos/:id', deleteTodos);
47 |
48 | // Error handling middleware
49 | app.use((err, req, res, next) => {
50 | console.error(err.stack);
51 | res.status(500).send('Something broke!');
52 | });
53 |
--------------------------------------------------------------------------------
/assets/i18n/translations/al.json:
--------------------------------------------------------------------------------
1 | {
2 | "TaskTittle":"Blloku i Shenimeve",
3 | "Subtittle" : "Cfare synon te arrish sot?",
4 | "Work":"Pune",
5 | "Personal":"Personale",
6 | "School":"Shkolle",
7 | "TaskInputField" : "Hidh nje shenim..",
8 | "Settings":"Parametrat",
9 | "Profili":"Profili",
10 | "SSubtittle":"Perditesoni te dhenat tuaja ketu",
11 | "Preferences":"Preferencat",
12 | "Help":"Ndihme",
13 | "Content":"Permbajtja",
14 | "Gjuha":"Gjuha",
15 | "Ndrysho Sfondin":"Ndrysho Sfondin",
16 | "Perdor Wi-Fi":"Perdor Wi-Fi",
17 | "Raporto nje problem":"Raporto nje problem",
18 | "Me Kontakto":"Me Kontakto",
19 | "Ruaj":"Ruaj",
20 | "Shkarko":"Shkarko",
21 | "Siguria":"Siguria",
22 | "Njoftimet":"Njoftimet",
23 | "Privatesia":"Privatesia",
24 | "Ndrysho Profilin":"Ndrysho Profilin",
25 | "Perditesoni kredencialet tuaja ketu":"Perditesoni kredencialet tuaja ketu",
26 | "Kalendari":"Kalendari",
27 | "Perzgjidhni eventet gjate dites suaj ketu":"Perzgjidhni eventet gjate dites suaj ketu",
28 | "Emri i eventit":"Emri i eventit",
29 | "Zgjidh daten e eventit":"Zgjidh daten e eventit",
30 | "SHTO EVENTIN":"SHTO EVENTIN",
31 | "Sot s'ka asnje event te shenuar":"Sot s'ka asnje event te shenuar",
32 | "Emri":"Emri",
33 | "Fjalekalimi":"Fjalekalimi",
34 | "Datelindje":"Datelindje",
35 | "Vendi":"Vendi",
36 | "Ruaj Ndryshimet":"Ruaj Ndryshimet",
37 | "ZGJIDH":"ZGJIDH"
38 |
39 | }
--------------------------------------------------------------------------------
/assets/i18n/translations/fr.json:
--------------------------------------------------------------------------------
1 | {
2 | "TaskTittle": "Note rapide",
3 | "Subtittle" : "Qu’allez-vous réaliser aujourd’hui ?",
4 | "Work":"Travail",
5 | "Personal":"Personnel",
6 | "School":"École",
7 | "TaskInputField": "Déposez une note..",
8 | "Settings": "Paramètres",
9 | "Profili":"Profil",
10 | "SSubtittle":"Mettez à jour vos préférences ici",
11 | "Preferences":"Préférences",
12 | "Help":"À l'aide",
13 | "Content":"Contenu",
14 | "Gjuha":"Langue",
15 | "Ndrysho Sfondin":"Mode sombre",
16 | "Perdor Wi-Fi":"Utliser Wi-Fi",
17 | "Raporto nje problem":"Signaler un problème",
18 | "Me Kontakto":"Contactez-moi",
19 | "Ruaj":"Enregistrer",
20 | "Shkarko":"Télécharger",
21 | "Siguria":"Sécurité",
22 | "Njoftimet":"L'avis",
23 | "Privatesia":"Confidentialité",
24 | "Ndrysho Profilin":"Modifier le profil",
25 | "Perditesoni kredencialet tuaja ketu":"Modifier les paramètres du profil",
26 | "Kalendari":"Calendrier",
27 | "Perzgjidhni eventet gjate dites suaj ketu":"Sélectionnez ici vos événements les plus importants",
28 | "Emri i eventit":"Nom de l'événement",
29 | "Zgjidh daten e eventit":"Choisissez la date de l'événement",
30 | "SHTO EVENTIN":"AJOUTER UN ÉVÈNEMENT",
31 | "Sot s'ka asnje event te shenuar":"Aujourd'hui, aucun événement n'est marqué",
32 | "Emri":"Nom",
33 | "Fjalekalimi":"Mot de passe",
34 | "Datelindje":"Anniversaire",
35 | "Vendi":"Pays",
36 | "Ruaj Ndryshimet":"Sauvegarder",
37 | "ZGJIDH":"SÉLECTIONNER"
38 |
39 | }
--------------------------------------------------------------------------------
/Components/task.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { View, Text, StyleSheet } from 'react-native';
3 | import { IconButton } from 'react-native-paper';
4 |
5 | const Task = (props) => {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 | {props.text}
13 |
14 |
15 |
16 |
17 |
23 |
29 |
30 |
31 | );
32 | };
33 |
34 | const styles = StyleSheet.create({
35 | item: {
36 | flexDirection: 'row',
37 | alignItems: 'center',
38 | backgroundColor: '#FFF',
39 | padding: 10,
40 | borderRadius: 10,
41 | marginBottom: 10,
42 | // Make sure item has enough space for text and icons
43 | justifyContent: 'space-between',
44 | },
45 | itemLeft: {
46 | flexDirection: 'row',
47 | alignItems: 'center',
48 | flex: 1, // Allow the text to use remaining space
49 | },
50 | square: {
51 | width: 24,
52 | height: 24,
53 | backgroundColor: '#5DA2A9',
54 | borderRadius: 5,
55 | marginRight: 15,
56 | },
57 | textWrapper: {
58 | flex: 1, // Allow text wrapper to use remaining space
59 | },
60 | itemText: {
61 | fontSize: 16,
62 | flexWrap: 'wrap', // Allow text to wrap into multiple lines
63 | },
64 | crossedText: {
65 | textDecorationLine: 'line-through',
66 | color: '#A0A0A0',
67 | },
68 | iconContainer: {
69 | flexDirection: 'row',
70 | alignItems: 'center',
71 | },
72 | });
73 |
74 | export default Task;
75 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "todolist",
3 | "version": "1.0.0",
4 | "main": "expo/AppEntry.js",
5 | "scripts": {
6 | "start": "expo start",
7 | "android": "expo start --android",
8 | "ios": "expo start --ios",
9 | "dev": "nodemon server.js",
10 | "server": "node server.js",
11 | "web": "expo start --web"
12 | },
13 | "dependencies": {
14 | "@ant-design/react-native": "^4.2.0",
15 | "@emotion/react": "^11.13.0",
16 | "@emotion/styled": "^11.13.0",
17 | "@expo/vector-icons": "^14.0.2",
18 | "@mui/material": "^5.16.4",
19 | "@mui/x-date-pickers": "^7.11.0",
20 | "@react-native-community/cameraroll": "^4.1.2",
21 | "@react-native-community/datetimepicker": "^8.2.0",
22 | "@react-native-community/hooks": "^3.0.0",
23 | "@react-native-picker/picker": "^2.7.7",
24 | "@react-navigation/bottom-tabs": "^6.6.1",
25 | "@react-navigation/core": "^6.4.17",
26 | "@react-navigation/elements": "^1.3.31",
27 | "@react-navigation/native": "^6.1.18",
28 | "@react-navigation/stack": "^6.4.1",
29 | "axios": "^1.7.2",
30 | "bcrypt": "^5.1.1",
31 | "colors": "^1.4.0",
32 | "core-js": "^3.37.1",
33 | "cors": "^2.8.5",
34 | "date-fns": "^3.6.0",
35 | "datepicker": "^0.0.0",
36 | "dotenv": "^16.4.5",
37 | "expo": "^51.0.21",
38 | "expo-datepicker": "^1.0.23",
39 | "expo-image-picker": "^15.0.7",
40 | "expo-status-bar": "~1.12.1",
41 | "express": "^4.19.2",
42 | "glob": "^11.0.0",
43 | "i18next": "^23.12.2",
44 | "mongoose": "^8.5.1",
45 | "nanoid": "^5.0.7",
46 | "patch-package": "^8.0.0",
47 | "postinstall-postinstall": "^2.1.0",
48 | "react": "^18.2.0",
49 | "react-dom": "^18.2.0",
50 | "react-i18next": "^15.0.0",
51 | "react-icons": "^5.2.1",
52 | "react-native": "^0.74.3",
53 | "react-native-calendars": "^1.1305.0",
54 | "react-native-date-picker": "^5.0.4",
55 | "react-native-draggable-flatlist": "^4.0.1",
56 | "react-native-fs": "^2.20.0",
57 | "react-native-gesture-handler": "~2.16.1",
58 | "react-native-modal-datetime-picker": "^17.1.0",
59 | "react-native-modern-datepicker": "^1.0.0-beta.91",
60 | "react-native-paper": "^5.12.3",
61 | "react-native-reanimated": "~3.10.1",
62 | "react-native-safe-area-context": "4.10.5",
63 | "react-native-screens": "3.31.1",
64 | "react-native-share": "^10.2.1",
65 | "react-native-tab-view": "^3.5.2",
66 | "react-native-vector-icons": "^10.1.0",
67 | "react-native-wheel-picker": "^1.2.0",
68 | "rimraf": "^6.0.1",
69 | "typescript": "~5.3.3"
70 | },
71 | "devDependencies": {
72 | "@babel/core": "^7.20.0",
73 | "@types/react": "~18.2.79",
74 | "nodemon": "^3.1.4"
75 | },
76 | "private": true
77 | }
78 |
--------------------------------------------------------------------------------
/App.js:
--------------------------------------------------------------------------------
1 | import { StatusBar } from 'expo-status-bar';
2 | import { Keyboard, KeyboardAvoidingView, Platform, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
3 | import Task from './Components/task';
4 | import { NavigationContainer,DefaultTheme, DarkTheme, } from '@react-navigation/native';
5 | import {Provider as PaperProvider,DarkTheme as PaperDarkTheme} from 'react-native-paper';
6 | import { createStackNavigator } from '@react-navigation/stack';
7 | import { Home, Portfolio, Profile, Settings, EditProfile } from './screens';
8 | import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
9 | import React, { useState } from 'react';
10 | import { AntDesign, Ionicons, Entypo } from '@expo/vector-icons';
11 | import { enableScreens } from 'react-native-screens';
12 | import { ThemeProvider, useTheme } from './Components/ThemeProvider'
13 | import {useColorScheme} from 'react-native';
14 | import { darkColors,lightTheme } from './Components/theme';
15 | import { I18nextProvider, useTranslation } from 'react-i18next';
16 | import i18n from './assets/i18n/i18n.config.js';
17 |
18 | enableScreens();
19 |
20 | const Stack = createStackNavigator();
21 | const Tab = createBottomTabNavigator();
22 |
23 |
24 | const screenOptions = {
25 | tabBarShowLabel: false,
26 | headerShown: false,
27 | tabBarStyle: {
28 | position: 'absolute',
29 | bottom: 0,
30 | right: 0,
31 | left: 0,
32 | height: 90,
33 | backgroundColor: '#fff',
34 | },
35 | };
36 |
37 | const Tabs = () => {
38 | return (
39 |
40 | (
45 |
46 |
47 |
48 | ),
49 | }}
50 | />
51 | (
56 |
57 |
58 |
59 | ),
60 | }}
61 | />
62 | (
67 |
68 |
69 |
70 | ),
71 | }}
72 | />
73 | (
78 |
79 |
80 |
81 | ),
82 | }}
83 | />
84 |
85 | );
86 | };
87 |
88 | export default function App() {
89 | const scheme = useColorScheme();
90 | const MyTheme = scheme === 'dark' ? DarkTheme : DefaultTheme;
91 | const {t}=useTranslation();
92 | return (
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 | );
101 | }
102 |
103 | const styles = StyleSheet.create({
104 | container: {
105 | flex: 1,
106 | backgroundColor: '#F1FCFB',
107 | },
108 | tasksWrapper: {
109 | paddingTop: 100,
110 | paddingHorizontal: 20,
111 | },
112 | sectionTitle: {
113 | fontSize: 24,
114 | fontWeight: 'bold',
115 | },
116 | items: {
117 | marginTop: 30,
118 | },
119 | writeTaskWrapper: {
120 | position: 'absolute',
121 | bottom: 60,
122 | width: '100%',
123 | flexDirection: 'row',
124 | justifyContent: 'space-around',
125 | alignItems: 'center',
126 | },
127 | input: {
128 | paddingVertical: 15,
129 | paddingHorizontal: 15,
130 | backgroundColor: '#FFFFFF',
131 | borderRadius: 60,
132 | borderColor: '#71E3DD',
133 | borderWidth: 1,
134 | width: 250,
135 | },
136 | addWrapper: {
137 | width: 60,
138 | height: 60,
139 | backgroundColor: '#FFFFFF',
140 | borderRadius: 60,
141 | justifyContent: 'center',
142 | alignItems: 'center',
143 | borderColor: '#71E3DD',
144 | borderWidth: 1,
145 | },
146 | addText: {},
147 | });
148 |
--------------------------------------------------------------------------------
/screens/Profile.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {
3 | StyleSheet,
4 | Text,
5 | TouchableOpacity,
6 | View,
7 | SafeAreaView,
8 | ScrollView,
9 | Image,
10 | } from 'react-native';
11 | import { MaterialIcons } from "@expo/vector-icons";
12 | import { StatusBar } from 'expo-status-bar';
13 | import { useTheme } from '../Components/ThemeProvider'; // Adjust the path as needed
14 | import { useTranslation } from 'react-i18next'; // Correct import
15 |
16 |
17 | export default function Profile({ navigation }) {
18 | const { t } = useTranslation();
19 | const { darkMode } = useTheme();
20 | const background = 'https://i.pinimg.com/474x/74/0e/cb/740ecb78aa4c10cb0a2170ea2350c337.jpg';
21 |
22 | const editProfileItem = {
23 |
24 | text: t("Ndrysho Profilin"),
25 | action: () => navigation.navigate("EditProfile"),
26 | style: {
27 | flexDirection: 'row',
28 | alignItems: 'center',
29 | backgroundColor: '#5DA2A9',
30 | height: '20%',
31 | width: '42%',
32 | borderRadius: 10,
33 | top: '-16%',
34 | paddingLeft: 30,
35 | marginHorizontal: '30%',
36 | },
37 | textStyle: {
38 |
39 | color: '#FFF',
40 | }
41 | };
42 |
43 | const securityItem = {
44 | icon: "security",
45 | text: t("Siguria"),
46 | action: () => console.log("Funksion Sigurie"),
47 | style: {
48 | flexDirection: 'row',
49 | alignItems: 'center',
50 | paddingVertical: 10,
51 | backgroundColor: 'transparent',
52 | height: 44,
53 | width: '40%',
54 | borderRadius: 10,
55 | padding: 5,
56 | },
57 | textStyle: {
58 | paddingLeft:'10%',
59 | color: darkMode ? '#F1FCFB' : '#5DA2A9'
60 | }
61 | };
62 |
63 | const notificationsItem = {
64 | icon: "notifications-none",
65 | text: t("Njoftimet"),
66 | action: () => console.log("Kontrollo Njoftimet"),
67 | style: {
68 | flexDirection: 'row',
69 | alignItems: 'center',
70 | paddingVertical: 12,
71 | backgroundColor: 'transparent',
72 | height: 44,
73 | width: '40%',
74 | borderRadius: 10,
75 | padding: 5,
76 | },
77 | textStyle: {
78 | paddingLeft:'10%',
79 | color: darkMode ? '#F1FCFB' : '#5DA2A9'
80 | }
81 | };
82 |
83 | const privacyItem = {
84 | icon: "lock-outline",
85 | text: t("Privatesia"),
86 | action: () => console.log("Kontrollo Privatesine"),
87 | style: {
88 | flexDirection: 'row',
89 | alignItems: 'center',
90 | paddingVertical: 8,
91 | backgroundColor: 'transparent',
92 | height: 44,
93 | width: '40%',
94 | borderRadius: 10,
95 | padding: 5,
96 | },
97 | textStyle: {
98 | paddingLeft:'10%',
99 | color: darkMode ? '#F1FCFB' : '#5DA2A9'
100 | }
101 | };
102 |
103 | const accountItems = [editProfileItem, securityItem, notificationsItem, privacyItem];
104 |
105 | const renderProfileItem = ({ icon, text, action, style, textStyle }) => (
106 |
107 | {icon && }
108 | {text}
109 |
110 | );
111 |
112 | return (
113 |
114 |
115 | navigation.goBack()} style={styles.backButton} />
116 |
117 |
118 |
119 |
120 |
132 |
133 | {t("Profili")}
134 |
135 |
140 | Altea Kapxhiu
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 | {accountItems.map((item, index) => (
149 |
150 | {renderProfileItem(item)}
151 |
152 | ))}
153 | {t("Perditesoni kredencialet tuaja ketu")}
164 |
165 |
166 |
167 |
168 | );
169 | }
170 |
171 | const styles = StyleSheet.create({
172 | container: {
173 | flex: 1,
174 | backgroundColor: '#F1FCFB',
175 | },
176 | header: {
177 | marginHorizontal: 12,
178 | flexDirection: 'row',
179 | justifyContent: 'center',
180 | },
181 | backButton: {
182 | position: 'absolute',
183 | left: 0,
184 | },
185 | profileImageContainer: {
186 | width: '100%',
187 |
188 | },
189 | profileImage: {
190 | height: 228,
191 | width: "100%",
192 | position:'absolute',
193 | marginTop : 10,
194 | },
195 | scrollView: {
196 | marginHorizontal: 12,
197 | },
198 | profileSection: {
199 | marginBottom: 12,
200 |
201 | },
202 | sectionTitle: {
203 | marginVertical: 10,
204 | fontSize: 32,
205 | fontWeight: '700',
206 | paddingLeft: 10,
207 | paddingTop: 15,
208 | },
209 | separator: {
210 | height: 1,
211 | width: '100%',
212 | backgroundColor: '#5DA2A9',
213 | marginVertical: 10,
214 | },
215 | subtitle: {
216 | fontSize: 15,
217 | paddingBottom: 15,
218 | paddingLeft: 10,
219 | fontWeight: '500',
220 | color: '#626161',
221 | },
222 |
223 | footer: {
224 | flex: 1,
225 | alignItems: "center",
226 | },
227 |
228 | backgroundImage: {
229 | height: 150,
230 | width: 150,
231 | borderRadius: 99,
232 | borderColor: '#5DA2A9',
233 | borderWidth: 2,
234 | justifyContent:'center',
235 | marginTop : 70,
236 |
237 |
238 | },
239 |
240 | });
241 |
--------------------------------------------------------------------------------
/screens/Settings.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { StyleSheet, View, Text, ScrollView, TouchableOpacity, SafeAreaView, Switch, Linking, Alert } from 'react-native';
3 | import FeatherIcon from 'react-native-vector-icons/Feather';
4 | import { useTheme } from '../Components/ThemeProvider'; // Adjust the path as needed
5 | import { useTranslation } from 'react-i18next'; // Correct import
6 |
7 | export default function Settings({ navigation }) {
8 | const { darkMode, toggleDarkMode } = useTheme();
9 | const { t, i18n } = useTranslation(); // Call inside component
10 |
11 | const [form, setForm] = useState({
12 | language: 'English',
13 | darkmode: darkMode,
14 | wifi: false,
15 | });
16 |
17 | const handlePress = async (itemId) => {
18 | switch (itemId) {
19 | case 'contact':
20 | const url = 'mailto:alteakapxhiu@gmail.com';
21 | try {
22 | const canOpen = await Linking.canOpenURL(url);
23 | if (canOpen) {
24 | await Linking.openURL(url);
25 | } else {
26 | Alert.alert('Error', 'Cannot open email client');
27 | }
28 | } catch (error) {
29 | console.error('Error opening email client:', error);
30 | Alert.alert('Error', 'Failed to open email client');
31 | }
32 | break;
33 | case 'bug':
34 | Alert.alert('Sukses !', 'Problemi u raportua');
35 | break;
36 | case 'language':
37 | Alert.alert(
38 | 'Select Language',
39 | 'Choose a language',
40 | [
41 | { text: 'Albanian', onPress: () => { i18n.changeLanguage('al'); Alert.alert('Gjuha u ndryshua !', 'Gjuha ndryshoi ne Shqip !'); } },
42 | { text: 'English', onPress: () => { i18n.changeLanguage('en'); Alert.alert('Language Changed', 'Language switched to English'); } },
43 | { text: 'French', onPress: () => { i18n.changeLanguage('fr'); Alert.alert('Langue modifiée !', ' La langue est passée au français !'); } },
44 | { text: 'Cancel', style: 'cancel' },
45 | ]
46 | );
47 | break;
48 | case 'save':
49 | Alert.alert('Sukses !', 'Ndryshimet u ruajten');
50 | break;
51 | case 'download':
52 | Alert.alert('Sukses !', 'Te dhenat u shkarkuan');
53 | break;
54 | default:
55 | console.log('Dicka e panjohur');
56 | }
57 | };
58 |
59 | const getSections = () => [
60 | {
61 | header: t('Preferences'),
62 | items: [
63 | { id: 'language', icon: 'globe', label: t('Gjuha'), type: 'link' },
64 | { id: 'darkmode', icon: 'moon', label: t('Ndrysho Sfondin'), type: 'toggle' },
65 | { id: 'wifi', icon: 'wifi', label: t('Perdor Wi-Fi'), type: 'toggle' },
66 | ],
67 | },
68 | {
69 | header: t('Help'),
70 | items: [
71 | { id: 'bug', icon: 'flag', label: t('Raporto nje problem'), type: 'link' },
72 | { id: 'contact', icon: 'mail', label: t('Me Kontakto'), type: 'link' },
73 | ],
74 | },
75 | {
76 | header: t('Content'),
77 | items: [
78 | { id: 'save', icon: 'save', label: t('Ruaj'), type: 'link' },
79 | { id: 'download', icon: 'download', label: t('Shkarko'), type: 'link' },
80 | ],
81 | },
82 | ];
83 |
84 | const SECTIONS = getSections();
85 |
86 | const renderItem = ({ icon, label, id, type }) => (
87 |
88 | handlePress(id)}>
89 |
90 |
96 | {label}
97 |
98 | {type === 'toggle' && (
99 | {
102 | setForm({ ...form, [id]: value });
103 | if (id === 'darkmode') {
104 | toggleDarkMode();
105 | }
106 | }}
107 | />
108 | )}
109 | {['link', 'select'].includes(type) && (
110 |
115 | )}
116 |
117 |
118 |
119 | );
120 |
121 | return (
122 |
123 |
124 |
125 | {t("Settings")}
126 |
127 | {t("SSubtittle")}
128 |
129 |
130 | {SECTIONS.map(({ header, items }) => (
131 |
132 |
133 | {header}
134 |
135 |
136 | {items.map((item) => renderItem(item))}
137 |
138 |
139 | ))}
140 |
141 |
142 | );
143 | }
144 |
145 | const styles = StyleSheet.create({
146 | container: {
147 | flex: 1,
148 | backgroundColor: '#fff',
149 | },
150 | contentContainer: {
151 | paddingHorizontal: 24,
152 | paddingBottom: 24,
153 | },
154 | header: {
155 | marginBottom: 12,
156 | paddingHorizontal: 10,
157 | },
158 | title: {
159 | paddingTop: 15,
160 | fontSize: 32,
161 | fontWeight: '700',
162 | marginBottom: 6,
163 | },
164 | subtitle: {
165 | fontSize: 15,
166 | fontWeight: '500',
167 | marginBottom: 12,
168 | },
169 | section: {
170 | marginBottom: 16,
171 | },
172 | sectionHeader: {
173 | marginBottom: 8,
174 | },
175 | sectionTitle: {
176 | fontSize: 14,
177 | fontWeight: '600',
178 | textTransform: 'uppercase',
179 | letterSpacing: 1.2,
180 | },
181 | sectionBody: {
182 | borderTopWidth: 1,
183 | borderTopColor: '#e3e3e3',
184 | borderBottomWidth: 1,
185 | borderBottomColor: '#e3e3e3',
186 | backgroundColor: '#F1FCFB',
187 | },
188 | rowWrapper: {
189 | paddingVertical: 12,
190 | paddingHorizontal: 18,
191 | borderBottomWidth: 1,
192 | borderBottomColor: '#e3e3e3',
193 | },
194 | row: {
195 | flexDirection: 'row',
196 | alignItems: 'center',
197 | },
198 | rowLabel: {
199 | fontSize: 16,
200 | flex: 1,
201 | },
202 | rowSpacer: {
203 | width: 16,
204 | },
205 | });
206 |
--------------------------------------------------------------------------------
/screens/Home.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Keyboard, KeyboardAvoidingView, FlatList, Platform, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native';
3 | import Task from '../Components/task';
4 | import axios from '../assets/axios';
5 | import { useTheme } from '../Components/ThemeProvider'; // Adjust the path as needed
6 | import { useTranslation } from 'react-i18next';
7 |
8 | const Home = () => {
9 | const { darkMode } = useTheme();
10 | const { t } = useTranslation();
11 |
12 | const [task, setTask] = useState('');
13 | const [taskItems, setTaskItems] = useState([]);
14 | const [editingId, setEditingId] = useState(null);
15 | const [selectedCategory, setSelectedCategory] = useState('Personale'); // Default category
16 |
17 | const addTodo = () => {
18 | if (task.trim() === '') return;
19 | const newTask = { id: Date.now(), text: task, completed: false, category: selectedCategory };
20 | setTaskItems([...taskItems, newTask]);
21 | setTask('');
22 | };
23 |
24 | const completeTask = (id) => {
25 | const updatedTasks = taskItems.map(item =>
26 | item.id === id ? { ...item, completed: !item.completed } : item
27 | );
28 | setTaskItems(updatedTasks);
29 | };
30 |
31 | const editTask = () => {
32 | if (!editingId) return;
33 |
34 | const updatedTasks = taskItems.map(item =>
35 | item.id === editingId ? { ...item, text: task } : item
36 | );
37 | setTaskItems(updatedTasks);
38 | setTask('');
39 | setEditingId(null);
40 | };
41 |
42 | const handleToDelete = (id) => {
43 | setTaskItems(prevState => prevState.filter(item => item.id !== id));
44 | };
45 |
46 | const filteredTasks = taskItems.filter(item => item.category === selectedCategory);
47 |
48 | return (
49 |
50 |
51 |
52 | {t("TaskTittle")}
53 |
54 |
55 | {t("Subtittle")}
56 |
57 |
58 | setSelectedCategory('Pune')}
61 | >
62 | {t("Work")}
63 |
64 | setSelectedCategory('Personale')}
67 | >
68 | {t("Personal")}
69 |
70 | setSelectedCategory('Shkolle')}
73 | >
74 | {t("School")}
75 |
76 |
77 |
78 | item.id.toString()}
82 | renderItem={({ item }) => (
83 | completeTask(item.id)}>
84 | {
87 | setTask(item.text);
88 | setEditingId(item.id);
89 | }}
90 | onToggle={() => completeTask(item.id)}
91 | onDelete={() => handleToDelete(item.id)}
92 | completed={item.completed}
93 | />
94 |
95 | )}
96 | />
97 |
98 |
99 |
103 | setTask(text)}
109 | />
110 |
111 |
112 | {editingId !== null ? '✓' : '+'}
113 |
114 |
115 |
116 |
117 | );
118 | };
119 |
120 | const styles = StyleSheet.create({
121 | tasksWrapper: {
122 | paddingTop: 20,
123 | paddingHorizontal: 15,
124 | flex: 1,
125 | },
126 | subtitle: {
127 | fontSize: 20,
128 | fontWeight: '500',
129 | color: '#666',
130 | paddingBottom: 25,
131 | },
132 | taskList: {
133 | marginTop: 20,
134 | },
135 | categories: {
136 | flexDirection: 'row',
137 | justifyContent: 'space-around',
138 | marginBottom: 20,
139 | },
140 | categoryButton: {
141 | paddingVertical: 10,
142 | paddingHorizontal: 20,
143 | borderRadius: 10,
144 | borderWidth: 1,
145 | borderColor: '#71E3DD',
146 | },
147 | selectedCategoryButton: {
148 | backgroundColor: '#71E3DD',
149 | },
150 | writeTaskWrapper: {
151 | position: 'absolute',
152 | bottom: 100,
153 | width: '100%',
154 | flexDirection: 'row',
155 | justifyContent: 'space-around',
156 | alignItems: 'center',
157 | },
158 | input: {
159 | paddingVertical: 15,
160 | paddingHorizontal: 15,
161 | backgroundColor: '#FFFFFF',
162 | borderRadius: 60,
163 | borderColor: '#71E3DD',
164 | borderWidth: 1,
165 | width: 260,
166 | },
167 | addWrapper: {
168 | width: 60,
169 | height: 60,
170 | backgroundColor: '#FFFFFF',
171 | borderRadius: 60,
172 | justifyContent: 'center',
173 | alignItems: 'center',
174 | borderColor: '#71E3DD',
175 | borderWidth: 1,
176 | },
177 | addText: {},
178 | });
179 |
180 | export default Home;
181 |
--------------------------------------------------------------------------------
/screens/Portfolio.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { StyleSheet, View, Text, ScrollView, TouchableOpacity, SafeAreaView, TextInput, Modal } from 'react-native';
3 | import { Agenda } from 'react-native-calendars';
4 | import { useTheme } from '../Components/ThemeProvider'; // Adjust the path as needed
5 | import { useTranslation } from 'react-i18next'; // Correct import
6 | import { Picker } from '@react-native-picker/picker'; // Ensure correct import
7 |
8 | export default function Portfolio() {
9 | const { darkMode } = useTheme();
10 | const { t } = useTranslation();
11 | const [items, setItems] = useState({
12 | '2024-07-21': [{ name: 'Seminar' }],
13 | '2024-07-22': [{ name: 'Takim ne pune' }],
14 | '2024-07-25': [{ name: 'Workshop' }],
15 | });
16 |
17 | const [newEventName, setNewEventName] = useState('');
18 | const [newEventDate, setNewEventDate] = useState('');
19 | const [isPickerVisible, setPickerVisibility] = useState(false);
20 |
21 | const handleAddEvent = () => {
22 | if (newEventName.trim() && newEventDate.trim()) {
23 | const datePattern = /^\d{4}-\d{2}-\d{2}$/;
24 | if (!datePattern.test(newEventDate)) {
25 | alert('Ju lutem vendosni daten ne formatin YYYY-MM-DD.');
26 | return;
27 | }
28 |
29 | const updatedItems = {
30 | ...items,
31 | [newEventDate]: [...(items[newEventDate] || []), { name: newEventName }],
32 | };
33 | setItems(updatedItems);
34 |
35 | setNewEventName('');
36 | setNewEventDate('');
37 | } else {
38 | alert('Ju lutem vendosni Emrin dhe Daten.');
39 | }
40 | };
41 |
42 | const handleConfirmDate = (date) => {
43 | setNewEventDate(date.toISOString().split('T')[0]);
44 | setPickerVisibility(false);
45 | };
46 |
47 | const renderItem = (item) => (
48 |
49 | {item.name}
50 |
51 | );
52 |
53 | const theme = {
54 | light: {
55 | agendaDayTextColor: '#5DA2A9',
56 | agendaDayNumColor: '#5DA2A9',
57 | agendaTodayColor: '#5DA2A9',
58 | agendaKnobColor: '#5DA2A9',
59 | monthTextColor: 'black',
60 | indicatorColor: '#5DA2A9',
61 | dotColor: '#F1FCFB',
62 | selectedDayBackgroundColor: '#5DA2A9',
63 | arrowColor: '#5DA2A9',
64 | currentDate: '#5DA2A9',
65 | },
66 | dark: {
67 | agendaDayTextColor: '#5DA2A9',
68 | agendaDayNumColor: '#5DA2A9',
69 | agendaTodayColor: '#5DA2A9',
70 | agendaKnobColor: '#5DA2A9',
71 | monthTextColor: 'black',
72 | indicatorColor: '#5DA2A9',
73 | dotColor: '#333',
74 | selectedDayBackgroundColor: '#5DA2A9',
75 | arrowColor: '#ddd',
76 | currentDate: '#5DA2A9',
77 | },
78 | };
79 | const currentTheme = darkMode ? theme.dark : theme.light;
80 |
81 | // Generate dates for the picker (this is a simplified example)
82 | const generateDates = () => {
83 | const dates = [];
84 | for (let i = 0; i < 1000; i++) {
85 | const date = new Date();
86 | date.setDate(date.getDate() + i);
87 | dates.push(date.toISOString().split('T')[0]);
88 | }
89 | return dates;
90 | };
91 |
92 | return (
93 |
94 |
95 |
96 | {t("Kalendari")}
97 |
98 |
99 | {t("Perzgjidhni eventet gjate dites suaj ketu")}
100 |
101 |
102 |
109 | setPickerVisibility(true)}
111 | style={[styles.input, { borderColor: darkMode ? '#5DA2A9' : '#5DA2A9', justifyContent: 'center' }]}>
112 |
113 | {newEventDate || t('Zgjidh daten e eventit')}
114 |
115 |
116 |
117 | {t("SHTO EVENTIN")}
118 |
119 |
120 |
121 | (
127 |
128 | {t("Sot s'ka asnje event te shenuar")}
129 |
130 | )}
131 | />
132 |
133 |
134 | setPickerVisibility(false)}
139 | >
140 |
141 | setNewEventDate(itemValue)}
145 | >
146 | {generateDates().map(date => (
147 |
148 | ))}
149 |
150 | setPickerVisibility(false)}
152 | style={styles.modalButton}
153 | >
154 | {t("ZGJIDH")}
155 |
156 |
157 |
158 |
159 |
160 | );
161 | }
162 |
163 | const styles = StyleSheet.create({
164 | container: {
165 | flex: 1,
166 | backgroundColor: '#F1FCFB',
167 | },
168 | contentContainer: {
169 | paddingHorizontal: 24,
170 | },
171 | agendaContainer: {
172 | height: '80%',
173 | },
174 | agenda: {
175 | backgroundColor: 'transparent', // Adjust as needed
176 | },
177 | header: {
178 | marginBottom: 12,
179 | },
180 | separator: {
181 | height: 1,
182 | width: '100%',
183 | backgroundColor: '#5DA2A9',
184 | marginVertical: 10,
185 | },
186 | inputContainer: {
187 | marginTop: 20,
188 | },
189 | input: {
190 | height: 40,
191 | borderWidth: 1,
192 | marginBottom: 10,
193 | paddingHorizontal: 10,
194 | justifyContent: 'center',
195 | },
196 | inputText: {
197 | fontSize: 16,
198 | },
199 | item: {
200 | borderRadius: 5,
201 | padding: 15,
202 | marginRight: 10,
203 | marginTop: 25,
204 | paddingBottom: 20,
205 | },
206 | itemText: {
207 | fontSize: 18,
208 | },
209 | title: {
210 | paddingTop: 20,
211 | fontSize: 32,
212 | fontWeight: '700',
213 | marginBottom: 6,
214 | },
215 | subtitle: {
216 | fontSize: 15,
217 | fontWeight: '500',
218 | },
219 | emptyData: {
220 | flex: 1,
221 | justifyContent: 'center',
222 | alignItems: 'center',
223 | },
224 | button: {
225 | backgroundColor: '#5DA2A9',
226 | padding: 10,
227 | alignItems: 'center',
228 | },
229 | buttonText: {
230 | color: '#F1FCFB',
231 | fontSize: 16,
232 | },
233 | modalContainer: {
234 | flex: 1,
235 | justifyContent: 'center',
236 | alignItems: 'center',
237 | backgroundColor: 'rgba(0, 0, 0, 0.5)',
238 | },
239 | picker: {
240 | width: 300,
241 | height: 200,
242 | backgroundColor: '#FFF',
243 | },
244 | modalButton: {
245 | marginTop: 20,
246 | backgroundColor: '#5DA2A9',
247 | padding: 10,
248 | borderRadius: 5,
249 | },
250 | modalButtonText: {
251 | color: '#FFF',
252 | fontSize: 16,
253 | },
254 | });
255 |
--------------------------------------------------------------------------------
/screens/EditProfile.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { StyleSheet, Text, TouchableOpacity, View, SafeAreaView, ScrollView, Image, Modal } from 'react-native';
3 | import { MaterialIcons } from "@expo/vector-icons";
4 | import * as ImagePicker from "expo-image-picker";
5 | import { TextInput } from 'react-native-paper';
6 | import { imagesDataURL } from '../Components/data';
7 | import DatePicker, { getFormatedDate } from 'react-native-modern-datepicker';
8 | import { Dimensions } from 'react-native';
9 | import { useTheme } from '../Components/ThemeProvider';
10 | import { useTranslation } from 'react-i18next'; // Correct import
11 |
12 |
13 |
14 | const { width, height } = Dimensions.get('window');
15 |
16 |
17 |
18 | export default function EditProfile({ navigation }) {
19 | const { t, i18n } = useTranslation(); // Call inside component
20 | const { darkMode } = useTheme();
21 | // Initialize with the default image URL from imagesDataURL
22 | const [selectedImage, setSelectedImage] = useState(imagesDataURL[0]);
23 | const [name, setName] = useState("Altea Kapxhiu");
24 | const [email, setEmail] = useState("alteakapxhiu@gmail.com");
25 | const [password, setPassword] = useState("vendos paskodin");
26 | const [country, setCountry] = useState("Shqiperi");
27 |
28 | const [openStartDatePicker, setOpenStartDatePicker] = useState(false);
29 | const today = new Date();
30 | const startDate = getFormatedDate(today.setFullYear(today.getFullYear() - 100), "YYYY/MM/DD");
31 | const [selectedStartDate, setSelectedStartDate] = useState("01/01/1999");
32 | const [startedDate, setStartedDate] = useState("12/12/2024");
33 |
34 | const handleChangeStartDate = (propDate) => {
35 | setStartedDate(propDate);
36 | };
37 |
38 | const handleOnPressStartDate = () => {
39 | setOpenStartDatePicker(!openStartDatePicker);
40 | };
41 |
42 | const handleImageSelection = async () => {
43 | // Request permission if needed (optional)
44 | const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync();
45 | if (status !== 'granted') {
46 | alert('Ndjese, duhet te lejoni aksesin ne galeri qe te vazhdojme!');
47 | return;
48 | }
49 |
50 | let result = await ImagePicker.launchImageLibraryAsync({
51 | mediaTypes: ImagePicker.MediaTypeOptions.Images, // Use Images if you only want images
52 | allowsEditing: true,
53 | aspect: [5, 4],
54 | quality: 1,
55 | });
56 |
57 | if (!result.cancelled && result.assets && result.assets.length > 0) {
58 | setSelectedImage(result.assets[0].uri); // Update to the selected image URI
59 | }
60 | };
61 |
62 | function renderDatePicker() {
63 | return (
64 |
69 |
70 |
78 | setSelectedStartDate(date)}
84 | options={{
85 | backgroundColor: '#5DA2A9',
86 | textHeaderColor: '#F1FCFB',
87 | textDefaultColor: '#F1FCFB',
88 | selectedTextColor: '#5DA2A9',
89 | mainColor: "#42767B",
90 | textSecondaryColor: "#42767B",
91 | borderColor: "#42767B"
92 | }}
93 | />
94 |
95 |
96 |
97 |
99 | Close
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 | );
108 | }
109 |
110 | return (
111 |
112 |
113 |
114 |
115 |
116 | navigation.goBack()} style={styles.backButton}>
117 |
118 |
119 | {t("Ndrysho Profilin")}
120 |
121 |
122 |
123 |
124 |
125 |
126 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 | {t("Emri")}
138 |
139 | setName(value)}
143 | editable={true}
144 | />
145 |
146 |
147 |
148 | Email
149 |
150 | setEmail(value)}
154 | editable={true}
155 | />
156 |
157 |
158 |
159 | {t("Fjalekalimi")}
160 |
161 | setPassword(value)}
165 | editable={true}
166 | secureTextEntry
167 | />
168 |
169 |
170 |
171 | {t("Datelindje")}
172 |
173 | {selectedStartDate}
174 |
175 |
176 |
177 |
178 | {t("Vendi")}
179 |
180 | setCountry(value)}
186 | editable={true}
187 | />
188 |
189 |
191 |
199 |
200 | {t("Ruaj Ndryshimet")}
201 |
202 |
203 | {renderDatePicker()}
204 |
205 |
206 | );
207 | }
208 |
209 | const styles = StyleSheet.create({
210 | safeAreaView: {
211 | flex: 1,
212 | backgroundColor: '#F1FCFB',
213 | paddingHorizontal: width * 0.05, // 5% of screen width
214 | },
215 | container: {
216 |
217 | },
218 | header: {
219 | marginHorizontal: height * 0.02,
220 | flexDirection: "row",
221 | justifyContent: "center",
222 | alignItems: "center",
223 | position: 'relative',
224 |
225 |
226 | },
227 | backButton: {
228 | position: "absolute",
229 | left: 0,
230 | paddingTop: height * 0.02,
231 |
232 | },
233 | headerTitle: {
234 | fontSize: width * 0.06,
235 | paddingBottom: height * 0.01,
236 | paddingTop: height * 0.02,
237 | fontWeight:'500', // Adjusted for responsiveness
238 | },
239 | imageContainer: {
240 | bottom:0,
241 | alignItems: "center",
242 | marginVertical: height * 0.03, // Responsive margin
243 | },
244 | profileImage: {
245 | height: width * 0.4, // 40% of screen width
246 | width: width * 0.4,
247 | borderRadius: width * 0.2,
248 | borderWidth: 2,
249 | borderColor: '#5DA2A9',
250 | },
251 | cameraIconContainer: {
252 | position: "absolute",
253 | bottom: 0,
254 | right: 10,
255 | zIndex: 9999,
256 | },
257 | scrollViewContent: {
258 | bottom: height * 0.08,
259 | flexGrow: 1,
260 | justifyContent: 'flex-start',
261 | paddingVertical: height * 0.06, // Responsive padding
262 | },
263 |
264 | textInput: {
265 | height: 40,
266 | width: '95%',
267 | backgroundColor: 'transparent',
268 | borderColor: '#5DA2A9',
269 | borderWidth: 1,
270 | fontWeight:'200',
271 | borderRadius: 4,
272 | paddingLeft: 5,
273 | },
274 | textInput1: {
275 | paddingTop: 10,
276 | height: 40,
277 | width: '95%',
278 | fontWeight:'200',
279 | backgroundColor: 'transparent',
280 | borderColor: '#5DA2A9',
281 | borderWidth: 1,
282 | borderRadius: 4,
283 | paddingLeft: 20,
284 | },
285 | submitButton: {
286 | backgroundColor: '#5DA2A9',
287 | height: 44,
288 | width: '60%',
289 | borderRadius: 6,
290 | alignItems: 'center',
291 | justifyContent: 'center',
292 | marginVertical: height * 0.03,
293 | },
294 | submitButtonText: {
295 | fontWeight: '700',
296 | fontSize: width * 0.05, // Responsive font size
297 | },
298 | });
299 |
300 |
301 |
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "axios-retry": "^4.4.1",
13 | "cors": "^2.8.5",
14 | "dotenv": "^16.4.5",
15 | "express": "^4.19.2",
16 | "mongoose": "^8.5.1"
17 | }
18 | },
19 | "node_modules/@mongodb-js/saslprep": {
20 | "version": "1.1.8",
21 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz",
22 | "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==",
23 | "license": "MIT",
24 | "dependencies": {
25 | "sparse-bitfield": "^3.0.3"
26 | }
27 | },
28 | "node_modules/@types/webidl-conversions": {
29 | "version": "7.0.3",
30 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
31 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
32 | "license": "MIT"
33 | },
34 | "node_modules/@types/whatwg-url": {
35 | "version": "11.0.5",
36 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
37 | "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
38 | "license": "MIT",
39 | "dependencies": {
40 | "@types/webidl-conversions": "*"
41 | }
42 | },
43 | "node_modules/accepts": {
44 | "version": "1.3.8",
45 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
46 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
47 | "license": "MIT",
48 | "dependencies": {
49 | "mime-types": "~2.1.34",
50 | "negotiator": "0.6.3"
51 | },
52 | "engines": {
53 | "node": ">= 0.6"
54 | }
55 | },
56 | "node_modules/array-flatten": {
57 | "version": "1.1.1",
58 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
59 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
60 | "license": "MIT"
61 | },
62 | "node_modules/asynckit": {
63 | "version": "0.4.0",
64 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
65 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
66 | "license": "MIT",
67 | "peer": true
68 | },
69 | "node_modules/axios": {
70 | "version": "1.7.2",
71 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
72 | "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
73 | "license": "MIT",
74 | "peer": true,
75 | "dependencies": {
76 | "follow-redirects": "^1.15.6",
77 | "form-data": "^4.0.0",
78 | "proxy-from-env": "^1.1.0"
79 | }
80 | },
81 | "node_modules/axios-retry": {
82 | "version": "4.4.1",
83 | "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.4.1.tgz",
84 | "integrity": "sha512-JGzNoglDHtHWIEvvAampB0P7jxQ/sT4COmW0FgSQkVg6o4KqNjNMBI6uFVOq517hkw/OAYYAG08ADtBlV8lvmQ==",
85 | "license": "Apache-2.0",
86 | "dependencies": {
87 | "is-retry-allowed": "^2.2.0"
88 | },
89 | "peerDependencies": {
90 | "axios": "0.x || 1.x"
91 | }
92 | },
93 | "node_modules/body-parser": {
94 | "version": "1.20.2",
95 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
96 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
97 | "license": "MIT",
98 | "dependencies": {
99 | "bytes": "3.1.2",
100 | "content-type": "~1.0.5",
101 | "debug": "2.6.9",
102 | "depd": "2.0.0",
103 | "destroy": "1.2.0",
104 | "http-errors": "2.0.0",
105 | "iconv-lite": "0.4.24",
106 | "on-finished": "2.4.1",
107 | "qs": "6.11.0",
108 | "raw-body": "2.5.2",
109 | "type-is": "~1.6.18",
110 | "unpipe": "1.0.0"
111 | },
112 | "engines": {
113 | "node": ">= 0.8",
114 | "npm": "1.2.8000 || >= 1.4.16"
115 | }
116 | },
117 | "node_modules/bson": {
118 | "version": "6.8.0",
119 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz",
120 | "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==",
121 | "license": "Apache-2.0",
122 | "engines": {
123 | "node": ">=16.20.1"
124 | }
125 | },
126 | "node_modules/bytes": {
127 | "version": "3.1.2",
128 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
129 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
130 | "license": "MIT",
131 | "engines": {
132 | "node": ">= 0.8"
133 | }
134 | },
135 | "node_modules/call-bind": {
136 | "version": "1.0.7",
137 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
138 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
139 | "license": "MIT",
140 | "dependencies": {
141 | "es-define-property": "^1.0.0",
142 | "es-errors": "^1.3.0",
143 | "function-bind": "^1.1.2",
144 | "get-intrinsic": "^1.2.4",
145 | "set-function-length": "^1.2.1"
146 | },
147 | "engines": {
148 | "node": ">= 0.4"
149 | },
150 | "funding": {
151 | "url": "https://github.com/sponsors/ljharb"
152 | }
153 | },
154 | "node_modules/combined-stream": {
155 | "version": "1.0.8",
156 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
157 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
158 | "license": "MIT",
159 | "peer": true,
160 | "dependencies": {
161 | "delayed-stream": "~1.0.0"
162 | },
163 | "engines": {
164 | "node": ">= 0.8"
165 | }
166 | },
167 | "node_modules/content-disposition": {
168 | "version": "0.5.4",
169 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
170 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
171 | "license": "MIT",
172 | "dependencies": {
173 | "safe-buffer": "5.2.1"
174 | },
175 | "engines": {
176 | "node": ">= 0.6"
177 | }
178 | },
179 | "node_modules/content-type": {
180 | "version": "1.0.5",
181 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
182 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
183 | "license": "MIT",
184 | "engines": {
185 | "node": ">= 0.6"
186 | }
187 | },
188 | "node_modules/cookie": {
189 | "version": "0.6.0",
190 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
191 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
192 | "license": "MIT",
193 | "engines": {
194 | "node": ">= 0.6"
195 | }
196 | },
197 | "node_modules/cookie-signature": {
198 | "version": "1.0.6",
199 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
200 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
201 | "license": "MIT"
202 | },
203 | "node_modules/cors": {
204 | "version": "2.8.5",
205 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
206 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
207 | "license": "MIT",
208 | "dependencies": {
209 | "object-assign": "^4",
210 | "vary": "^1"
211 | },
212 | "engines": {
213 | "node": ">= 0.10"
214 | }
215 | },
216 | "node_modules/debug": {
217 | "version": "2.6.9",
218 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
219 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
220 | "license": "MIT",
221 | "dependencies": {
222 | "ms": "2.0.0"
223 | }
224 | },
225 | "node_modules/define-data-property": {
226 | "version": "1.1.4",
227 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
228 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
229 | "license": "MIT",
230 | "dependencies": {
231 | "es-define-property": "^1.0.0",
232 | "es-errors": "^1.3.0",
233 | "gopd": "^1.0.1"
234 | },
235 | "engines": {
236 | "node": ">= 0.4"
237 | },
238 | "funding": {
239 | "url": "https://github.com/sponsors/ljharb"
240 | }
241 | },
242 | "node_modules/delayed-stream": {
243 | "version": "1.0.0",
244 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
245 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
246 | "license": "MIT",
247 | "peer": true,
248 | "engines": {
249 | "node": ">=0.4.0"
250 | }
251 | },
252 | "node_modules/depd": {
253 | "version": "2.0.0",
254 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
255 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
256 | "license": "MIT",
257 | "engines": {
258 | "node": ">= 0.8"
259 | }
260 | },
261 | "node_modules/destroy": {
262 | "version": "1.2.0",
263 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
264 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
265 | "license": "MIT",
266 | "engines": {
267 | "node": ">= 0.8",
268 | "npm": "1.2.8000 || >= 1.4.16"
269 | }
270 | },
271 | "node_modules/dotenv": {
272 | "version": "16.4.5",
273 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
274 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
275 | "license": "BSD-2-Clause",
276 | "engines": {
277 | "node": ">=12"
278 | },
279 | "funding": {
280 | "url": "https://dotenvx.com"
281 | }
282 | },
283 | "node_modules/ee-first": {
284 | "version": "1.1.1",
285 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
286 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
287 | "license": "MIT"
288 | },
289 | "node_modules/encodeurl": {
290 | "version": "1.0.2",
291 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
292 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
293 | "license": "MIT",
294 | "engines": {
295 | "node": ">= 0.8"
296 | }
297 | },
298 | "node_modules/es-define-property": {
299 | "version": "1.0.0",
300 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
301 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
302 | "license": "MIT",
303 | "dependencies": {
304 | "get-intrinsic": "^1.2.4"
305 | },
306 | "engines": {
307 | "node": ">= 0.4"
308 | }
309 | },
310 | "node_modules/es-errors": {
311 | "version": "1.3.0",
312 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
313 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
314 | "license": "MIT",
315 | "engines": {
316 | "node": ">= 0.4"
317 | }
318 | },
319 | "node_modules/escape-html": {
320 | "version": "1.0.3",
321 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
322 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
323 | "license": "MIT"
324 | },
325 | "node_modules/etag": {
326 | "version": "1.8.1",
327 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
328 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
329 | "license": "MIT",
330 | "engines": {
331 | "node": ">= 0.6"
332 | }
333 | },
334 | "node_modules/express": {
335 | "version": "4.19.2",
336 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
337 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
338 | "license": "MIT",
339 | "dependencies": {
340 | "accepts": "~1.3.8",
341 | "array-flatten": "1.1.1",
342 | "body-parser": "1.20.2",
343 | "content-disposition": "0.5.4",
344 | "content-type": "~1.0.4",
345 | "cookie": "0.6.0",
346 | "cookie-signature": "1.0.6",
347 | "debug": "2.6.9",
348 | "depd": "2.0.0",
349 | "encodeurl": "~1.0.2",
350 | "escape-html": "~1.0.3",
351 | "etag": "~1.8.1",
352 | "finalhandler": "1.2.0",
353 | "fresh": "0.5.2",
354 | "http-errors": "2.0.0",
355 | "merge-descriptors": "1.0.1",
356 | "methods": "~1.1.2",
357 | "on-finished": "2.4.1",
358 | "parseurl": "~1.3.3",
359 | "path-to-regexp": "0.1.7",
360 | "proxy-addr": "~2.0.7",
361 | "qs": "6.11.0",
362 | "range-parser": "~1.2.1",
363 | "safe-buffer": "5.2.1",
364 | "send": "0.18.0",
365 | "serve-static": "1.15.0",
366 | "setprototypeof": "1.2.0",
367 | "statuses": "2.0.1",
368 | "type-is": "~1.6.18",
369 | "utils-merge": "1.0.1",
370 | "vary": "~1.1.2"
371 | },
372 | "engines": {
373 | "node": ">= 0.10.0"
374 | }
375 | },
376 | "node_modules/finalhandler": {
377 | "version": "1.2.0",
378 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
379 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
380 | "license": "MIT",
381 | "dependencies": {
382 | "debug": "2.6.9",
383 | "encodeurl": "~1.0.2",
384 | "escape-html": "~1.0.3",
385 | "on-finished": "2.4.1",
386 | "parseurl": "~1.3.3",
387 | "statuses": "2.0.1",
388 | "unpipe": "~1.0.0"
389 | },
390 | "engines": {
391 | "node": ">= 0.8"
392 | }
393 | },
394 | "node_modules/follow-redirects": {
395 | "version": "1.15.6",
396 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
397 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
398 | "funding": [
399 | {
400 | "type": "individual",
401 | "url": "https://github.com/sponsors/RubenVerborgh"
402 | }
403 | ],
404 | "license": "MIT",
405 | "peer": true,
406 | "engines": {
407 | "node": ">=4.0"
408 | },
409 | "peerDependenciesMeta": {
410 | "debug": {
411 | "optional": true
412 | }
413 | }
414 | },
415 | "node_modules/form-data": {
416 | "version": "4.0.0",
417 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
418 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
419 | "license": "MIT",
420 | "peer": true,
421 | "dependencies": {
422 | "asynckit": "^0.4.0",
423 | "combined-stream": "^1.0.8",
424 | "mime-types": "^2.1.12"
425 | },
426 | "engines": {
427 | "node": ">= 6"
428 | }
429 | },
430 | "node_modules/forwarded": {
431 | "version": "0.2.0",
432 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
433 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
434 | "license": "MIT",
435 | "engines": {
436 | "node": ">= 0.6"
437 | }
438 | },
439 | "node_modules/fresh": {
440 | "version": "0.5.2",
441 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
442 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
443 | "license": "MIT",
444 | "engines": {
445 | "node": ">= 0.6"
446 | }
447 | },
448 | "node_modules/function-bind": {
449 | "version": "1.1.2",
450 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
451 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
452 | "license": "MIT",
453 | "funding": {
454 | "url": "https://github.com/sponsors/ljharb"
455 | }
456 | },
457 | "node_modules/get-intrinsic": {
458 | "version": "1.2.4",
459 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
460 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
461 | "license": "MIT",
462 | "dependencies": {
463 | "es-errors": "^1.3.0",
464 | "function-bind": "^1.1.2",
465 | "has-proto": "^1.0.1",
466 | "has-symbols": "^1.0.3",
467 | "hasown": "^2.0.0"
468 | },
469 | "engines": {
470 | "node": ">= 0.4"
471 | },
472 | "funding": {
473 | "url": "https://github.com/sponsors/ljharb"
474 | }
475 | },
476 | "node_modules/gopd": {
477 | "version": "1.0.1",
478 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
479 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
480 | "license": "MIT",
481 | "dependencies": {
482 | "get-intrinsic": "^1.1.3"
483 | },
484 | "funding": {
485 | "url": "https://github.com/sponsors/ljharb"
486 | }
487 | },
488 | "node_modules/has-property-descriptors": {
489 | "version": "1.0.2",
490 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
491 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
492 | "license": "MIT",
493 | "dependencies": {
494 | "es-define-property": "^1.0.0"
495 | },
496 | "funding": {
497 | "url": "https://github.com/sponsors/ljharb"
498 | }
499 | },
500 | "node_modules/has-proto": {
501 | "version": "1.0.3",
502 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
503 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
504 | "license": "MIT",
505 | "engines": {
506 | "node": ">= 0.4"
507 | },
508 | "funding": {
509 | "url": "https://github.com/sponsors/ljharb"
510 | }
511 | },
512 | "node_modules/has-symbols": {
513 | "version": "1.0.3",
514 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
515 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
516 | "license": "MIT",
517 | "engines": {
518 | "node": ">= 0.4"
519 | },
520 | "funding": {
521 | "url": "https://github.com/sponsors/ljharb"
522 | }
523 | },
524 | "node_modules/hasown": {
525 | "version": "2.0.2",
526 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
527 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
528 | "license": "MIT",
529 | "dependencies": {
530 | "function-bind": "^1.1.2"
531 | },
532 | "engines": {
533 | "node": ">= 0.4"
534 | }
535 | },
536 | "node_modules/http-errors": {
537 | "version": "2.0.0",
538 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
539 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
540 | "license": "MIT",
541 | "dependencies": {
542 | "depd": "2.0.0",
543 | "inherits": "2.0.4",
544 | "setprototypeof": "1.2.0",
545 | "statuses": "2.0.1",
546 | "toidentifier": "1.0.1"
547 | },
548 | "engines": {
549 | "node": ">= 0.8"
550 | }
551 | },
552 | "node_modules/iconv-lite": {
553 | "version": "0.4.24",
554 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
555 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
556 | "license": "MIT",
557 | "dependencies": {
558 | "safer-buffer": ">= 2.1.2 < 3"
559 | },
560 | "engines": {
561 | "node": ">=0.10.0"
562 | }
563 | },
564 | "node_modules/inherits": {
565 | "version": "2.0.4",
566 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
567 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
568 | "license": "ISC"
569 | },
570 | "node_modules/ipaddr.js": {
571 | "version": "1.9.1",
572 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
573 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
574 | "license": "MIT",
575 | "engines": {
576 | "node": ">= 0.10"
577 | }
578 | },
579 | "node_modules/is-retry-allowed": {
580 | "version": "2.2.0",
581 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz",
582 | "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==",
583 | "license": "MIT",
584 | "engines": {
585 | "node": ">=10"
586 | },
587 | "funding": {
588 | "url": "https://github.com/sponsors/sindresorhus"
589 | }
590 | },
591 | "node_modules/kareem": {
592 | "version": "2.6.3",
593 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
594 | "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
595 | "license": "Apache-2.0",
596 | "engines": {
597 | "node": ">=12.0.0"
598 | }
599 | },
600 | "node_modules/media-typer": {
601 | "version": "0.3.0",
602 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
603 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
604 | "license": "MIT",
605 | "engines": {
606 | "node": ">= 0.6"
607 | }
608 | },
609 | "node_modules/memory-pager": {
610 | "version": "1.5.0",
611 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
612 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
613 | "license": "MIT"
614 | },
615 | "node_modules/merge-descriptors": {
616 | "version": "1.0.1",
617 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
618 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
619 | "license": "MIT"
620 | },
621 | "node_modules/methods": {
622 | "version": "1.1.2",
623 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
624 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
625 | "license": "MIT",
626 | "engines": {
627 | "node": ">= 0.6"
628 | }
629 | },
630 | "node_modules/mime": {
631 | "version": "1.6.0",
632 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
633 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
634 | "license": "MIT",
635 | "bin": {
636 | "mime": "cli.js"
637 | },
638 | "engines": {
639 | "node": ">=4"
640 | }
641 | },
642 | "node_modules/mime-db": {
643 | "version": "1.52.0",
644 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
645 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
646 | "license": "MIT",
647 | "engines": {
648 | "node": ">= 0.6"
649 | }
650 | },
651 | "node_modules/mime-types": {
652 | "version": "2.1.35",
653 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
654 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
655 | "license": "MIT",
656 | "dependencies": {
657 | "mime-db": "1.52.0"
658 | },
659 | "engines": {
660 | "node": ">= 0.6"
661 | }
662 | },
663 | "node_modules/mongodb": {
664 | "version": "6.7.0",
665 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz",
666 | "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==",
667 | "license": "Apache-2.0",
668 | "dependencies": {
669 | "@mongodb-js/saslprep": "^1.1.5",
670 | "bson": "^6.7.0",
671 | "mongodb-connection-string-url": "^3.0.0"
672 | },
673 | "engines": {
674 | "node": ">=16.20.1"
675 | },
676 | "peerDependencies": {
677 | "@aws-sdk/credential-providers": "^3.188.0",
678 | "@mongodb-js/zstd": "^1.1.0",
679 | "gcp-metadata": "^5.2.0",
680 | "kerberos": "^2.0.1",
681 | "mongodb-client-encryption": ">=6.0.0 <7",
682 | "snappy": "^7.2.2",
683 | "socks": "^2.7.1"
684 | },
685 | "peerDependenciesMeta": {
686 | "@aws-sdk/credential-providers": {
687 | "optional": true
688 | },
689 | "@mongodb-js/zstd": {
690 | "optional": true
691 | },
692 | "gcp-metadata": {
693 | "optional": true
694 | },
695 | "kerberos": {
696 | "optional": true
697 | },
698 | "mongodb-client-encryption": {
699 | "optional": true
700 | },
701 | "snappy": {
702 | "optional": true
703 | },
704 | "socks": {
705 | "optional": true
706 | }
707 | }
708 | },
709 | "node_modules/mongodb-connection-string-url": {
710 | "version": "3.0.1",
711 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
712 | "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
713 | "license": "Apache-2.0",
714 | "dependencies": {
715 | "@types/whatwg-url": "^11.0.2",
716 | "whatwg-url": "^13.0.0"
717 | }
718 | },
719 | "node_modules/mongoose": {
720 | "version": "8.5.1",
721 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.1.tgz",
722 | "integrity": "sha512-OhVcwVl91A1G6+XpjDcpkGP7l7ikZkxa0DylX7NT/lcEqAjggzSdqDxb48A+xsDxqNAr0ntSJ1yiE3+KJTOd5Q==",
723 | "license": "MIT",
724 | "dependencies": {
725 | "bson": "^6.7.0",
726 | "kareem": "2.6.3",
727 | "mongodb": "6.7.0",
728 | "mpath": "0.9.0",
729 | "mquery": "5.0.0",
730 | "ms": "2.1.3",
731 | "sift": "17.1.3"
732 | },
733 | "engines": {
734 | "node": ">=16.20.1"
735 | },
736 | "funding": {
737 | "type": "opencollective",
738 | "url": "https://opencollective.com/mongoose"
739 | }
740 | },
741 | "node_modules/mongoose/node_modules/ms": {
742 | "version": "2.1.3",
743 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
744 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
745 | "license": "MIT"
746 | },
747 | "node_modules/mpath": {
748 | "version": "0.9.0",
749 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
750 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
751 | "license": "MIT",
752 | "engines": {
753 | "node": ">=4.0.0"
754 | }
755 | },
756 | "node_modules/mquery": {
757 | "version": "5.0.0",
758 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
759 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
760 | "license": "MIT",
761 | "dependencies": {
762 | "debug": "4.x"
763 | },
764 | "engines": {
765 | "node": ">=14.0.0"
766 | }
767 | },
768 | "node_modules/mquery/node_modules/debug": {
769 | "version": "4.3.5",
770 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
771 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
772 | "license": "MIT",
773 | "dependencies": {
774 | "ms": "2.1.2"
775 | },
776 | "engines": {
777 | "node": ">=6.0"
778 | },
779 | "peerDependenciesMeta": {
780 | "supports-color": {
781 | "optional": true
782 | }
783 | }
784 | },
785 | "node_modules/mquery/node_modules/ms": {
786 | "version": "2.1.2",
787 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
788 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
789 | "license": "MIT"
790 | },
791 | "node_modules/ms": {
792 | "version": "2.0.0",
793 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
794 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
795 | "license": "MIT"
796 | },
797 | "node_modules/negotiator": {
798 | "version": "0.6.3",
799 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
800 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
801 | "license": "MIT",
802 | "engines": {
803 | "node": ">= 0.6"
804 | }
805 | },
806 | "node_modules/object-assign": {
807 | "version": "4.1.1",
808 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
809 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
810 | "license": "MIT",
811 | "engines": {
812 | "node": ">=0.10.0"
813 | }
814 | },
815 | "node_modules/object-inspect": {
816 | "version": "1.13.2",
817 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
818 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
819 | "license": "MIT",
820 | "engines": {
821 | "node": ">= 0.4"
822 | },
823 | "funding": {
824 | "url": "https://github.com/sponsors/ljharb"
825 | }
826 | },
827 | "node_modules/on-finished": {
828 | "version": "2.4.1",
829 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
830 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
831 | "license": "MIT",
832 | "dependencies": {
833 | "ee-first": "1.1.1"
834 | },
835 | "engines": {
836 | "node": ">= 0.8"
837 | }
838 | },
839 | "node_modules/parseurl": {
840 | "version": "1.3.3",
841 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
842 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
843 | "license": "MIT",
844 | "engines": {
845 | "node": ">= 0.8"
846 | }
847 | },
848 | "node_modules/path-to-regexp": {
849 | "version": "0.1.7",
850 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
851 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
852 | "license": "MIT"
853 | },
854 | "node_modules/proxy-addr": {
855 | "version": "2.0.7",
856 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
857 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
858 | "license": "MIT",
859 | "dependencies": {
860 | "forwarded": "0.2.0",
861 | "ipaddr.js": "1.9.1"
862 | },
863 | "engines": {
864 | "node": ">= 0.10"
865 | }
866 | },
867 | "node_modules/proxy-from-env": {
868 | "version": "1.1.0",
869 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
870 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
871 | "license": "MIT",
872 | "peer": true
873 | },
874 | "node_modules/punycode": {
875 | "version": "2.3.1",
876 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
877 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
878 | "license": "MIT",
879 | "engines": {
880 | "node": ">=6"
881 | }
882 | },
883 | "node_modules/qs": {
884 | "version": "6.11.0",
885 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
886 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
887 | "license": "BSD-3-Clause",
888 | "dependencies": {
889 | "side-channel": "^1.0.4"
890 | },
891 | "engines": {
892 | "node": ">=0.6"
893 | },
894 | "funding": {
895 | "url": "https://github.com/sponsors/ljharb"
896 | }
897 | },
898 | "node_modules/range-parser": {
899 | "version": "1.2.1",
900 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
901 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
902 | "license": "MIT",
903 | "engines": {
904 | "node": ">= 0.6"
905 | }
906 | },
907 | "node_modules/raw-body": {
908 | "version": "2.5.2",
909 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
910 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
911 | "license": "MIT",
912 | "dependencies": {
913 | "bytes": "3.1.2",
914 | "http-errors": "2.0.0",
915 | "iconv-lite": "0.4.24",
916 | "unpipe": "1.0.0"
917 | },
918 | "engines": {
919 | "node": ">= 0.8"
920 | }
921 | },
922 | "node_modules/safe-buffer": {
923 | "version": "5.2.1",
924 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
925 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
926 | "funding": [
927 | {
928 | "type": "github",
929 | "url": "https://github.com/sponsors/feross"
930 | },
931 | {
932 | "type": "patreon",
933 | "url": "https://www.patreon.com/feross"
934 | },
935 | {
936 | "type": "consulting",
937 | "url": "https://feross.org/support"
938 | }
939 | ],
940 | "license": "MIT"
941 | },
942 | "node_modules/safer-buffer": {
943 | "version": "2.1.2",
944 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
945 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
946 | "license": "MIT"
947 | },
948 | "node_modules/send": {
949 | "version": "0.18.0",
950 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
951 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
952 | "license": "MIT",
953 | "dependencies": {
954 | "debug": "2.6.9",
955 | "depd": "2.0.0",
956 | "destroy": "1.2.0",
957 | "encodeurl": "~1.0.2",
958 | "escape-html": "~1.0.3",
959 | "etag": "~1.8.1",
960 | "fresh": "0.5.2",
961 | "http-errors": "2.0.0",
962 | "mime": "1.6.0",
963 | "ms": "2.1.3",
964 | "on-finished": "2.4.1",
965 | "range-parser": "~1.2.1",
966 | "statuses": "2.0.1"
967 | },
968 | "engines": {
969 | "node": ">= 0.8.0"
970 | }
971 | },
972 | "node_modules/send/node_modules/ms": {
973 | "version": "2.1.3",
974 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
975 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
976 | "license": "MIT"
977 | },
978 | "node_modules/serve-static": {
979 | "version": "1.15.0",
980 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
981 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
982 | "license": "MIT",
983 | "dependencies": {
984 | "encodeurl": "~1.0.2",
985 | "escape-html": "~1.0.3",
986 | "parseurl": "~1.3.3",
987 | "send": "0.18.0"
988 | },
989 | "engines": {
990 | "node": ">= 0.8.0"
991 | }
992 | },
993 | "node_modules/set-function-length": {
994 | "version": "1.2.2",
995 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
996 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
997 | "license": "MIT",
998 | "dependencies": {
999 | "define-data-property": "^1.1.4",
1000 | "es-errors": "^1.3.0",
1001 | "function-bind": "^1.1.2",
1002 | "get-intrinsic": "^1.2.4",
1003 | "gopd": "^1.0.1",
1004 | "has-property-descriptors": "^1.0.2"
1005 | },
1006 | "engines": {
1007 | "node": ">= 0.4"
1008 | }
1009 | },
1010 | "node_modules/setprototypeof": {
1011 | "version": "1.2.0",
1012 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1013 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1014 | "license": "ISC"
1015 | },
1016 | "node_modules/side-channel": {
1017 | "version": "1.0.6",
1018 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
1019 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
1020 | "license": "MIT",
1021 | "dependencies": {
1022 | "call-bind": "^1.0.7",
1023 | "es-errors": "^1.3.0",
1024 | "get-intrinsic": "^1.2.4",
1025 | "object-inspect": "^1.13.1"
1026 | },
1027 | "engines": {
1028 | "node": ">= 0.4"
1029 | },
1030 | "funding": {
1031 | "url": "https://github.com/sponsors/ljharb"
1032 | }
1033 | },
1034 | "node_modules/sift": {
1035 | "version": "17.1.3",
1036 | "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
1037 | "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
1038 | "license": "MIT"
1039 | },
1040 | "node_modules/sparse-bitfield": {
1041 | "version": "3.0.3",
1042 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1043 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1044 | "license": "MIT",
1045 | "dependencies": {
1046 | "memory-pager": "^1.0.2"
1047 | }
1048 | },
1049 | "node_modules/statuses": {
1050 | "version": "2.0.1",
1051 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1052 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1053 | "license": "MIT",
1054 | "engines": {
1055 | "node": ">= 0.8"
1056 | }
1057 | },
1058 | "node_modules/toidentifier": {
1059 | "version": "1.0.1",
1060 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1061 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1062 | "license": "MIT",
1063 | "engines": {
1064 | "node": ">=0.6"
1065 | }
1066 | },
1067 | "node_modules/tr46": {
1068 | "version": "4.1.1",
1069 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
1070 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
1071 | "license": "MIT",
1072 | "dependencies": {
1073 | "punycode": "^2.3.0"
1074 | },
1075 | "engines": {
1076 | "node": ">=14"
1077 | }
1078 | },
1079 | "node_modules/type-is": {
1080 | "version": "1.6.18",
1081 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1082 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1083 | "license": "MIT",
1084 | "dependencies": {
1085 | "media-typer": "0.3.0",
1086 | "mime-types": "~2.1.24"
1087 | },
1088 | "engines": {
1089 | "node": ">= 0.6"
1090 | }
1091 | },
1092 | "node_modules/unpipe": {
1093 | "version": "1.0.0",
1094 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1095 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1096 | "license": "MIT",
1097 | "engines": {
1098 | "node": ">= 0.8"
1099 | }
1100 | },
1101 | "node_modules/utils-merge": {
1102 | "version": "1.0.1",
1103 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1104 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1105 | "license": "MIT",
1106 | "engines": {
1107 | "node": ">= 0.4.0"
1108 | }
1109 | },
1110 | "node_modules/vary": {
1111 | "version": "1.1.2",
1112 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1113 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1114 | "license": "MIT",
1115 | "engines": {
1116 | "node": ">= 0.8"
1117 | }
1118 | },
1119 | "node_modules/webidl-conversions": {
1120 | "version": "7.0.0",
1121 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1122 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1123 | "license": "BSD-2-Clause",
1124 | "engines": {
1125 | "node": ">=12"
1126 | }
1127 | },
1128 | "node_modules/whatwg-url": {
1129 | "version": "13.0.0",
1130 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
1131 | "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
1132 | "license": "MIT",
1133 | "dependencies": {
1134 | "tr46": "^4.1.1",
1135 | "webidl-conversions": "^7.0.0"
1136 | },
1137 | "engines": {
1138 | "node": ">=16"
1139 | }
1140 | }
1141 | }
1142 | }
1143 |
--------------------------------------------------------------------------------