├── 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 | --------------------------------------------------------------------------------