From daedd0b068c36e63c0387c389515ac454ae351d5 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 06:40:11 +0000 Subject: [PATCH 01/11] Initial UI, Login/Register Flow Prelim, Icons --- .gitignore | 4 + README.md | 2 +- frontend-next/package-lock.json | 851 ++++++++- frontend-next/package.json | 1 + frontend-next/public/logos/icon.png | Bin 0 -> 964 bytes frontend-next/public/logos/logo.png | Bin 0 -> 64822 bytes .../public/logos/logo_transparent.png | Bin 0 -> 19633 bytes .../public/logos/logo_transparent_inverse.png | Bin 0 -> 18583 bytes .../logos/logo_transparent_inverse2.png | Bin 0 -> 26164 bytes frontend-next/public/next.svg | 1 - frontend-next/public/vercel.svg | 1 - frontend-next/src/app/api/login/route.js | 121 ++ frontend-next/src/app/api/register/route.js | 66 + frontend-next/src/app/favicon.ico | Bin 25931 -> 15406 bytes frontend-next/src/app/globals.css | 8 +- frontend-next/src/app/layout.js | 4 +- frontend-next/src/app/login/layout.js | 19 + frontend-next/src/app/login/page.js | 57 + frontend-next/src/app/page.js | 48 +- frontend-next/src/app/register/layout.js | 19 + frontend-next/src/app/register/page.js | 56 + frontend-next/src/app/room/[stub]/layout.js | 26 + frontend-next/src/app/room/[stub]/page.js | 28 + frontend-next/src/app/room/[stub]/shared.js | 18 + frontend-next/src/lib/firebase-admin.js | 11 + frontend-next/src/lib/firebase-config.js | 19 + package-lock.json | 1609 +++++++++++++++++ package.json | 6 + 28 files changed, 2935 insertions(+), 40 deletions(-) create mode 100644 frontend-next/public/logos/icon.png create mode 100644 frontend-next/public/logos/logo.png create mode 100644 frontend-next/public/logos/logo_transparent.png create mode 100644 frontend-next/public/logos/logo_transparent_inverse.png create mode 100644 frontend-next/public/logos/logo_transparent_inverse2.png delete mode 100644 frontend-next/public/next.svg delete mode 100644 frontend-next/public/vercel.svg create mode 100644 frontend-next/src/app/api/login/route.js create mode 100644 frontend-next/src/app/api/register/route.js create mode 100644 frontend-next/src/app/login/layout.js create mode 100644 frontend-next/src/app/login/page.js create mode 100644 frontend-next/src/app/register/layout.js create mode 100644 frontend-next/src/app/register/page.js create mode 100644 frontend-next/src/app/room/[stub]/layout.js create mode 100644 frontend-next/src/app/room/[stub]/page.js create mode 100644 frontend-next/src/app/room/[stub]/shared.js create mode 100644 frontend-next/src/lib/firebase-admin.js create mode 100644 frontend-next/src/lib/firebase-config.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 6a7d6d8..ccff3db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +# Firebase Stuff +firebase-admin-key.json +firebase*.json + # Logs logs *.log diff --git a/README.md b/README.md index 88a7680..33ff6ac 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ChatMaps +![](/frontend-next/public/logos/logo_transparent.png) Main repo for ChatMaps, our COS420 Project. ChatMaps is a web-based social networking service that allows users to connect to others in their local geographic area. It will implement an interactable mapping utility to show general user locations relative to other users, as well as a chat room feature that allows users to start public conversations based on a specified topic. ChatMaps is primarily intended for use in densely populated areas, such as college campuses or metropolitan areas, so people of similar interests can start conversations. The goal of this project is to create a web app that plots locations, gives a radius of the local area, and connects users into different topic-based chat rooms. diff --git a/frontend-next/package-lock.json b/frontend-next/package-lock.json index 54972d9..dbcba5c 100644 --- a/frontend-next/package-lock.json +++ b/frontend-next/package-lock.json @@ -8,6 +8,7 @@ "name": "chatmaps", "version": "0.1.0", "dependencies": { + "firebase": "^10.8.0", "next": "^14.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -109,6 +110,528 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.1.tgz", + "integrity": "sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.7.tgz", + "integrity": "sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + }, + "node_modules/@firebase/app": { + "version": "0.9.27", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.27.tgz", + "integrity": "sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.2.tgz", + "integrity": "sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.9.tgz", + "integrity": "sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==", + "dependencies": { + "@firebase/app-check": "0.8.2", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.27.tgz", + "integrity": "sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==", + "dependencies": { + "@firebase/app": "0.9.27", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.0.tgz", + "integrity": "sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.2.tgz", + "integrity": "sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==", + "dependencies": { + "@firebase/auth": "1.6.0", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", + "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", + "dependencies": { + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", + "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", + "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/database": "1.0.3", + "@firebase/database-types": "1.0.1", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", + "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.4" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.2.tgz", + "integrity": "sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "@firebase/webchannel-wrapper": "0.10.5", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.25.tgz", + "integrity": "sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/firestore": "4.4.2", + "@firebase/firestore-types": "3.0.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.1.tgz", + "integrity": "sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.7.tgz", + "integrity": "sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/functions": "0.11.1", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.5.tgz", + "integrity": "sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.5.tgz", + "integrity": "sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.6.tgz", + "integrity": "sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.6.tgz", + "integrity": "sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/messaging": "0.12.6", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.5.tgz", + "integrity": "sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.5.tgz", + "integrity": "sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.5", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.5.tgz", + "integrity": "sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.5.tgz", + "integrity": "sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + }, + "node_modules/@firebase/storage": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.1.tgz", + "integrity": "sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.4.tgz", + "integrity": "sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/storage": "0.12.1", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", + "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", + "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -428,6 +951,60 @@ "node": ">=14" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@rushstack/eslint-patch": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", @@ -448,6 +1025,14 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/node": { + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -622,7 +1207,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -631,7 +1215,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1110,11 +1693,57 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1125,8 +1754,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/commander": { "version": "4.1.1", @@ -1460,7 +2088,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, "engines": { "node": ">=6" } @@ -1942,6 +2569,17 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -1982,6 +2620,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.0.tgz", + "integrity": "sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-compat": "0.2.7", + "@firebase/app": "0.9.27", + "@firebase/app-check": "0.8.2", + "@firebase/app-check-compat": "0.3.9", + "@firebase/app-compat": "0.2.27", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "1.6.0", + "@firebase/auth-compat": "0.5.2", + "@firebase/database": "1.0.3", + "@firebase/database-compat": "1.0.3", + "@firebase/firestore": "4.4.2", + "@firebase/firestore-compat": "0.3.25", + "@firebase/functions": "0.11.1", + "@firebase/functions-compat": "0.3.7", + "@firebase/installations": "0.6.5", + "@firebase/installations-compat": "0.2.5", + "@firebase/messaging": "0.12.6", + "@firebase/messaging-compat": "0.2.6", + "@firebase/performance": "0.6.5", + "@firebase/performance-compat": "0.2.5", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-compat": "0.2.5", + "@firebase/storage": "0.12.1", + "@firebase/storage-compat": "0.3.4", + "@firebase/util": "1.9.4" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -2096,6 +2767,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -2356,6 +3035,16 @@ "node": ">= 0.4" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2555,7 +3244,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -2941,12 +3629,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3613,6 +4311,29 @@ "react-is": "^16.13.1" } }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3737,6 +4458,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -3858,6 +4587,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -4151,7 +4899,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4499,6 +5246,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "dependencies": { + "@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==" + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -4544,6 +5307,27 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4735,6 +5519,14 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -4750,6 +5542,49 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend-next/package.json b/frontend-next/package.json index c26344e..c4dfa5c 100644 --- a/frontend-next/package.json +++ b/frontend-next/package.json @@ -9,6 +9,7 @@ "lint": "next lint" }, "dependencies": { + "firebase": "^10.8.0", "next": "^14.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/frontend-next/public/logos/icon.png b/frontend-next/public/logos/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a21883c2e6f5a30116d295d869e8490e9210f07c GIT binary patch literal 964 zcmV;#13UbQP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00009P)t-s|Ns9#!O8#s|5Wo@ z&;S4c0d!JMQvg8b*k%9#00Cl4M??UK1szBL000McNliru=mHZ1Hwoo3K9>Lh106|3 zK~#9!?b|_`+As_S;AEj2)c5fbys+N!HLn?d1SJ(o`e2zoKe2oemS$iaw53lt0xE)Wb5E)WcY$icWMP`F~eP`F~eJ_ob%LW* zvWs$23_7Gk;fq0sbSQi=XuRp@o*xsa#N)1fOJFchg>MNA=C8uGq}UHFgO;=kzj1*D zQ&l|?Or=cBx>D@3&h;Ev1({N=TaVV38ifxA$T!IfP)w@xyLhXTlZnj~ctsu)q=-!0 zcQi7fGR`KqO4@)GSY=l#XC}1@c!if65vdg#E9kcim=OiN(k7FQ3Z0d{Lv>5th;SwJ z4>BoDOQ%01gObh4-ajT-lsewX#;uL_JT&-w8=-y34lAMVfZFm&t#mVqr*N?|+E}-c z&#_=is+FWv+B-E3_3z4vQorSYJuOWtu|IlnB|aaR`4p^%GGJe0s9*lzFh zUVJ}Fu*($Ub_b+L4PlCeyzmzXQnrwSY$XMUQ~*UB&|{GY zA}Qeh+U`(^`fT-TnV)|+B<+vqcqN(?@+hT`*Obahu{C7f#qC#cXsC{63P%u7KsuzQOBiX80|-M( zH%c>f3=QwSX9nZ>p5N#F<2lb~k9%V8eckI?*IMi5m6C!KDKQN(9v&X4^n<^Z@$gOy z;Njs@ojn6yN%@ri2K*nsgR<0Jyu5b0d2n#r^p5-;JiNjXk^=)maD2}8fu;i<-k*-p z|M1657+t}OM&_y-jw;sXw(`b~22Tte4Zv%7cpg`cEX{3|Y|O149j=OKd0ch9D#F8Y z)eZa?&Vf1N!H(-AR_z>vpST{@m<6rdFL_$jm5y|;l>EkI$ox@zEvN6Oa(%^crA1FZK zE(;Ef-q&a?h6zxbII`<1D)XeHJMpHg=|6CXCoAb^8oY}MT0&AU8KUy4-$WOMJj}e) z8x!p{QjM$<>bV@CWFdEtNX?NRJw1*VAL*0zx~8$Ym9L>H5uCYdq-IMW@%q%^j&Nf5 z(LP~-6x#5017mZ-`RMHYrSW$#l5YuHT#rsu6rqYY7*QS${_ZN zD-m>$*9zZ$FBGFP?V6R84`FDZSo+Y#K;y&Dj4QYP{$6Ya20c5nE>!$_aSjPxSm!t= zTAGHq3jDgQdw}2X6Q|<-`zZpdk3glj#6nFg2PczUzn#qOcS`&0j?*hQ;Quf zOLGdY39kCgNriPpg5nr#aMm&^Jk+#|#QlTs2e_u1%3W^~lYs{3lTtaoS2VzE&e2-% zYti8<5Il^am(jS*6jUrHm9BId1*xS4|`yyS6%(T_p+M22j=6?+@1& ztLj>Ne@9Bk6G>1;GRYGbd%}8Dr_e;Jo71W7Mxah;NUZF4hikhd!$d+ftLZE_J~mHF zgodK>*E!yTkD5!B;h(*zrw}X(zQR|lt5O6iK>2x5D{a{%QPN7dTVDDp=T(k(QZX}w zNX#wZDNt1|vw1{3-ShYbZW)f>45v}ejb^J@Zc$n;Nvc+Qp=`u1@*x>juqb@I^>Tzl z`&n9Yi?{;(lRVX)gEo8@!9X!8B$MA%6n;c|KcES%A9pX2Tu{vYrk0JAW^mFSP%PEo zoeZD7M9J$V{)RBW!yFdDaP@Zz4oWMRcVNsJROW9G_g@uOD?iVv<`lm}r@vnWuoj13 z&ttnm1xV;Hz~K$3)Y`4|d_^2MVT*iv+ z6OCiUXh`@ML9z4JKBIPy7C!-I;;6|Rx>8^Nve460Q7v`9`yB4; zvgS-hwTM4DL>v{Ik$vb`!CLWWptb+KlmO_KGcd9-4Ex$q!WDWp=e}8%&<9l+ncW;e zA0-q50Bbx=l>viMpz=<8ad64TJojq*UmUcW(7YM~<0u`Bd9HB8=70y4okrAKx$_`J?lctfi_NH}>_~LsBI@Q(BK_k6)%_UOO=OtaL2)L-r=ZBj|@3@b*P*TMLovCNK zE<>61>F$M70^`SJouG}|`SJ1v*Ap9bD;*Y!EsDDGK-DpJ0aRbhIvIq@}`e&)?5B@Y4Zk zhdCR(RRX#h*dG218%R7g;JEH0_ya4KX1OwM-wIxJKGeYhGq(J3n2W2t6O>Lftbu+$ z+9A?vWLjuoY;(<=7}KB%dFnAed4RVAtO2+<2C8u{p3>lz%~}wd-1}DY-F)t;^odC|`)<~Kjjc(M#g3&@;fJwm zwzlvp2ISYk8l(3tg<@wp_bNZkcS%~zm5PC$oD!CP3aSmLd?Jg4Ho3a#tYN-DLO?tYF#cIMevH#~qe z@?S9>n$$tlGUWoglU2H|R#`gDL_hFXcocx(k#G)SRXK-N;>ZGP)A(7a9eh`~nhdcW zI*x~)MG?+**lkUZdwk76{XwA{*3cw{E4`o?2C*D^LX!(dZ*%oo2+r(q#0`|_pe-1Io%fX_%BMzZ$0XTOfCR|cOj1QPyKLvI#RLd14&G3b{{o)MW?N(krN zx4L~L-~<&3^{&a>1IvDzb$d@qkM(XQ?ZkKj3b4)lhc5y^9<57*b& zKV2Y&mowb?CaCG@nTjdFqY+So^$Vj3&$l}#igGhM&(S+5&+z&;2+_L0&agH0QiQid zh)4xGFc0XLK}-mVXY``7Q_v||DxJ*|#up%t2374TVSsu@7)*OJJno0V#ZpjtFrVD; zuxkia?1}R6Z^fik*omM|!_dEC!As)DJutk4v~^7R`2et$1}((%s7E!t1%H)pD$TzP zyz~PTrJ^7v#%8ynVPp>x!^X^=^D0TT%JuB~K{DRC6`{0xnIG&!9+o+&vuDjYWcH1O z!{N}-f+P!^^8Kd&Aj3G05J3wvH;|NW&FmatCQ3D9AG| zu@-_!4|&%Ycm(*bJ-`30OnrXieu!z;0)Nkod8CEjD36tSiALn-^&+II`c*UU2wsEs z%DvE;S7rB^TfJ)M{?2u!qU?yyW)@$2lH8QRU+P^X3in`?KHwa=Zcb;uKE*qY%>J^# zeV$Ef%a^^GVdq+1(kBrU@~tF9fOoyq(ALOg4!#Ke;DLM$AT*&^(~(KE=pidsejEJr-c;v5J90K>UBtlIhF{#)wEJzZ%SuUnw7E@EiXaE9Gtt@RzM51*;_dQ++&| zOs^X;%2~@*PsO}XOcNMoc$^}3U3qpl!86l={eH%D^IDjIqK2FFA!q8OnUA*H3$N>$ zHPf<|$8?i+(uuhZejezF5i0Bj8x~KR4o#0A^C(Yf6?YB(%1a2EG z5{x32S$>wg2@{rXl8y{^%Llv_{%6icoAZ%V4_k@vz?yFwf6p22NtMl0seTpYs94!f zG2BWbo&+Gx<8@1Jh4RC+K6=)7s*Z9E$=JD$T73bg?RW`2jn-W*JaxDmgTLoEjG=si zOewc_oiro9P8QEgJCfZE6qlfL-&xIiRU&kzm<{S)8bdoqHm~n-k9POy^BEl!nWZ@O z9`r9}P%akc!Zfl;81{vR@3E#~Cejl|NE4_))nX8h{`*KM)H@g&m%;S)V>kw5Yg-?M z$R-D{j zK2sJ$j2X=@obs|)wmy^I%+akM^7^Q8)F`EA(Yi~z5zHZ5m7F*4X<0ItPn_ur8Fnq? zeMhI7BsdUg^HJtr#9?1ewbFC(kujwBBY3$Eg|`3uIrPJI-W!z+flcp5S!K!ccXlk@ z{~U!_;2(jyVwHEuX^2%K1P6F{C$E|dd=@J{yu4f%uN<4BzI}d9ohSO4G^w2Rrw7A2 zp-YM$52n6^g(~ln@ry{eNJk3COu4nc3El74Z`8V~&d|J&57#c5IhWc&3rpWTsyB;$ zIMo{VB@$Y9hN1f*??=#F`BmC(ZH@0%4@QRYiK_-1e?E@$sTp|JIZ<;V!VbR(|@Wzq+TVkl3r`F4sT_MGJS{k-nx*yr_o; zc7uJY4~}MTQu{W)Hf0J_PfSXHZ8lhZ^Fyg3KcnCNndlu%2gX(m=dyyP+xVs&?W2FU zI(~9BJViaII^KPmPi1>%T7wZtem$QoGq8S+_CZw!l3+g77eQQL1|M@_)VQ~kc@IT6^{E0U$L77wU ziSz10JJ^)?@_HOT&9QS(^@W67V%>8|ohp53OaDB1SZeT+rlSYPLBWhc9r0D_FWWVdPLOwP}>9E>8=NJ<95@95^ znA296w_t@hirQBYkYT2Q8K0lrE3@mBWEn^Ia#y%OvxDG^+Qhi2M7z2telcbCRRa3A zU6^&;<6(LCWdhpFDPul!z+l=IGgXW=No;#6h(UQwT~>wWys_x$~mh}0i9YG0S;j)xguYw`oY_hb2@TB$C6{%j>g zUzl;myy9?hq7=e*9M#7cPD6A=;`9fM6f#WXyR@`d{zI++QtXKshhydUH{vuby(xi2 zMkv&3ptdx>ffb%HGw!AM1D*dB)v&Wb2PBJPrbrqBjwl25-pFevqurh%ntsQ;_6jj*|Y1O+SnZ#E7EbMuN6J5EO|Dev(}Qvw8wKO zAo_+nISs*?>v%-OI+crGx0LCmOINsRyMW3^2Il4A7~(|l1%QZ{@ptlvJb2IgIG|_} z5)Z);?ZWnM7TNq3nvrb{A6+9ewjvFR;B!iO)VJnclT8nleX*y175) zh#}e&3kh$}W<7QdwRY27FG=GTmK{5r5}AY<6GxqsvcK8kmEtF*|wUWP2M z?|Hb_;Y!`bz>uzVmaZx~8%2h10d)1j1CrM)&ond~v_6>u&Eqyhfq&!YFO%l_9wv|= z49HYsZJvrk3zm|d2l^Yvg)rPN{1iviEFlHKW*8(X3$1eCj0z07q6kN>?Ps*&WAqgY z9x%m91JzwaTOnvF@dlZ*@y68FtOYR^K(T13;rLnU0`jAW0F6~WU4%K>3`_8^>Rmd9 z@?F48q|G0S1Ew{3AR$bJKx+ml7pn&oVgk1}&y#prtd}36Ug8t17yjFo@u9OyAfU~F zGA@(zQg7sVXE?2L;g-7XgXu<9dnLkt{WY6;;>LGazV_VUaNl)n{jAaJG=jm zy$;*tD3_|M8j&SPrE^{d{zWl6fG6e1dmc+ldNe$Laf>G0KRZ$ic_~;M>c15@$c(~O z6jp)5=qPMH@+{u!IFkx0yQA<=z%3Yu+&Ey5{HBy(P)?-_cp$&MY&*pfJ`biCjBkgt z%rL_8tRmC0{f$j|I}e0hq!joLp#GkiV_30IrH%tK1F>F5`dt>%=`yfZaKOprUh03w z%YyG_cC$~YT=}Mmpr*Q3K)W7gOd2PQTHB(uYEI4}=|l3kOdtEReY;H;iHF=Jvy2&f z@4Z|`%xCPocrT4y7s;=4-26VAt^5{4FOob7a&0l3Yc+|T6RE!ZNSJ8UP5(T4~Cb4PHaN}akQ3c zMeSqlA7UO0bONUG!oyo2=@{mKw`4y{^$~-#i$G~s%s6ihHF*fLqKP`Z+8|>Ct9)P^ z^$%ef1D=<6D1n3d;8({>y2poIBRf%KPJ~0_!Akp(%d9cb zxH6xb?DpO$dzOeR)|rkNBcG zsXA{cFQyq>#(26vEf1XMtMzg64L7vPeki@FiwF$xp?f~TIDqGN%38)IGYj?aEZ(nZ z_{-^$0;l)Nv7RlYEC0{G>;?3{{mA)=8a|q}H+i6g?fCeVtp(W&$hX2GB;bv>O2@wO zhc^qkZ$J!%bUmQeXAX=@`*tDx{Z-XmzKfE~?0}C2{^c5gTs9tZ8eV?xPq{jlVHD?? z`Oj>|yr~lS1jqQu@ALCr<0(FkZEl_TFBlX0R}I^Wv;l2gC?;rq;lv8JdHS2iNH@KX zvAluS4LOoOj6LiDWQOA?$Hh4yTUrJ+piO~n`5Wr9ek9~yG@BJYc*B2nWWi z>FS|&R%?r1w}@hbx`I^u-_c`SGz6llz}AuOeAF7+qTP^U{>DLbhK7Ogp#%&+4hCl5 zMqLIuv-5L;S3Jxg3?s6oKR9TpsU%dMxGASF?(&}>-*rfs2cN-++a%f|)2XQ{xG8uI z@X$(`sR6JUuJQlituZ3kJc7?WVzT#Pcng$nb<>|-2|pilDW%5V7r$G5Y33l6c&M-4xbHU+d9`<-`$|+ zdEfMLR914RS_kVWVy#9T>juIk9Sq|ODZnzNMD ziONo6Jned0Xw70TUc?WcRtad6w*0+Jx>I_Pad~b7>P+XHE@WG@M5(KYbodQcYg<^9 zPnX5~=^D{WE5G6C0b8J=!9$dQ4$n2@s*^$hN~zSt+;-m?TN#Pmf|UO+R~WONY@VJk zb&=6KCmaY9$JE6CVD|sm#Q&Gk;;d_oxrZ^kf%BaRH8zYZaAF4i-_AG*V2nG~g6g)M-Mx9UNp-Jd_%u#SILS zTj-@ny-ZJ8H_^MwlhiQE{vXEr-SO}-aXpJ){BP4=uhi7>0&-IX$M~^@y++a64Hh}l z(d~Dm392L)L1L@A^A*_s0|hZ~R+JARBtB!w0nP^bEvLYPgv#SCmJ&{;Fz(>pm`yoU znZxNIk2LjM2RZK2#^Lg z{9~bxWJiXz>6v!_TYT;jdZzpKnY(5Qj6hQG8QyQ%oRpkwt;4@V^jd6)j;^Ny?jaC0 zq?MI*3pm)2`+TLd9~;epOcu<+AgBZ@sNcLCvrcP_{MP+jE&>aZ^3US0Ky+Da&K#SP z_ytTc&b%e*J;-i^|IZjG)qWRB5@7>NIC_IU;Mto2{*L2GCo_Uv&J|#Wr>H<3@RBAN=uMZky77Wjl{sg1ANZ}JM@S+CrvXZAHRJx>+OVZod9 zZMgcU*^0YTEUo+L!2e97jJ7-r|JHr;{!D>f2rk)#?T%XAf6W%Q3W^TVz=63YS1dJ2 z6$q~x;@Eo+bGiE*#vu6!#>B{=h1 zuwYxMJ277W23JXZB$B!vR4*V?iklB!o4)!@eQkdkKRr_hY^P&`me)iW9*-?^9BIcU zMzHXVW%8CgT}5WRJdZ`(ZMb>6dax#>9zq=Vg`2 ziDQ#U&o~`4)%FXRqdN;sAAGXR9`Xv5Av#ax`w=!Qow4L;=Aj6LxmswU{W^32g$B3~ zWC?=@oKe@Nq2CK-16qEvI$Q_@5qLYs7!igczj-01&x7-2QyB{z7LOQSzkIh7#s36#$F#)PSdqFW? zcxYTl;U&;sDsY;H!*oz|yD2J~<(yYK7Pih|_(pM2lV$}#2%4w`h>l6~VXv(iDE2?*Fu?@Y^8**4M(BEfwh$CJ=6(PzspCuGr=z?^JR%beUHTE~0+|Ap z?;9?HxO&6p;%?YHp#+%-Z0o_@7p#Ne9D*Gc`4%`bvzA47F^+b+v7?ZKXAJQt-VV<0 zm98gd;Hto4ilKx_G%G6LnLcohE_Z#r(QSAEkY^f3srush;h2C>3?=!GfdjZ#t@ay$ zYW&bX!oyoJrS=@dUm)-QSJCgeGE8XN{zKaORGg*TK>VMNMb!6;K*#_a14wmbFpG)g zPJArRm{2`J=f+jlPNZyIbdI$B%_^VMnm$<&{-jTOQ`f51Y-xJ3YOu2am>2B#X+Nex zvJoa%bE)i*bcjE@hVVcWnKI+2QKi1V6alwnhY zF_BE_-hI!xNp`R%NSLxnN3xc##7uoxWb8E?3X$ZDUB9j}>EI;%i7W3ccJA2K`sjY$ zyh-Dl{$Ln})NV?#O3L_I-je@Cz$1nmrzr-iGewz3=qfP5Qy`s$o$8OR7RM2DDt$l@ zvZ_D2VFy?rAmD&#$g6b=#fq$%zmG2b8cg`D3sBi#Kx)^gT$xDUjL0enIt9$X0ri09 zxikHGL<{(FxSST09jw9Wh%z9eGEo|j87K-2BUF2x_@?`*iCwRv5giqdZ5DS62 z{9Psyzx&g?S?Szb+ZU*K8qMuiAKPi=2mT1g;>sD*zLY22yZbYe%x156BjjqNz>tr$ znzSdj99K;cAK`$)4U!-e`?QB9@R$4|0jF+V_`v)`fu0&`@xXg zmvN}VvA--Ry}cmYVmWS>3jqQSVBP@K8(Q;h`cMW;I_!OJ6jk zQ>YMYRAsBRZMD*4wg4UpxcQX7I�nuPka5{;F?7zUzR%IN=-6Y~*JoUQZ?RlZCgQ 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 KZJt>FE%Dz~tc^$j literal 0 HcmV?d00001 diff --git a/frontend-next/public/logos/logo_transparent.png b/frontend-next/public/logos/logo_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..9e28a01ae052111491660a4bf23ffd26b3a33707 GIT binary patch literal 19633 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 literal 0 HcmV?d00001 diff --git a/frontend-next/public/next.svg b/frontend-next/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/frontend-next/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend-next/public/vercel.svg b/frontend-next/public/vercel.svg deleted file mode 100644 index d2f8422..0000000 --- a/frontend-next/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend-next/src/app/api/login/route.js b/frontend-next/src/app/api/login/route.js new file mode 100644 index 0000000..8005225 --- /dev/null +++ b/frontend-next/src/app/api/login/route.js @@ -0,0 +1,121 @@ +// src/app/api/login/route.js +import { auth } from "firebase-admin"; +import { cookies, headers } from "next/headers"; +import { NextResponse } from "next/server"; +import { customInitApp } from "../../../lib/firebase-admin"; +import { signInWithEmailAndPassword } from "firebase/auth"; +import { auth as authConfig } from "../../../lib/firebase-config"; + +// Init the Firebase SDK every time the server is called +customInitApp(); + +async function handleBearerToken(authorization) { + if (authorization?.startsWith("Bearer ")) { + const idToken = authorization.split("Bearer ")[1]; + const decodedToken = await auth().verifyIdToken(idToken); + + if (decodedToken) { + const expiresIn = 5 * 60 * 1000; + const sessionCookie = await auth().createSessionCookie(idToken, { + expiresIn, + }); + const options = { + name: "session", + value: sessionCookie, + maxAge: expiresIn, + httpOnly: true, + secure: true, + }; + + cookies().set(options); + return NextResponse.json({}, { status: 200 }); + } + } +} + +async function handleEmailAndPassword(email, password) { + try { + const userCredential = await signInWithEmailAndPassword( + authConfig, + email, + password + ); + + const user = userCredential.user; + const authorization = user.accessToken; + + if (authorization) { + const idToken = authorization; + const decodedToken = await auth().verifyIdToken(idToken); + + if (decodedToken) { + const expiresIn = 5 * 60 * 1000; + const sessionCookie = await auth().createSessionCookie(idToken, { + expiresIn, + }); + const options = { + name: "session", + value: sessionCookie, + maxAge: expiresIn, + httpOnly: true, + secure: true, + }; + + cookies().set(options); + return NextResponse.json({ options }, { status: 200 }); + } + } + } catch (error) { + console.error("Authentication error:", error); + + let errorMessage = "Authentication failed"; + + // Check Firebase authentication error codes and handle them accordingly + if (error.code === "auth/wrong-password") { + errorMessage = "Wrong password"; + } else if (error.code === "auth/user-not-found") { + errorMessage = "User not found"; + } else if (error.code === "auth/invalid-email") { + errorMessage = "Invalid email address"; + } + + return NextResponse.json({ error: errorMessage }, { status: 401 }); + } +} + +export async function POST(request, response) { + try { + const { email, password } = await request?.json(); + + if (!email || !password) { + const authorization = headers().get("Authorization"); + return await handleBearerToken(authorization); + } else { + return await handleEmailAndPassword(email, password); + } + } catch (error) { + console.error(error); + return NextResponse.json( + { error: "Internal Server Error" }, + { status: 500 } + ); + } +} + +export async function GET(request) { + const session = cookies().get("session")?.value || ""; + + //Validate if the cookie exist in the request + if (!session) { + return NextResponse.json({ isLogged: false }, { status: 401 }); + } + + //Use Firebase Admin to validate the session cookie + const decodedClaims = await auth().verifySessionCookie(session, true); + + if (!decodedClaims) { + return NextResponse.json({ isLogged: false }, { status: 401 }); + } + + return NextResponse.json({ isLogged: true }, { status: 200 }); +} \ No newline at end of file diff --git a/frontend-next/src/app/api/register/route.js b/frontend-next/src/app/api/register/route.js new file mode 100644 index 0000000..12d3c65 --- /dev/null +++ b/frontend-next/src/app/api/register/route.js @@ -0,0 +1,66 @@ +// Import necessary functions +import { createUserWithEmailAndPassword } from "firebase/auth"; +import { auth } from "../../../lib/firebase-config"; +import { NextResponse } from "next/server"; + +// Function to register a new user using Firebase Authentication +export async function registerUser(email, password) { + try { + const userCredential = await createUserWithEmailAndPassword( + auth, + email, + password + ); + + const user = userCredential.user; + console.log("User registered:", user); + + // You can perform additional actions after successful registration, if needed. + + return { success: true, user }; + } catch (error) { + console.error("Error during registration:", error); + return { success: false, error: error.message }; + } +} + +// POST request handler +export async function POST(request, response) { + try { + // Extract email and password from the request body + const { email, password } = await request?.json(); + + console.log(email); + // Check if email and password are provided + if (!email || !password) { + return NextResponse.json( + { error: "Email and password are required." }, + { status: 400 } + ); + } + + // Register the user + const registrationResult = await registerUser(email, password); + + if (registrationResult.success) { + // Registration successful + return NextResponse.json({ + message: "Registration successful.", + user: registrationResult.user, + }); + } else { + // Registration failed, return an error response + return NextResponse.json( + { error: registrationResult.error }, + { status: 500 } + ); + } + } catch (error) { + // Handle unexpected errors + console.error("Error during registration:", error); + return NextResponse.json( + { error: "Internal Server Error" }, + { status: 500 } + ); + } +} \ No newline at end of file diff --git a/frontend-next/src/app/favicon.ico b/frontend-next/src/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..af40c30e08ec5139fb84cdfb4631b46fb1b76a3a 100644 GIT binary patch literal 15406 zcmeHOYitx%6dnZyc_=<0;&hD0C5tLXXT0pTBMFflGv3_TF@9ymGJa?y$AD!f8X7Ai{ z&v(u}_uO;O+~v57xE|bq0UYiH+?<{qHw_`4>Yn|C}oGpF*Z{DO$*dIz4*m zZCavTYpo;}s6KuRobdrPDq~WPUQ_P=VzilvY;I?=h73>lH6%b=SMd&lI4DDCD2IFLyN1P&u(Le8CGC z`yk5kx~jq}-09i6m(VWHUEuu__$KFMSQekOrp&)ZP!dOgFWG#OcjEbQ9p2^7!MF!n z6EFt@I=mSc_+S2A=w@L^^3K;5TB8~(CiODz-TF-}{EG>1hQZ{{A6FG&NnKsxCDz=s zTR^Ti^5dTzv#-j_M_!uE!Mq0R&nGVN$NDNRGUt~4)=mD zjMC^tKUnkmY$=Uv^!QWkp{1a8AM5bzSf4bpNOIiMY!k8DY%Q(TvmSrwaT=|gVToTv zF-k+_sJ_%s#P1mjUDTWELlG8O@zlNt{|y=a{Yrk9;xN>+c<3*T$4lkq(|goxDd`V< zkqnxY4is^gwtuTYr$!@AX+ce8T65vwPM`_W&FJch-COPxwoZ6;JlQ zyqxPHm2o|_1-^I~bh1t(drG#Lf997FJ?7dgI{cfhd;sJfh%sFX9flKe&sp4)#h7o> z-da^jydh9oJP2*m;xFjTbpC^<7c{@?;LeaS$xFW;Yc%N~6q~2tk6)%eIO89Z#5tYGAM<&xoBT1)HrdfTYZH___qoX*cE6VOZRbut z2mIUI!hpH{m>s^_Ht;=Py2SrbW25t!6Js_U{IQN@+OnhHXW_>l)XL@L8G0)Q|E3%< zoP-XiJK?9-R#nGcj(zt$^z{vJ97G|V7?ozc!`^^j+Ew@BdNOv`bqx*B#uX`AZYD~1 zo&-whzPhvqV!4o=6Rr-+d8N1gh zrT2Gb{1m$*pS%QXQVVdiJ!cYsNESEen%`+}xd|8c77Kv=lvd{%&nLo)II}Ct5ZvVz z5E~uIz^l=H+>T;xe8OVNM<#N9y5Ex8Ti@FLDIWpcwN}_Q@6X_w;;#tJ6UekpuTZ=b ztmcc&_On_Xxjsi~==(=%p1S-@^Joubd1{X&(q~auuPE|Uu=$NHW6rWW^xulIk@8V) z3P3q7^!t4W;Ey7|a}K!@AMDAsaR^F9^vxjGy@Z~gE$bo*zt$}u)*1L=uSc=AJIW6m z*<7dKhaDlm{8}_>p6fEgtgW|!pVl+7uO|4&KVZXu;yEp@z;8>N$!dc<++M#2CphxE zEb${(OgYC`-jVX2k~jr1#%xs<--aw9tl9r%VY4LG7ca zat+RxAfA{3{69LCfzB~dj$5y9Cv{f%;qO*ae-u+ks*1*_JNV%Zf#N~?G~dW@Zsl6& z@*|7~`FNYQgztUGBddo?gbVb?gv!f)QXwXhH22VROXk})-C@LoI$U$`b%UUV6?p?D5-i?!`y zed&+M&u*;66uYUulG3oxGgVvYyb1fJ9ABe(pAi)Rux| zcSO^k*MXSb@NWXUna^y4?R?1mA$?Crd&;>P&4mkSzb+Vzk6W(zN%s{ihxO7ci0`k7 zor{8QEwD3;XW&=o5|-Fr2}@7F%z zKw3XGaOBz^V|i9;{EWaQU5LZV6ufwj7Gm{%>m7(T(RUr2b_oL3>0Bfr4kSN zSdVjyvnbXu!f8|=QcCZI4eFg|%G*v%WIIOwlQ7X46!@Y(M(16Pa8o_)`LRAOgAHPx zH1xyn%K;n5m`^mrX6GHPC0NT{{MKz#2QJ~Kv(s3|cXz1nX`Efc@89Ve8ktN1a%PiOI6 zJiC^RC(hu1K3}u_d#)JG=wi92T_v|6SGF8_YQ(yH&V}*7{u1Yt6=5Nrr7`30);sv5 z-rzYzRm4Y;D_f2EwgYk;f}cHNr=V>UJuGx%dq3iq9NqnNYoJ>L-5PLP G1OEeWA_SKJ literal 25931 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 LrJugUA?W`A8`#=m diff --git a/frontend-next/src/app/globals.css b/frontend-next/src/app/globals.css index 43ce32a..1679e2d 100644 --- a/frontend-next/src/app/globals.css +++ b/frontend-next/src/app/globals.css @@ -2,17 +2,20 @@ @tailwind components; @tailwind utilities; -main { +body { background-color: aliceblue; text-align: center; text-wrap:pretty; } button { - background-color: rgb(205, 205, 205); + background: #dee0e0; border-color: black; border: 5px; border-radius: 5px; + padding: 5px; + margin: 5px; + filter: drop-shadow(0 25px 25px rgb(0 0 0 / 0.15)); } button:hover { @@ -23,5 +26,6 @@ input { border: 1px solid black; border-radius: 4px; padding: 10px 10px; + margin: 5px; } diff --git a/frontend-next/src/app/layout.js b/frontend-next/src/app/layout.js index 16679e4..a4b31a2 100644 --- a/frontend-next/src/app/layout.js +++ b/frontend-next/src/app/layout.js @@ -11,7 +11,9 @@ export const metadata = { export default function RootLayout({ children }) { return ( - {children} + + {children} + ); } diff --git a/frontend-next/src/app/login/layout.js b/frontend-next/src/app/login/layout.js new file mode 100644 index 0000000..fd19b66 --- /dev/null +++ b/frontend-next/src/app/login/layout.js @@ -0,0 +1,19 @@ +import { Inter } from "next/font/google"; +import "../globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "ChatMaps: Login", + description: "ChatMaps: Social Media for College Students", +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/frontend-next/src/app/login/page.js b/frontend-next/src/app/login/page.js new file mode 100644 index 0000000..443cb0a --- /dev/null +++ b/frontend-next/src/app/login/page.js @@ -0,0 +1,57 @@ +"use client"; +import {createUserWithEmailAndPassword, getRedirectResult,signInWithRedirect,} from "firebase/auth"; +import { useEffect, useState } from "react"; +import { auth, provider } from "../../lib/firebase-config"; +import { useForm } from "react-hook-form"; +import { useRouter } from "next/navigation"; +import "../globals.css" + +function Home() { + const router = useRouter(); + const { register, handleSubmit } = useForm(); + const Login = async (data) => { + try { + const res = await fetch("/api/login", { + method: "POST", + body: JSON.stringify(data ? data : {}), + }); + + if (res.ok) { + const result = await res.json(); + console.log("Logged In"); + router.push("/room/success"); + } else { + const errorResponse = await res.json(); + console.error(errorResponse); + } + } catch (error) { + console.error("Error during login:", error); + } + }; + const onSubmit = (data) => { + //setError(""); // Clear the error state on successful registration + Login(data); + }; + return ( +
+
+
+ + + Chat with friends! + +
+

Login

+
+
+
+ +
+
+
+
+
+ ) +} + +export default Home; \ No newline at end of file diff --git a/frontend-next/src/app/page.js b/frontend-next/src/app/page.js index 7c2ca05..7b862e0 100644 --- a/frontend-next/src/app/page.js +++ b/frontend-next/src/app/page.js @@ -1,27 +1,23 @@ -export default function Home() { - return ( -
-

Welcome to ChatMaps.

- - -
- - - -
- - -
- - - -
- - -
- ); +function Home() { + return ( +
+
+ +
+
+
+ + + Chat with friends! + +
+ + +
+
+
+
+ ) } + +export default Home; \ No newline at end of file diff --git a/frontend-next/src/app/register/layout.js b/frontend-next/src/app/register/layout.js new file mode 100644 index 0000000..c31cd65 --- /dev/null +++ b/frontend-next/src/app/register/layout.js @@ -0,0 +1,19 @@ +import { Inter } from "next/font/google"; +import "../globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "ChatMaps: Register", + description: "ChatMaps: Social Media for College Students", +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/frontend-next/src/app/register/page.js b/frontend-next/src/app/register/page.js new file mode 100644 index 0000000..d7184d7 --- /dev/null +++ b/frontend-next/src/app/register/page.js @@ -0,0 +1,56 @@ +"use client"; +import { useRouter } from "next/navigation"; +import { useForm } from "react-hook-form"; +import "../globals.css" + +function Home() { + const {register, handleSubmit } = useForm() + const router = useRouter(); + const onSubmit = (data) => { + //setError(""); // Clear the error state on successful registration + RegisterWithEmail(data); + }; + + const RegisterWithEmail = async (data) => { + try { + const res = await fetch("/api/register", { + method: "POST", + body: JSON.stringify(data ? data : {}), + }); + + if (res.ok) { + const result = await res.json(); + console.log("Created"); + router.push("/login"); + } else { + const errorResponse = await res.json(); + console.error(errorResponse); + } + } catch (error) { + console.error("Error during registration:", error); + //setError("An unexpected error occurred. Please try again."); // Set the error state + } + }; + return ( +
+
+
+ + + Chat with friends! + +
+

Register

+
+
+
+ +
+
+
+
+
+ ) +} + +export default Home; \ No newline at end of file diff --git a/frontend-next/src/app/room/[stub]/layout.js b/frontend-next/src/app/room/[stub]/layout.js new file mode 100644 index 0000000..97b6b71 --- /dev/null +++ b/frontend-next/src/app/room/[stub]/layout.js @@ -0,0 +1,26 @@ +import { Inter } from "next/font/google"; +import "../../globals.css"; +import { Header, Sidebar } from "./shared" + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "ChatMaps", + description: "ChatMaps: Social Media for College Students", +}; + +export default function RootLayout({ children }) { + return ( + + +
+
+
+ {children} +
+ +
+ + + ); +} diff --git a/frontend-next/src/app/room/[stub]/page.js b/frontend-next/src/app/room/[stub]/page.js new file mode 100644 index 0000000..f9046e2 --- /dev/null +++ b/frontend-next/src/app/room/[stub]/page.js @@ -0,0 +1,28 @@ +function MessagesDisplayBox() { + return ( +
+ Messages Stream in Here +
+ ) +} + +function MessageSendBox() { + return ( +
+ Message Sender +
+ ) +} + +function Home() { + return ( +
+ + +
+ ) +} + + + +export default Home; \ No newline at end of file diff --git a/frontend-next/src/app/room/[stub]/shared.js b/frontend-next/src/app/room/[stub]/shared.js new file mode 100644 index 0000000..91d7dd3 --- /dev/null +++ b/frontend-next/src/app/room/[stub]/shared.js @@ -0,0 +1,18 @@ +export function Header() { + return ( +
+ +
+ ) +} + +export function Sidebar() { + return ( +
+
+ Sidebar +
+
+ + ) + } diff --git a/frontend-next/src/lib/firebase-admin.js b/frontend-next/src/lib/firebase-admin.js new file mode 100644 index 0000000..781c331 --- /dev/null +++ b/frontend-next/src/lib/firebase-admin.js @@ -0,0 +1,11 @@ +// lib/firebase-admin-config.js +import { initializeApp, getApps, cert } from "firebase-admin/app"; +import serviceAccount from "../../../firebase-admin-key" + +export function customInitApp() { + if (getApps().length <= 0) { + initializeApp({ + credential: cert(serviceAccount) + }); + } +} \ No newline at end of file diff --git a/frontend-next/src/lib/firebase-config.js b/frontend-next/src/lib/firebase-config.js new file mode 100644 index 0000000..6f053be --- /dev/null +++ b/frontend-next/src/lib/firebase-config.js @@ -0,0 +1,19 @@ +// lib/firebase-config.js +import { initializeApp } from "firebase/app"; +import { getApps, getApp } from "firebase/app"; +import { OAuthProvider, getAuth } from "firebase/auth"; +import { GoogleAuthProvider } from "firebase/auth"; +import firebaseConfigFile from "../../../firebase-config" + +const firebaseConfig = firebaseConfigFile; + +const app = getApps().length > 0 ? getApp() : initializeApp(firebaseConfig); +const auth = getAuth(app); +const provider = new GoogleAuthProvider(); + +// Prevent automatic account selection +provider.setCustomParameters({ + prompt: "select_account", +}); + +export { auth, provider }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..150cafe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1609 @@ +{ + "name": "ChatMaps", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "firebase-admin": "^12.0.0", + "react-hook-form": "^7.50.1" + } + }, + "node_modules/@fastify/busboy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", + "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", + "dependencies": { + "text-decoding": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/component": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", + "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", + "dependencies": { + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", + "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", + "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/database": "1.0.3", + "@firebase/database-types": "1.0.1", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", + "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.4" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", + "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.3.0.tgz", + "integrity": "sha512-2IftQLAbCuVp0nTd3neeu+d3OYIegJpV/V9R4USQj51LzJcXPe8h8jZ7j3+svSNhJVGy6JsN0T1QqlJdMDhTwg==", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.0.4", + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", + "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.7.0.tgz", + "integrity": "sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==", + "optional": true, + "dependencies": { + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "compressible": "^2.0.12", + "duplexify": "^4.0.0", + "ent": "^2.2.0", + "fast-xml-parser": "^4.3.0", + "gaxios": "^6.0.2", + "google-auth-library": "^9.0.0", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "optional": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "optional": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "optional": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "optional": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "optional": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "optional": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "optional": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "optional": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "optional": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "optional": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", + "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "optional": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, + "node_modules/@types/node": { + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "optional": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "optional": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "optional": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "optional": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "optional": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "optional": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "optional": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "optional": true + }, + "node_modules/fast-xml-parser": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", + "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/firebase-admin": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", + "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", + "dependencies": { + "@fastify/busboy": "^1.2.1", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^20.10.3", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.0.1", + "node-forge": "^1.3.1", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.1.0", + "@google-cloud/storage": "^7.7.0" + } + }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "optional": true + }, + "node_modules/gaxios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.2.0.tgz", + "integrity": "sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "optional": true, + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "optional": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/google-auth-library": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.6.3.tgz", + "integrity": "sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==", + "optional": true, + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.1.tgz", + "integrity": "sha512-qpSfslpwqToIgQ+Tf3MjWIDjYK4UFIZ0uz6nLtttlW9N1NQA4PhGf9tlGo6KDYJ4rgL2w4CjXVd0z5yeNpN/Iw==", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "~1.10.0", + "@grpc/proto-loader": "^0.7.0", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.6.1", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.0", + "protobufjs": "7.2.6", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "optional": true, + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "optional": true + }, + "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-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jose": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", + "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "optional": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", + "dependencies": { + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", + "debug": "^4.3.4", + "jose": "^4.14.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "optional": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "optional": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", + "dependencies": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "node_modules/lru-memoizer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", + "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "optional": 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", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "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-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "optional": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proto3-json-serializer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", + "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", + "optional": true, + "dependencies": { + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.50.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.1.tgz", + "integrity": "sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "optional": true, + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "optional": true + }, + "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==", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "optional": true + }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "optional": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "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==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/text-decoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", + "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" + }, + "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/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "optional": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "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/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "optional": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "optional": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f5d1206 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "firebase-admin": "^12.0.0", + "react-hook-form": "^7.50.1" + } +} -- 2.52.0 From c528c6bacf05b9da591dc008fd50b269f296779b Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 07:50:37 +0000 Subject: [PATCH 02/11] Refactor / Commentate --- frontend-next/src/app/api/login/route.js | 122 +++++--------------- frontend-next/src/app/api/register/route.js | 46 ++------ frontend-next/src/app/api/signout/route.js | 11 ++ frontend-next/src/app/login/page.js | 40 +++---- frontend-next/src/app/page.js | 7 +- frontend-next/src/app/register/page.js | 44 +++---- frontend-next/src/lib/firebase-config.js | 21 +--- frontend-next/src/middleware.js | 26 +++++ 8 files changed, 119 insertions(+), 198 deletions(-) create mode 100644 frontend-next/src/app/api/signout/route.js create mode 100644 frontend-next/src/middleware.js diff --git a/frontend-next/src/app/api/login/route.js b/frontend-next/src/app/api/login/route.js index 8005225..55d9967 100644 --- a/frontend-next/src/app/api/login/route.js +++ b/frontend-next/src/app/api/login/route.js @@ -1,121 +1,63 @@ -// src/app/api/login/route.js -import { auth } from "firebase-admin"; import { cookies, headers } from "next/headers"; import { NextResponse } from "next/server"; -import { customInitApp } from "../../../lib/firebase-admin"; +// Firebase Imports +import { auth } from "firebase-admin"; import { signInWithEmailAndPassword } from "firebase/auth"; +// Lib Imports import { auth as authConfig } from "../../../lib/firebase-config"; +import { customInitApp } from "../../../lib/firebase-admin"; -// Init the Firebase SDK every time the server is called +// Needs to "init" on each call to the API customInitApp(); -async function handleBearerToken(authorization) { - if (authorization?.startsWith("Bearer ")) { - const idToken = authorization.split("Bearer ")[1]; - const decodedToken = await auth().verifyIdToken(idToken); - - if (decodedToken) { - const expiresIn = 5 * 60 * 1000; - const sessionCookie = await auth().createSessionCookie(idToken, { - expiresIn, - }); - const options = { - name: "session", - value: sessionCookie, - maxAge: expiresIn, - httpOnly: true, - secure: true, - }; - - cookies().set(options); - return NextResponse.json({}, { status: 200 }); - } - } -} - +// Login with Email/Password async function handleEmailAndPassword(email, password) { try { - const userCredential = await signInWithEmailAndPassword( - authConfig, - email, - password - ); - - const user = userCredential.user; - const authorization = user.accessToken; - - if (authorization) { - const idToken = authorization; - const decodedToken = await auth().verifyIdToken(idToken); - - if (decodedToken) { - const expiresIn = 5 * 60 * 1000; - const sessionCookie = await auth().createSessionCookie(idToken, { - expiresIn, - }); - const options = { + var userCredential = await signInWithEmailAndPassword(authConfig,email,password); + if (userCredential.user.accessToken) { + const token = await auth().verifyIdToken(userCredential.user.accessToken); + if (token) { + var expiresIn = 300000 + var sessionCookie = await auth().createSessionCookie(userCredential.user.accessToken, {expiresIn,}); + var options = { name: "session", value: sessionCookie, - maxAge: expiresIn, + maxAge: expiresIn, // 5 mins httpOnly: true, secure: true, }; - cookies().set(options); return NextResponse.json({ options }, { status: 200 }); } } } catch (error) { - console.error("Authentication error:", error); - - let errorMessage = "Authentication failed"; - - // Check Firebase authentication error codes and handle them accordingly - if (error.code === "auth/wrong-password") { - errorMessage = "Wrong password"; - } else if (error.code === "auth/user-not-found") { - errorMessage = "User not found"; - } else if (error.code === "auth/invalid-email") { - errorMessage = "Invalid email address"; - } - - return NextResponse.json({ error: errorMessage }, { status: 401 }); + return NextResponse.json({ error: error.code }, { status: 401 }); } } -export async function POST(request, response) { +// Handles POST requests (login requests) +export async function POST(req, res) { try { - const { email, password } = await request?.json(); - - if (!email || !password) { - const authorization = headers().get("Authorization"); - return await handleBearerToken(authorization); - } else { - return await handleEmailAndPassword(email, password); - } + var { email, password } = await req?.json() + return await handleEmailAndPassword(email, password); // need session token } catch (error) { - console.error(error); - return NextResponse.json( - { error: "Internal Server Error" }, - { status: 500 } - ); + return NextResponse.json({ error: "Internal Server Error" },{ status: 500 }); } } -export async function GET(request) { - const session = cookies().get("session")?.value || ""; - +// Handles GET requests (is session still valid requests) +export async function GET(req) { + var session = cookies().get("session")?.value || ""; //Validate if the cookie exist in the request if (!session) { return NextResponse.json({ isLogged: false }, { status: 401 }); - } - - //Use Firebase Admin to validate the session cookie - const decodedClaims = await auth().verifySessionCookie(session, true); - - if (!decodedClaims) { - return NextResponse.json({ isLogged: false }, { status: 401 }); - } - - return NextResponse.json({ isLogged: true }, { status: 200 }); + } else { + // Validate session cookie + var validation = await auth().verifySessionCookie(session, true); + if (!validation) { + return NextResponse.json({ isLogged: false }, { status: 401 }); + } else { + return NextResponse.json({ isLogged: true }, { status: 200 }); + } + } } \ No newline at end of file diff --git a/frontend-next/src/app/api/register/route.js b/frontend-next/src/app/api/register/route.js index 12d3c65..0dba943 100644 --- a/frontend-next/src/app/api/register/route.js +++ b/frontend-next/src/app/api/register/route.js @@ -6,31 +6,19 @@ import { NextResponse } from "next/server"; // Function to register a new user using Firebase Authentication export async function registerUser(email, password) { try { - const userCredential = await createUserWithEmailAndPassword( - auth, - email, - password - ); - - const user = userCredential.user; - console.log("User registered:", user); - + var userCredential = await createUserWithEmailAndPassword(auth,email,password); // You can perform additional actions after successful registration, if needed. - - return { success: true, user }; + return { success: true, userCredential }; } catch (error) { - console.error("Error during registration:", error); return { success: false, error: error.message }; } } // POST request handler -export async function POST(request, response) { +export async function POST(req, res) { try { // Extract email and password from the request body - const { email, password } = await request?.json(); - - console.log(email); + var { email, password } = await req?.json(); // Check if email and password are provided if (!email || !password) { return NextResponse.json( @@ -40,27 +28,15 @@ export async function POST(request, response) { } // Register the user - const registrationResult = await registerUser(email, password); - - if (registrationResult.success) { - // Registration successful - return NextResponse.json({ - message: "Registration successful.", - user: registrationResult.user, - }); - } else { - // Registration failed, return an error response - return NextResponse.json( - { error: registrationResult.error }, - { status: 500 } - ); + try { + var userCredential = await createUserWithEmailAndPassword(auth,email,password); + return NextResponse.json({message: "Registration successful.",user: userCredential.user,}); + } catch { + return NextResponse.json({ error: registrationResult.error },{ status: 500 }); } + } catch (error) { // Handle unexpected errors - console.error("Error during registration:", error); - return NextResponse.json( - { error: "Internal Server Error" }, - { status: 500 } - ); + return NextResponse.json({ error: "Internal Server Error" },{ status: 500 }); } } \ No newline at end of file diff --git a/frontend-next/src/app/api/signout/route.js b/frontend-next/src/app/api/signout/route.js new file mode 100644 index 0000000..333092a --- /dev/null +++ b/frontend-next/src/app/api/signout/route.js @@ -0,0 +1,11 @@ +import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; + +export async function POST(req) { + cookies().set({ + name: "session", + value: "", + maxAge: -1, + }); + return NextResponse.json({}, { status: 200 }); +} \ No newline at end of file diff --git a/frontend-next/src/app/login/page.js b/frontend-next/src/app/login/page.js index 443cb0a..5844183 100644 --- a/frontend-next/src/app/login/page.js +++ b/frontend-next/src/app/login/page.js @@ -6,32 +6,20 @@ import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import "../globals.css" -function Home() { - const router = useRouter(); - const { register, handleSubmit } = useForm(); - const Login = async (data) => { - try { - const res = await fetch("/api/login", { - method: "POST", - body: JSON.stringify(data ? data : {}), - }); +function Login() { + var router = useRouter(); + var { register, handleSubmit } = useForm(); + async function Login(data) { + const res = await fetch("/api/login", { + method: "POST", + body: JSON.stringify(data ? data : {}), + }); - if (res.ok) { - const result = await res.json(); - console.log("Logged In"); - router.push("/room/success"); - } else { - const errorResponse = await res.json(); - console.error(errorResponse); - } - } catch (error) { - console.error("Error during login:", error); + if (res.ok) { + router.push("/room/success"); } - }; - const onSubmit = (data) => { - //setError(""); // Clear the error state on successful registration - Login(data); - }; + } + return (
@@ -42,7 +30,7 @@ function Home() {

Login

-
+

@@ -54,4 +42,4 @@ function Home() { ) } -export default Home; \ No newline at end of file +export default Login; \ No newline at end of file diff --git a/frontend-next/src/app/page.js b/frontend-next/src/app/page.js index 7b862e0..690a8ad 100644 --- a/frontend-next/src/app/page.js +++ b/frontend-next/src/app/page.js @@ -1,4 +1,5 @@ -function Home() { +async function Home() { + return (
@@ -11,8 +12,8 @@ function Home() { Chat with friends!
- - + +
diff --git a/frontend-next/src/app/register/page.js b/frontend-next/src/app/register/page.js index d7184d7..14e72e7 100644 --- a/frontend-next/src/app/register/page.js +++ b/frontend-next/src/app/register/page.js @@ -3,34 +3,20 @@ import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import "../globals.css" -function Home() { - const {register, handleSubmit } = useForm() - const router = useRouter(); - const onSubmit = (data) => { - //setError(""); // Clear the error state on successful registration - RegisterWithEmail(data); - }; - - const RegisterWithEmail = async (data) => { - try { - const res = await fetch("/api/register", { - method: "POST", - body: JSON.stringify(data ? data : {}), - }); - - if (res.ok) { - const result = await res.json(); - console.log("Created"); - router.push("/login"); - } else { - const errorResponse = await res.json(); - console.error(errorResponse); - } - } catch (error) { - console.error("Error during registration:", error); - //setError("An unexpected error occurred. Please try again."); // Set the error state +function Register() { + var {register, handleSubmit } = useForm() + var router = useRouter(); + + async function RegisterWithEmail(data) { + const res = await fetch("/api/register", { + method: "POST", + body: JSON.stringify(data ? data : {}), + }); + if (res.ok) { + router.push("/login"); } - }; + } + return (
@@ -41,7 +27,7 @@ function Home() {

Register

- +

@@ -53,4 +39,4 @@ function Home() { ) } -export default Home; \ No newline at end of file +export default Register; \ No newline at end of file diff --git a/frontend-next/src/lib/firebase-config.js b/frontend-next/src/lib/firebase-config.js index 6f053be..4a5abcf 100644 --- a/frontend-next/src/lib/firebase-config.js +++ b/frontend-next/src/lib/firebase-config.js @@ -1,19 +1,10 @@ -// lib/firebase-config.js -import { initializeApp } from "firebase/app"; -import { getApps, getApp } from "firebase/app"; -import { OAuthProvider, getAuth } from "firebase/auth"; -import { GoogleAuthProvider } from "firebase/auth"; +import { initializeApp, getApps, getApp } from "firebase/app"; +import { getAuth } from "firebase/auth"; import firebaseConfigFile from "../../../firebase-config" -const firebaseConfig = firebaseConfigFile; +var firebaseConfig = firebaseConfigFile; -const app = getApps().length > 0 ? getApp() : initializeApp(firebaseConfig); -const auth = getAuth(app); -const provider = new GoogleAuthProvider(); +var app = getApps().length > 0 ? getApp() : initializeApp(firebaseConfig); +var auth = getAuth(app); -// Prevent automatic account selection -provider.setCustomParameters({ - prompt: "select_account", -}); - -export { auth, provider }; \ No newline at end of file +export { auth }; \ No newline at end of file diff --git a/frontend-next/src/middleware.js b/frontend-next/src/middleware.js new file mode 100644 index 0000000..12d3e1e --- /dev/null +++ b/frontend-next/src/middleware.js @@ -0,0 +1,26 @@ +// src/middleware.js +import { NextResponse } from "next/server"; + +export async function middleware(req, res) { + const session = req.cookies.get("session"); + // Login if not logged in + if (!session) { + return NextResponse.redirect(new URL("/login", req.url)); + } + //Call the authentication endpoint + const responseAPI = await fetch("http://localhost:3000/api/login", { + headers: { + Cookie: `session=${session?.value}`, + }, + }); + // Login if unauthorized + if (responseAPI.status !== 200) { + return NextResponse.redirect(new URL("/login", req.url)); + } + return NextResponse.next(); +} + +//Add your protected routes +export const config = { + matcher: ["/room/:path*"], +}; \ No newline at end of file -- 2.52.0 From 7420cc63fb28767efa299cf92f15f3422d1e9635 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 07:59:18 +0000 Subject: [PATCH 03/11] Cleanup/condense package.json files --- frontend-next/package-lock.json | 1030 +++++++++++++++++++- frontend-next/package.json | 4 +- package-lock.json | 1609 ------------------------------- package.json | 6 - 4 files changed, 1017 insertions(+), 1632 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/frontend-next/package-lock.json b/frontend-next/package-lock.json index dbcba5c..3791b85 100644 --- a/frontend-next/package-lock.json +++ b/frontend-next/package-lock.json @@ -9,9 +9,11 @@ "version": "0.1.0", "dependencies": { "firebase": "^10.8.0", + "firebase-admin": "^12.0.0", "next": "^14.1.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-hook-form": "^7.50.1" }, "devDependencies": { "autoprefixer": "^10.0.1", @@ -603,6 +605,89 @@ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" }, + "node_modules/@google-cloud/firestore": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.3.0.tgz", + "integrity": "sha512-2IftQLAbCuVp0nTd3neeu+d3OYIegJpV/V9R4USQj51LzJcXPe8h8jZ7j3+svSNhJVGy6JsN0T1QqlJdMDhTwg==", + "optional": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.0.4", + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", + "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.7.0.tgz", + "integrity": "sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==", + "optional": true, + "dependencies": { + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "compressible": "^2.0.12", + "duplexify": "^4.0.0", + "ent": "^2.2.0", + "fast-xml-parser": "^4.3.0", + "gaxios": "^6.0.2", + "google-auth-library": "^9.0.0", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.9.14", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", @@ -1019,12 +1104,90 @@ "tslib": "^2.4.0" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "optional": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", + "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "optional": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "node_modules/@types/node": { "version": "20.11.19", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", @@ -1033,6 +1196,53 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, + "node_modules/@types/request": { + "version": "2.48.12", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", + "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", + "optional": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "optional": true + }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -1166,6 +1376,18 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -1187,6 +1409,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "optional": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1418,12 +1652,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", "dev": true }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "optional": true, + "dependencies": { + "retry": "0.13.1" + } + }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", @@ -1433,6 +1685,12 @@ "has-symbols": "^1.0.3" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "optional": true + }, "node_modules/autoprefixer": { "version": "10.4.17", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", @@ -1506,6 +1764,35 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -1569,6 +1856,11 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1756,6 +2048,18 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1765,6 +2069,18 @@ "node": ">= 6" } }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "optional": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1807,7 +2123,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1860,6 +2175,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1905,12 +2229,32 @@ "node": ">=6.0.0" } }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.670", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.670.tgz", @@ -1923,6 +2267,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", @@ -1936,6 +2289,12 @@ "node": ">=10.13.0" } }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "optional": true + }, "node_modules/es-abstract": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", @@ -2514,11 +2873,26 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "devOptional": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -2560,6 +2934,28 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-xml-parser": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", + "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -2653,6 +3049,39 @@ "@firebase/util": "1.9.4" } }, + "node_modules/firebase-admin": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", + "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", + "dependencies": { + "@fastify/busboy": "^1.2.1", + "@firebase/database-compat": "^1.0.2", + "@firebase/database-types": "^1.0.0", + "@types/node": "^20.10.3", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.0.1", + "node-forge": "^1.3.1", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.1.0", + "@google-cloud/storage": "^7.7.0" + } + }, + "node_modules/firebase-admin/node_modules/@fastify/busboy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", + "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", + "dependencies": { + "text-decoding": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -2698,6 +3127,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -2758,6 +3201,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "optional": true + }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -2767,6 +3216,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gaxios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.2.0.tgz", + "integrity": "sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "optional": true, + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2931,6 +3408,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-auth-library": { + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.6.3.tgz", + "integrity": "sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==", + "optional": true, + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.1.tgz", + "integrity": "sha512-qpSfslpwqToIgQ+Tf3MjWIDjYK4UFIZ0uz6nLtttlW9N1NQA4PhGf9tlGo6KDYJ4rgL2w4CjXVd0z5yeNpN/Iw==", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "~1.10.0", + "@grpc/proto-loader": "^0.7.0", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.6.1", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.0", + "protobufjs": "7.2.6", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax/node_modules/@grpc/grpc-js": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -2954,6 +3484,19 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "optional": true, + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3040,6 +3583,45 @@ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "optional": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -3093,7 +3675,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "devOptional": true }, "node_modules/internal-slot": { "version": "1.0.7", @@ -3366,6 +3948,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -3497,6 +4091,14 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", + "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3514,6 +4116,15 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "optional": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -3544,6 +4155,46 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -3559,6 +4210,43 @@ "node": ">=4.0" } }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", + "dependencies": { + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", + "debug": "^4.3.4", + "jose": "^4.14.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3608,6 +4296,11 @@ "node": ">=10" } }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3634,12 +4327,52 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -3665,6 +4398,29 @@ "node": "14 || >=16.14" } }, + "node_modules/lru-memoizer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", + "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" + } + }, + "node_modules/lru-memoizer/node_modules/lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", + "dependencies": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "node_modules/lru-memoizer/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3687,6 +4443,39 @@ "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==", + "optional": 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", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3720,8 +4509,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -3829,6 +4617,34 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "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-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -3866,7 +4682,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 6" } @@ -3985,7 +4801,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -4011,7 +4827,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "devOptional": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4311,6 +5127,18 @@ "react-is": "^16.13.1" } }, + "node_modules/proto3-json-serializer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", + "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", + "optional": true, + "dependencies": { + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/protobufjs": { "version": "7.2.6", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", @@ -4334,6 +5162,11 @@ "node": ">=12.0.0" } }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4386,6 +5219,21 @@ "react": "^18.2.0" } }, + "node_modules/react-hook-form": { + "version": "7.50.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.1.tgz", + "integrity": "sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -4401,6 +5249,20 @@ "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", @@ -4501,6 +5363,29 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "optional": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "optional": true, + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -4635,7 +5520,6 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -4650,7 +5534,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -4757,6 +5640,21 @@ "node": ">=0.10.0" } }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "optional": true + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -4765,6 +5663,15 @@ "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": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -4940,6 +5847,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "optional": true + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -5054,6 +5973,52 @@ "node": ">=6" } }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "optional": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "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==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/text-decoding": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", + "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5093,6 +6058,12 @@ "node": ">=8.0" } }, + "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/ts-api-utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", @@ -5305,7 +6276,25 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "devOptional": true + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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/websocket-driver": { "version": "0.7.4", @@ -5328,6 +6317,16 @@ "node": ">=0.8.0" } }, + "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/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5517,7 +6516,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "devOptional": true }, "node_modules/y18n": { "version": "5.0.8", @@ -5530,8 +6529,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "2.3.4", @@ -5589,7 +6587,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" }, diff --git a/frontend-next/package.json b/frontend-next/package.json index c4dfa5c..347a17b 100644 --- a/frontend-next/package.json +++ b/frontend-next/package.json @@ -12,7 +12,9 @@ "firebase": "^10.8.0", "next": "^14.1.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "firebase-admin": "^12.0.0", + "react-hook-form": "^7.50.1" }, "devDependencies": { "autoprefixer": "^10.0.1", diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 150cafe..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1609 +0,0 @@ -{ - "name": "ChatMaps", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "firebase-admin": "^12.0.0", - "react-hook-form": "^7.50.1" - } - }, - "node_modules/@fastify/busboy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", - "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", - "dependencies": { - "text-decoding": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" - }, - "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" - }, - "node_modules/@firebase/component": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", - "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", - "dependencies": { - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", - "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.5", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", - "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", - "dependencies": { - "@firebase/component": "0.6.5", - "@firebase/database": "1.0.3", - "@firebase/database-types": "1.0.1", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", - "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.4" - } - }, - "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/util": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", - "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.3.0.tgz", - "integrity": "sha512-2IftQLAbCuVp0nTd3neeu+d3OYIegJpV/V9R4USQj51LzJcXPe8h8jZ7j3+svSNhJVGy6JsN0T1QqlJdMDhTwg==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.0.4", - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.0.tgz", - "integrity": "sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.7.0.tgz", - "integrity": "sha512-EMCEY+6JiIkx7Dt8NXVGGjy1vRdSGdHkoqZoqjJw7cEBkT7ZkX0c7puedfn1MamnzW5SX4xoa2jVq5u7OWBmkQ==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "compressible": "^2.0.12", - "duplexify": "^4.0.0", - "ent": "^2.2.0", - "fast-xml-parser": "^4.3.0", - "gaxios": "^6.0.2", - "google-auth-library": "^9.0.0", - "mime": "^3.0.0", - "mime-types": "^2.0.8", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", - "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "optional": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "optional": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "optional": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "optional": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "optional": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "optional": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "optional": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "optional": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "optional": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "optional": true - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/request": { - "version": "2.48.12", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", - "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "optional": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/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/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "optional": true - }, - "node_modules/fast-xml-parser": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", - "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/firebase-admin": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-12.0.0.tgz", - "integrity": "sha512-wBrrSSsKV++/+O8E7O/C7/wL0nbG/x4Xv4yatz/+sohaZ+LsnWtYUcrd3gZutO86hLpDex7xgyrkKbgulmtVyQ==", - "dependencies": { - "@fastify/busboy": "^1.2.1", - "@firebase/database-compat": "^1.0.2", - "@firebase/database-types": "^1.0.0", - "@types/node": "^20.10.3", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.1.0", - "@google-cloud/storage": "^7.7.0" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "optional": true - }, - "node_modules/gaxios": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.2.0.tgz", - "integrity": "sha512-H6+bHeoEAU5D6XNc6mPKeN5dLZqEDs9Gpk6I+SZBEzK5So58JVrHPmevNi35fRl1J9Y5TaeLW0kYx3pCJ1U2mQ==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", - "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "optional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/google-auth-library": { - "version": "9.6.3", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.6.3.tgz", - "integrity": "sha512-4CacM29MLC2eT9Cey5GDVK4Q8t+MMp8+OEdOaqD9MG6b0dOyLORaaeJMPQ7EESVgm/+z5EKYyFLxgzBJlJgyHQ==", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.1.tgz", - "integrity": "sha512-qpSfslpwqToIgQ+Tf3MjWIDjYK4UFIZ0uz6nLtttlW9N1NQA4PhGf9tlGo6KDYJ4rgL2w4CjXVd0z5yeNpN/Iw==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.10.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.0", - "protobufjs": "7.2.6", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "optional": true, - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "optional": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "optional": true - }, - "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-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jose": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "peer": true - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "optional": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "optional": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": 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", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "optional": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "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-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "optional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proto3-json-serializer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz", - "integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-hook-form": { - "version": "7.50.1", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.1.tgz", - "integrity": "sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ==", - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "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/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "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==", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "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==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/text-decoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", - "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" - }, - "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/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "optional": true - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "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/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "optional": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "optional": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index f5d1206..0000000 --- a/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "firebase-admin": "^12.0.0", - "react-hook-form": "^7.50.1" - } -} -- 2.52.0 From c6056c385bb7eb2de6906e556e3a178c6bb2c95d Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 08:06:16 +0000 Subject: [PATCH 04/11] Favicon Fixes / Cleanup --- frontend-next/{src/app => public}/favicon.ico | Bin frontend-next/src/app/layout.js | 2 +- frontend-next/tailwind.config.js | 9 --------- 3 files changed, 1 insertion(+), 10 deletions(-) rename frontend-next/{src/app => public}/favicon.ico (100%) diff --git a/frontend-next/src/app/favicon.ico b/frontend-next/public/favicon.ico similarity index 100% rename from frontend-next/src/app/favicon.ico rename to frontend-next/public/favicon.ico diff --git a/frontend-next/src/app/layout.js b/frontend-next/src/app/layout.js index a4b31a2..927f794 100644 --- a/frontend-next/src/app/layout.js +++ b/frontend-next/src/app/layout.js @@ -5,7 +5,7 @@ const inter = Inter({ subsets: ["latin"] }); export const metadata = { title: "ChatMaps", - description: "ChatMaps: Social Media for College Students", + description: "ChatMaps: Social Media for College Students" }; export default function RootLayout({ children }) { diff --git a/frontend-next/tailwind.config.js b/frontend-next/tailwind.config.js index 7980350..1485f98 100644 --- a/frontend-next/tailwind.config.js +++ b/frontend-next/tailwind.config.js @@ -5,14 +5,5 @@ module.exports = { "./src/components/**/*.{js,ts,jsx,tsx,mdx}", "./src/app/**/*.{js,ts,jsx,tsx,mdx}", ], - theme: { - extend: { - backgroundImage: { - "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", - }, - }, - }, plugins: [], }; -- 2.52.0 From f19b09c5fd26f917cf169d4dc041f62f3df1fe2a Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 08:17:17 +0000 Subject: [PATCH 05/11] Update Import Paths --- frontend-next/src/{lib => app/api}/firebase-admin.js | 2 +- frontend-next/src/{lib => app/api}/firebase-config.js | 2 +- frontend-next/src/app/api/login/route.js | 4 ++-- frontend-next/src/app/api/register/route.js | 2 +- frontend-next/src/app/login/page.js | 3 --- 5 files changed, 5 insertions(+), 8 deletions(-) rename frontend-next/src/{lib => app/api}/firebase-admin.js (79%) rename frontend-next/src/{lib => app/api}/firebase-config.js (81%) diff --git a/frontend-next/src/lib/firebase-admin.js b/frontend-next/src/app/api/firebase-admin.js similarity index 79% rename from frontend-next/src/lib/firebase-admin.js rename to frontend-next/src/app/api/firebase-admin.js index 781c331..93591f4 100644 --- a/frontend-next/src/lib/firebase-admin.js +++ b/frontend-next/src/app/api/firebase-admin.js @@ -1,6 +1,6 @@ // lib/firebase-admin-config.js import { initializeApp, getApps, cert } from "firebase-admin/app"; -import serviceAccount from "../../../firebase-admin-key" +import serviceAccount from "../../../../firebase-admin-key" export function customInitApp() { if (getApps().length <= 0) { diff --git a/frontend-next/src/lib/firebase-config.js b/frontend-next/src/app/api/firebase-config.js similarity index 81% rename from frontend-next/src/lib/firebase-config.js rename to frontend-next/src/app/api/firebase-config.js index 4a5abcf..e1da74b 100644 --- a/frontend-next/src/lib/firebase-config.js +++ b/frontend-next/src/app/api/firebase-config.js @@ -1,6 +1,6 @@ import { initializeApp, getApps, getApp } from "firebase/app"; import { getAuth } from "firebase/auth"; -import firebaseConfigFile from "../../../firebase-config" +import firebaseConfigFile from "../../../../firebase-config" var firebaseConfig = firebaseConfigFile; diff --git a/frontend-next/src/app/api/login/route.js b/frontend-next/src/app/api/login/route.js index 55d9967..2ce8f5a 100644 --- a/frontend-next/src/app/api/login/route.js +++ b/frontend-next/src/app/api/login/route.js @@ -4,8 +4,8 @@ import { NextResponse } from "next/server"; import { auth } from "firebase-admin"; import { signInWithEmailAndPassword } from "firebase/auth"; // Lib Imports -import { auth as authConfig } from "../../../lib/firebase-config"; -import { customInitApp } from "../../../lib/firebase-admin"; +import { auth as authConfig } from "../firebase-config"; +import { customInitApp } from "../firebase-admin"; // Needs to "init" on each call to the API customInitApp(); diff --git a/frontend-next/src/app/api/register/route.js b/frontend-next/src/app/api/register/route.js index 0dba943..9bc7268 100644 --- a/frontend-next/src/app/api/register/route.js +++ b/frontend-next/src/app/api/register/route.js @@ -1,6 +1,6 @@ // Import necessary functions import { createUserWithEmailAndPassword } from "firebase/auth"; -import { auth } from "../../../lib/firebase-config"; +import { auth } from "../firebase-config"; import { NextResponse } from "next/server"; // Function to register a new user using Firebase Authentication diff --git a/frontend-next/src/app/login/page.js b/frontend-next/src/app/login/page.js index 5844183..dad45da 100644 --- a/frontend-next/src/app/login/page.js +++ b/frontend-next/src/app/login/page.js @@ -1,7 +1,4 @@ "use client"; -import {createUserWithEmailAndPassword, getRedirectResult,signInWithRedirect,} from "firebase/auth"; -import { useEffect, useState } from "react"; -import { auth, provider } from "../../lib/firebase-config"; import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import "../globals.css" -- 2.52.0 From 57a8415e52ab029f1ae6eabf92ce86d703548cc7 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 21:02:14 +0000 Subject: [PATCH 06/11] Update Build Test --- .github/workflows/frontend-tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index b1c4c1b..1b21080 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -22,6 +22,9 @@ jobs: - name: Install dependencies run: npm install frontend-next/ + - name: Generate "dummy" gitignore Files + run: touch firebase-admin-key.json && touch firebase-config.json + - name: Lint run: npm --prefix frontend-next/ run lint -- 2.52.0 From d20aecdbe88c9a7f1a0b36811fbbd11723301900 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 21:24:45 +0000 Subject: [PATCH 07/11] Use GH Secrets with Workflow --- .github/workflows/frontend-tests.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index 1b21080..eeab12d 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -22,8 +22,11 @@ jobs: - name: Install dependencies run: npm install frontend-next/ - - name: Generate "dummy" gitignore Files - run: touch firebase-admin-key.json && touch firebase-config.json + - name: Generate firebase-config.json + run: echo $ {{ secrets.FIREBASE_CONFIG }} > firebase-config.json + + - name: Generate firebase-admin.json + run: echo $ {{ secrets.FIREBASE_ADMIN }} > firebase-admin.json - name: Lint run: npm --prefix frontend-next/ run lint -- 2.52.0 From c555a59cf8bed6d7f2ff1006f4ddfea5b0f2fbb0 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 21:26:32 +0000 Subject: [PATCH 08/11] Spaces Matter --- .github/workflows/frontend-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index eeab12d..79e9d57 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -23,10 +23,10 @@ jobs: run: npm install frontend-next/ - name: Generate firebase-config.json - run: echo $ {{ secrets.FIREBASE_CONFIG }} > firebase-config.json + run: echo ${{ secrets.FIREBASE_CONFIG }} > firebase-config.json - name: Generate firebase-admin.json - run: echo $ {{ secrets.FIREBASE_ADMIN }} > firebase-admin.json + run: echo ${{ secrets.FIREBASE_ADMIN }} > firebase-admin.json - name: Lint run: npm --prefix frontend-next/ run lint -- 2.52.0 From 69d5bfe9a98bbbe4ea0b1c9ed327ac4fef91797f Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Mon, 19 Feb 2024 21:34:08 +0000 Subject: [PATCH 09/11] Remove build stage to remove conflict with local files --- .github/workflows/frontend-tests.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index 79e9d57..7c582b7 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -19,17 +19,5 @@ jobs: with: node-version: 21.6.2 - - name: Install dependencies - run: npm install frontend-next/ - - - name: Generate firebase-config.json - run: echo ${{ secrets.FIREBASE_CONFIG }} > firebase-config.json - - - name: Generate firebase-admin.json - run: echo ${{ secrets.FIREBASE_ADMIN }} > firebase-admin.json - - name: Lint run: npm --prefix frontend-next/ run lint - - - name: Build Frontend - run: npm --prefix frontend-next/ run build \ No newline at end of file -- 2.52.0 From d7a2382cb574e330a600d90662143729245480a9 Mon Sep 17 00:00:00 2001 From: Nicholas Pease <34464552+LAX18@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:37:16 -0500 Subject: [PATCH 10/11] Restore Dependency Installation --- .github/workflows/frontend-tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/frontend-tests.yml b/.github/workflows/frontend-tests.yml index 7c582b7..d467545 100644 --- a/.github/workflows/frontend-tests.yml +++ b/.github/workflows/frontend-tests.yml @@ -18,6 +18,9 @@ jobs: uses: actions/setup-node@v2 with: node-version: 21.6.2 + + - name: Install dependencies + run: npm install frontend-next/ - name: Lint run: npm --prefix frontend-next/ run lint -- 2.52.0 From ec2fc15a3fbef7a63aea0e100538cae13a850cf8 Mon Sep 17 00:00:00 2001 From: Nicholas Pease Date: Tue, 20 Feb 2024 01:08:12 -0500 Subject: [PATCH 11/11] Add onboarding, dashboard with relevant API's --- frontend-next/package-lock.json | 9 +++ frontend-next/package.json | 3 +- frontend-next/src/app/api/firebase-config.js | 2 +- frontend-next/src/app/api/login/route.js | 19 +++--- frontend-next/src/app/api/onboard/route.js | 40 +++++++++++ frontend-next/src/app/api/signout/route.js | 8 ++- frontend-next/src/app/api/user/route.js | 15 ++++ frontend-next/src/app/app/layout.js | 26 +++++++ frontend-next/src/app/app/page.js | 72 ++++++++++++++++++++ frontend-next/src/app/app/shared.js | 18 +++++ frontend-next/src/app/login/page.js | 5 +- frontend-next/src/app/onboarding/layout.js | 19 ++++++ frontend-next/src/app/onboarding/page.js | 44 ++++++++++++ frontend-next/src/app/page.js | 2 +- frontend-next/src/app/register/page.js | 3 +- frontend-next/src/middleware.js | 29 +++++++- 16 files changed, 295 insertions(+), 19 deletions(-) create mode 100644 frontend-next/src/app/api/onboard/route.js create mode 100644 frontend-next/src/app/api/user/route.js create mode 100644 frontend-next/src/app/app/layout.js create mode 100644 frontend-next/src/app/app/page.js create mode 100644 frontend-next/src/app/app/shared.js create mode 100644 frontend-next/src/app/onboarding/layout.js create mode 100644 frontend-next/src/app/onboarding/page.js diff --git a/frontend-next/package-lock.json b/frontend-next/package-lock.json index 3791b85..c0721f0 100644 --- a/frontend-next/package-lock.json +++ b/frontend-next/package-lock.json @@ -11,6 +11,7 @@ "firebase": "^10.8.0", "firebase-admin": "^12.0.0", "next": "^14.1.0", + "pigeon-maps": "^0.21.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.50.1" @@ -4949,6 +4950,14 @@ "node": ">=0.10.0" } }, + "node_modules/pigeon-maps": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/pigeon-maps/-/pigeon-maps-0.21.3.tgz", + "integrity": "sha512-NbzISHHvMrcYBMBJ6NSSdTC1iGshSYOvsql9AqBfsE7KXni9xFIV9dkIWAfkKGCbafZ/0JysWZSp7zfg2piOFg==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", diff --git a/frontend-next/package.json b/frontend-next/package.json index 347a17b..4ea9d2f 100644 --- a/frontend-next/package.json +++ b/frontend-next/package.json @@ -10,10 +10,11 @@ }, "dependencies": { "firebase": "^10.8.0", + "firebase-admin": "^12.0.0", "next": "^14.1.0", + "pigeon-maps": "^0.21.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "firebase-admin": "^12.0.0", "react-hook-form": "^7.50.1" }, "devDependencies": { diff --git a/frontend-next/src/app/api/firebase-config.js b/frontend-next/src/app/api/firebase-config.js index e1da74b..d544147 100644 --- a/frontend-next/src/app/api/firebase-config.js +++ b/frontend-next/src/app/api/firebase-config.js @@ -7,4 +7,4 @@ var firebaseConfig = firebaseConfigFile; var app = getApps().length > 0 ? getApp() : initializeApp(firebaseConfig); var auth = getAuth(app); -export { auth }; \ No newline at end of file +export { auth, app }; \ No newline at end of file diff --git a/frontend-next/src/app/api/login/route.js b/frontend-next/src/app/api/login/route.js index 2ce8f5a..0994af3 100644 --- a/frontend-next/src/app/api/login/route.js +++ b/frontend-next/src/app/api/login/route.js @@ -1,4 +1,4 @@ -import { cookies, headers } from "next/headers"; +import { cookies } from "next/headers"; import { NextResponse } from "next/server"; // Firebase Imports import { auth } from "firebase-admin"; @@ -15,14 +15,14 @@ async function handleEmailAndPassword(email, password) { try { var userCredential = await signInWithEmailAndPassword(authConfig,email,password); if (userCredential.user.accessToken) { - const token = await auth().verifyIdToken(userCredential.user.accessToken); + var token = await auth().verifyIdToken(userCredential.user.accessToken); if (token) { - var expiresIn = 300000 + var expiresIn = 20 * 60 * 1000; // 20 minutes var sessionCookie = await auth().createSessionCookie(userCredential.user.accessToken, {expiresIn,}); var options = { name: "session", value: sessionCookie, - maxAge: expiresIn, // 5 mins + maxAge: expiresIn, // 20 mins httpOnly: true, secure: true, }; @@ -53,11 +53,12 @@ export async function GET(req) { return NextResponse.json({ isLogged: false }, { status: 401 }); } else { // Validate session cookie - var validation = await auth().verifySessionCookie(session, true); - if (!validation) { - return NextResponse.json({ isLogged: false }, { status: 401 }); - } else { - return NextResponse.json({ isLogged: true }, { status: 200 }); + try { + var validation = await auth().verifySessionCookie(session, true); + return NextResponse.json({ isLogged: true, uid: validation.uid, email: validation.email }, { status: 200 }); + } catch (error) { + return NextResponse.json({ isLogged: false}, { status: 401 }); } + } } \ No newline at end of file diff --git a/frontend-next/src/app/api/onboard/route.js b/frontend-next/src/app/api/onboard/route.js new file mode 100644 index 0000000..0820fc5 --- /dev/null +++ b/frontend-next/src/app/api/onboard/route.js @@ -0,0 +1,40 @@ +import { NextResponse } from "next/server"; +// Lib Imports +import { app } from "../firebase-config"; +import { getDatabase, ref, set as firebaseSet } from "firebase/database"; + + +async function onboard(firstName, lastName, req) { + var session = req.cookies.get("session"); + //Call the authentication endpoint + var res = await fetch("http://localhost:3000/api/login", {headers: {Cookie: `session=${session?.value}`}}) + + // Login if unauthorized + if (res.status !== 200) { + return NextResponse.json({}, { status: 401 }); + } + try { + var { uid, email } = await res.json() + var database = getDatabase(app) + await firebaseSet(ref(database, `users/${uid}`), { + firstName: firstName, + lastName: lastName, + email: email + }); + return NextResponse.json({}, { status: 200 }); + } catch(error) { + return NextResponse.json({ error: "Internal Server Error" },{ status: 500 }); + } +} + + +// Handles POST requests (login requests) +export async function POST(req, res) { + try { + var { firstName, lastName } = await req?.json() + return await onboard(firstName, lastName, req); + } catch (error) { + console.log(error) + return NextResponse.json({ error: "Internal Server Error" },{ status: 500 }); + } +} \ No newline at end of file diff --git a/frontend-next/src/app/api/signout/route.js b/frontend-next/src/app/api/signout/route.js index 333092a..e476c1e 100644 --- a/frontend-next/src/app/api/signout/route.js +++ b/frontend-next/src/app/api/signout/route.js @@ -1,11 +1,17 @@ import { cookies } from "next/headers"; import { NextResponse } from "next/server"; -export async function POST(req) { + +export async function GET(req) { cookies().set({ name: "session", value: "", maxAge: -1, }); + cookies().set({ + name: "firstName", + value: "", + maxAge: -1, + }); return NextResponse.json({}, { status: 200 }); } \ No newline at end of file diff --git a/frontend-next/src/app/api/user/route.js b/frontend-next/src/app/api/user/route.js new file mode 100644 index 0000000..d2f9aa6 --- /dev/null +++ b/frontend-next/src/app/api/user/route.js @@ -0,0 +1,15 @@ +import { NextResponse } from "next/server"; +import { cookies } from "next/headers"; + +export async function GET(req) { + const session = cookies().get("session"); + // Login if not logged in + if (session) { + return NextResponse.json({ + firstName: cookies().get("firstName")?.value, + lastName: cookies().get("lastName")?.value, + uid: cookies().get("uid")?.value, + }) + } + return NextResponse.json({}, { status: 500 }); + } \ No newline at end of file diff --git a/frontend-next/src/app/app/layout.js b/frontend-next/src/app/app/layout.js new file mode 100644 index 0000000..4b40e5e --- /dev/null +++ b/frontend-next/src/app/app/layout.js @@ -0,0 +1,26 @@ +import { Inter } from "next/font/google"; +import "../globals.css"; +import { Header, Sidebar } from "./shared" + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "ChatMaps: Home", + description: "ChatMaps: Social Media for College Students", +}; + +export default function RootLayout({ children }) { + return ( + + +
+
+
+ {children} +
+ +
+ + + ); +} diff --git a/frontend-next/src/app/app/page.js b/frontend-next/src/app/app/page.js new file mode 100644 index 0000000..e7805e9 --- /dev/null +++ b/frontend-next/src/app/app/page.js @@ -0,0 +1,72 @@ +"use client" +import { useState, useEffect } from 'react' +import {Map} from "pigeon-maps" + +function WelcomeMessage() { + //TODO: REALLY GROSS WAY TO GET COOKIES, NEED NEW WAY TO STORE USER DATA WITHOUT API CALLS. THIS PAGE HAS TO BE CLIENT SIDE DUE TO MAPS / GEOLOCATION + const [data, setData] = useState(null) + const [isLoading, setLoading] = useState(true) + useEffect(() => { + fetch('/api/user') + .then((res) => res.json()) + .then((data) => { + setData(data) + setLoading(false) + }) + }, []) + if (isLoading) return
+ if (!data) return
+ + return ( +
+
+ Welcome, {data.firstName} {data.lastName} +
+
+ Lets see what's happening in your area. +
+
+ ) + +} + +function Geo() { + const [isLoading, setLoading] = useState(true) + const [data, setData] = useState(); + useEffect(() => { + if('geolocation' in navigator) { + // Retrieve latitude & longitude coordinates from `navigator.geolocation` Web API + navigator.geolocation.getCurrentPosition(({ coords }) => { + const { latitude, longitude } = coords; + console.log(latitude, longitude) + setData(coords) + setLoading(false) + }) + } + }, []); + if (!isLoading) { + return ( + + ) + } else { + return ( +
Loading...
+ ) + } + +} + +function Home() { + return ( +
+ +
+ +
+
+ ) +} + + + +export default Home; \ No newline at end of file diff --git a/frontend-next/src/app/app/shared.js b/frontend-next/src/app/app/shared.js new file mode 100644 index 0000000..4fd6826 --- /dev/null +++ b/frontend-next/src/app/app/shared.js @@ -0,0 +1,18 @@ +export function Header() { + return ( +
+ +
+ ) +} + +export function Sidebar() { + return ( +
+
+ Sidebar +
+
+ + ) + } diff --git a/frontend-next/src/app/login/page.js b/frontend-next/src/app/login/page.js index dad45da..aa10c06 100644 --- a/frontend-next/src/app/login/page.js +++ b/frontend-next/src/app/login/page.js @@ -13,7 +13,7 @@ function Login() { }); if (res.ok) { - router.push("/room/success"); + router.push("/app"); } } @@ -30,7 +30,8 @@ function Login() {

- +
+ Don't have an account? Sign Up
diff --git a/frontend-next/src/app/onboarding/layout.js b/frontend-next/src/app/onboarding/layout.js new file mode 100644 index 0000000..8e01519 --- /dev/null +++ b/frontend-next/src/app/onboarding/layout.js @@ -0,0 +1,19 @@ +import { Inter } from "next/font/google"; +import "../globals.css"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "ChatMaps: Onboarding", + description: "ChatMaps: Social Media for College Students" +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/frontend-next/src/app/onboarding/page.js b/frontend-next/src/app/onboarding/page.js new file mode 100644 index 0000000..1f3b195 --- /dev/null +++ b/frontend-next/src/app/onboarding/page.js @@ -0,0 +1,44 @@ +"use client"; +import "../globals.css" +import { useForm } from "react-hook-form"; +import { useRouter } from "next/navigation"; + +function Onboarding() { + var router = useRouter(); + var { register, handleSubmit } = useForm(); + + async function Onboard(data) { + const res = await fetch("/api/onboard", { + method: "POST", + body: JSON.stringify(data ? data : {}), + }); + + if (res.ok) { + router.push("/app"); + } else { + router.push("/login"); + } + } + return ( +
+
+
+ + + Chat with friends! + +
+ Welcome to ChatMaps! We are excited to have you join our community!
First we just need a little bit of information from you to get started. +
+
+
+
+ +
+
+
+
+ ) +} + +export default Onboarding; \ No newline at end of file diff --git a/frontend-next/src/app/page.js b/frontend-next/src/app/page.js index 690a8ad..ad4c12d 100644 --- a/frontend-next/src/app/page.js +++ b/frontend-next/src/app/page.js @@ -1,4 +1,4 @@ -async function Home() { +function Home() { return (
diff --git a/frontend-next/src/app/register/page.js b/frontend-next/src/app/register/page.js index 14e72e7..618e974 100644 --- a/frontend-next/src/app/register/page.js +++ b/frontend-next/src/app/register/page.js @@ -30,7 +30,8 @@ function Register() {


- +
+ Have an account? Log In
diff --git a/frontend-next/src/middleware.js b/frontend-next/src/middleware.js index 12d3e1e..7029033 100644 --- a/frontend-next/src/middleware.js +++ b/frontend-next/src/middleware.js @@ -1,5 +1,7 @@ // src/middleware.js import { NextResponse } from "next/server"; +import { app } from "./app/api/firebase-config"; +import { getDatabase, ref, get as firebaseGet } from "firebase/database"; export async function middleware(req, res) { const session = req.cookies.get("session"); @@ -17,10 +19,31 @@ export async function middleware(req, res) { if (responseAPI.status !== 200) { return NextResponse.redirect(new URL("/login", req.url)); } - return NextResponse.next(); + // If new user, redirect to onboarding + var { uid } = await responseAPI.json() + var firstName = await req.cookies.get("firstName")?.value; + if (firstName) { + return NextResponse.next(); + } else { + var database = getDatabase(app) + var user = await firebaseGet(ref(database, `users/${uid}`)); + if (!user.exists()) { + return NextResponse.redirect(new URL("/onboarding", req.url)); + } else { + var returnedResponse = NextResponse.next(); + returnedResponse.cookies.set("firstName",user.val()?.firstName) + returnedResponse.cookies.set("lastName",user.val()?.lastName) + returnedResponse.cookies.set("uid",uid) + return returnedResponse + } + } } -//Add your protected routes +//Protected routes export const config = { - matcher: ["/room/:path*"], + matcher: ['/((?!login|register|onboarding|api|_next/static|_next/image|auth|favicon.ico|robots.txt|images|logo|$).*)',], + missing: [ + { type: 'header', key: 'next-router-prefetch' }, + { type: 'header', key: 'purpose', value: 'prefetch' }, + ], }; \ No newline at end of file -- 2.52.0