From 6be41fab6eefc7d236ac17669d27382ce986a1d6 Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Mon, 27 Nov 2023 14:51:05 +0100 Subject: [PATCH] Project upgrade to 2.0.0 with k8s support --- .gitlab-ci.yml | 267 ++ README.md | 34 +- backend/Dockerfile | 23 +- backend/README.md | 13 +- backend/chat_bot_function.py | 20 +- backend/document_topics.py | 28 + backend/ingest.py | 154 +- backend/k8s/config.yml | 10 + backend/k8s/deployment.yml | 64 + backend/k8s/service.yml | 13 + backend/labels_dictionary.py | 29 - backend/labels_dictionary_full.py | 95 - backend/main.py | 140 +- backend/requirements.txt | 30 +- backend/start.sh | 8 - backend/test_main.py | 4 + docker-compose.yml | 117 +- frontend/Dockerfile | 12 +- frontend/README.md | 11 +- frontend/k8s/config.yml | 11 + frontend/k8s/deployment.yml | 48 + frontend/k8s/ingress.yml | 20 + frontend/k8s/service.yml | 13 + frontend/package-lock.json | 2901 +++++++---------- frontend/package.json | 65 +- frontend/src/hooks.client.ts | 5 +- frontend/src/hooks.server.ts | 2 +- .../src/lib/components/ActionCardStats.svelte | 4 +- .../src/lib/components/ActionCards.svelte | 6 +- frontend/src/lib/components/FileTable.svelte | 47 +- frontend/src/lib/components/MainFooter.svelte | 10 +- frontend/src/lib/components/MainNavbar.svelte | 40 +- frontend/src/lib/components/PDFViewer.svelte | 32 +- frontend/src/lib/components/StatsBar.svelte | 15 +- .../(auth)/email-change/+page.server.ts | 6 +- .../src/routes/(auth)/login/+page.server.ts | 6 +- frontend/src/routes/(auth)/login/+page.svelte | 6 +- .../src/routes/(auth)/logout/+page.server.ts | 3 +- .../(auth)/password-reset/+page.server.ts | 4 +- .../src/routes/(auth)/profile/+page.server.ts | 7 +- .../src/routes/(auth)/profile/+page.svelte | 36 +- .../routes/(auth)/register/+page.server.ts | 7 +- .../src/routes/(auth)/register/+page.svelte | 4 +- frontend/src/routes/+layout.svelte | 19 +- frontend/src/routes/+page.server.ts | 7 +- frontend/src/routes/+page.svelte | 26 +- frontend/src/routes/api/documents/+server.ts | 18 + .../api/documents/[documentID]/+server.ts | 14 + .../documents/[documentID]/delete/+server.ts | 22 + .../[documentID]/download/+server.ts | 26 + .../documents/recent_document_id/+server.ts | 23 + frontend/src/routes/api/stats_bar/+server.ts | 15 + frontend/src/routes/api/stats_home/+server.ts | 6 + frontend/src/routes/api/user-image/+server.ts | 23 + frontend/src/routes/dashboard/+page.server.ts | 3 +- .../dashboard/file-create/+page.server.ts | 7 +- .../routes/dashboard/file-create/+page.svelte | 5 +- .../file-create/done/[id]/+page.server.ts | 3 +- .../file-create/done/[id]/+page.svelte | 4 +- .../file-create/preview/+page.server.ts | 3 +- .../file-create/preview/+page.svelte | 46 +- .../dashboard/file-read/[id]/+page.server.ts | 7 +- .../dashboard/file-read/[id]/+page.svelte | 47 +- .../dashboard/file-upload/+page.server.ts | 14 +- .../routes/dashboard/file-upload/+page.svelte | 4 +- .../file-upload/done/[id]/+page.server.ts | 3 +- .../file-upload/done/[id]/+page.svelte | 4 +- .../file-upload/preview/+page.server.ts | 3 +- .../file-upload/preview/+page.svelte | 44 +- .../stats/all-chunks-topics/+page.server.ts | 8 - .../stats/all-chunks-topics/+page.svelte | 230 -- .../stats/all-docs-topics/+page.server.ts | 3 +- .../stats/all-docs-topics/+page.svelte | 19 +- .../doc-chunks-topics/[id]/+page.server.ts | 9 - .../stats/doc-chunks-topics/[id]/+page.svelte | 188 -- frontend/src/routes/metrics/+server.ts | 21 + frontend/svelte.config.js | 14 +- grafana/.dockerignore | 9 + grafana/.gitignore | 3 + grafana/Dockerfile | 19 + grafana/README.md | 30 + grafana/dashboards/dashboard.yml | 11 + .../prometheus-dashboard-ee-k8s.json | 905 +++++ .../prometheus-dashboard-ee-local.json | 905 +++++ grafana/datasources/datasource.yml | 17 + grafana/k8s/deployment.yml | 45 + grafana/k8s/service.yml | 12 + pocketbase/Dockerfile | 12 +- pocketbase/README.md | 13 +- pocketbase/init-pocketbase.sh | 17 + pocketbase/k8s/deployment.yml | 63 + pocketbase/k8s/pv-pvc.yml | 29 + pocketbase/k8s/service.yml | 13 + .../1698581801_created_documents.js | 130 + .../1698581801_created_documents_stats.js | 109 + ...698581801_created_documents_total_stats.js | 46 + .../1698581856_collections_snapshot.js | 328 ++ pocketbase/{ => pb_migrations}/pb_schema.json | 115 +- prometheus/.dockerignore | 10 + prometheus/.gitignore | 3 + prometheus/Dockerfile | 7 +- prometheus/README.md | 15 + prometheus/k8s/deployment.yml | 45 + prometheus/k8s/service.yml | 13 + prometheus/prometheus.yml | 8 +- qdrant/Dockerfile | 5 + qdrant/README.md | 2 +- qdrant/k8s/deployment.yml | 52 + qdrant/k8s/pv-pvc.yml | 29 + qdrant/k8s/service.yml | 13 + 110 files changed, 5503 insertions(+), 2788 deletions(-) create mode 100644 .gitlab-ci.yml create mode 100644 backend/document_topics.py create mode 100644 backend/k8s/config.yml create mode 100644 backend/k8s/deployment.yml create mode 100644 backend/k8s/service.yml delete mode 100644 backend/labels_dictionary.py delete mode 100644 backend/labels_dictionary_full.py delete mode 100644 backend/start.sh create mode 100644 frontend/k8s/config.yml create mode 100644 frontend/k8s/deployment.yml create mode 100644 frontend/k8s/ingress.yml create mode 100644 frontend/k8s/service.yml create mode 100644 frontend/src/routes/api/documents/+server.ts create mode 100644 frontend/src/routes/api/documents/[documentID]/+server.ts create mode 100644 frontend/src/routes/api/documents/[documentID]/delete/+server.ts create mode 100644 frontend/src/routes/api/documents/[documentID]/download/+server.ts create mode 100644 frontend/src/routes/api/documents/recent_document_id/+server.ts create mode 100644 frontend/src/routes/api/stats_bar/+server.ts create mode 100644 frontend/src/routes/api/stats_home/+server.ts create mode 100644 frontend/src/routes/api/user-image/+server.ts delete mode 100644 frontend/src/routes/dashboard/stats/all-chunks-topics/+page.server.ts delete mode 100644 frontend/src/routes/dashboard/stats/all-chunks-topics/+page.svelte delete mode 100644 frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.server.ts delete mode 100644 frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.svelte create mode 100644 frontend/src/routes/metrics/+server.ts create mode 100644 grafana/.dockerignore create mode 100644 grafana/.gitignore create mode 100644 grafana/Dockerfile create mode 100644 grafana/README.md create mode 100644 grafana/dashboards/dashboard.yml create mode 100644 grafana/dashboards/prometheus-dashboard-ee-k8s.json create mode 100644 grafana/dashboards/prometheus-dashboard-ee-local.json create mode 100644 grafana/datasources/datasource.yml create mode 100644 grafana/k8s/deployment.yml create mode 100644 grafana/k8s/service.yml create mode 100644 pocketbase/init-pocketbase.sh create mode 100644 pocketbase/k8s/deployment.yml create mode 100644 pocketbase/k8s/pv-pvc.yml create mode 100644 pocketbase/k8s/service.yml create mode 100644 pocketbase/pb_migrations/1698581801_created_documents.js create mode 100644 pocketbase/pb_migrations/1698581801_created_documents_stats.js create mode 100644 pocketbase/pb_migrations/1698581801_created_documents_total_stats.js create mode 100644 pocketbase/pb_migrations/1698581856_collections_snapshot.js rename pocketbase/{ => pb_migrations}/pb_schema.json (81%) create mode 100644 prometheus/.dockerignore create mode 100644 prometheus/.gitignore create mode 100644 prometheus/README.md create mode 100644 prometheus/k8s/deployment.yml create mode 100644 prometheus/k8s/service.yml create mode 100644 qdrant/k8s/deployment.yml create mode 100644 qdrant/k8s/pv-pvc.yml create mode 100644 qdrant/k8s/service.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..4ad2d64 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,267 @@ +stages: + - test + - build + - scan + - push + - deploy + +variables: + CONTAINER_REGISTRY: "registry.digitalocean.com/htw" + +.build_template: &build_definition + stage: build + tags: + - ubuntu-runner + script: + - cd $CI_PROJECT_DIR/$SERVICE_PATH + - docker build -t $SERVICE_NAME:$CI_PIPELINE_ID . + +test_backend: + stage: test + variables: + SERVICE_PATH: "./backend" + RUNNING_TESTS: "true" + tags: + - ubuntu-runner + script: + - export RUNNING_TESTS=${RUNNING_TESTS} + - python3.10 -m pip --version || (wget https://bootstrap.pypa.io/get-pip.py && python3.10 get-pip.py --user) + - export PATH=$PATH:~/.local/bin + - cd $SERVICE_PATH + - pip install -r requirements.txt + - pytest + +test_frontend: + stage: test + variables: + SERVICE_PATH: "./frontend" + tags: + - ubuntu-runner + script: + - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash + - source ~/.nvm/nvm.sh + - nvm install 18 + - nvm use 18 + - cd $SERVICE_PATH + - npm cache clean --force + - npm ci + - npm test + +.scan_template: &scan_definition + stage: scan + tags: + - ubuntu-runner + script: + - trivy image --severity HIGH,CRITICAL --no-progress $SERVICE_NAME:$CI_PIPELINE_ID + +.push_template: &push_definition + stage: push + tags: + - ubuntu-runner + script: + - docker tag $SERVICE_NAME:$CI_PIPELINE_ID $CONTAINER_REGISTRY/$SERVICE_NAME:$CI_PIPELINE_ID + - docker push $CONTAINER_REGISTRY/$SERVICE_NAME:$CI_PIPELINE_ID + +.deploy_template: &deploy_definition + stage: deploy + tags: + - ubuntu-runner + script: + - export KUBECONFIG=$KUBECONFIG_DATA + - kubectl config set-context --current --namespace=example-namespace-name + - cd $CI_PROJECT_DIR/$SERVICE_PATH/k8s + - if [ -f config.yml ]; then kubectl apply -f config.yml; fi + - if [ -f pv-pvc.yml ]; then kubectl apply -f pv-pvc.yml; fi + - if [ -f ingress.yml ]; then kubectl apply -f ingress.yml; fi + - sed -i "s|registry/app:tag|$CONTAINER_REGISTRY/$SERVICE_NAME:$CI_PIPELINE_ID|g" deployment.yml + - kubectl apply -f deployment.yml + - kubectl apply -f service.yml + +# Frontend Service + +build_frontend: + <<: *build_definition + variables: + SERVICE_NAME: "ee-frontend" + SERVICE_PATH: "./frontend" + +scan_frontend: + <<: *scan_definition + variables: + SERVICE_NAME: "ee-frontend" + +push_frontend: + <<: *push_definition + variables: + SERVICE_NAME: "ee-frontend" + +deploy_frontend: + <<: *deploy_definition + variables: + SERVICE_NAME: "ee-frontend" + SERVICE_PATH: "./frontend" + +# Backend Service + +build_backend: + <<: *build_definition + variables: + SERVICE_NAME: "ee-backend" + SERVICE_PATH: "./backend" + +scan_backend: + <<: *scan_definition + variables: + SERVICE_NAME: "ee-backend" + +push_backend: + <<: *push_definition + variables: + SERVICE_NAME: "ee-backend" + +deploy_backend: + stage: deploy + tags: + - ubuntu-runner + variables: + SERVICE_NAME: "ee-backend" + SERVICE_PATH: "./backend" + script: + # Custom script steps for the backend deployment + - export KUBECONFIG=$KUBECONFIG_DATA + - kubectl config set-context --current --namespace=example-namespace-name + - | + if kubectl get secret ee-backend-secrets &> /dev/null; then + kubectl delete secret ee-backend-secrets + fi + kubectl create secret generic ee-backend-secrets \ + --from-literal=OPENAI_API_KEY=$OPENAI_API_KEY \ + --from-literal=POCKETBASE_ADMIN_EMAIL=$POCKETBASE_ADMIN_EMAIL \ + --from-literal=POCKETBASE_ADMIN_PASSWORD=$POCKETBASE_ADMIN_PASSWORD + + # Deploy definition steps + - cd $CI_PROJECT_DIR/$SERVICE_PATH/k8s + - if [ -f config.yml ]; then kubectl apply -f config.yml; fi + - if [ -f pv-pvc.yml ]; then kubectl apply -f pv-pvc.yml; fi + - if [ -f ingress.yml ]; then kubectl apply -f ingress.yml; fi + - sed -i "s|registry/app:tag|$CONTAINER_REGISTRY/$SERVICE_NAME:$CI_PIPELINE_ID|g" deployment.yml + - kubectl apply -f deployment.yml + - kubectl apply -f service.yml + +# Qdrant Service + +build_qdrant: + <<: *build_definition + variables: + SERVICE_NAME: "ee-qdrant" + SERVICE_PATH: "./qdrant" + +scan_qdrant: + <<: *scan_definition + variables: + SERVICE_NAME: "ee-qdrant" + +push_qdrant: + <<: *push_definition + variables: + SERVICE_NAME: "ee-qdrant" + +deploy_qdrant: + <<: *deploy_definition + variables: + SERVICE_NAME: "ee-qdrant" + SERVICE_PATH: "./qdrant" + +# Pocketbase Service + +build_pocketbase: + <<: *build_definition + variables: + SERVICE_NAME: "ee-pocketbase" + SERVICE_PATH: "./pocketbase" + +scan_pocketbase: + <<: *scan_definition + variables: + SERVICE_NAME: "ee-pocketbase" + +push_pocketbase: + <<: *push_definition + variables: + SERVICE_NAME: "ee-pocketbase" + +deploy_pocketbase: + stage: deploy + tags: + - ubuntu-runner + variables: + SERVICE_NAME: "ee-pocketbase" + SERVICE_PATH: "./pocketbase" + script: + # Custom script steps for the pocketbase deployment + - export KUBECONFIG=$KUBECONFIG_DATA + - kubectl config set-context --current --namespace=example-namespace-name + - | + if kubectl get secret ee-pocketbase-secrets &> /dev/null; then + kubectl delete secret ee-pocketbase-secrets + fi + kubectl create secret generic ee-pocketbase-secrets \ + --from-literal=POCKETBASE_ADMIN_EMAIL=$POCKETBASE_ADMIN_EMAIL \ + --from-literal=POCKETBASE_ADMIN_PASSWORD=$POCKETBASE_ADMIN_PASSWORD + + # Deploy definition steps + - cd $CI_PROJECT_DIR/$SERVICE_PATH/k8s + - if [ -f config.yml ]; then kubectl apply -f config.yml; fi + - if [ -f pv-pvc.yml ]; then kubectl apply -f pv-pvc.yml; fi + - if [ -f ingress.yml ]; then kubectl apply -f ingress.yml; fi + - sed -i "s|registry/app:tag|$CONTAINER_REGISTRY/$SERVICE_NAME:$CI_PIPELINE_ID|g" deployment.yml + - kubectl apply -f deployment.yml + - kubectl apply -f service.yml + +# Prometheus Service + +build_prometheus: + <<: *build_definition + variables: + SERVICE_NAME: "ee-prometheus" + SERVICE_PATH: "./prometheus" + +scan_prometheus: + <<: *scan_definition + variables: + SERVICE_NAME: "ee-prometheus" + +push_prometheus: + <<: *push_definition + variables: + SERVICE_NAME: "ee-prometheus" + +deploy_prometheus: + <<: *deploy_definition + variables: + SERVICE_NAME: "ee-prometheus" + SERVICE_PATH: "./prometheus" + +# Grafana Service + +build_grafana: + <<: *build_definition + variables: + SERVICE_NAME: "ee-grafana" + SERVICE_PATH: "./grafana" + +scan_grafana: + <<: *scan_definition + variables: + SERVICE_NAME: "ee-grafana" + +push_grafana: + <<: *push_definition + variables: + SERVICE_NAME: "ee-grafana" + +deploy_grafana: + <<: *deploy_definition + variables: + SERVICE_NAME: "ee-grafana" + SERVICE_PATH: "./grafana" diff --git a/README.md b/README.md index c053b7d..439c12e 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,20 @@ This is the Repository for the unified services for the Epistle Engine with Github actions and Docker support. +## Important! + +You should be using the Chrome/Edge Browser for testing and using the application. + +Because in the frontend env file: PUBLIC_SECURE=true to test it. Only if you are need to test it on safari change it to false. + +Also On the Cluster it is set to TRUE. So you can only test it with Chrome/Edge. + +for init-pocketbase.sh to run, you need the file to be in LF line endings, so please do not edit the file or open it. If you have the error: init-pocketbase.sh not found, edit the file to have LF line endings and not CRLF! + ## Status -[![Test Backend](https://github.com/kamyabnazari/epistle-engine/actions/workflows/test-backend.yml/badge.svg)](https://github.com/kamyabnazari/epistle-engine/actions/workflows/test-backend.yml) -[![Test Frontend](https://github.com/kamyabnazari/epistle-engine/actions/workflows/test-frontend.yml/badge.svg)](https://github.com/kamyabnazari/epistle-engine/actions/workflows/test-frontend.yml) +Test Backend +Test Frontend ## About the Project @@ -65,6 +75,14 @@ Branch Example: `kn-feature-name-example` - [Qdrant](https://qdrant.io/) [Vector Search Engine] +### Prometheus + +- [Prometheus](https://prometheus.io/) [Obeservation Tool] + +### Grafana + +- [Grafana](https://grafana.com/) [Dashboard Tool] + ## Getting Started Install all the prerequisites and follow the instructions in the README.md files of the services. @@ -90,6 +108,14 @@ These all also have to be installed on the system in order to generate PDFs. Please create the services after another in order and follow the instructions in the README.md files. +When you run them individually you have to use localhost to access and connect them to each other. + +Or Use Docker Compose to create all of it and connect them together. + +```bash +docker-compose up --build +``` + Please setup in the following order: ### 1. Setup [Pocketbase](pocketbase/README.md) @@ -99,3 +125,7 @@ Please setup in the following order: ### 3. Setup [Backend](backend/README.md) ### 4. Setup [Frontend](frontend/README.md) + +### 5. Setup [Prometheus](prometheus/README.md) + +### 6. Setup [Grafana](grafana/README.md) diff --git a/backend/Dockerfile b/backend/Dockerfile index 2eb2c87..164ba0d 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,20 +1,31 @@ # Dockerfile for the backend service testing -FROM python:3 +FROM python:3.10 + +# Set environment variable +ENV XDG_RUNTIME_DIR=/tmp/runtime-root # Install system dependencies RUN apt-get update && \ - apt-get install -y libcairo2-dev pkg-config texlive-base texlive-latex-recommended wkhtmltopdf && \ + apt-get install -y \ + libcairo2-dev \ + pkg-config \ + texlive-base \ + texlive-latex-recommended \ + wkhtmltopdf && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* +# Set the working directory inside the container WORKDIR /app + +# Copy the local src files to the container ADD . /app # Install python dependencies RUN pip install -r requirements.txt --no-cache-dir -# Make sure our start script is executable -RUN chmod +x /app/start.sh - +# Expose port for the application EXPOSE 5003 -CMD ["./start.sh"] + +# Command to run the application +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5003", "--timeout-keep-alive", "360"] \ No newline at end of file diff --git a/backend/README.md b/backend/README.md index 20a9803..f02c122 100644 --- a/backend/README.md +++ b/backend/README.md @@ -10,18 +10,19 @@ Create a `.env` file in the root of the backend directory with the following var OPENAI_API_KEY={your openai api key} POCKETBASE_ADMIN_EMAIL={your pocketbase admin email} POCKETBASE_ADMIN_PASSWORD={your pocketbase admin password} -PUBLIC_POCKETBASE_URL=http://localhost:8090 -PUBLIC_FRONTEND_URL=http://localhost:5173 -PUBLIC_QDRANT_URL=http://localhost:6333 -QDRANT__SERVICE_API_KEY={Only for Deployed Qdrant} +PUBLIC_POCKETBASE_URL=http://ee-pocketbase:8090 +PUBLIC_FRONTEND_URL=http://ee-frontend:3000 +PUBLIC_QDRANT_URL=http://ee-qdrant:6333 +PUBLIC_PROMETHEUS_URL=http://ee-prometheus:9090 +RUNNING_TESTS=false // if you want to run tests set to true ``` ### Running the backend To install the required packages for this plugin and run the service locally, run the following commands: -```bash -pip install --upgrade -r requirements.txt +``` +pip install -r requirements.txt uvicorn main:app --reload --host 0.0.0.0 --port 5003 --timeout-keep-alive 360 ``` diff --git a/backend/chat_bot_function.py b/backend/chat_bot_function.py index 529610e..0f6f919 100644 --- a/backend/chat_bot_function.py +++ b/backend/chat_bot_function.py @@ -1,32 +1,24 @@ -import os from langchain.chat_models import ChatOpenAI from langchain.embeddings.openai import OpenAIEmbeddings from langchain.chains import ConversationalRetrievalChain from langchain.schema import HumanMessage, AIMessage from langchain.vectorstores import Qdrant + from qdrant_client import QdrantClient from dotenv import load_dotenv load_dotenv() -def make_chain(documentId:str): +def make_chain(documentId:str, qdrant_client: QdrantClient): model = ChatOpenAI( - model_name="gpt-4", + model_name="gpt-3.5-turbo", temperature="0", ) embeddings = OpenAIEmbeddings() - url = os.getenv('PUBLIC_QDRANT_URL') - api_key = os.getenv('QDRANT__SERVICE_API_KEY') - - if api_key: - client = QdrantClient(url=url, prefer_grpc=True, api_key=api_key) - else: - client = QdrantClient(url=url) - - qdrant = Qdrant(client, documentId, embeddings) + qdrant = Qdrant(qdrant_client, documentId, embeddings) return ConversationalRetrievalChain.from_llm( model, @@ -34,11 +26,11 @@ def make_chain(documentId:str): return_source_documents=True, ) -def chat_bot_funtion(question: str, chat_history, documentId: str): +def chat_bot_funtion(question: str, chat_history, documentId: str, qdrant_client: QdrantClient): if not chat_history: chat_history=[] - chain = make_chain(documentId) + chain = make_chain(documentId, qdrant_client) # Generate answer response = chain({"question": question, "chat_history": chat_history}) diff --git a/backend/document_topics.py b/backend/document_topics.py new file mode 100644 index 0000000..54f1648 --- /dev/null +++ b/backend/document_topics.py @@ -0,0 +1,28 @@ +document_topics = [ + "Technology", "Software", "Hardware", "Network", "Cybersecurity", + "Artificial Intelligence", "Blockchain", "Science", "Biology", "Chemistry", + "Physics", "Astronomy", "Environmental", "Health", "Nutrition", + "Mental Health", "Medicine", "Fitness", "Disease", "Finance", + "Investment", "Banking", "Insurance", "Cryptocurrency", "Stock Market", + "Business", "Entrepreneurship", "Marketing", "E-commerce", "Human Resources", + "Strategy", "Education", "Online Learning", "Curriculum", "College", + "K-12", "Scholarship", "Legal", "Contract", "Intellectual Property", + "Criminal", "Employment Law", "Real Estate", "Art and Culture", "Music", + "Literature", "Film", "Theatre", "Visual Arts", "Politics", + "Government", "Policy", "Elections", "International Relations", "Activism", + "Environment", "Sustainability", "Climate Change", "Conservation", "Renewable Energy", + "Pollution", "Sports", "Football", "Basketball", "Baseball", + "Soccer", "Olympics", "Travel", "Adventure", "Hotels", + "Flights", "Tourism", "Cuisine", "Social Media", "Platforms", + "Trends", "Influencers", "Digital Marketing", "Analytics", "Automotive", + "Electric Vehicles", "Cars", "Trucks", "Motorcycles", "Auto Industry", + "Real Estate", "Residential", "Commercial", "Mortgages", "Investment", + "Architecture", "Lifestyle", "Fashion", "Food and Drink", "Wellness", + "Hobbies", "Relationships", "Religion", "Christianity", "Islam", + "Hinduism", "Buddhism", "Spirituality", "Entertainment", "Movies", + "Television", "Gaming", "Books", "Celebrity", "Construction", + "Architecture", "Engineering", "Infrastructure", "Materials", "Project Management", + "Manufacturing", "Production", "Robotics", "Supply Chain", "Quality Control", + "Logistics", "Agriculture", "Farming", "Livestock", "Horticulture", + "Organic", "Sustainability" +] diff --git a/backend/ingest.py b/backend/ingest.py index a614a79..b595d03 100644 --- a/backend/ingest.py +++ b/backend/ingest.py @@ -1,4 +1,3 @@ -import json import pdfplumber import PyPDF3 import re @@ -9,8 +8,12 @@ from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Qdrant +from langchain import LLMChain +from langchain.chat_models import ChatOpenAI +from langchain.prompts import ChatPromptTemplate -from transformers import pipeline +# Import document_topics from document_topics.py +from document_topics import document_topics # Importing pocketbase sdk from pocketbase import PocketBase @@ -19,37 +22,13 @@ from collections import Counter -from retry import retry - import logging -from labels_dictionary import get_candidate_labels_for_documents, get_candidate_labels_for_chunks - logging.basicConfig(level=logging.INFO) load_dotenv() -# Define the maximum number of retries and the delay between retries -max_retries = 5 -retry_delay = 2 - -pocketbase_url = os.getenv("PUBLIC_POCKETBASE_URL") - -# Empty PocketBase client -pocketbase_client = None - -# Function to create PocketBase client with retries -@retry(tries=max_retries, delay=retry_delay) -def create_pocketbase_client(): - pocketbase_client = PocketBase(pocketbase_url) - - # Login as admin - pocketbase_client.admins.auth_with_password( - os.getenv("POCKETBASE_ADMIN_EMAIL"), os.getenv("POCKETBASE_ADMIN_PASSWORD") - ) - - # If the above code executes successfully, return the PocketBase client - return pocketbase_client +qdrant_public_url = os.getenv('PUBLIC_QDRANT_URL') def extract_metadata_from_pdf(file_path: str) -> Dict[str, str]: with open(file_path, "rb") as pdf_file: @@ -61,42 +40,6 @@ def extract_metadata_from_pdf(file_path: str) -> Dict[str, str]: "creation_date": metadata.get("/CreationDate", "").strip(), } -# Load the classifier once at the top of your script -classifier = pipeline("zero-shot-classification", model="distilbert-base-uncased") - -def classify_topics_document(text:str) -> str: - candidate_labels = get_candidate_labels_for_documents() - result = classifier(text, candidate_labels, multi_label=True) - # find the index of the topic with the highest score - highest_score_index = result["scores"].index(max(result["scores"])) - # log the labels and their scores - logging.info(f"Document Labels: {result['labels']}") - logging.info(f"Document Scores: {result['scores']}") - # return the topic with the highest score if this score is greater than 0.4 - if(max(result["scores"])) < 0.4: - return "Other" - else: - return result["labels"][highest_score_index] - -def classify_topics_chunks(chunks: List[str]) -> List[str]: - candidate_labels = get_candidate_labels_for_chunks() - results = classifier(chunks, candidate_labels, multi_label=True) - - classified_chunks = [] - for result in results: - # find the index of the topic with the highest score - highest_score_index = result["scores"].index(max(result["scores"])) - # log the labels and their scores - logging.info(f"Chunk Labels: {result['labels']}") - logging.info(f"Chunk Scores: {result['scores']}") - # add the topic with the highest score if this score is greater than 0.4 - if max(result["scores"]) < 0.4: - classified_chunks.append("Other") - else: - classified_chunks.append(result["labels"][highest_score_index]) - - return classified_chunks - def extract_pages_from_pdf(file_path: str) -> List[Tuple[int, str]]: """ Extracts the text from each page of the PDF. @@ -153,7 +96,6 @@ def clean_text( cleaned_pages.append((page_num, text)) return cleaned_pages - def text_to_docs(text: List[str], metadata: Dict[str, str]) -> List[Document]: """Converts list of strings to a list of Documents with metadata.""" doc_chunks = [] @@ -166,41 +108,62 @@ def text_to_docs(text: List[str], metadata: Dict[str, str]) -> List[Document]: ) chunks = text_splitter.split_text(page) all_chunks.extend([(page_num, i, chunk) for i, chunk in enumerate(chunks)]) - - all_topics = classify_topics_chunks([chunk for _, _, chunk in all_chunks]) - - topic_counts = count_topic_occurrences(all_topics) - for (page_num, i, chunk), topic in zip(all_chunks, all_topics): + for page_num, i, chunk in all_chunks: doc = Document( page_content=chunk, metadata={ "page_number": page_num, "chunk": i, "source": f"p{page_num}-{i}", - "topic" : topic, **metadata, }, ) doc_chunks.append(doc) - return doc_chunks, topic_counts + return doc_chunks def count_topic_occurrences(topics: List[str]) -> List[Dict[str, Union[str, int]]]: counter = Counter(topics) result = [{'id': topic, 'value': count} for topic, count in counter.items()] return result -def create_embeddings_from_pdf_file(file_path: str, documentId: str): - # Step 0: Create Pocketbase client - pocketbase_client = create_pocketbase_client() +def classify_topic_document(text:str, openai_model: ChatOpenAI) -> str: + # Create a Classification prompt + classify_prompt = ChatPromptTemplate.from_template( + "Based on the following text: '{all_texts}', " + "please classify the document by selecting one word from this list of topics: {all_topics}. " + "Choose the topic that is most accurately represented in the text." + ) + + all_topics = ', '.join(document_topics) + all_texts = text[:1000] + + # classify_prompt_value = classify_prompt.format(all_topics=all_topics, all_texts=all_texts) + + # Create a dictionary to hold the inputs + classify_prompt_dict = { + 'all_topics': all_topics, + 'all_texts': all_texts + } + llm_chain = LLMChain( + prompt=classify_prompt, + llm=openai_model + ) + + # Classify Document on the basis of its text + classify_result = llm_chain.run(classify_prompt_dict) + + return classify_result + +def create_embeddings_from_pdf_file(file_path: str, documentId: str, pocketbase_client: PocketBase, openai_model: ChatOpenAI): # Step 1: Parse PDF raw_pages, metadata = parse_pdf(file_path) # Step 1.5: Classify the topic of the whole document whole_document_text = " ".join([text for _, text in raw_pages]) - document_topic = classify_topics_document(whole_document_text) - metadata["document_topic"] = document_topic # add the document's topic to the metadata + document_topic = classify_topic_document(whole_document_text, openai_model) + metadata["document_topic"] = document_topic # add the document's topic to the metadata # Step 1.75: Update the document's topic in the database data = { @@ -215,37 +178,16 @@ def create_embeddings_from_pdf_file(file_path: str, documentId: str): remove_multiple_newlines, ] cleaned_text_pdf = clean_text(raw_pages, cleaning_functions) - document_chunks, topic_counts = text_to_docs(cleaned_text_pdf, metadata) - - # Step 2.5: Save the topic statistics to PocketBase - data = { - "classified_doc_chunks_topics": json.dumps(topic_counts) - } - pocketbase_client.collection('documents').update(documentId, data) + document_chunks = text_to_docs(cleaned_text_pdf, metadata) # Step 3 + 4: Generate embeddings and store them in DB embeddings = OpenAIEmbeddings() - url = os.getenv('PUBLIC_QDRANT_URL') - api_key = os.getenv('QDRANT__SERVICE_API_KEY') - - if api_key: - Qdrant.from_documents( - document_chunks, - embedding=embeddings, - url=url, - prefer_grpc=True, - api_key=api_key, - collection_name=documentId, - timeout=120 - ) - else: - Qdrant.from_documents( - document_chunks, - embedding=embeddings, - url=url, - prefer_grpc=False, - collection_name=documentId, - timeout=120 - ) - \ No newline at end of file + Qdrant.from_documents( + document_chunks, + embedding=embeddings, + url=qdrant_public_url, + prefer_grpc=False, + collection_name=documentId, + timeout=120 + ) \ No newline at end of file diff --git a/backend/k8s/config.yml b/backend/k8s/config.yml new file mode 100644 index 0000000..0006865 --- /dev/null +++ b/backend/k8s/config.yml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: ee-backend-config +data: + PUBLIC_POCKETBASE_URL: "http://ee-pocketbase:8090" + PUBLIC_FRONTEND_URL: "http://ee-frontend:3000" + PUBLIC_QDRANT_URL: "http://ee-qdrant:6333" + PUBLIC_PROMETHEUS_URL: "http://ee-prometheus:9090" + RUNNING_TESTS: "false" diff --git a/backend/k8s/deployment.yml b/backend/k8s/deployment.yml new file mode 100644 index 0000000..634404c --- /dev/null +++ b/backend/k8s/deployment.yml @@ -0,0 +1,64 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ee-backend +spec: + replicas: 1 + selector: + matchLabels: + app: ee-backend + template: + metadata: + labels: + app: ee-backend + spec: + containers: + - name: ee-backend + image: registry/app:tag + ports: + - containerPort: 5003 + envFrom: + - configMapRef: + name: ee-backend-config + env: + - name: OPENAI_API_KEY + valueFrom: + secretKeyRef: + name: ee-backend-secrets + key: OPENAI_API_KEY + - name: POCKETBASE_ADMIN_EMAIL + valueFrom: + secretKeyRef: + name: ee-backend-secrets + key: POCKETBASE_ADMIN_EMAIL + - name: POCKETBASE_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: ee-backend-secrets + key: POCKETBASE_ADMIN_PASSWORD + resources: + limits: + cpu: 300m + memory: 300Mi + requests: + cpu: 100m + memory: 100Mi + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: /health + port: 5003 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /health + port: 5003 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 diff --git a/backend/k8s/service.yml b/backend/k8s/service.yml new file mode 100644 index 0000000..081a9df --- /dev/null +++ b/backend/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: ee-backend +spec: + type: ClusterIP + ports: + - port: 5003 + name: api + targetPort: 5003 + protocol: TCP + selector: + app: ee-backend diff --git a/backend/labels_dictionary.py b/backend/labels_dictionary.py deleted file mode 100644 index 34dd53d..0000000 --- a/backend/labels_dictionary.py +++ /dev/null @@ -1,29 +0,0 @@ -def get_candidate_labels_for_documents(): - return [ - "Technology", - "Science", - "Politics", - "Business", - "Lifestyle", - "Art", - "Entertainment", - "Sports", - "Health", - "Education", - ] - -def get_candidate_labels_for_chunks(): - return [ - "Introduction", - "Main Argument", - "Evidence", - "Counterargument", - "Conclusion", - "Background Information", - "Methodology", - "Results", - "Analysis", - "Summary", - "Theory", - "Application", - ] \ No newline at end of file diff --git a/backend/labels_dictionary_full.py b/backend/labels_dictionary_full.py deleted file mode 100644 index 9fa5d4f..0000000 --- a/backend/labels_dictionary_full.py +++ /dev/null @@ -1,95 +0,0 @@ -def get_candidate_labels_for_documents(): - return [ - "Technology", - "Science", - "Politics", - "Business", - "Lifestyle", - "Art", - "Entertainment", - "Sports", - "Health", - "Education", - "Environment", - "Travel", - "Food and Cooking", - "Fashion", - "History", - "Literature", - "Music", - "Film and TV", - "Gaming", - "Fitness and Wellness", - "Social Issues", - "Economics", - "Psychology", - "Philosophy", - "Religion", - "Sociology", - "Law", - "Medicine", - "Astronomy", - "Mathematics", - "Engineering", - "Architecture", - "Geography", - "Anthropology", - "Linguistics", - "Biology", - "Chemistry", - "Physics", - "Marketing", - "Management", - "Computer Science", - "Data Science", - "Statistics", - "Machine Learning", - "Cheat Sheet", - ] - -def get_candidate_labels_for_chunks(): - return [ - "Introduction", - "Main Argument", - "Evidence", - "Counterargument", - "Conclusion", - "Background Information", - "Methodology", - "Results", - "Analysis", - "Summary", - "Theory", - "Application", - "Case Study", - "Review", - "Recommendation", - "Biography", - "Historical Context", - "Future Outlook", - "Legal Aspect", - "Ethical Consideration", - "Abstract", - "Hypothesis", - "Findings", - "Discussion", - "Limitations", - "Acknowledgments", - "References", - "Appendix", - "Data", - "Procedures", - "Experiments", - "Literature Review", - "Problem Statement", - "Objectives", - "Key Terms", - "Implications", - "Research Questions", - "Theory Development", - "Data Analysis", - "Research Design", - "Proposed Solution", - "Code", - "Results and Discussion", - ] \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 249d5e8..5f53cac 100644 --- a/backend/main.py +++ b/backend/main.py @@ -1,8 +1,8 @@ import subprocess +import time import pdfkit import io import os -from qdrant_client import QdrantClient import requests # Python package for PDF parsing @@ -19,6 +19,8 @@ from langchain.prompts import ChatPromptTemplate from langchain.schema import HumanMessage, AIMessage +from qdrant_client import QdrantClient + from dotenv import load_dotenv # Importing pocketbase sdk @@ -34,44 +36,89 @@ # Observability Tool from prometheus_fastapi_instrumentator import Instrumentator +import logging +import requests +from typing import Tuple, Optional + load_dotenv() from retry import retry # Define the maximum number of retries and the delay between retries max_retries = 5 -retry_delay = 2 +retry_delay = 5 +initial_delay = 5 -pocketbase_url = os.getenv("PUBLIC_POCKETBASE_URL") -frontend_public_url = os.getenv("PUBLIC_FRONTEND_URL") -prometheus_public_url = os.getenv("PUBLIC_PROMETHEUS_URL") -apikey = os.getenv("OPENAI_API_KEY") +pocketbase_public_url = os.getenv("PUBLIC_POCKETBASE_URL", "http://default-pocketbase-url") +frontend_public_url = os.getenv("PUBLIC_FRONTEND_URL", "http://default-frontend-url") +prometheus_public_url = os.getenv("PUBLIC_PROMETHEUS_URL", "http://default-prometheus-url") +qdrant_public_url = os.getenv('PUBLIC_QDRANT_URL', 'http://default-qdrant-url') +openai_api_key = os.getenv("OPENAI_API_KEY", 'default-openai-api-key') -# Empty PocketBase client -pocketbase_client = None +running_tests_str = os.getenv('RUNNING_TESTS', 'false') +running_tests_bool = running_tests_str.lower() == 'true' + +app = FastAPI() + +app.add_middleware( + CORSMiddleware, + allow_origins=[pocketbase_public_url, frontend_public_url, prometheus_public_url, qdrant_public_url], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) # Function to create PocketBase client with retries @retry(tries=max_retries, delay=retry_delay) def create_pocketbase_client(): - pocketbase_client = PocketBase(pocketbase_url) + if running_tests_bool: + print("Skipping client creation during tests.") + return None + + time.sleep(initial_delay) + + client = PocketBase(pocketbase_public_url) # Login as admin - pocketbase_client.admins.auth_with_password( + client.admins.auth_with_password( os.getenv("POCKETBASE_ADMIN_EMAIL"), os.getenv("POCKETBASE_ADMIN_PASSWORD") ) # If the above code executes successfully, return the PocketBase client - return pocketbase_client + return client -app = FastAPI() +# Function to create Qdrant client with retries +@retry(tries=max_retries, delay=retry_delay) +def create_qdrant_client(): + if running_tests_bool: + print("Skipping client creation during tests.") + return None + + # Create Qdrant client with retries + client = QdrantClient(url=qdrant_public_url) -app.add_middleware( - CORSMiddleware, - allow_origins=[pocketbase_url, frontend_public_url, prometheus_public_url], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) + # If the above code executes successfully, return the Qdrant client + return client + +def create_openai_model(): + if running_tests_bool: + print("Skipping model creation during tests.") + return None + + # Create OpenAI model with retries + model = ChatOpenAI(openai_api_key=openai_api_key, model_name = 'gpt-3.5-turbo') + + # If the above code executes successfully, return the Qdrant client + return model + +# Create PocketBase client with retries +pocketbase_client = create_pocketbase_client() + +# Create Qdrant client with retries +qdrant_client = create_qdrant_client() + +# use the v LLM +openai_model = create_openai_model() @app.get("/") async def read_root(): @@ -87,22 +134,17 @@ async def _startup(): async def read_favicon(): return FileResponse("favicon.ico", media_type="image/vnd.microsoft.icon") +@app.get("/health") +async def health_check(): + return {"status": "OK"} + @app.get("/api") async def read_api_root(): return {"message": "Welcome to the EE API!"} @app.post("/api/documents/{document_id}/delete_vector_file") -async def delete_api_vector_file(document_id: str): - - url = os.getenv('PUBLIC_QDRANT_URL') - api_key = os.getenv('QDRANT__SERVICE_API_KEY') - - if api_key: - client = QdrantClient(url=url, prefer_grpc=True, api_key=api_key) - else: - client = QdrantClient(url=url) - - client.delete_collection(document_id) +async def delete_api_vector_file(document_id: str): + qdrant_client.delete_collection(document_id) return {"message": "Vector file deleted!"} @app.post("/api/documents/{document_id}/send_new_message/{user_id}") @@ -114,14 +156,14 @@ async def read_api_documents_send_new_message(document_id: str, user_id: str, re message = body.get('message') history = body.get('history') chat_history = [] - #loop through the chat history to create a new chat history array for the chat_bot_function + # loop through the chat history to create a new chat history array for the chat_bot_function for el in history: if(el.get('sender') == "person"): chat_history.append(HumanMessage(content=el.get('message'))) else: chat_history.append(AIMessage(content=el.get('message'))) - response, new_chat_history = chat_bot_funtion(message, chat_history=chat_history, documentId=document_id) + response, new_chat_history = chat_bot_funtion(message, chat_history=chat_history, documentId=document_id, qdrant_client=qdrant_client) answer = response["answer"] source = response["source_documents"] @@ -130,21 +172,18 @@ async def read_api_documents_send_new_message(document_id: str, user_id: str, re @app.post("/api/documents/{document_id}/document_post_process/{user_id}") async def read_api_documents_document_post_process(document_id: str, user_id: str): - # Create PocketBase client with retries - pocketbase_client = create_pocketbase_client() - - content, recordId = get_file_from_pb(document_id, user_id) + content, recordId = get_file_from_pb(document_id, user_id, pocketbase_public_url, pocketbase_client) # Write content to a file pdf_file_name = "created-document.pdf" with open(pdf_file_name, "wb") as file: file.write(content) - file.close + file.close() # Generate a PDF file current_dir = os.getcwd() pdf_path = os.path.join(current_dir, pdf_file_name) - create_embeddings_from_pdf_file(pdf_path, document_id) + create_embeddings_from_pdf_file(pdf_path, document_id, pocketbase_client, openai_model) os.remove(pdf_path) total_pages = get_pdf_page_count(io.BytesIO(content)) @@ -155,16 +194,9 @@ async def read_api_documents_document_post_process(document_id: str, user_id: st "word_count": total_words } pocketbase_client.collection('documents').update(recordId, data) - @app.post("/api/documents/create/{user_id}") -async def read_api_document_create(user_id: str, request: Request): - # Create PocketBase client with retries - pocketbase_client = create_pocketbase_client() - - # use the gpt-4 LLM - openai_model = ChatOpenAI(openai_api_key=apikey, model_name = 'gpt-4') - +async def read_api_document_create(user_id: str, request: Request): # Accessing Request body and converting it to a dictionary body = await request.json() @@ -180,7 +212,6 @@ async def read_api_document_create(user_id: str, request: Request): prompt = latex_prompt, llm = openai_model ) - #TODO scan text to classify topic of the document # Generate LaTeX content using this prompt latex_content = llm_chain.run(latex_prompt_value) latex_content = "\\documentclass{article}\n\\begin{document}\n" + latex_content + "\n\\end{document}" @@ -225,7 +256,7 @@ async def read_api_document_create(user_id: str, request: Request): # Generate a Embeddings from the PDF file current_dir = os.getcwd() pdf_path = os.path.join(current_dir, pdf_file_name) - create_embeddings_from_pdf_file(pdf_path, documentId) + create_embeddings_from_pdf_file(pdf_path, documentId, pocketbase_client, openai_model) # Delete the generated LaTeX and PDF files os.remove(pdf_file_path) @@ -283,7 +314,7 @@ async def read_api_document_create(user_id: str, request: Request): # Generate a Embeddings from the PDF file current_dir = os.getcwd() pdf_path = os.path.join(current_dir, pdf_file_name) - create_embeddings_from_pdf_file(pdf_path, documentId) + create_embeddings_from_pdf_file(pdf_path, documentId, pocketbase_client, openai_model) # Delete the generated HTML and PDF files os.remove(html_file_name) @@ -317,11 +348,12 @@ def get_pdf_word_count(file_content): return total_words -def get_file_from_pb(document_id: str, user_id: str): +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +def get_file_from_pb(document_id: str, user_id: str, pocketbase_public_url: str, pocketbase_client: PocketBase) -> Optional[Tuple[bytes, str]]: try: - # Create PocketBase client with retries - pocketbase_client = create_pocketbase_client() - # Fetching document from the database by document ID response = pocketbase_client.collection("documents").get_one(document_id) response_dict = dict(response.__dict__) # Convert Record object to a dictionary @@ -341,7 +373,7 @@ def get_file_from_pb(document_id: str, user_id: str): size = '0x0' if owner == user_id: - url = f"{pocketbase_url}/api/files/{collectionId}/{recordId}/{fileName}?thumb={size}" + url = f"{pocketbase_public_url}/api/files/{collectionId}/{recordId}/{fileName}?thumb={size}" response = requests.get(url) response.raise_for_status() return response.content, recordId diff --git a/backend/requirements.txt b/backend/requirements.txt index 9c4f62e..31e21f0 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,16 +1,14 @@ -langchain -fastapi -uvicorn -openai -python-dotenv -pocketbase -PyPDF3 -pdfkit -pytest -pdfplumber -qdrant-client -retry -tiktoken -transformers -tensorflow -prometheus-fastapi-instrumentator \ No newline at end of file +langchain==0.0.333 +fastapi==0.103.1 +uvicorn==0.23.2 +openai==1.2.0 +python-dotenv==1.0.0 +pocketbase==0.8.1 +PyPDF3==1.0.6 +pdfkit==1.0.0 +pytest==7.4.1 +pdfplumber==0.10.2 +qdrant-client==1.4.0 +retry==0.9.2 +tiktoken==0.4.0 +prometheus-fastapi-instrumentator==6.1.0 diff --git a/backend/start.sh b/backend/start.sh deleted file mode 100644 index 273944b..0000000 --- a/backend/start.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# This is a script that will be run at the start of the container. - -# Download transformers model -python -c "from transformers import AutoModel; AutoModel.from_pretrained('distilbert-base-uncased')" - -# Start the application -uvicorn main:app --host 0.0.0.0 --port 5003 --timeout-keep-alive 360 \ No newline at end of file diff --git a/backend/test_main.py b/backend/test_main.py index e6fbf4e..6e0e8c6 100644 --- a/backend/test_main.py +++ b/backend/test_main.py @@ -12,3 +12,7 @@ def test_read_api_root(): response = client.get("/api") assert response.status_code == 200 assert response.json() == {"message": "Welcome to the EE API!"} + +def test_read_health(): + response = client.get("/health") + assert response.status_code == 200 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index aba15bc..2f37f30 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,8 @@ version: "3.8" name: ee-application services: + +# Pocketbase service ee-pocketbase: image: ee-pocketbase container_name: ee-pocketbase @@ -13,10 +15,17 @@ services: volumes: - ./pocketbase/pb_data:/pb_data healthcheck: - test: wget --no-verbose --tries=1 --spider http://localhost:8090/api/health || exit 1 - interval: 5s - timeout: 5s - retries: 5 + test: wget --no-verbose --tries=1 --spider http://ee-pocketbase:8090/api/health || exit 1 + interval: 10s + timeout: 10s + retries: 10 + networks: + - ee-network + env_file: + - pocketbase/.env + +# Qdrant service + ee-qdrant: image: ee-qdrant container_name: ee-qdrant @@ -28,6 +37,65 @@ services: - "6333:6333" volumes: - ./qdrant/qd_data:/qdrant/storage + healthcheck: + test: wget --no-verbose --tries=1 http://ee-qdrant:6333/healthz || exit 1 + interval: 10s + timeout: 10s + retries: 10 + networks: + - ee-network + +# Backend service + + ee-backend: + image: ee-backend + container_name: ee-backend + restart: unless-stopped + build: + context: ./backend + dockerfile: Dockerfile + depends_on: + - ee-pocketbase + - ee-qdrant + ports: + - "5003:5003" + healthcheck: + test: wget --no-verbose --tries=1 http://ee-backend:5003/health || exit 1 + interval: 10s + timeout: 10s + retries: 10 + networks: + - ee-network + env_file: + - backend/.env + +# Frontend service + + ee-frontend: + image: ee-frontend + container_name: ee-frontend + restart: unless-stopped + build: + context: ./frontend + dockerfile: Dockerfile + depends_on: + - ee-pocketbase + - ee-qdrant + - ee-backend + ports: + - "3000:3000" + healthcheck: + test: wget --no-verbose --tries=1 --spider http://ee-frontend:3000/ || exit 1 + interval: 10s + timeout: 10s + retries: 10 + networks: + - ee-network + env_file: + - frontend/.env + +# Prometheus service + ee-prometheus: image: ee-prometheus container_name: ee-prometheus @@ -35,5 +103,44 @@ services: build: context: ./prometheus dockerfile: Dockerfile + depends_on: + - ee-frontend + - ee-backend ports: - - "9090:9090" \ No newline at end of file + - "9090:9090" + volumes: + - ./prometheus/pm_data:/prometheus + healthcheck: + test: wget --no-verbose --tries=1 --spider http://ee-prometheus:9090/-/healthy || exit 1 + interval: 10s + timeout: 10s + retries: 10 + networks: + - ee-network + +# Grafana service + + ee-grafana: + image: ee-grafana + container_name: ee-grafana + restart: unless-stopped + build: + context: ./grafana + dockerfile: Dockerfile + depends_on: + - ee-prometheus + ports: + - "3050:3000" + volumes: + - ./grafana/gf_data:/var/lib/grafana + healthcheck: + test: wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1 + interval: 10s + timeout: 10s + retries: 10 + networks: + - ee-network + +networks: + ee-network: + driver: bridge \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 713e34d..5708adc 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,18 +1,22 @@ # Dockerfile for EE Application -FROM node:18-alpine AS builder +FROM node:20.8.1 AS builder WORKDIR /app -COPY package*.json . +COPY package*.json ./ RUN npm ci COPY . . +# This should be set to empty if it is not used! +ENV BASE_PATH= RUN npm run build RUN npm prune --production -FROM node:18-alpine +FROM node:20.8.1 WORKDIR /app COPY --from=builder /app/build build/ COPY --from=builder /app/node_modules node_modules/ COPY package.json . EXPOSE 3000 ENV NODE_ENV=production -CMD [ "node", "build" ] \ No newline at end of file +# This should be set to empty if it is not used! +ENV BASE_PATH= +CMD [ "node", "build" ] diff --git a/frontend/README.md b/frontend/README.md index b5e8d3d..63b6fac 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -7,9 +7,8 @@ Create a `.env` file in the root of the frontend directory with the following variables: ``` -PUBLIC_POCKETBASE_URL=http://localhost:8090 -PUBLIC_BACKEND_URL=http://localhost:5003 -PUBLIC_QDRANT_URL=http://localhost:6333 +PUBLIC_POCKETBASE_URL=http://ee-pocketbase:8090 +PUBLIC_BACKEND_URL=http://ee-backend:5003 PUBLIC_SECURE=true // if testing on safari or firefox, set to false PUBLIC_HTTPONLY=false PUBLIC_SAMESITE=None @@ -18,17 +17,19 @@ BODY_SIZE_LIMIT=0 ### Running the frontend -```bash +``` npm install npm run dev ``` +http://localhost:3000/ or http://localhost:5173/ + ### Building the project To create a production version of your app: -```bash +``` npm run build ``` diff --git a/frontend/k8s/config.yml b/frontend/k8s/config.yml new file mode 100644 index 0000000..40283ca --- /dev/null +++ b/frontend/k8s/config.yml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: ee-frontend-config +data: + PUBLIC_POCKETBASE_URL: "http://ee-pocketbase:8090" + PUBLIC_BACKEND_URL: "http://ee-backend:5003" + PUBLIC_SECURE: "true" + PUBLIC_HTTPONLY: "false" + PUBLIC_SAMESITE: "None" + BODY_SIZE_LIMIT: "0" diff --git a/frontend/k8s/deployment.yml b/frontend/k8s/deployment.yml new file mode 100644 index 0000000..a533535 --- /dev/null +++ b/frontend/k8s/deployment.yml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ee-frontend +spec: + replicas: 1 + selector: + matchLabels: + app: ee-frontend + template: + metadata: + labels: + app: ee-frontend + spec: + containers: + - name: ee-frontend + image: registry/app:tag + ports: + - containerPort: 3000 + envFrom: + - configMapRef: + name: ee-frontend-config + resources: + limits: + cpu: 300m + memory: 300Mi + requests: + cpu: 100m + memory: 100Mi + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 diff --git a/frontend/k8s/ingress.yml b/frontend/k8s/ingress.yml new file mode 100644 index 0000000..1fa8ff8 --- /dev/null +++ b/frontend/k8s/ingress.yml @@ -0,0 +1,20 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ee-frontend-ingress + namespace: example-namespace-name + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" +spec: + ingressClassName: nginx + rules: + - host: domainname.xyz + http: + paths: + - pathType: ImplementationSpecific + path: /(/|$)(.*) + backend: + service: + name: ee-frontend + port: + number: 3000 diff --git a/frontend/k8s/service.yml b/frontend/k8s/service.yml new file mode 100644 index 0000000..afee711 --- /dev/null +++ b/frontend/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: ee-frontend +spec: + type: ClusterIP + ports: + - port: 3000 + name: webui + targetPort: 3000 + protocol: TCP + selector: + app: ee-frontend diff --git a/frontend/package-lock.json b/frontend/package-lock.json index fd73ad8..e3543fa 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,47 +1,49 @@ { "name": "ee-application", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ee-application", - "version": "1.0.1", + "version": "1.0.2", "dependencies": { - "axios": "^1.4.0", + "axios": "^1.6.0", "d3": "^7.8.5", - "pdfjs-dist": "^3.7.107", - "pocketbase": "^0.15.2" + "dotenv": "^16.3.1", + "pdfjs-dist": "^3.11.174", + "pocketbase": "^0.15.2", + "prom-client": "^15.0.0" }, "devDependencies": { - "@iconify/json": "^2.2.82", - "@sveltejs/adapter-node": "^1.2.4", - "@sveltejs/kit": "^1.20.5", - "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/typography": "^0.5.9", - "@testing-library/svelte": "^3.2.2", - "@typescript-eslint/eslint-plugin": "^5.60.0", - "@typescript-eslint/parser": "^5.60.0", - "autoprefixer": "^10.4.14", - "daisyui": "^3.1.7", - "eslint": "^8.43.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-svelte": "^2.31.0", + "@iconify/json": "^2.2.134", + "@sveltejs/adapter-node": "^1.3.1", + "@sveltejs/kit": "^1.27.1", + "@tailwindcss/forms": "^0.5.6", + "@tailwindcss/typography": "^0.5.10", + "@testing-library/svelte": "^4.0.4", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", + "autoprefixer": "^10.4.16", + "daisyui": "^3.9.4", + "eslint": "^8.52.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-svelte": "^2.34.0", "jsdom": "^22.1.0", "postcss": "^8.4.31", - "prettier": "^2.8.8", - "prettier-plugin-svelte": "^2.10.1", - "prettier-plugin-tailwindcss": "^0.3.0", - "svelte": "^3.54.0", - "svelte-check": "^3.4.4", - "sveltekit-superforms": "^1.1.1", - "tailwindcss": "^3.3.2", - "tslib": "^2.5.3", - "typescript": "^5.1.3", - "unplugin-icons": "^0.16.3", - "vite": "^4.3.9", - "vitest": "^0.32.2", - "zod": "^3.22.3" + "prettier": "^3.0.3", + "prettier-plugin-svelte": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.6", + "svelte": "^4.2.2", + "svelte-check": "^3.5.2", + "sveltekit-superforms": "^1.8.0", + "tailwindcss": "^3.3.5", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "unplugin-icons": "^0.17.1", + "vite": "^4.5.0", + "vitest": "^0.34.6", + "zod": "^3.22.4" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -65,6 +67,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@antfu/install-pkg": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", @@ -79,50 +94,28 @@ } }, "node_modules/@antfu/utils": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.4.tgz", - "integrity": "sha512-qe8Nmh9rYI/HIspLSTwtbMFPj6dISG6+dJnOguTlPNXtCvS2uezdxscVBb7/3DrmNbQK49TDqpkSQ1chbRGdpQ==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { + "node_modules/@babel/code-frame/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", @@ -134,7 +127,7 @@ "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/chalk": { + "node_modules/@babel/code-frame/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", @@ -148,7 +141,7 @@ "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { + "node_modules/@babel/code-frame/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", @@ -157,13 +150,13 @@ "color-name": "1.1.3" } }, - "node_modules/@babel/highlight/node_modules/color-name": { + "node_modules/@babel/code-frame/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", @@ -172,7 +165,7 @@ "node": ">=0.8.0" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { + "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", @@ -181,7 +174,7 @@ "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { + "node_modules/@babel/code-frame/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -193,365 +186,123 @@ "node": ">=4" } }, - "node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -573,23 +324,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -605,21 +356,30 @@ } }, "node_modules/@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -641,15 +401,15 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@iconify/json": { - "version": "2.2.82", - "resolved": "https://registry.npmjs.org/@iconify/json/-/json-2.2.82.tgz", - "integrity": "sha512-MBnhpcVZl6Gq0L50+yO1x4t+IWS3jpJUjnelBNHvXgQZ1lhQOmL6q5fIyrkTIBas8XA+tbhWwYe2kdZabNDH8w==", + "version": "2.2.134", + "resolved": "https://registry.npmjs.org/@iconify/json/-/json-2.2.134.tgz", + "integrity": "sha512-FNhZA6m+SVPdFfnRu3yZZV3iZzziopkSxGHF3no0Qz1z8v0/iVJl8PxJtHMDsedIXmpU4fMAw07iVVRY6G7Adw==", "dev": true, "dependencies": { "@iconify/types": "*", @@ -663,19 +423,43 @@ "dev": true }, "node_modules/@iconify/utils": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.7.tgz", - "integrity": "sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.11.tgz", + "integrity": "sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==", "dev": true, "dependencies": { "@antfu/install-pkg": "^0.1.1", - "@antfu/utils": "^0.7.4", + "@antfu/utils": "^0.7.5", "@iconify/types": "^2.0.0", "debug": "^4.3.4", "kolorist": "^1.8.0", "local-pkg": "^0.4.3" } }, + "node_modules/@iconify/utils/node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -691,9 +475,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -715,39 +499,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", - "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -785,16 +543,24 @@ "node": ">= 8" } }, + "node_modules/@opentelemetry/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, "node_modules/@rollup/plugin-commonjs": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz", - "integrity": "sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==", + "version": "25.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", + "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -802,13 +568,13 @@ "estree-walker": "^2.0.2", "glob": "^8.0.3", "is-reference": "1.2.1", - "magic-string": "^0.27.0" + "magic-string": "^0.30.3" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^2.68.0||^3.0.0" + "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -817,9 +583,9 @@ } }, "node_modules/@rollup/plugin-json": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", - "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.1.tgz", + "integrity": "sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1" @@ -828,7 +594,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -837,9 +603,9 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", - "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -853,7 +619,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^2.78.0||^3.0.0" + "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -862,9 +628,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz", + "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -875,7 +641,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -883,13 +649,19 @@ } } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@sveltejs/adapter-node": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.2.4.tgz", - "integrity": "sha512-TNnhS+OKRZ9RKnC+ho5mlE2FJquI61i0v7yOXxBUSU3LAoYH2kwVVL8P8ecjefmZ8BOfM1V54pBnDODBU5CEaA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.3.1.tgz", + "integrity": "sha512-A0VgRQDCDPzdLNoiAbcOxGw4zT1Mc+n1LwT1OmO350R7WxrEqdMUChPPOd1iMfIDWlP4ie6E2d/WQf5es2d4Zw==", "dev": true, "dependencies": { - "@rollup/plugin-commonjs": "^24.0.0", + "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", "rollup": "^3.7.0" @@ -899,9 +671,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.20.5.tgz", - "integrity": "sha512-8rJYZ2boRlO75lwpbpB+DlSzIwmTuamXTpVlDtw4dBk86o3UaDe/+Ro4xCsV/4FtTw2U8xPHyV83edAWbQHG0w==", + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.1.tgz", + "integrity": "sha512-nYkOUJKbeI8fcwvt/cyhTdz6VG4kT6XVprNnzfIwif+IZ8RvxvJuPhPhYjz14ASIcMLpq8xC6D3X4xH3bvWi+Q==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -912,11 +684,12 @@ "esm-env": "^1.0.0", "kleur": "^4.1.5", "magic-string": "^0.30.0", - "mime": "^3.0.0", + "mrmime": "^1.0.1", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^2.0.2", - "undici": "~5.22.0" + "tiny-glob": "^0.2.9", + "undici": "~5.26.2" }, "bin": { "svelte-kit": "svelte-kit.js" @@ -929,30 +702,18 @@ "vite": "^4.0.0" } }, - "node_modules/@sveltejs/kit/node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.2.tgz", - "integrity": "sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.6.tgz", + "integrity": "sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==", "dev": true, "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^1.0.3", + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.4", "debug": "^4.3.4", "deepmerge": "^4.3.1", "kleur": "^4.1.5", - "magic-string": "^0.30.0", - "svelte-hmr": "^0.15.2", + "magic-string": "^0.30.3", + "svelte-hmr": "^0.15.3", "vitefu": "^0.2.4" }, "engines": { @@ -964,9 +725,9 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.3.tgz", - "integrity": "sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz", + "integrity": "sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -980,22 +741,10 @@ "vite": "^4.0.0" } }, - "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.6.tgz", + "integrity": "sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==", "dev": true, "dependencies": { "mini-svg-data-uri": "^1.2.3" @@ -1005,9 +754,9 @@ } }, "node_modules/@tailwindcss/typography": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", - "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.10.tgz", + "integrity": "sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==", "dev": true, "dependencies": { "lodash.castarray": "^4.4.0", @@ -1020,9 +769,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -1035,22 +784,22 @@ "pretty-format": "^27.0.2" }, "engines": { - "node": ">=12" + "node": ">=14" } }, "node_modules/@testing-library/svelte": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-3.2.2.tgz", - "integrity": "sha512-IKwZgqbekC3LpoRhSwhd0JswRGxKdAGkf39UiDXTywK61YyLXbCYoR831e/UUC6EeNW4hiHPY+2WuovxOgI5sw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-4.0.4.tgz", + "integrity": "sha512-m5ExbO2fMZDR8J03DWXJrJ6untfIE6aDL00DpYbXLy1HwqnY+KxdDMCbx3OvCR5yi7Z6bFCV91dgetlWdeOEKw==", "dev": true, "dependencies": { - "@testing-library/dom": "^8.1.0" + "@testing-library/dom": "^9.3.1" }, "engines": { "node": ">= 10" }, "peerDependencies": { - "svelte": "3.x" + "svelte": "^3 || ^4" } }, "node_modules/@tootallnate/once": { @@ -1063,54 +812,57 @@ } }, "node_modules/@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", + "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", "dev": true }, "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.4.tgz", + "integrity": "sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==", "dev": true, "dependencies": { "@types/chai": "*" } }, "node_modules/@types/cookie": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", - "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.3.tgz", + "integrity": "sha512-SLg07AS9z1Ab2LU+QxzU8RCmzsja80ywjf/t5oqw+4NSH20gIGlhLOrBDm1L3PBWzPa4+wkgFQVZAjE6Ioj2ug==", "dev": true }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", - "dev": true + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.8.tgz", + "integrity": "sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==", "dev": true }, "node_modules/@types/resolve": { @@ -1120,38 +872,39 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1160,25 +913,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", - "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1187,16 +941,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1204,25 +958,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1231,12 +985,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1244,21 +998,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1271,72 +1025,76 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.9.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitest/expect": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.32.2.tgz", - "integrity": "sha512-6q5yzweLnyEv5Zz1fqK5u5E83LU+gOMVBDuxBl2d2Jfx1BAp5M+rZgc5mlyqdnxquyoiOXpXmFNkcGcfFnFH3Q==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", + "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", "dev": true, "dependencies": { - "@vitest/spy": "0.32.2", - "@vitest/utils": "0.32.2", - "chai": "^4.3.7" + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "chai": "^4.3.10" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.32.2.tgz", - "integrity": "sha512-06vEL0C1pomOEktGoLjzZw+1Fb+7RBRhmw/06WkDrd1akkT9i12su0ku+R/0QM69dfkIL/rAIDTG+CSuQVDcKw==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", + "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", "dev": true, "dependencies": { - "@vitest/utils": "0.32.2", - "concordance": "^5.0.4", + "@vitest/utils": "0.34.6", "p-limit": "^4.0.0", - "pathe": "^1.1.0" + "pathe": "^1.1.1" }, "funding": { "url": "https://opencollective.com/vitest" @@ -1370,73 +1128,119 @@ } }, "node_modules/@vitest/snapshot": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.32.2.tgz", - "integrity": "sha512-JwhpeH/PPc7GJX38vEfCy9LtRzf9F4er7i4OsAJyV7sjPwjj+AIR8cUgpMTWK4S3TiamzopcTyLsZDMuldoi5A==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", + "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", "dev": true, "dependencies": { - "magic-string": "^0.30.0", - "pathe": "^1.1.0", - "pretty-format": "^27.5.1" + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "node_modules/@vitest/snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@vitest/snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/@vitest/spy": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.32.2.tgz", - "integrity": "sha512-Q/ZNILJ4ca/VzQbRM8ur3Si5Sardsh1HofatG9wsJY1RfEaw0XKP8IVax2lI1qnrk9YPuG9LA2LkZ0EI/3d4ug==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", + "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", "dev": true, "dependencies": { - "tinyspy": "^2.1.0" + "tinyspy": "^2.1.1" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.32.2.tgz", - "integrity": "sha512-lnJ0T5i03j0IJaeW73hxe2AuVnZ/y1BhhCOuIcl9LIzXnbpXJT9Lrt6brwKHXLOiA7MZ6N5hSJjt0xE1dGNCzQ==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", + "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", "dev": true, "dependencies": { "diff-sequences": "^29.4.3", "loupe": "^2.3.6", - "pretty-format": "^27.5.1" + "pretty-format": "^29.5.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1455,9 +1259,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1467,7 +1271,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "devOptional": true, + "dev": true, "dependencies": { "debug": "4" }, @@ -1495,7 +1299,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -1534,25 +1338,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1611,9 +1396,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -1623,12 +1408,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -1656,20 +1445,29 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true + "dev": true }, "node_modules/binary-extensions": { "version": "2.2.0", @@ -1680,17 +1478,16 @@ "node": ">=8" } }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1709,9 +1506,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -1728,10 +1525,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1761,18 +1558,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dev": true, - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1783,13 +1568,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1814,9 +1600,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001507", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", - "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==", + "version": "1.0.30001555", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001555.tgz", + "integrity": "sha512-NzbUFKUnJ3DTcq6YyZB6+qqhfD112uR3uoEnkmfzm2wVzUNsFkU7AwBjKQ654Sp5cau0JxhFyRSn/tQZ+XfygA==", "dev": true, "funding": [ { @@ -1833,34 +1619,19 @@ } ] }, - "node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -1883,10 +1654,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -1930,13 +1704,26 @@ "node": ">= 6" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "optional": true, - "engines": { - "node": ">=10" + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/code-red/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" } }, "node_modules/color-convert": { @@ -1957,15 +1744,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -1984,12 +1762,11 @@ } }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/commondir": { @@ -2002,32 +1779,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true - }, - "node_modules/concordance": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", - "dev": true, - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "optional": true + "dev": true }, "node_modules/cookie": { "version": "0.5.0", @@ -2062,6 +1814,19 @@ "fastparse": "^1.1.2" } }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -2245,14 +2010,6 @@ "node": ">=12" } }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -2465,15 +2222,16 @@ } }, "node_modules/daisyui": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.1.7.tgz", - "integrity": "sha512-VQhaunQlB7Buo+AbE+S3i6H/eYknKEuKVHG67y7sbG58uEjeLK6n2rojG3YE7fwoOss6ldbUL8Oy0MyoJi0CHw==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.9.4.tgz", + "integrity": "sha512-fvi2RGH4YV617/6DntOVGcOugOPym9jTGWW2XySb5ZpvdWO4L7bEG77VHirrnbRUEWvIEVXkBpxUz2KFj0rVnA==", "dev": true, "dependencies": { "colord": "^2.9", "css-selector-tokenizer": "^0.8", + "postcss": "^8", "postcss-js": "^4", - "tailwindcss": "^3" + "tailwindcss": "^3.1" }, "engines": { "node": ">=16.9.0" @@ -2481,9 +2239,6 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/daisyui" - }, - "peerDependencies": { - "postcss": "^8" } }, "node_modules/data-urls": { @@ -2500,23 +2255,11 @@ "node": ">=14" } }, - "node_modules/date-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", - "dev": true, - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "devOptional": true, + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -2535,18 +2278,6 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -2560,15 +2291,15 @@ } }, "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", @@ -2603,12 +2334,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2635,11 +2381,14 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/detect-indent": { "version": "6.1.0", @@ -2650,15 +2399,6 @@ "node": ">=8" } }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/devalue": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz", @@ -2672,9 +2412,9 @@ "dev": true }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2728,18 +2468,23 @@ "node": ">=12" } }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.439", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.439.tgz", - "integrity": "sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg==", + "version": "1.4.569", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz", + "integrity": "sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==", "dev": true }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "optional": true - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -2779,9 +2524,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, "bin": { @@ -2791,28 +2536,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/escalade": { @@ -2837,27 +2582,28 @@ } }, "node_modules/eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2867,7 +2613,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -2877,9 +2622,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2893,9 +2637,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -2905,21 +2649,22 @@ } }, "node_modules/eslint-plugin-svelte": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.31.0.tgz", - "integrity": "sha512-Q70jPFRraTkc/giPSfY7yuatmJcb5fPelWNplevqd45gfaJDjc3qXRtWQ6m9U5tWVVYERU9dcdUod294vwD8Gw==", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.34.0.tgz", + "integrity": "sha512-4RYUgNai7wr0v+T/kljMiYSjC/oqwgq5i+cPppawryAayj4C7WK1ixFlWCGmNmBppnoKCl4iA4ZPzPtlHcb4CA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@jridgewell/sourcemap-codec": "^1.4.14", "debug": "^4.3.1", "esutils": "^2.0.3", - "known-css-properties": "^0.27.0", + "known-css-properties": "^0.28.0", "postcss": "^8.4.5", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^6.0.0", "postcss-selector-parser": "^6.0.11", - "svelte-eslint-parser": "^0.31.0" + "semver": "^7.5.3", + "svelte-eslint-parser": ">=0.33.0 <1.0.0" }, "engines": { "node": "^14.17.0 || >=16.0.0" @@ -2929,7 +2674,7 @@ }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0-0", - "svelte": "^3.37.0 || ^4.0.0-0" + "svelte": "^3.37.0 || ^4.0.0" }, "peerDependenciesMeta": { "svelte": { @@ -2951,23 +2696,14 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2975,15 +2711,11 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2991,15 +2723,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esm-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", @@ -3007,12 +2730,12 @@ "dev": true }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -3035,40 +2758,22 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -3118,16 +2823,10 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3220,28 +2919,29 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -3280,52 +2980,28 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true + "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3337,10 +3013,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -3351,26 +3030,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -3381,15 +3040,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3460,9 +3119,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3474,6 +3133,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3494,6 +3159,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -3512,30 +3183,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3555,12 +3208,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3605,11 +3258,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "optional": true + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", @@ -3641,7 +3300,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "devOptional": true, + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -3708,7 +3367,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3718,16 +3377,16 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true + "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -3840,12 +3499,12 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3875,15 +3534,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4039,16 +3689,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -4092,23 +3738,14 @@ "dev": true }, "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", "dev": true, "bin": { "jiti": "bin/jiti.js" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4169,6 +3806,12 @@ } } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4187,6 +3830,15 @@ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -4197,9 +3849,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz", - "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", + "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", "dev": true }, "node_modules/kolorist": { @@ -4237,10 +3889,14 @@ "dev": true }, "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, "engines": { "node": ">=14" }, @@ -4248,6 +3904,12 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4263,12 +3925,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.castarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", @@ -4288,19 +3944,19 @@ "dev": true }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4318,52 +3974,22 @@ } }, "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/md5-hex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", - "dev": true, - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true }, "node_modules/merge-stream": { "version": "2.0.0", @@ -4393,18 +4019,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4433,18 +4047,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -4467,7 +4069,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4484,40 +4086,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "optional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -4531,15 +4099,15 @@ } }, "node_modules/mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.10.0", "pathe": "^1.1.1", "pkg-types": "^1.0.3", - "ufo": "^1.1.2" + "ufo": "^1.3.0" } }, "node_modules/mri": { @@ -4564,7 +4132,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "devOptional": true + "dev": true }, "node_modules/mz": { "version": "2.7.0", @@ -4577,12 +4145,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -4607,75 +4169,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4706,29 +4205,17 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "optional": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4743,9 +4230,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4798,7 +4285,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "dependencies": { "wrappy": "1" } @@ -4902,7 +4389,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4956,9 +4443,9 @@ } }, "node_modules/pdfjs-dist": { - "version": "3.7.107", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.7.107.tgz", - "integrity": "sha512-D0pZgz4u8VNjCCXfNCjzeFcenxKFGh2RnGlLIvDHgpT+ZvOlsBlHugpOfmcLQyKk7csHBhPalf+mCM6thiclSQ==", + "version": "3.11.174", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.11.174.tgz", + "integrity": "sha512-TdTZPf1trZ8/UFu5Cx/GXB7GZM30LT+wWUNfsi6Bq8ePLnb+woNKtDymI2mxZYBpMbonNFqKmiz684DIfnd8dA==", "engines": { "node": ">=18" }, @@ -4967,6 +4454,35 @@ "path2d-polyfill": "^2.0.1" } }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/periscopic/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/periscopic/node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -5015,9 +4531,9 @@ } }, "node_modules/pocketbase": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.15.2.tgz", - "integrity": "sha512-dGSwO2j3XqtFMANNNEVh/moRw0ItOraKC1p3J+I0y/tPEfgleCAUptMWhqHrFNS+jM5r21eSS1U48N9/OmHFzA==" + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.15.3.tgz", + "integrity": "sha512-sjM0XO4wHUlVZs94VhRJi4FeYtbLqvxFbRDJlfjFb/4FkxypbGwxLM4HDAEr8q6jdreuxAM1/n/b5HB1GjQ1Vg==" }, "node_modules/postcss": { "version": "8.4.31", @@ -5161,9 +4677,9 @@ } }, "node_modules/postcss-scss": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", - "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", "dev": true, "funding": [ { @@ -5173,13 +4689,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "engines": { "node": ">=12.0" }, "peerDependencies": { - "postcss": "^8.4.19" + "postcss": "^8.4.29" } }, "node_modules/postcss-selector-parser": { @@ -5211,37 +4731,37 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-plugin-svelte": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-2.10.1.tgz", - "integrity": "sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.0.3.tgz", + "integrity": "sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==", "dev": true, "peerDependencies": { - "prettier": "^1.16.4 || ^2.0.0", + "prettier": "^3.0.0", "svelte": "^3.2.0 || ^4.0.0-next.0" } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz", - "integrity": "sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.6.tgz", + "integrity": "sha512-2Xgb+GQlkPAUCFi3sV+NOYcSI5XgduvDBL2Zt/hwJudeKXkyvRS65c38SB0yb9UB40+1rL83I6m0RtlOQ8eHdg==", "dev": true, "engines": { - "node": ">=12.17.0" + "node": ">=14.21.3" }, "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", @@ -5249,17 +4769,15 @@ "@shopify/prettier-plugin-liquid": "*", "@shufo/prettier-plugin-blade": "*", "@trivago/prettier-plugin-sort-imports": "*", - "prettier": ">=2.2.0", + "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*", - "prettier-plugin-twig-melody": "*" + "prettier-plugin-svelte": "*" }, "peerDependenciesMeta": { "@ianvs/prettier-plugin-sort-imports": { @@ -5335,6 +4853,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/prom-client": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.0.0.tgz", + "integrity": "sha512-UocpgIrKyA2TKLVZDSfm8rGkL13C19YrQBAiG3xo3aDFWcHedxRxI3z+cIcucoxpSO0h5lff5iv/SXoxyeopeA==", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -5396,20 +4926,6 @@ "pify": "^2.3.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5423,20 +4939,20 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -5452,12 +4968,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5491,7 +5007,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -5506,7 +5022,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5528,9 +5044,9 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", - "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -5589,26 +5105,6 @@ "node": ">=6" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5674,7 +5170,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "devOptional": true, + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5685,18 +5181,41 @@ "node": ">=10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "optional": true - }, "node_modules/set-cookie-parser": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5742,38 +5261,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "devOptional": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "optional": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } + "dev": true }, "node_modules/sirv": { "version": "2.0.3", @@ -5829,9 +5317,9 @@ "dev": true }, "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", "dev": true }, "node_modules/stop-iteration-iterator": { @@ -5846,43 +5334,11 @@ "node": ">= 0.4" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5924,21 +5380,21 @@ } }, "node_modules/strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", "dev": true, "dependencies": { - "acorn": "^8.8.2" + "acorn": "^8.10.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", @@ -5957,6 +5413,15 @@ "node": ">=8" } }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/sucrase/node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -6002,18 +5467,33 @@ } }, "node_modules/svelte": { - "version": "3.59.2", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.2.tgz", - "integrity": "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.2.tgz", + "integrity": "sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==", "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^3.2.1", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, "engines": { - "node": ">= 8" + "node": ">=16" } }, "node_modules/svelte-check": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.4.tgz", - "integrity": "sha512-Uys9+R65cj8TmP8f5UpS7B2xKpNLYNxEWJsA5ZoKcWq/uwvABFF7xS6iPQGLoa7hxz0DS6xU60YFpmq06E4JxA==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.5.2.tgz", + "integrity": "sha512-5a/YWbiH4c+AqAUP+0VneiV5bP8YOk9JL3jwvN+k2PEPLgpu85bjQc5eE67+eIZBBwUEJzmO3I92OqKcqbp3fw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -6022,7 +5502,7 @@ "import-fresh": "^3.2.1", "picocolors": "^1.0.0", "sade": "^1.7.4", - "svelte-preprocess": "^5.0.3", + "svelte-preprocess": "^5.0.4", "typescript": "^5.0.3" }, "bin": { @@ -6033,16 +5513,16 @@ } }, "node_modules/svelte-eslint-parser": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.31.0.tgz", - "integrity": "sha512-/31RpBf/e3YjoFphjsyo3JRyN1r4UalGAGafXrZ6EJK4h4COOO0rbfBoen5byGsXnIJKsrlC1lkEd2Vzpq2IDg==", + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", + "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", "dev": true, "dependencies": { "eslint-scope": "^7.0.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", - "postcss": "^8.4.23", - "postcss-scss": "^4.0.6" + "postcss": "^8.4.29", + "postcss-scss": "^4.0.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6051,7 +5531,7 @@ "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0-0" + "svelte": "^3.37.0 || ^4.0.0" }, "peerDependenciesMeta": { "svelte": { @@ -6059,41 +5539,16 @@ } } }, - "node_modules/svelte-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/svelte-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/svelte-hmr": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.2.tgz", - "integrity": "sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz", + "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==", "dev": true, "engines": { "node": "^12.20 || ^14.13.1 || >= 16" }, "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0-next.0" + "svelte": "^3.19.0 || ^4.0.0" } }, "node_modules/svelte-preprocess": { @@ -6158,10 +5613,49 @@ } } }, + "node_modules/svelte-preprocess/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/svelte/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/svelte/node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/sveltekit-superforms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sveltekit-superforms/-/sveltekit-superforms-1.1.1.tgz", - "integrity": "sha512-lD3ov06C/O8hD7mCzEQZ7CTsbHrh6kWhRP3njI9ZSwvG5DW6vhfi6Re/cyYy//cS0oMONI0xBieWyr9s24Y9jA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/sveltekit-superforms/-/sveltekit-superforms-1.8.0.tgz", + "integrity": "sha512-ig4SJNe72UNlmL2FjXk6Z3I7WYEm+qerA8PB4WOjQkOirztiDNJrY/bs1lF8VLxc56TSG9JQkCtZkgUdlH3yYA==", "dev": true, "funding": [ { @@ -6179,7 +5673,7 @@ ], "peerDependencies": { "@sveltejs/kit": "1.x", - "svelte": "3.x", + "svelte": "3.x || 4.x", "zod": "3.x" } }, @@ -6190,9 +5684,9 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -6200,10 +5694,10 @@ "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", - "fast-glob": "^3.2.12", + "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.18.2", + "jiti": "^1.19.1", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -6215,7 +5709,6 @@ "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, @@ -6270,41 +5763,20 @@ } }, "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true, "engines": { "node": ">= 14" } }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "optional": true, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "bintrees": "1.0.2" } }, "node_modules/text-table": { @@ -6334,34 +5806,35 @@ "node": ">=0.8" } }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" } }, "node_modules/tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", "dev": true }, "node_modules/tinypool": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.5.0.tgz", - "integrity": "sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", + "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", "dev": true, "engines": { "node": ">=14.0.0" @@ -6415,6 +5888,18 @@ "node": ">=14" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -6422,30 +5907,9 @@ "dev": true }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/type-check": { @@ -6482,9 +5946,9 @@ } }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6495,23 +5959,29 @@ } }, "node_modules/ufo": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", - "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz", + "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==", "dev": true }, "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", "dev": true, "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -6522,36 +5992,37 @@ } }, "node_modules/unplugin": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.3.1.tgz", - "integrity": "sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz", + "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==", "dev": true, "dependencies": { - "acorn": "^8.8.2", + "acorn": "^8.10.0", "chokidar": "^3.5.3", "webpack-sources": "^3.2.3", "webpack-virtual-modules": "^0.5.0" } }, "node_modules/unplugin-icons": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.16.3.tgz", - "integrity": "sha512-hivVVr6++WHSj6Iz+rjTa14/ALMYT+PFd2sPtTBKlQR3cdzui1VwM72TzSu94NkDm/KVncvOIiBwoHwUPeL9bg==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-0.17.1.tgz", + "integrity": "sha512-KsWejBPCHokYCNDQUzGu6R3E3XDYH/YpewgQwrVBXgpl1iR0RdW1NEGNdjlbuapwVnZXVgA5eiDTfNaQCawSdg==", "dev": true, "dependencies": { "@antfu/install-pkg": "^0.1.1", - "@antfu/utils": "^0.7.4", - "@iconify/utils": "^2.1.6", + "@antfu/utils": "^0.7.6", + "@iconify/utils": "^2.1.11", "debug": "^4.3.4", "kolorist": "^1.8.0", - "local-pkg": "^0.4.3", - "unplugin": "^1.3.1" + "local-pkg": "^0.5.0", + "unplugin": "^1.5.0" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { "@svgr/core": ">=7.0.0", + "@svgx/core": "^1.0.1", "@vue/compiler-sfc": "^3.0.2 || ^2.7.0", "vue-template-compiler": "^2.6.12", "vue-template-es2015-compiler": "^1.9.0" @@ -6560,6 +6031,9 @@ "@svgr/core": { "optional": true }, + "@svgx/core": { + "optional": true + }, "@vue/compiler-sfc": { "optional": true }, @@ -6572,9 +6046,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -6624,17 +6098,17 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true + "dev": true }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -6642,12 +6116,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -6660,6 +6138,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -6675,17 +6156,17 @@ } }, "node_modules/vite-node": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.32.2.tgz", - "integrity": "sha512-dTQ1DCLwl2aEseov7cfQ+kDMNJpM1ebpyMMMwWzBvLbis8Nla/6c9WQcqpPssTwS6Rp/+U6KwlIj8Eapw4bLdA==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", + "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", "dev": true, "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", - "mlly": "^1.2.0", - "pathe": "^1.1.0", + "mlly": "^1.4.0", + "pathe": "^1.1.1", "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" @@ -6698,12 +6179,12 @@ } }, "node_modules/vitefu": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", - "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "vite": { @@ -6712,35 +6193,34 @@ } }, "node_modules/vitest": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.32.2.tgz", - "integrity": "sha512-hU8GNNuQfwuQmqTLfiKcqEhZY72Zxb7nnN07koCUNmntNxbKQnVbeIS6sqUgR3eXSlbOpit8+/gr1KpqoMgWCQ==", + "version": "0.34.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", + "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", "dev": true, "dependencies": { "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.32.2", - "@vitest/runner": "0.32.2", - "@vitest/snapshot": "0.32.2", - "@vitest/spy": "0.32.2", - "@vitest/utils": "0.32.2", - "acorn": "^8.8.2", + "@vitest/expect": "0.34.6", + "@vitest/runner": "0.34.6", + "@vitest/snapshot": "0.34.6", + "@vitest/spy": "0.34.6", + "@vitest/utils": "0.34.6", + "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", - "chai": "^4.3.7", - "concordance": "^5.0.4", + "chai": "^4.3.10", "debug": "^4.3.4", "local-pkg": "^0.4.3", - "magic-string": "^0.30.0", - "pathe": "^1.1.0", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", "picocolors": "^1.0.0", - "std-env": "^3.3.2", + "std-env": "^3.3.3", "strip-literal": "^1.0.1", "tinybench": "^2.5.0", - "tinypool": "^0.5.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.32.2", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.6", "why-is-node-running": "^2.2.2" }, "bin": { @@ -6789,16 +6269,16 @@ } } }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "node_modules/vitest/node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, "engines": { - "node": ">=12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, "node_modules/w3c-xmlserializer": { @@ -6837,15 +6317,6 @@ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "dev": true }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -6927,17 +6398,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6962,25 +6432,16 @@ "node": ">=8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7017,7 +6478,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "dev": true }, "node_modules/yaml": { "version": "1.10.2", @@ -7041,9 +6502,9 @@ } }, "node_modules/zod": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/frontend/package.json b/frontend/package.json index 3747456..c8c96c6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "ee-application", - "version": "1.0.1", + "version": "2.0.0", "private": true, "scripts": { "dev": "vite dev", @@ -11,43 +11,46 @@ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write ." + "format": "prettier --plugin-search-dir . --write .", + "prepare": "svelte-kit sync" }, "devDependencies": { - "@iconify/json": "^2.2.82", - "@sveltejs/adapter-node": "^1.2.4", - "@sveltejs/kit": "^1.20.5", - "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/typography": "^0.5.9", - "@testing-library/svelte": "^3.2.2", - "@typescript-eslint/eslint-plugin": "^5.60.0", - "@typescript-eslint/parser": "^5.60.0", - "autoprefixer": "^10.4.14", - "daisyui": "^3.1.7", - "eslint": "^8.43.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-svelte": "^2.31.0", + "@iconify/json": "^2.2.134", + "@sveltejs/adapter-node": "^1.3.1", + "@sveltejs/kit": "^1.27.1", + "@tailwindcss/forms": "^0.5.6", + "@tailwindcss/typography": "^0.5.10", + "@testing-library/svelte": "^4.0.4", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", + "autoprefixer": "^10.4.16", + "daisyui": "^3.9.4", + "eslint": "^8.52.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-svelte": "^2.34.0", "jsdom": "^22.1.0", "postcss": "^8.4.31", - "prettier": "^2.8.8", - "prettier-plugin-svelte": "^2.10.1", - "prettier-plugin-tailwindcss": "^0.3.0", - "svelte": "^3.54.0", - "svelte-check": "^3.4.4", - "sveltekit-superforms": "^1.1.1", - "tailwindcss": "^3.3.2", - "tslib": "^2.5.3", - "typescript": "^5.1.3", - "unplugin-icons": "^0.16.3", - "vite": "^4.3.9", - "vitest": "^0.32.2", - "zod": "^3.22.3" + "prettier": "^3.0.3", + "prettier-plugin-svelte": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.6", + "svelte": "^4.2.2", + "svelte-check": "^3.5.2", + "sveltekit-superforms": "^1.8.0", + "tailwindcss": "^3.3.5", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "unplugin-icons": "^0.17.1", + "vite": "^4.5.0", + "vitest": "^0.34.6", + "zod": "^3.22.4" }, "type": "module", "dependencies": { - "axios": "^1.4.0", + "axios": "^1.6.0", "d3": "^7.8.5", - "pdfjs-dist": "^3.7.107", - "pocketbase": "^0.15.2" + "dotenv": "^16.3.1", + "pdfjs-dist": "^3.11.174", + "pocketbase": "^0.15.2", + "prom-client": "^15.0.0" } } diff --git a/frontend/src/hooks.client.ts b/frontend/src/hooks.client.ts index b695ed9..0d3b382 100644 --- a/frontend/src/hooks.client.ts +++ b/frontend/src/hooks.client.ts @@ -1,7 +1,8 @@ import { currentUser, pb } from '$lib/pocketbase'; pb.authStore.loadFromCookie(document.cookie); + pb.authStore.onChange(() => { - currentUser.set(pb.authStore.model); - document.cookie = pb.authStore.exportToCookie(); + currentUser.set(pb.authStore.model); + document.cookie = pb.authStore.exportToCookie(); }); diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts index 9032c6a..f5b2b18 100644 --- a/frontend/src/hooks.server.ts +++ b/frontend/src/hooks.server.ts @@ -45,4 +45,4 @@ function parseBool(value: string | undefined) { // in all other cases, return false return false; -} +} \ No newline at end of file diff --git a/frontend/src/lib/components/ActionCardStats.svelte b/frontend/src/lib/components/ActionCardStats.svelte index ab71e5a..b130a65 100644 --- a/frontend/src/lib/components/ActionCardStats.svelte +++ b/frontend/src/lib/components/ActionCardStats.svelte @@ -1,5 +1,7 @@
@@ -7,7 +9,7 @@

Your Visualizations

find out more with specific stats about your data collected!

- + - diff --git a/frontend/src/lib/components/MainFooter.svelte b/frontend/src/lib/components/MainFooter.svelte index fe112b6..8de456b 100644 --- a/frontend/src/lib/components/MainFooter.svelte +++ b/frontend/src/lib/components/MainFooter.svelte @@ -1,11 +1,15 @@ + +

Copyright © 2023

diff --git a/frontend/src/lib/components/MainNavbar.svelte b/frontend/src/lib/components/MainNavbar.svelte index 8435be6..e1fed68 100644 --- a/frontend/src/lib/components/MainNavbar.svelte +++ b/frontend/src/lib/components/MainNavbar.svelte @@ -6,7 +6,8 @@ import IconSun from '~icons/solar/sun-2-outline'; import { onMount, onDestroy } from 'svelte'; import { writable } from 'svelte/store'; - import { getImageURL } from '$lib/utils'; + + import { base } from '$app/paths'; const theme = writable('lofi'); @@ -27,6 +28,26 @@ } }); + let imageUrl: any; + + onMount(async () => { + setTimeout(async () => { + await fetchUserImage(); + }, 200); + }); + + async function fetchUserImage() { + try { + const response = await fetch(`${base}/api/user-image`); + if (response.ok) { + const blob = await response.blob(); + imageUrl = URL.createObjectURL(blob); + } + } catch (error) { + console.error('Fetch error:', error); + } + } + onDestroy(() => { theme.set('business'); // Reset the theme to default on component destruction }); @@ -46,11 +67,11 @@
@@ -63,7 +84,7 @@
user avatar -
  • Profile
  • +
  • Profile
  • { return async ({ result }) => { pb.authStore.clear(); @@ -93,8 +114,9 @@
  • {:else} - - + + {/if} {:catch error}

    Error loading user data: {error.message}

    diff --git a/frontend/src/lib/components/PDFViewer.svelte b/frontend/src/lib/components/PDFViewer.svelte index d7b70fb..8067467 100644 --- a/frontend/src/lib/components/PDFViewer.svelte +++ b/frontend/src/lib/components/PDFViewer.svelte @@ -9,6 +9,8 @@ import IconLeftArrow from '~icons/solar/square-arrow-left-outline'; import IconRightArrow from '~icons/solar/square-arrow-right-outline'; + import { base } from '$app/paths'; + let pdf: PDFDocumentProxy | null = null; let currentPageNumber = 1; let canvas: HTMLCanvasElement; @@ -74,8 +76,8 @@ }; const downloadPdf = async () => { - if (generatedDocumentURL) { - const response = await fetch(generatedDocumentURL); + if (document.id) { + const response = await fetch(`${base}/api/documents/${document.id}/download`); const blob = await response.blob(); const objectURL = window.URL.createObjectURL(blob); @@ -93,18 +95,22 @@ return /^((?!chrome|android).)*safari/i.test(navigator.userAgent); } - const printPdf = () => { + const printPdf = async () => { if (generatedDocumentURL) { if (isSafari()) { downloadPdf(); } else { - const link = window.document.createElement('a'); - link.href = generatedDocumentURL; - link.target = '_blank'; - link.rel = 'noopener noreferrer'; - window.document.body.appendChild(link); - link.click(); - window.document.body.removeChild(link); + const response = await fetch(`${base}/api/documents/${document.id}/download`); + const blob = await response.blob(); + const objectURL = window.URL.createObjectURL(blob); + + const downloadLink = window.document.createElement('a'); + downloadLink.href = objectURL; + downloadLink.download = document?.name; + window.document.body.appendChild(downloadLink); + downloadLink.click(); + window.document.body.removeChild(downloadLink); + window.URL.revokeObjectURL(objectURL); } } }; @@ -119,7 +125,11 @@ isRendering = true; try { - const loadingTask = getDocument(url); + const response = await fetch(`${base}/api/documents/${document.id}/download`); + const blob = await response.blob(); + const objectURL = window.URL.createObjectURL(blob); + + const loadingTask = getDocument(objectURL); pdf = await loadingTask.promise; await loadPage(currentPageNumber); diff --git a/frontend/src/lib/components/StatsBar.svelte b/frontend/src/lib/components/StatsBar.svelte index 53a0de5..285b4f7 100644 --- a/frontend/src/lib/components/StatsBar.svelte +++ b/frontend/src/lib/components/StatsBar.svelte @@ -7,22 +7,25 @@ import type { Record } from 'pocketbase'; import { currentUser, pb } from '$lib/pocketbase'; import { documentStatus } from '$lib/documentStore'; + import { base } from '$app/paths'; let stats: Record; onMount(async () => { pb.authStore.loadFromCookie(document.cookie); - await fetchStats(); + setTimeout(async () => { + await fetchStats(); + }, 100); }); async function fetchStats() { try { if ($currentUser) { - const response = await pb - .collection('documents_stats') - .getFirstListItem(`owner='${$currentUser.id}'`); - if (response) { - stats = response as Record; + const response = await fetch(`${base}/api/stats_bar`); + if (response.ok) { + stats = await response.json(); + } else { + throw new Error('Failed to fetch stats'); } } } catch (error) { diff --git a/frontend/src/routes/(auth)/email-change/+page.server.ts b/frontend/src/routes/(auth)/email-change/+page.server.ts index 324b853..ba6d7e0 100644 --- a/frontend/src/routes/(auth)/email-change/+page.server.ts +++ b/frontend/src/routes/(auth)/email-change/+page.server.ts @@ -4,6 +4,8 @@ import type { Actions, PageServerLoad } from './$types'; import { superValidate } from 'sveltekit-superforms/server'; import { changeEmailSchema } from '$lib/schemas'; +import { base } from '$app/paths'; + export const actions: Actions = { default: async ({ locals, request }) => { const form = await superValidate(request, changeEmailSchema); @@ -19,13 +21,13 @@ export const actions: Actions = { throw error(400, 'The Email or Password may be wrong, please try again.'); } - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } const form = await superValidate(changeEmailSchema); diff --git a/frontend/src/routes/(auth)/login/+page.server.ts b/frontend/src/routes/(auth)/login/+page.server.ts index 9decb5c..2fc1d33 100644 --- a/frontend/src/routes/(auth)/login/+page.server.ts +++ b/frontend/src/routes/(auth)/login/+page.server.ts @@ -4,6 +4,8 @@ import type { Actions, PageServerLoad } from './$types'; import { superValidate } from 'sveltekit-superforms/server'; import { loginSchema } from '$lib/schemas'; +import { base } from '$app/paths'; + export const actions: Actions = { default: async ({ locals, request }) => { const form = await superValidate(request, loginSchema); @@ -18,13 +20,13 @@ export const actions: Actions = { throw error(400, 'The Email or Password may be wrong, try again.'); } - throw redirect(303, '/dashboard'); + throw redirect(303, `${base}/dashboard`); } }; export const load: PageServerLoad = async ({ locals }) => { if (locals.user) { - throw redirect(303, '/dashboard'); + throw redirect(303, `${base}/dashboard`); } const form = await superValidate(loginSchema); diff --git a/frontend/src/routes/(auth)/login/+page.svelte b/frontend/src/routes/(auth)/login/+page.svelte index 3839acf..88f954a 100644 --- a/frontend/src/routes/(auth)/login/+page.svelte +++ b/frontend/src/routes/(auth)/login/+page.svelte @@ -8,6 +8,8 @@ import IconInfo from '~icons/solar/info-square-outline'; + import { base } from '$app/paths'; + export let data: PageData; onMount(() => { @@ -63,7 +65,9 @@ bind:value={$form.password} {...$constraints.password} /> - Forgot password? + Forgot password?
    diff --git a/frontend/src/routes/(auth)/logout/+page.server.ts b/frontend/src/routes/(auth)/logout/+page.server.ts index 786873d..707a555 100644 --- a/frontend/src/routes/(auth)/logout/+page.server.ts +++ b/frontend/src/routes/(auth)/logout/+page.server.ts @@ -1,10 +1,11 @@ import { redirect } from '@sveltejs/kit'; import type { Actions } from './$types'; +import { base } from '$app/paths'; export const actions: Actions = { default: async ({ locals }) => { locals.pb.authStore.clear(); locals.user = null; - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/(auth)/password-reset/+page.server.ts b/frontend/src/routes/(auth)/password-reset/+page.server.ts index a74683a..f707a10 100644 --- a/frontend/src/routes/(auth)/password-reset/+page.server.ts +++ b/frontend/src/routes/(auth)/password-reset/+page.server.ts @@ -4,6 +4,8 @@ import type { Actions, PageServerLoad } from './$types'; import { superValidate } from 'sveltekit-superforms/server'; import { resetPasswordSchema } from '$lib/schemas'; +import { base } from '$app/paths'; + export const actions: Actions = { default: async ({ locals, request }) => { const form = await superValidate(request, resetPasswordSchema); @@ -18,7 +20,7 @@ export const actions: Actions = { throw err; } - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/(auth)/profile/+page.server.ts b/frontend/src/routes/(auth)/profile/+page.server.ts index 56df84c..478f731 100644 --- a/frontend/src/routes/(auth)/profile/+page.server.ts +++ b/frontend/src/routes/(auth)/profile/+page.server.ts @@ -6,6 +6,7 @@ import { env } from '$env/dynamic/public'; import type { Record } from 'pocketbase'; import http from 'http'; import https from 'https'; +import { base } from '$app/paths'; export const actions: Actions = { updateProfile: async ({ locals, request }) => { @@ -26,7 +27,7 @@ export const actions: Actions = { throw error(400, 'Something went wrong updating your profile'); } - throw redirect(303, '/dashboard'); + throw redirect(303, `${base}/dashboard`); }, deleteAccount: async ({ locals }) => { try { @@ -55,12 +56,12 @@ export const actions: Actions = { throw error(400, 'Something went wrong deleting your account'); } - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/(auth)/profile/+page.svelte b/frontend/src/routes/(auth)/profile/+page.svelte index 0482a5f..b1acb7f 100644 --- a/frontend/src/routes/(auth)/profile/+page.svelte +++ b/frontend/src/routes/(auth)/profile/+page.svelte @@ -2,17 +2,39 @@ import { applyAction, enhance } from '$app/forms'; import { invalidateAll } from '$app/navigation'; import { currentUser, pb } from '$lib/pocketbase'; - import { getImageURL, showPreview } from '$lib/utils'; + import { showPreview } from '$lib/utils'; import { onMount } from 'svelte'; import IconImageEdit from '~icons/solar/gallery-edit-outline'; + import { base } from '$app/paths'; + let loading = false; onMount(() => { pb.authStore.loadFromCookie(document.cookie); }); + let imageUrl: any; + + onMount(async () => { + setTimeout(async () => { + await fetchUserImage(); + }, 0); + }); + + async function fetchUserImage() { + try { + const response = await fetch(`${base}/api/user-image`); + if (response.ok) { + const blob = await response.blob(); + imageUrl = URL.createObjectURL(blob); + } + } catch (error) { + console.error('Fetch error:', error); + } + } + const submitAction = () => { loading = true; return async ({ result }) => { @@ -69,11 +91,7 @@ > user avatar - +
    @@ -128,12 +146,12 @@ class="input input-bordered w-full" disabled /> - +
    diff --git a/frontend/src/routes/(auth)/register/+page.server.ts b/frontend/src/routes/(auth)/register/+page.server.ts index c5d8fcb..6ccc01d 100644 --- a/frontend/src/routes/(auth)/register/+page.server.ts +++ b/frontend/src/routes/(auth)/register/+page.server.ts @@ -4,6 +4,8 @@ import type { Actions, PageServerLoad } from './$types'; import { superValidate } from 'sveltekit-superforms/server'; import { registerSchema } from '$lib/schemas'; +import { base } from '$app/paths'; + export const actions: Actions = { default: async ({ locals, request }) => { const form = await superValidate(request, registerSchema); @@ -16,16 +18,17 @@ export const actions: Actions = { await locals.pb.collection('users').create(form.data); await locals.pb.collection('users').requestVerification(form.data.email); } catch (err) { + console.log(err) throw error(400, 'The Email used already exists, please use another one.'); } - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; export const load: PageServerLoad = async ({ locals }) => { if (locals.user) { - throw redirect(303, '/dashboard'); + throw redirect(303, `${base}/dashboard`); } const form = await superValidate(registerSchema); diff --git a/frontend/src/routes/(auth)/register/+page.svelte b/frontend/src/routes/(auth)/register/+page.svelte index aa33744..4e93a80 100644 --- a/frontend/src/routes/(auth)/register/+page.svelte +++ b/frontend/src/routes/(auth)/register/+page.svelte @@ -8,6 +8,8 @@ import IconInfo from '~icons/solar/info-square-outline'; + import { base } from '$app/paths'; + export let data: PageData; onMount(() => { @@ -91,7 +93,7 @@ bind:value={$form.passwordConfirm} {...$constraints.passwordConfirm} /> - Already an account? + Already an account?
    diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte index 872eb67..a664a83 100644 --- a/frontend/src/routes/+layout.svelte +++ b/frontend/src/routes/+layout.svelte @@ -3,6 +3,7 @@ import Navbar from '$lib/components/MainNavbar.svelte'; import Footer from '$lib/components/MainFooter.svelte'; import { page } from '$app/stores'; + import { base } from '$app/paths';
    @@ -21,14 +22,24 @@
    diff --git a/frontend/src/routes/+page.server.ts b/frontend/src/routes/+page.server.ts index b830325..790cc55 100644 --- a/frontend/src/routes/+page.server.ts +++ b/frontend/src/routes/+page.server.ts @@ -1,8 +1,9 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; +import { base } from '$app/paths'; -export const load: PageServerLoad = async ({ locals }) => { +export const load: PageServerLoad = async ({ locals, fetch }) => { if (locals.user) { - throw redirect(303, '/dashboard'); + throw redirect(303, `${base}/dashboard`); } -}; +}; \ No newline at end of file diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 9eae104..591e053 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -1,23 +1,21 @@ @@ -32,15 +30,15 @@
    Total documents analysed
    -
    {stats?.total_documents ?? '0'}
    +
    {data?.data?.total_documents ?? '0'}
    Total documents created
    -
    {stats?.total_created ?? '0'}
    +
    {data?.data?.total_created ?? '0'}
    - +
    diff --git a/frontend/src/routes/api/documents/+server.ts b/frontend/src/routes/api/documents/+server.ts new file mode 100644 index 0000000..6fad979 --- /dev/null +++ b/frontend/src/routes/api/documents/+server.ts @@ -0,0 +1,18 @@ +import { error, json } from '@sveltejs/kit'; + +export async function GET({ locals }) { + const user = locals.user; + + if (user) { + const response = await locals.pb.collection('documents').getFullList({ + sort: '-created', + filter: `owner='${user.id}'` + }); + + if (response) { + return json(response); + } + } else { + throw error(400, 'User not found for file table!'); + } +} \ No newline at end of file diff --git a/frontend/src/routes/api/documents/[documentID]/+server.ts b/frontend/src/routes/api/documents/[documentID]/+server.ts new file mode 100644 index 0000000..3c03ac8 --- /dev/null +++ b/frontend/src/routes/api/documents/[documentID]/+server.ts @@ -0,0 +1,14 @@ +import { error, json } from '@sveltejs/kit'; + +export async function GET({ params, locals }) { + const { documentID } = params; + const user = locals.user; + + if (user) { + const document = await locals.pb.collection('documents').getOne(documentID); + + return json(document); + } else { + throw error(400, 'User not found for user image!'); + } +} diff --git a/frontend/src/routes/api/documents/[documentID]/delete/+server.ts b/frontend/src/routes/api/documents/[documentID]/delete/+server.ts new file mode 100644 index 0000000..5f52c51 --- /dev/null +++ b/frontend/src/routes/api/documents/[documentID]/delete/+server.ts @@ -0,0 +1,22 @@ +import { error, json } from '@sveltejs/kit'; +import { env } from '$env/dynamic/public'; +import axios from 'axios'; + +export async function DELETE({ params, locals }) { + const { documentID } = params; + const user = locals.user; + + if (user) { + await locals.pb.collection('documents').delete(documentID); + const response = await axios({ + url: `${env.PUBLIC_BACKEND_URL}/api/documents/${documentID}/delete_vector_file`, + method: 'post', + timeout: 500000, + headers: { 'Content-Type': 'application/json' } + }); + + return json(response); + } else { + throw error(400, 'User not found for file table!'); + } +} \ No newline at end of file diff --git a/frontend/src/routes/api/documents/[documentID]/download/+server.ts b/frontend/src/routes/api/documents/[documentID]/download/+server.ts new file mode 100644 index 0000000..2731c60 --- /dev/null +++ b/frontend/src/routes/api/documents/[documentID]/download/+server.ts @@ -0,0 +1,26 @@ +import { getDocumentURL } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export async function GET({ params, locals }) { + const { documentID } = params; + const user = locals.user; + + if (user) { + const document = await locals.pb.collection('documents').getOne(documentID); + const documentURL = getDocumentURL(document.collectionId, document.id, document.document); + + const documentResponse = await fetch(documentURL); + + const documentBuffer = await documentResponse.arrayBuffer(); + const options: ResponseInit = { + status: 200, + headers: { + 'Content-Type': documentResponse.type, + }, + } + + return new Response(documentBuffer, options); + } else { + throw error(400, 'User not found for user image!'); + } +} diff --git a/frontend/src/routes/api/documents/recent_document_id/+server.ts b/frontend/src/routes/api/documents/recent_document_id/+server.ts new file mode 100644 index 0000000..1957c0a --- /dev/null +++ b/frontend/src/routes/api/documents/recent_document_id/+server.ts @@ -0,0 +1,23 @@ +import { error, json } from '@sveltejs/kit'; +import type { Record } from 'pocketbase'; + +export async function GET({ locals }) { + const user = locals.user; + + let recentlyAddedDocumentID: string; + let documentList: Record[] = []; + + if (user) { + const response = await locals.pb.collection('documents').getList(1, 1, { + sort: '-created', + filter: `owner='${user.id}'` + }); + + documentList = response.items || []; + recentlyAddedDocumentID = documentList[0]?.id; + + return json(recentlyAddedDocumentID); + } else { + throw error(400, 'User not found for recently added document!'); + } +} diff --git a/frontend/src/routes/api/stats_bar/+server.ts b/frontend/src/routes/api/stats_bar/+server.ts new file mode 100644 index 0000000..9fee23b --- /dev/null +++ b/frontend/src/routes/api/stats_bar/+server.ts @@ -0,0 +1,15 @@ +import { error, json } from '@sveltejs/kit'; + +export async function GET({ locals }) { + const user = locals.user; + + if (user) { + const response = await locals.pb.collection('documents_stats').getFirstListItem(`owner='${user.id}'`); + + if (response) { + return json(response); + } + } else { + throw error(400, 'User not found for stats bar!'); + } +} \ No newline at end of file diff --git a/frontend/src/routes/api/stats_home/+server.ts b/frontend/src/routes/api/stats_home/+server.ts new file mode 100644 index 0000000..1d5bf8f --- /dev/null +++ b/frontend/src/routes/api/stats_home/+server.ts @@ -0,0 +1,6 @@ +import { json } from '@sveltejs/kit'; + +export async function GET({ locals }) { + const response = await locals.pb.collection('documents_total_stats').getFirstListItem('id=1'); + return json(response); +} diff --git a/frontend/src/routes/api/user-image/+server.ts b/frontend/src/routes/api/user-image/+server.ts new file mode 100644 index 0000000..7a2addd --- /dev/null +++ b/frontend/src/routes/api/user-image/+server.ts @@ -0,0 +1,23 @@ +import { getImageURL } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export async function GET({ locals }) { + const user = locals.user; + if (user) { + const imageUrl = getImageURL(user.collectionId, user.id, user.avatar); + + const imageResponse = await fetch(imageUrl); + + const imageBuffer = await imageResponse.arrayBuffer(); + const options: ResponseInit = { + status: 200, + headers: { + 'Content-Type': imageResponse.type, + }, + } + + return new Response(imageBuffer, options); + } else { + throw error(400, 'User not found for user image!'); + } +} diff --git a/frontend/src/routes/dashboard/+page.server.ts b/frontend/src/routes/dashboard/+page.server.ts index 66def6d..982ddb0 100644 --- a/frontend/src/routes/dashboard/+page.server.ts +++ b/frontend/src/routes/dashboard/+page.server.ts @@ -1,8 +1,9 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; +import { base } from '$app/paths'; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-create/+page.server.ts b/frontend/src/routes/dashboard/file-create/+page.server.ts index e4a1555..5bb9154 100644 --- a/frontend/src/routes/dashboard/file-create/+page.server.ts +++ b/frontend/src/routes/dashboard/file-create/+page.server.ts @@ -5,6 +5,7 @@ import { env } from '$env/dynamic/public'; import axios from 'axios'; import http from 'http'; import https from 'https'; +import { base } from '$app/paths'; export const actions: Actions = { createDocument: async ({ locals, request }) => { @@ -26,20 +27,18 @@ export const actions: Actions = { topic: topicRequested, export_option: exportOption }, - httpAgent: new http.Agent({ family: 4 }), // Force IPv4 - httpsAgent: new https.Agent({ family: 4 }) // Force IPv4 }); } catch (err) { console.error(err); throw error(400, 'Something went wrong creating your document'); } - throw redirect(303, '/dashboard/file-create/preview'); + throw redirect(303, `${base}/dashboard/file-create/preview`); } }; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-create/+page.svelte b/frontend/src/routes/dashboard/file-create/+page.svelte index 1f624bf..9447c2a 100644 --- a/frontend/src/routes/dashboard/file-create/+page.svelte +++ b/frontend/src/routes/dashboard/file-create/+page.svelte @@ -2,6 +2,8 @@ import { applyAction, enhance } from '$app/forms'; import { invalidateAll } from '$app/navigation'; + import { base } from '$app/paths'; + let loading = false; const submitCreateDocument = () => { @@ -49,7 +51,6 @@ name="export_option" disabled={loading} > - @@ -70,7 +71,7 @@
    { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-create/done/[id]/+page.svelte b/frontend/src/routes/dashboard/file-create/done/[id]/+page.svelte index e11f6ff..5577490 100644 --- a/frontend/src/routes/dashboard/file-create/done/[id]/+page.svelte +++ b/frontend/src/routes/dashboard/file-create/done/[id]/+page.svelte @@ -4,6 +4,8 @@ import { page } from '$app/stores'; import { onMount } from 'svelte'; + import { base } from '$app/paths'; + let documentID: string; onMount(async () => { @@ -11,7 +13,7 @@ }); function goRead() { - goto(`/dashboard/file-read/${documentID}`); + goto(`${base}/dashboard/file-read/${documentID}`); } diff --git a/frontend/src/routes/dashboard/file-create/preview/+page.server.ts b/frontend/src/routes/dashboard/file-create/preview/+page.server.ts index 66def6d..982ddb0 100644 --- a/frontend/src/routes/dashboard/file-create/preview/+page.server.ts +++ b/frontend/src/routes/dashboard/file-create/preview/+page.server.ts @@ -1,8 +1,9 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; +import { base } from '$app/paths'; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-create/preview/+page.svelte b/frontend/src/routes/dashboard/file-create/preview/+page.svelte index 6b873ee..2fbc6b4 100644 --- a/frontend/src/routes/dashboard/file-create/preview/+page.svelte +++ b/frontend/src/routes/dashboard/file-create/preview/+page.svelte @@ -1,43 +1,45 @@
    - + @@ -128,17 +145,13 @@ {#if message.sender === $currentUser?.id} user avatar {:else} - ee avatar + ee avatar {/if}
    diff --git a/frontend/src/routes/dashboard/file-upload/+page.server.ts b/frontend/src/routes/dashboard/file-upload/+page.server.ts index 9266ab2..35a5a06 100644 --- a/frontend/src/routes/dashboard/file-upload/+page.server.ts +++ b/frontend/src/routes/dashboard/file-upload/+page.server.ts @@ -3,8 +3,7 @@ import { error, redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; import { env } from '$env/dynamic/public'; import axios from 'axios'; -import http from 'http'; -import https from 'https'; +import { base } from '$app/paths'; export const actions: Actions = { uploadDocument: async ({ locals, request }) => { @@ -23,26 +22,25 @@ export const actions: Actions = { try { const document = await locals.pb.collection('documents').create(data); - await axios({ url: `${env.PUBLIC_BACKEND_URL}/api/documents/${document.id}/document_post_process/${locals.user.id}`, method: 'post', timeout: 500000, - headers: { 'Content-Type': 'application/json' }, - httpAgent: new http.Agent({ family: 4 }), // Force IPv4 - httpsAgent: new https.Agent({ family: 4 }) // Force IPv4 + headers: { + 'Content-Type': 'application/json', + }, }); } catch (err) { console.error(err); throw error(400, 'Something went wrong uploading your document'); } - throw redirect(303, '/dashboard/file-upload/preview'); + throw redirect(303, `${base}/dashboard/file-upload/preview`); } }; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-upload/+page.svelte b/frontend/src/routes/dashboard/file-upload/+page.svelte index bfce99e..068bb8f 100644 --- a/frontend/src/routes/dashboard/file-upload/+page.svelte +++ b/frontend/src/routes/dashboard/file-upload/+page.svelte @@ -2,6 +2,8 @@ import { applyAction, enhance } from '$app/forms'; import { invalidateAll } from '$app/navigation'; + import { base } from '$app/paths'; + let loading = false; const submitUploadDocument = () => { @@ -61,7 +63,7 @@
    { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-upload/done/[id]/+page.svelte b/frontend/src/routes/dashboard/file-upload/done/[id]/+page.svelte index be48d83..b35d7c1 100644 --- a/frontend/src/routes/dashboard/file-upload/done/[id]/+page.svelte +++ b/frontend/src/routes/dashboard/file-upload/done/[id]/+page.svelte @@ -4,6 +4,8 @@ import { page } from '$app/stores'; import { onMount } from 'svelte'; + import { base } from '$app/paths'; + let documentID: string; onMount(async () => { @@ -11,7 +13,7 @@ }); function goRead() { - goto(`/dashboard/file-read/${documentID}`); + goto(`${base}/dashboard/file-read/${documentID}`); } diff --git a/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts b/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts index 66def6d..982ddb0 100644 --- a/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts +++ b/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts @@ -1,8 +1,9 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; +import { base } from '$app/paths'; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/file-upload/preview/+page.svelte b/frontend/src/routes/dashboard/file-upload/preview/+page.svelte index 804158c..b0b2a80 100644 --- a/frontend/src/routes/dashboard/file-upload/preview/+page.svelte +++ b/frontend/src/routes/dashboard/file-upload/preview/+page.svelte @@ -1,10 +1,9 @@ - -
    -
    - -
    -

    Visualizations

    -

    All you Chunk Topics

    -
    - - {#if isLoading} -
    - -
    - {:else} -
    - - {#each root.leaves() as leaf, i} - - - {tVals[i]} - - - - - - {#each `${lVals[leaf.data]}`.split(/\n/g) as subtext, j} - - {subtext} - - {/each} - - - {/each} - -
    - {/if} -
    -
    - - diff --git a/frontend/src/routes/dashboard/stats/all-docs-topics/+page.server.ts b/frontend/src/routes/dashboard/stats/all-docs-topics/+page.server.ts index 243b613..d26b30b 100644 --- a/frontend/src/routes/dashboard/stats/all-docs-topics/+page.server.ts +++ b/frontend/src/routes/dashboard/stats/all-docs-topics/+page.server.ts @@ -1,9 +1,10 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; +import { base } from '$app/paths'; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { - throw redirect(303, '/login'); + throw redirect(303, `${base}/login`); } }; diff --git a/frontend/src/routes/dashboard/stats/all-docs-topics/+page.svelte b/frontend/src/routes/dashboard/stats/all-docs-topics/+page.svelte index de16e47..c0397fa 100644 --- a/frontend/src/routes/dashboard/stats/all-docs-topics/+page.svelte +++ b/frontend/src/routes/dashboard/stats/all-docs-topics/+page.svelte @@ -3,9 +3,10 @@ import { onMount } from 'svelte'; // @ts-ignore import { InternSet, hierarchy, pack, range, scaleOrdinal, schemeTableau10 } from 'd3'; - import { currentUser, pb } from '$lib/pocketbase'; import type { Record } from 'pocketbase'; + import { base } from '$app/paths'; + let data: any[] = []; let documentList: Record[] = []; let root: { leaves: () => any }; @@ -47,11 +48,11 @@ async function fetchDocuments() { try { - const response = await pb.collection('documents').getFullList({ - sort: '-created', - filter: `owner='${$currentUser?.id}'` + const response = await fetch(`${base}/api/documents`, { + method: 'GET', + headers: { 'Content-Type': 'application/json' } }); - documentList = response || []; + documentList = (await response.json()) || []; const topicCounts: { [key: string]: number } = {}; // New map object to hold topic counts @@ -128,7 +129,7 @@
    - {#if isLoading}
    diff --git a/frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.server.ts b/frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.server.ts deleted file mode 100644 index 93d81ab..0000000 --- a/frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.server.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { redirect } from '@sveltejs/kit'; -import type { PageServerLoad } from '../$types'; - -export const load: PageServerLoad = async ({ locals }) => { - if (!locals.user) { - throw redirect(303, '/login'); - } -}; - diff --git a/frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.svelte b/frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.svelte deleted file mode 100644 index 003c119..0000000 --- a/frontend/src/routes/dashboard/stats/doc-chunks-topics/[id]/+page.svelte +++ /dev/null @@ -1,188 +0,0 @@ - - -
    -
    - -
    -

    Visualizations

    -

    All you Document Chunks

    -
    - {#if isLoading} -
    - -
    - {:else} -
    - - {#each root.leaves() as leaf, i} - - - {tVals[i]} - - - - - - {#each `${lVals[leaf.data]}`.split(/\n/g) as subtext, j} - - {subtext} - - {/each} - - - {/each} - -
    - {/if} -
    -
    - - diff --git a/frontend/src/routes/metrics/+server.ts b/frontend/src/routes/metrics/+server.ts new file mode 100644 index 0000000..1716df9 --- /dev/null +++ b/frontend/src/routes/metrics/+server.ts @@ -0,0 +1,21 @@ +import { register, collectDefaultMetrics } from 'prom-client'; + +// Collect default metrics like CPU and memory usage +collectDefaultMetrics(); + +export async function GET() { + try { + const metrics = register.metrics(); + + const options: ResponseInit = { + status: 200, + headers: { + 'Content-Type': register.contentType, + }, + } + + return new Response(await metrics, options); + } catch (error) { + console.error(error); + } +} diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js index 3c597f3..c0060b7 100644 --- a/frontend/svelte.config.js +++ b/frontend/svelte.config.js @@ -1,5 +1,9 @@ import adapterNode from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/kit/vite'; +import 'dotenv/config'; + +// Get base path from environment variable or default to '/' +const basePath = process.env.BASE_PATH || ''; /** @type {import('@sveltejs/kit').Config} */ const config = { @@ -11,8 +15,14 @@ const config = { // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // If your environment is not supported or you settled on a specific environment, switch out the adapter. // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapterNode() + adapter: adapterNode(), + csrf: { + checkOrigin: false, + }, + paths: { + base: basePath + } } }; -export default config; +export default config; \ No newline at end of file diff --git a/grafana/.dockerignore b/grafana/.dockerignore new file mode 100644 index 0000000..945fdf6 --- /dev/null +++ b/grafana/.dockerignore @@ -0,0 +1,9 @@ +.DS_Store +.git +.git* +.vscode +.env +.dockeringnore +docker-compose.yml +pb-schema.json +README.md \ No newline at end of file diff --git a/grafana/.gitignore b/grafana/.gitignore new file mode 100644 index 0000000..08669fa --- /dev/null +++ b/grafana/.gitignore @@ -0,0 +1,3 @@ +# Pocketbase gitignore file + +gf_data/ \ No newline at end of file diff --git a/grafana/Dockerfile b/grafana/Dockerfile new file mode 100644 index 0000000..feb27f2 --- /dev/null +++ b/grafana/Dockerfile @@ -0,0 +1,19 @@ +# Dockerfile for Grafana + +FROM grafana/grafana:9.4.7 + +# Create the dashboards directory +RUN mkdir -p /var/lib/grafana/dashboards + +# Copy the data source provisioning file +COPY datasources/datasource.yml /etc/grafana/provisioning/datasources/ + +# Copy the dashboard provisioning file +COPY dashboards/dashboard.yml /etc/grafana/provisioning/dashboards/ + +# Copy the dashboard JSON files to the created directory +COPY dashboards/prometheus-dashboard.json /etc/grafana/provisioning/dashboards/ +COPY dashboards/prometheus-dashboard-ee-k8s.json /etc/grafana/provisioning/dashboards/ +COPY dashboards/prometheus-dashboard-ee-local.json /etc/grafana/provisioning/dashboards/ + +EXPOSE 3000 diff --git a/grafana/README.md b/grafana/README.md new file mode 100644 index 0000000..a7fa47e --- /dev/null +++ b/grafana/README.md @@ -0,0 +1,30 @@ +# Grafana + +## Setup + +### Change URL if testing localy + +Change the url in the README.md, all datasources should actualy be set. + +URLs to the datasources: + +``` +url: http://ee-prometheus:9090 +url: http://ee-prometheus.example-namespace-name:9090/ +``` + +### Running Grafana + +Use docker compose to create Grafana Service: + +``` +docker-compose up +``` + +### Accessing Grafana + +Navigate to http://localhost:3050/ or the Deployed URL. + +Note: + +Initial installation password and usernames are "admin". \ No newline at end of file diff --git a/grafana/dashboards/dashboard.yml b/grafana/dashboards/dashboard.yml new file mode 100644 index 0000000..22ef1cf --- /dev/null +++ b/grafana/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: "Prometheus" + orgId: 1 + folder: "" + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/grafana/dashboards/prometheus-dashboard-ee-k8s.json b/grafana/dashboards/prometheus-dashboard-ee-k8s.json new file mode 100644 index 0000000..bffad03 --- /dev/null +++ b/grafana/dashboards/prometheus-dashboard-ee-k8s.json @@ -0,0 +1,905 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "http_requests_total", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Total", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "up", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Up Status", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "process_heap_bytes", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Process Heap Bytes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "scrape_duration_seconds", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Scrape Duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "python_gc_collections_total", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Python GC Collections Total", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 17 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "nodejs_external_memory_bytes", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "External Memory Bytes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "http_request_duration_highr_seconds_sum", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Duration High Seconds Sum", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 25 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "editorMode": "builder", + "expr": "process_open_fds", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Process Open FDS", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "definition": "query_result(prometheus_tsdb_head_samples_appended_total)", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "job", + "options": [], + "query": { + "query": "query_result(prometheus_tsdb_head_samples_appended_total)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*job=\"([^\"]+)/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "P95F23D146BEF9D9C" + }, + "definition": "query_result(up{job=~\"$job\"})", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "instance", + "options": [], + "query": { + "query": "query_result(up{job=~\"$job\"})", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*instance=\"([^\"]+).*/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "1h", + "value": "1h" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "interval", + "options": [ + { + "selected": true, + "text": "1h", + "value": "1h" + }, + { + "selected": false, + "text": "3h", + "value": "3h" + }, + { + "selected": false, + "text": "6h", + "value": "6h" + }, + { + "selected": false, + "text": "12h", + "value": "12h" + }, + { + "selected": false, + "text": "1d", + "value": "1d" + }, + { + "selected": false, + "text": "2d", + "value": "2d" + }, + { + "selected": false, + "text": "7d", + "value": "7d" + }, + { + "selected": false, + "text": "30d", + "value": "30d" + }, + { + "selected": false, + "text": "90d", + "value": "90d" + }, + { + "selected": false, + "text": "180d", + "value": "180d" + } + ], + "query": "1h, 3h, 6h, 12h, 1d, 2d, 7d, 30d, 90d, 180d", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Dashboard Namespace eee k8s", + "uid": "SkK7fhIIkk8s", + "version": 3, + "weekStart": "" +} \ No newline at end of file diff --git a/grafana/dashboards/prometheus-dashboard-ee-local.json b/grafana/dashboards/prometheus-dashboard-ee-local.json new file mode 100644 index 0000000..bb7f8a6 --- /dev/null +++ b/grafana/dashboards/prometheus-dashboard-ee-local.json @@ -0,0 +1,905 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "http_requests_total", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Total", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "up", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Up Status", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "process_heap_bytes", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Process Heap Bytes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "scrape_duration_seconds", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Scrape Duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "python_gc_collections_total", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Python GC Collections Total", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 17 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "nodejs_external_memory_bytes", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "External Memory Bytes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "http_request_duration_highr_seconds_sum", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Request Duration High Seconds Sum", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 25 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "editorMode": "builder", + "expr": "process_open_fds", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Process Open FDS", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "definition": "query_result(prometheus_tsdb_head_samples_appended_total)", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "job", + "options": [], + "query": { + "query": "query_result(prometheus_tsdb_head_samples_appended_total)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*job=\"([^\"]+)/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "P3F102418C336D577" + }, + "definition": "query_result(up{job=~\"$job\"})", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "instance", + "options": [], + "query": { + "query": "query_result(up{job=~\"$job\"})", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*instance=\"([^\"]+).*/", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "1h", + "value": "1h" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "interval", + "options": [ + { + "selected": true, + "text": "1h", + "value": "1h" + }, + { + "selected": false, + "text": "3h", + "value": "3h" + }, + { + "selected": false, + "text": "6h", + "value": "6h" + }, + { + "selected": false, + "text": "12h", + "value": "12h" + }, + { + "selected": false, + "text": "1d", + "value": "1d" + }, + { + "selected": false, + "text": "2d", + "value": "2d" + }, + { + "selected": false, + "text": "7d", + "value": "7d" + }, + { + "selected": false, + "text": "30d", + "value": "30d" + }, + { + "selected": false, + "text": "90d", + "value": "90d" + }, + { + "selected": false, + "text": "180d", + "value": "180d" + } + ], + "query": "1h, 3h, 6h, 12h, 1d, 2d, 7d, 30d, 90d, 180d", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Dashboard Namespace eee local", + "uid": "SkK7fhIIk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/grafana/datasources/datasource.yml b/grafana/datasources/datasource.yml new file mode 100644 index 0000000..49b2b2d --- /dev/null +++ b/grafana/datasources/datasource.yml @@ -0,0 +1,17 @@ +apiVersion: 1 + +datasources: + - name: ee-prometheus-k8s + type: prometheus + access: proxy + orgId: 1 + url: http://ee-prometheus.example-namespace-name:9090/ + isDefault: true + editable: true + - name: ee-prometheus-local + type: prometheus + access: proxy + orgId: 1 + url: http://ee-prometheus:9090/ + isDefault: false + editable: true diff --git a/grafana/k8s/deployment.yml b/grafana/k8s/deployment.yml new file mode 100644 index 0000000..cbb7669 --- /dev/null +++ b/grafana/k8s/deployment.yml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ee-grafana +spec: + replicas: 1 + selector: + matchLabels: + app: ee-grafana + template: + metadata: + labels: + app: ee-grafana + spec: + containers: + - name: ee-grafana + image: registry/app:tag + ports: + - containerPort: 3000 + resources: + limits: + cpu: 300m + memory: 300Mi + requests: + cpu: 100m + memory: 100Mi + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 \ No newline at end of file diff --git a/grafana/k8s/service.yml b/grafana/k8s/service.yml new file mode 100644 index 0000000..19d4672 --- /dev/null +++ b/grafana/k8s/service.yml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: ee-grafana +spec: + type: ClusterIP + ports: + - port: 3050 + targetPort: 3000 + protocol: TCP + selector: + app: ee-grafana diff --git a/pocketbase/Dockerfile b/pocketbase/Dockerfile index 92010a7..faae992 100644 --- a/pocketbase/Dockerfile +++ b/pocketbase/Dockerfile @@ -6,14 +6,20 @@ ARG PB_VERSION=0.16.5 RUN apk add --no-cache \ unzip \ - # this is needed only if you want to use scp to copy later your pb_data locally + ca-certificates \ openssh # download and unzip PocketBase ADD https://github.com/pocketbase/pocketbase/releases/download/v${PB_VERSION}/pocketbase_${PB_VERSION}_linux_amd64.zip /tmp/pb.zip RUN unzip /tmp/pb.zip -d /pb/ +# copy initialization script to container +COPY init-pocketbase.sh /pb/init-pocketbase.sh +RUN chmod +x /pb/init-pocketbase.sh + +COPY pb_migrations /pb/pb_migrations + EXPOSE 8090 -# start PocketBase -CMD ["/pb/pocketbase", "serve", "--http=0.0.0.0:8090"] \ No newline at end of file +# start PocketBase with the initialization script +CMD ["/pb/init-pocketbase.sh"] diff --git a/pocketbase/README.md b/pocketbase/README.md index 558a1d8..e4fb21e 100644 --- a/pocketbase/README.md +++ b/pocketbase/README.md @@ -2,11 +2,20 @@ ## Setup +### Environment variables + +Create a `.env` file in the root of the backend directory with the following variables: + +``` +POCKETBASE_ADMIN_EMAIL=test@example.com +POCKETBASE_ADMIN_PASSWORD=1234567890 +``` + ### Running pocketbase Use docker compose to create Pocketbase Service: -```bash +``` docker-compose up ``` @@ -18,7 +27,7 @@ Also import pb_schema.json in the admin settings! It should match your backend admin user credentials in your .env file. -```bash +``` POCKETBASE_ADMIN_EMAIL POCKETBASE_ADMIN_PASSWORD ``` diff --git a/pocketbase/init-pocketbase.sh b/pocketbase/init-pocketbase.sh new file mode 100644 index 0000000..584150e --- /dev/null +++ b/pocketbase/init-pocketbase.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Start PocketBase in the background +/pb/pocketbase serve --http=0.0.0.0:8090 & +PB_PID=$! + +# Waiting for PocketBase to be ready to accept connections +sleep 5 + +# Create an admin user using environment variables for email and password +/pb/pocketbase admin create "$POCKETBASE_ADMIN_EMAIL" "$POCKETBASE_ADMIN_PASSWORD" + +# Run migrations +/pb/pocketbase migrate up + +# Wait for the PocketBase process to finish +wait $PB_PID \ No newline at end of file diff --git a/pocketbase/k8s/deployment.yml b/pocketbase/k8s/deployment.yml new file mode 100644 index 0000000..a2bc5c0 --- /dev/null +++ b/pocketbase/k8s/deployment.yml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ee-pocketbase +spec: + replicas: 1 + selector: + matchLabels: + app: ee-pocketbase + template: + metadata: + labels: + app: ee-pocketbase + spec: + containers: + - name: ee-pocketbase + image: registry/app:tag + ports: + - containerPort: 8090 + env: + - name: POCKETBASE_ADMIN_EMAIL + valueFrom: + secretKeyRef: + name: ee-pocketbase-secrets + key: POCKETBASE_ADMIN_EMAIL + - name: POCKETBASE_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: ee-pocketbase-secrets + key: POCKETBASE_ADMIN_PASSWORD + volumeMounts: + - name: pb-storage + mountPath: /pb_data + resources: + limits: + cpu: 300m + memory: 300Mi + requests: + cpu: 100m + memory: 100Mi + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: /api/health + port: 8090 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /api/health + port: 8090 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + volumes: + - name: pb-storage + persistentVolumeClaim: + claimName: ee-pocketbase-pvc diff --git a/pocketbase/k8s/pv-pvc.yml b/pocketbase/k8s/pv-pvc.yml new file mode 100644 index 0000000..2c34559 --- /dev/null +++ b/pocketbase/k8s/pv-pvc.yml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: ee-pocketbase-pv + labels: + app: ee-pocketbase +spec: + storageClassName: manual + capacity: + storage: 1Gi + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + hostPath: + path: "/tmp/ee-pocketbase" +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ee-pocketbase-pvc + labels: + app: ee-pocketbase +spec: + storageClassName: manual + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/pocketbase/k8s/service.yml b/pocketbase/k8s/service.yml new file mode 100644 index 0000000..d9147aa --- /dev/null +++ b/pocketbase/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: ee-pocketbase +spec: + type: ClusterIP + ports: + - port: 8090 + name: api + targetPort: 8090 + protocol: TCP + selector: + app: ee-pocketbase diff --git a/pocketbase/pb_migrations/1698581801_created_documents.js b/pocketbase/pb_migrations/1698581801_created_documents.js new file mode 100644 index 0000000..d8477cf --- /dev/null +++ b/pocketbase/pb_migrations/1698581801_created_documents.js @@ -0,0 +1,130 @@ +migrate((db) => { + const collection = new Collection({ + "id": "8iv79uqtsxbzb7i", + "created": "2023-10-29 12:16:41.539Z", + "updated": "2023-10-29 12:16:41.539Z", + "name": "documents", + "type": "base", + "system": false, + "schema": [ + { + "system": false, + "id": "wril0oaf", + "name": "owner", + "type": "relation", + "required": true, + "unique": false, + "options": { + "collectionId": "_pb_users_auth_", + "cascadeDelete": true, + "minSelect": null, + "maxSelect": 1, + "displayFields": [] + } + }, + { + "system": false, + "id": "u24kgjzx", + "name": "name", + "type": "text", + "required": true, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "system": false, + "id": "kcapcxkb", + "name": "document", + "type": "file", + "required": true, + "unique": false, + "options": { + "maxSelect": 1, + "maxSize": 104857600, + "mimeTypes": [], + "thumbs": [], + "protected": false + } + }, + { + "system": false, + "id": "r04pmvga", + "name": "type", + "type": "select", + "required": true, + "unique": false, + "options": { + "maxSelect": 1, + "values": [ + "Created", + "Uploaded" + ] + } + }, + { + "system": false, + "id": "xjjs1yqp", + "name": "page_count", + "type": "number", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "system": false, + "id": "e67iynho", + "name": "word_count", + "type": "number", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "system": false, + "id": "4xrn6pah", + "name": "classified_topic", + "type": "text", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "system": false, + "id": "gfcbrhw1", + "name": "chat_history", + "type": "json", + "required": false, + "unique": false, + "options": {} + } + ], + "indexes": [], + "listRule": "owner.id = @request.auth.id", + "viewRule": "owner.id = @request.auth.id", + "createRule": "@request.auth.id != null", + "updateRule": "owner.id = @request.auth.id", + "deleteRule": "owner.id = @request.auth.id", + "options": {} + }); + + return Dao(db).saveCollection(collection); +}, (db) => { + const dao = new Dao(db); + const collection = dao.findCollectionByNameOrId("8iv79uqtsxbzb7i"); + + return dao.deleteCollection(collection); +}) diff --git a/pocketbase/pb_migrations/1698581801_created_documents_stats.js b/pocketbase/pb_migrations/1698581801_created_documents_stats.js new file mode 100644 index 0000000..6e75cfb --- /dev/null +++ b/pocketbase/pb_migrations/1698581801_created_documents_stats.js @@ -0,0 +1,109 @@ +migrate((db) => { + const collection = new Collection({ + "id": "4uw92ioynhexgcz", + "created": "2023-10-29 12:16:41.535Z", + "updated": "2023-10-29 12:16:41.579Z", + "name": "documents_stats", + "type": "view", + "system": false, + "schema": [ + { + "system": false, + "id": "khvalogk", + "name": "owner", + "type": "relation", + "required": true, + "unique": false, + "options": { + "collectionId": "_pb_users_auth_", + "cascadeDelete": true, + "minSelect": null, + "maxSelect": 1, + "displayFields": [] + } + }, + { + "system": false, + "id": "5jxamune", + "name": "total_pages", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "2vngsmd9", + "name": "total_words", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "hqdbenzo", + "name": "total_documents", + "type": "number", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "system": false, + "id": "die9kkzz", + "name": "total_uploaded", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "6mmva5ol", + "name": "total_created", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "hhexp9zs", + "name": "min_created_date", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "6q5bhvdy", + "name": "max_created_date", + "type": "json", + "required": false, + "unique": false, + "options": {} + } + ], + "indexes": [], + "listRule": "owner.id = @request.auth.id", + "viewRule": "owner.id = @request.auth.id", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": { + "query": "SELECT\n (ROW_NUMBER() OVER()) as id,\n documents.owner AS owner,\n SUM(page_count) AS total_pages,\n SUM(word_count) AS total_words,\n COUNT(*) AS total_documents,\n SUM(CASE WHEN type = 'Uploaded' THEN 1 ELSE 0 END) AS total_uploaded,\n SUM(CASE WHEN type = 'Created' THEN 1 ELSE 0 END) AS total_created,\n MIN(created) AS min_created_date,\n MAX(created) AS max_created_date\nFROM documents\nGROUP BY owner\n" + } + }); + + return Dao(db).saveCollection(collection); +}, (db) => { + const dao = new Dao(db); + const collection = dao.findCollectionByNameOrId("4uw92ioynhexgcz"); + + return dao.deleteCollection(collection); +}) diff --git a/pocketbase/pb_migrations/1698581801_created_documents_total_stats.js b/pocketbase/pb_migrations/1698581801_created_documents_total_stats.js new file mode 100644 index 0000000..dcafbca --- /dev/null +++ b/pocketbase/pb_migrations/1698581801_created_documents_total_stats.js @@ -0,0 +1,46 @@ +migrate((db) => { + const collection = new Collection({ + "id": "je0l596w0o6gf22", + "created": "2023-10-29 12:16:41.538Z", + "updated": "2023-10-29 12:16:41.587Z", + "name": "documents_total_stats", + "type": "view", + "system": false, + "schema": [ + { + "system": false, + "id": "uarsmx0s", + "name": "total_documents", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "bivu8nw5", + "name": "total_created", + "type": "json", + "required": false, + "unique": false, + "options": {} + } + ], + "indexes": [], + "listRule": "", + "viewRule": "", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": { + "query": "SELECT\n (ROW_NUMBER() OVER()) as id,\n SUM(total_documents) AS total_documents,\n SUM(total_created) AS total_created\nFROM documents_stats\n" + } + }); + + return Dao(db).saveCollection(collection); +}, (db) => { + const dao = new Dao(db); + const collection = dao.findCollectionByNameOrId("je0l596w0o6gf22"); + + return dao.deleteCollection(collection); +}) diff --git a/pocketbase/pb_migrations/1698581856_collections_snapshot.js b/pocketbase/pb_migrations/1698581856_collections_snapshot.js new file mode 100644 index 0000000..05fba89 --- /dev/null +++ b/pocketbase/pb_migrations/1698581856_collections_snapshot.js @@ -0,0 +1,328 @@ +migrate((db) => { + const snapshot = [ + { + "id": "_pb_users_auth_", + "created": "2023-10-29 12:15:56.691Z", + "updated": "2023-10-29 12:16:41.532Z", + "name": "users", + "type": "auth", + "system": false, + "schema": [ + { + "system": false, + "id": "users_name", + "name": "name", + "type": "text", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "system": false, + "id": "users_avatar", + "name": "avatar", + "type": "file", + "required": false, + "unique": false, + "options": { + "maxSelect": 1, + "maxSize": 5242880, + "mimeTypes": [ + "image/jpeg", + "image/png", + "image/svg+xml", + "image/gif", + "image/webp" + ], + "thumbs": null, + "protected": false + } + } + ], + "indexes": [], + "listRule": "id = @request.auth.id", + "viewRule": "id = @request.auth.id", + "createRule": "", + "updateRule": "id = @request.auth.id", + "deleteRule": "id = @request.auth.id", + "options": { + "allowEmailAuth": true, + "allowOAuth2Auth": true, + "allowUsernameAuth": true, + "exceptEmailDomains": null, + "manageRule": null, + "minPasswordLength": 8, + "onlyEmailDomains": null, + "requireEmail": false + } + }, + { + "id": "4uw92ioynhexgcz", + "created": "2023-10-29 12:16:41.535Z", + "updated": "2023-10-29 12:16:41.579Z", + "name": "documents_stats", + "type": "view", + "system": false, + "schema": [ + { + "system": false, + "id": "khvalogk", + "name": "owner", + "type": "relation", + "required": true, + "unique": false, + "options": { + "collectionId": "_pb_users_auth_", + "cascadeDelete": true, + "minSelect": null, + "maxSelect": 1, + "displayFields": [] + } + }, + { + "system": false, + "id": "5jxamune", + "name": "total_pages", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "2vngsmd9", + "name": "total_words", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "hqdbenzo", + "name": "total_documents", + "type": "number", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "system": false, + "id": "die9kkzz", + "name": "total_uploaded", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "6mmva5ol", + "name": "total_created", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "hhexp9zs", + "name": "min_created_date", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "6q5bhvdy", + "name": "max_created_date", + "type": "json", + "required": false, + "unique": false, + "options": {} + } + ], + "indexes": [], + "listRule": "owner.id = @request.auth.id", + "viewRule": "owner.id = @request.auth.id", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": { + "query": "SELECT\n (ROW_NUMBER() OVER()) as id,\n documents.owner AS owner,\n SUM(page_count) AS total_pages,\n SUM(word_count) AS total_words,\n COUNT(*) AS total_documents,\n SUM(CASE WHEN type = 'Uploaded' THEN 1 ELSE 0 END) AS total_uploaded,\n SUM(CASE WHEN type = 'Created' THEN 1 ELSE 0 END) AS total_created,\n MIN(created) AS min_created_date,\n MAX(created) AS max_created_date\nFROM documents\nGROUP BY owner\n" + } + }, + { + "id": "je0l596w0o6gf22", + "created": "2023-10-29 12:16:41.538Z", + "updated": "2023-10-29 12:16:41.587Z", + "name": "documents_total_stats", + "type": "view", + "system": false, + "schema": [ + { + "system": false, + "id": "uarsmx0s", + "name": "total_documents", + "type": "json", + "required": false, + "unique": false, + "options": {} + }, + { + "system": false, + "id": "bivu8nw5", + "name": "total_created", + "type": "json", + "required": false, + "unique": false, + "options": {} + } + ], + "indexes": [], + "listRule": "", + "viewRule": "", + "createRule": null, + "updateRule": null, + "deleteRule": null, + "options": { + "query": "SELECT\n (ROW_NUMBER() OVER()) as id,\n SUM(total_documents) AS total_documents,\n SUM(total_created) AS total_created\nFROM documents_stats\n" + } + }, + { + "id": "8iv79uqtsxbzb7i", + "created": "2023-10-29 12:16:41.539Z", + "updated": "2023-10-29 12:16:41.539Z", + "name": "documents", + "type": "base", + "system": false, + "schema": [ + { + "system": false, + "id": "wril0oaf", + "name": "owner", + "type": "relation", + "required": true, + "unique": false, + "options": { + "collectionId": "_pb_users_auth_", + "cascadeDelete": true, + "minSelect": null, + "maxSelect": 1, + "displayFields": [] + } + }, + { + "system": false, + "id": "u24kgjzx", + "name": "name", + "type": "text", + "required": true, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "system": false, + "id": "kcapcxkb", + "name": "document", + "type": "file", + "required": true, + "unique": false, + "options": { + "maxSelect": 1, + "maxSize": 104857600, + "mimeTypes": [], + "thumbs": [], + "protected": false + } + }, + { + "system": false, + "id": "r04pmvga", + "name": "type", + "type": "select", + "required": true, + "unique": false, + "options": { + "maxSelect": 1, + "values": [ + "Created", + "Uploaded" + ] + } + }, + { + "system": false, + "id": "xjjs1yqp", + "name": "page_count", + "type": "number", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "system": false, + "id": "e67iynho", + "name": "word_count", + "type": "number", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null + } + }, + { + "system": false, + "id": "4xrn6pah", + "name": "classified_topic", + "type": "text", + "required": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + }, + { + "system": false, + "id": "gfcbrhw1", + "name": "chat_history", + "type": "json", + "required": false, + "unique": false, + "options": {} + } + ], + "indexes": [], + "listRule": "owner.id = @request.auth.id", + "viewRule": "owner.id = @request.auth.id", + "createRule": "@request.auth.id != null", + "updateRule": "owner.id = @request.auth.id", + "deleteRule": "owner.id = @request.auth.id", + "options": {} + } + ]; + + const collections = snapshot.map((item) => new Collection(item)); + + return Dao(db).importCollections(collections, true, null); +}, (db) => { + return null; +}) diff --git a/pocketbase/pb_schema.json b/pocketbase/pb_migrations/pb_schema.json similarity index 81% rename from pocketbase/pb_schema.json rename to pocketbase/pb_migrations/pb_schema.json index f6d8b42..1d9fa39 100644 --- a/pocketbase/pb_schema.json +++ b/pocketbase/pb_migrations/pb_schema.json @@ -6,11 +6,13 @@ "system": false, "schema": [ { + "system": false, "id": "users_name", "name": "name", "type": "text", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": { "min": null, "max": null, @@ -18,11 +20,13 @@ } }, { + "system": false, "id": "users_avatar", "name": "avatar", "type": "file", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": { "maxSelect": 1, "maxSize": 5242880, @@ -62,11 +66,13 @@ "system": false, "schema": [ { - "id": "0a5dyaiq", + "system": false, + "id": "yjkkops1", "name": "owner", "type": "relation", - "system": false, "required": true, + "presentable": false, + "unique": false, "options": { "collectionId": "_pb_users_auth_", "cascadeDelete": true, @@ -76,62 +82,77 @@ } }, { - "id": "lj8lims3", + "system": false, + "id": "k4l8o9oj", "name": "total_pages", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} }, { - "id": "0urchsp5", + "system": false, + "id": "4svvazm6", "name": "total_words", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} }, { - "id": "3fefn6tl", + "system": false, + "id": "favnxlq4", "name": "total_documents", "type": "number", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": { "min": null, - "max": null + "max": null, + "noDecimal": false } }, { - "id": "e50s4gf3", + "system": false, + "id": "7gk1bp4n", "name": "total_uploaded", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} }, { - "id": "pswjgzap", + "system": false, + "id": "spukvdgi", "name": "total_created", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} }, { - "id": "kgxaeib6", + "system": false, + "id": "szjs7ajm", "name": "min_created_date", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} }, { - "id": "nimunns9", + "system": false, + "id": "okvo8gpu", "name": "max_created_date", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} } ], @@ -152,19 +173,23 @@ "system": false, "schema": [ { - "id": "geddz5zg", + "system": false, + "id": "tofuoviz", "name": "total_documents", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} }, { - "id": "cqemk738", + "system": false, + "id": "sv1yug2r", "name": "total_created", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} } ], @@ -185,11 +210,13 @@ "system": false, "schema": [ { + "system": false, "id": "wril0oaf", "name": "owner", "type": "relation", - "system": false, "required": true, + "presentable": false, + "unique": false, "options": { "collectionId": "_pb_users_auth_", "cascadeDelete": true, @@ -199,11 +226,13 @@ } }, { + "system": false, "id": "u24kgjzx", "name": "name", "type": "text", - "system": false, "required": true, + "presentable": false, + "unique": false, "options": { "min": null, "max": null, @@ -211,11 +240,13 @@ } }, { + "system": false, "id": "kcapcxkb", "name": "document", "type": "file", - "system": false, "required": true, + "presentable": false, + "unique": false, "options": { "maxSelect": 1, "maxSize": 104857600, @@ -225,11 +256,13 @@ } }, { + "system": false, "id": "r04pmvga", "name": "type", "type": "select", - "system": false, "required": true, + "presentable": false, + "unique": false, "options": { "maxSelect": 1, "values": [ @@ -239,33 +272,41 @@ } }, { + "system": false, "id": "xjjs1yqp", "name": "page_count", "type": "number", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": { "min": null, - "max": null + "max": null, + "noDecimal": false } }, { + "system": false, "id": "e67iynho", "name": "word_count", "type": "number", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": { "min": null, - "max": null + "max": null, + "noDecimal": false } }, { + "system": false, "id": "4xrn6pah", "name": "classified_topic", "type": "text", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": { "min": null, "max": null, @@ -273,19 +314,13 @@ } }, { - "id": "qrfkkifz", - "name": "classified_doc_chunks_topics", - "type": "json", "system": false, - "required": false, - "options": {} - }, - { "id": "gfcbrhw1", "name": "chat_history", "type": "json", - "system": false, "required": false, + "presentable": false, + "unique": false, "options": {} } ], diff --git a/prometheus/.dockerignore b/prometheus/.dockerignore new file mode 100644 index 0000000..ec1a654 --- /dev/null +++ b/prometheus/.dockerignore @@ -0,0 +1,10 @@ +.DS_Store +.git +.git* +.vscode +.env +.dockeringnore +docker-compose.yml +fly.toml +pb-schema.json +README.md \ No newline at end of file diff --git a/prometheus/.gitignore b/prometheus/.gitignore new file mode 100644 index 0000000..3d1e3a7 --- /dev/null +++ b/prometheus/.gitignore @@ -0,0 +1,3 @@ +# Pocketbase gitignore file + +pm_data/ \ No newline at end of file diff --git a/prometheus/Dockerfile b/prometheus/Dockerfile index 290393d..d1fb86f 100644 --- a/prometheus/Dockerfile +++ b/prometheus/Dockerfile @@ -1,2 +1,5 @@ -FROM prom/prometheus -ADD prometheus.yml /etc/prometheus/ \ No newline at end of file +# Dockerfile for Prometheus + +FROM prom/prometheus:latest + +COPY prometheus.yml /etc/prometheus/prometheus.yml diff --git a/prometheus/README.md b/prometheus/README.md new file mode 100644 index 0000000..87df999 --- /dev/null +++ b/prometheus/README.md @@ -0,0 +1,15 @@ +# Prometheus + +## Setup + +### Running Prometheus + +Use docker compose to create Prometheus Service: + +``` +docker-compose up +``` + +### Accessing Prometheus + +Navigate to http://localhost:9090/ or the Deployed URL. diff --git a/prometheus/k8s/deployment.yml b/prometheus/k8s/deployment.yml new file mode 100644 index 0000000..3e61951 --- /dev/null +++ b/prometheus/k8s/deployment.yml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ee-prometheus +spec: + replicas: 1 + selector: + matchLabels: + app: ee-prometheus + template: + metadata: + labels: + app: ee-prometheus + spec: + containers: + - name: ee-prometheus + image: registry/app:tag + ports: + - containerPort: 9090 + resources: + limits: + cpu: 300m + memory: 300Mi + requests: + cpu: 100m + memory: 100Mi + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: /-/healthy + port: 9090 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /-/healthy + port: 9090 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 diff --git a/prometheus/k8s/service.yml b/prometheus/k8s/service.yml new file mode 100644 index 0000000..fa1f761 --- /dev/null +++ b/prometheus/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: ee-prometheus +spec: + type: ClusterIP + ports: + - port: 9090 + name: metrics + targetPort: 9090 + protocol: TCP + selector: + app: ee-prometheus diff --git a/prometheus/prometheus.yml b/prometheus/prometheus.yml index d2d33eb..9f98536 100644 --- a/prometheus/prometheus.yml +++ b/prometheus/prometheus.yml @@ -2,6 +2,10 @@ global: scrape_interval: 15s scrape_configs: - - job_name: 'backend_application' + - job_name: "backend_service" static_configs: - - targets: ['host.docker.internal:5003'] + - targets: ["ee-backend:5003"] + - job_name: "frontend_service" + metrics_path: "/metrics" + static_configs: + - targets: ["ee-frontend:3000"] diff --git a/qdrant/Dockerfile b/qdrant/Dockerfile index d42c300..6146a51 100644 --- a/qdrant/Dockerfile +++ b/qdrant/Dockerfile @@ -3,6 +3,11 @@ # Use the official Qdrant Docker image FROM qdrant/qdrant:latest +# Install wget +RUN apt-get update && \ + apt-get install -y wget && \ + apt-get clean + # Create a directory for Qdrant storage inside the container RUN mkdir -p /qdrant/storage diff --git a/qdrant/README.md b/qdrant/README.md index f704dcb..fc2b37c 100644 --- a/qdrant/README.md +++ b/qdrant/README.md @@ -6,7 +6,7 @@ Use docker compose to create Qdrant Service: -```bash +``` docker-compose up ``` diff --git a/qdrant/k8s/deployment.yml b/qdrant/k8s/deployment.yml new file mode 100644 index 0000000..f1077db --- /dev/null +++ b/qdrant/k8s/deployment.yml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ee-qdrant +spec: + replicas: 1 + selector: + matchLabels: + app: ee-qdrant + template: + metadata: + labels: + app: ee-qdrant + spec: + containers: + - name: ee-qdrant + image: registry/app:tag + ports: + - containerPort: 6333 + volumeMounts: + - name: qdrant-storage + mountPath: /qdrant/storage + resources: + limits: + cpu: 300m + memory: 300Mi + requests: + cpu: 100m + memory: 100Mi + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: /healthz + port: 6333 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + readinessProbe: + httpGet: + path: /healthz + port: 6333 + initialDelaySeconds: 20 + timeoutSeconds: 1 + periodSeconds: 10 + failureThreshold: 3 + volumes: + - name: qdrant-storage + persistentVolumeClaim: + claimName: ee-qdrant-pvc diff --git a/qdrant/k8s/pv-pvc.yml b/qdrant/k8s/pv-pvc.yml new file mode 100644 index 0000000..3ef31e6 --- /dev/null +++ b/qdrant/k8s/pv-pvc.yml @@ -0,0 +1,29 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: ee-qdrant-pv + labels: + app: ee-qdrant +spec: + storageClassName: manual + capacity: + storage: 1Gi + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + hostPath: + path: "/tmp/ee-qdrant" +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: ee-qdrant-pvc + labels: + app: ee-qdrant +spec: + storageClassName: manual + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi diff --git a/qdrant/k8s/service.yml b/qdrant/k8s/service.yml new file mode 100644 index 0000000..22bf0cd --- /dev/null +++ b/qdrant/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: ee-qdrant +spec: + type: ClusterIP + ports: + - port: 6333 + name: api + targetPort: 6333 + protocol: TCP + selector: + app: ee-qdrant