diff --git a/Node/call-vertex-remote-config-server/README.md b/Node/call-vertex-remote-config-server/README.md new file mode 100644 index 0000000000..2b85fba344 --- /dev/null +++ b/Node/call-vertex-remote-config-server/README.md @@ -0,0 +1,81 @@ +Call the Vertex AI Gemini API with Remote Config and App Check +============================================================== + +Introduction +------------ + +This is a sample callable function that authenticates clients with App +Check and then sends queries to Gemini using the Vertex AI Gemini API. Vertex +AI model parameters (including the model itself) are controlled by +Remote Config server features included in the Firebase Admin SDK for +Node.js. + +Use the web client provided in `client/` to test the function. + +- [Read more about Remote Config for servers](https://firebase.google.com/docs/remote-config/server). +- [Read more about App Check](https://firebase.google.com/docs/app-check). +- [Read more about the Vertex AI Node.js Client library](https://cloud.google.com/nodejs/docs/reference/aiplatform/latest). + +Important: Vertex AI and Cloud Functions require a billing account. Review +[Vertex AI pricing](https://cloud.google.com/vertex-ai/pricing) and +[Firebase pricing](https://firebase.google.com/pricing) before running +this function. If you're new to Firebase and Google Cloud, check to see if +you're eligible for a +[$300 credit](https://firebase.google.com/support/faq#pricing-free-trial) and +a Free Trial Cloud Billing account. + +Get Started +--------------- + + 1. Follow the instructions in client/README.md to create a Firebase project, + enable ReCAPTCHA Enterprise, enable and enforce Firebase App Check, and add + your Firebase config and ReCAPTCHA Enterprise key to the client config. + + 2. Enable [recommended Vertex AI APIs](https://console.cloud.google.com/vertex-ai). + + 3. Configure a Remote Config server template on the Firebase console. Use the template + described in + [Use server side Remote Config with Cloud Functions and Vertex + AI](https://firebase.google.com/docs/remote-config/solution-server#implementation-create-template), + which contains all of the parameters used in this function sample. + + 4. Install dependencies: `cd functions && npm install` + + 5. If you haven't already done so, install firebase-tools: + + `npm i firebase-tools@latest` + + 6. Log into Firebase: + + `firebase login` + + 7. Deploy the function. We recommend testing in the + [Firebase emulator](https://firebase.google.com/docs/remote-config/solution-server#implementation-deploy-and-test-in-emulator): + + `firebase emulators:start` + + 8. If testing in the emulator, verify that `testMode` is set to `true` in + `client/main.ts`, then start the client: + + `cd client && npm run dev` + + TIP: If you're using the emulator, you can deploy both the function and hosting + to the emulator. From the `client` directory, run `npm run build`. + Then, from the parent directory, run `firebase server --only functions,hosting`. + Open http://localhost:5000 to access and test the web client's connection + to the `callVertexWithRC` function. + + 0. Open the [client app in a browser](http://localhost:5173) and enter a + prompt. To access the Vertex AI Gemini API, make sure that you have + set the `is_vertex_enabled` boolean parameter in your Remote Config + server template to `true`. + +Support +------- + +- [Firebase Support](https://firebase.google.com/support/) + +License +------- + +© Google, 2024. Licensed under an [Apache-2](../../LICENSE) license. diff --git a/Node/call-vertex-remote-config-server/client/README.md b/Node/call-vertex-remote-config-server/client/README.md new file mode 100644 index 0000000000..e4bacdab35 --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/README.md @@ -0,0 +1,59 @@ +Test client for call-vertex-remote-config-server +================================================ + +Introduction +------------ + +This is a basic web app that calls the `callVertexWithRC` function. The +function uses values stored in Remote Config server templates with +the Firebase Admin SDK to dynamically update Vertex AI Gemini API +parameters. Access is controlled using Firebase App Check. + +- [Read more about Remote Config for servers](https://firebase.google.com/docs/remote-config/server). +- [Read more about App Check](https://firebase.google.com/docs/app-check). +- [Read more about the Vertex AI Node.js Client library](https://cloud.google.com/nodejs/docs/reference/aiplatform/latest). + +Important: Vertex AI and Cloud Functions require a billing account. Review +[Vertex AI pricing](https://cloud.google.com/vertex-ai/pricing) and +[Firebase pricing](https://firebase.google.com/pricing) before running +this function. If you're new to Firebase and Google Cloud, check to see if +you're eligible for a +[$300 credit](https://firebase.google.com/support/faq#pricing-free-trial) and +a Free Trial Cloud Billing account. + +Get started +--------------- + + 1. Create a [Firebase project and register a web app](https://firebase.google.com/docs/web/setup#create-firebase-project-and-app). + 2. [Create a ReCAPTCHA Enterprise key](https://firebase.google.com/docs/app-check/web/recaptcha-enterprise-provider#project-setup) + in the same project. + 3. [Enable App Check](https://firebase.google.com/docs/app-check/web/recaptcha-enterprise-provider) + in the Firebase console with the ReCAPTCHA Enterprise site key you created. + 4. Copy your Firebase project config and your ReCAPTCHA Enterprise site key + into the appropriate places in `config.ts` in this directory. + 5. In this directory, run `npm install`. + 6. Set up and deploy the function as described in [../README.md](../README.md). + 7. In this directory, run `npm run dev` to run the client. + +To run this app against the `callVertexWithRC` function running in the Firebase +emulator, ensure that `testMode`in `main.ts` is set to `true`. Before testing +with a deployed (i.e., not emulated) function, set `testMode` to `false`. + +TIP: You can build the client and deploy to Firebase Hosting by running + `npm run build` from the `client` directory. Hosting deliverables are + generated and saved in `client/dist` and you can then deploy to + the emulator or Firebase Hosting from the parent directory. We recommend + deploying to the emulator first--you can use the following command to + deploy the function and web client simultaneously: + + firebase serve --only functions,hosting + +Support +------- + +- [Firebase Support](https://firebase.google.com/support/) + +License +------- + +© Google, 2024. Licensed under an [Apache-2](../../../LICENSE) license. diff --git a/Node/call-vertex-remote-config-server/client/config.ts b/Node/call-vertex-remote-config-server/client/config.ts new file mode 100644 index 0000000000..30cfc6363e --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/config.ts @@ -0,0 +1,8 @@ +export const firebaseConfig = { + YOUR_FIREBASE_CONFIG +}; + + // Your ReCAPTCHA Enterprise site key (must be from the same project + // as the Firebase config above). +export const RECAPTCHA_ENTERPRISE_SITE_KEY = + "YOUR_RECAPTCHA_KEY"; diff --git a/Node/call-vertex-remote-config-server/client/index.html b/Node/call-vertex-remote-config-server/client/index.html new file mode 100644 index 0000000000..fac205fd9e --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/index.html @@ -0,0 +1,72 @@ + + + + + + + Client app for Remote Config server function with Vertex AI and App Check + + + + +
+

Client app for Remote Config server function with Vertex AI and App Check

+
+
+ + + + \ No newline at end of file diff --git a/Node/call-vertex-remote-config-server/client/main.ts b/Node/call-vertex-remote-config-server/client/main.ts new file mode 100644 index 0000000000..f749d56450 --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/main.ts @@ -0,0 +1,117 @@ +/** + * @license + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { initializeApp } from "firebase/app"; +import { firebaseConfig, RECAPTCHA_ENTERPRISE_SITE_KEY } from "./config"; +import { + initializeAppCheck, + ReCaptchaEnterpriseProvider, +} from "firebase/app-check"; +import { + getFunctions, + httpsCallable, + connectFunctionsEmulator, +} from "firebase/functions"; + +// Set to true to test in emulator. +const testMode = true; + +// Use showdown to convert Gemini-provided Markdown to HTML +import { Converter } from "showdown"; +const converter = new Converter(); + +// Set up output elements. +const outputDiv = document.createElement("div"); +document.body.appendChild(outputDiv); + +// Initialize Firebase app. +const app = initializeApp(firebaseConfig); + +// Initialize App Check. +initializeAppCheck(app, { + provider: new ReCaptchaEnterpriseProvider(RECAPTCHA_ENTERPRISE_SITE_KEY), +}); + +// Define callVertexWithRC as a call to the callVertexWithRC function. +const callVertexWithRC = httpsCallable(getFunctions(), "callVertexWithRC", { + limitedUseAppCheckTokens: true, +}); + +// Enable emulator so that it can be used in test mode. +const functions = getFunctions(app, "us-central1"); // Replace with your region + +if (testMode) { + connectFunctionsEmulator(functions, "localhost", 5001); +} + +// Generate body for index.html. +document.body.innerHTML += ` + +
+
+
+
+
+
+

+ +
+`; + +const promptForm = document.getElementById("promptForm") as HTMLFormElement; + +promptForm.addEventListener("submit", async (event) => { + event.preventDefault(); + const promptInput = document.getElementById( + "promptInput" + ) as HTMLInputElement; + const prompt = promptInput.value; + + const waitingMessageElement = document.getElementById("waitingMessage"); + + // Define a variable to keep track of the number of dots + let dotCount = 0; + + // Set interval to add dots every second + const intervalId = setInterval(() => { + // Increment dotCount + dotCount = (dotCount + 1) % 7; + const dots = ".".repeat(dotCount); + waitingMessageElement.textContent = "Waiting for response" + dots; + }, 1000); + + const errorMessageElement = document.getElementById("errorMessage"); + errorMessageElement.textContent = ""; + + try { + const { data } = await callVertexWithRC({ prompt }); + const generatedTextElement = document.getElementById("generatedText"); // Access the element + const htmlContent = converter.makeHtml(data); + if (!generatedTextElement) { + throw new Error("Missing generated text."); + } + generatedTextElement.innerHTML = htmlContent; // Set the element's content + waitingMessageElement.textContent = ""; + errorMessageElement.textContent = ""; + + } catch (error) { + errorMessageElement.textContent = "Error calling function: " + error.message; + waitingMessageElement.textContent = ""; + } + // Clear welcome dots. + clearInterval(intervalId); +}); diff --git a/Node/call-vertex-remote-config-server/client/package.json b/Node/call-vertex-remote-config-server/client/package.json new file mode 100644 index 0000000000..a889a350c3 --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/package.json @@ -0,0 +1,33 @@ +{ + "name": "call-vertex-remote-config-server-client", + "version": "1.0.0", + "description": "JavaScript quickstart for Vertex AI, Firebase Remote Config server, and App Check.", + "repository": { + "type": "git", + "url": "git+https://github.com/firebase/functions-samples.git" + }, + "author": "", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/firebase/functions-samples/issues" + }, + "engines": { + "npm": ">=9.0.0 <10.0.0", + "node": ">=18.0.0 <=20.0.0" + }, + "homepage": "https://github.com/firebase/functions-samples#readme", + "devDependencies": { + "typescript": "^5.1.6", + "vite": "^4.4.9" + }, + "scripts": { + "dev": "vite", + "build": "vite build", + "format": "prettier --write ." + }, + "dependencies": { + "@firebase/functions": "^0.11.5", + "firebase": "^10.12.1", + "showdown": "^2.1.0" + } +} diff --git a/Node/call-vertex-remote-config-server/client/vite-env.d.ts b/Node/call-vertex-remote-config-server/client/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/Node/call-vertex-remote-config-server/client/vite.config.js b/Node/call-vertex-remote-config-server/client/vite.config.js new file mode 100644 index 0000000000..4567aa2961 --- /dev/null +++ b/Node/call-vertex-remote-config-server/client/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + base: '', + build: { + rollupOptions: { + input: ['index.html','main.ts'], + }, + }, + logLevel: 'info', +}); diff --git a/Node/call-vertex-remote-config-server/firebase.json b/Node/call-vertex-remote-config-server/firebase.json new file mode 100644 index 0000000000..996774f319 --- /dev/null +++ b/Node/call-vertex-remote-config-server/firebase.json @@ -0,0 +1,32 @@ +{ + "functions": [ + { + "source": "functions", + "codebase": "call-vertex-remote-config-server", + "ignore": [ + "node_modules", + ".git", + "firebase-debug.log", + "firebase-debug.*.log", + "*.local", + "*.bak" + ] + } + ], + "emulators": { + "functions": { + "port": 5001 + }, + "ui": { + "enabled": true + }, + "singleProjectMode": true + }, + "hosting": { + "public": "client/dist", + "ignore": [ + "firebase.json", + "**/node_modules/**" + ] + } +} diff --git a/Node/call-vertex-remote-config-server/functions/index.js b/Node/call-vertex-remote-config-server/functions/index.js new file mode 100644 index 0000000000..9cf167572a --- /dev/null +++ b/Node/call-vertex-remote-config-server/functions/index.js @@ -0,0 +1,159 @@ +/** + * @license + * Copyright 2024 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// [START remote_config_server_vertex_init] +const { onCall, HttpsError } = require("firebase-functions/v2/https"); +const logger = require("firebase-functions/logger"); + +const { initializeApp } = require("firebase-admin/app"); +const { VertexAI } = require("@google-cloud/vertexai"); +const { getRemoteConfig } = require("firebase-admin/remote-config"); + +// Allow all origins. Set origin to restrict domain access. +const cors = require("cors")({ origin: true }); + +// Set and check environment variables. +const project = process.env.GCLOUD_PROJECT; + +// Enable App Check +const appCheckRequired = true; + +// Initialize Firebase. +const app = initializeApp(); +// [END remote_config_server_vertex_init] + +// [START remote_config_server_vertex_default_values] +// Define default (fallback) parameter values for Remote Config. +const defaultConfig = { + // Default values for Vertex AI. + model_name: "gemini-1.5-flash-preview-0514", + generation_config: [ + { + stopSequences: [], + temperature: 0.7, + maxOutputTokens: 64, + topP: 0.1, + topK: 20, + }, + ], + prompt: + "I'm a developer who wants to learn about Firebase and you are a \ + helpful assistant who knows everything there is to know about Firebase!", + safety_settings: [ + { + category: "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", + threshold: "HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE", + }, + ], + + // Vertex AI location. + location: "us-central1", + + // Disable Vertex AI Gemini API access for testing. + vertex_enabled: false, +}; +// [END remote_config_server_vertex_default_values] + +// [START remote_config_server_vertex_create_function] +// Export the function. +exports.callVertexWithRC = onCall( + { + enforceAppCheck: appCheckRequired, // Enable App Check enforcement + consumeAppCheckToken: false, // Don't consume the token (optional) + }, + async (data, context) => { + try { + // Set up Remote Config. + const rc = getRemoteConfig(app); + + // Get the Remote Config template and assign default values. + const template = await rc.getServerTemplate({ + defaultConfig: defaultConfig, + }); + + // Add the template evaluation to a constant. + const config = template.evaluate(); + + // Obtain values from Remote Config. + const textModel = + config.getString("model_name") || defaultConfig.model_name; + const textPrompt = config.getString("prompt") || defaultConfig.prompt; + const generationConfig = + config.getString("generation_config") || + defaultConfig.generation_config; + const safetySettings = + config.getString("safety_settings") || defaultConfig.safety_settings; + const location = config.getString("location") || defaultConfig.location; + const vertexEnabled = + config.getBoolean("is_vertex_enabled") || defaultConfig.vertex_enabled; + // [END remote_config_server_vertex_create_function] + + // [START remote_config_server_vertex_function_logic] + // Allow user input. + const userInput = data.data.prompt || ""; + + // Instantiate Vertex AI. + const vertex_ai = new VertexAI({ project: project, location: location }); + const generativeModel = vertex_ai.getGenerativeModel({ + model: textModel, + safety_settings: safetySettings, + generation_config: generationConfig, + }); + + // Combine prompt from Remote Config with optional user input. + const chatInput = textPrompt + " " + userInput; + + if (!chatInput) { + throw new HttpsError("invalid-argument", "Missing text prompt"); + } + + // Check if Vertex AI is enabled + if (vertexEnabled !== true) { + logger.log("Vertex AI is not enabled"); + return; + } + logger.log( + "\nRunning with model ", + textModel, + ", prompt: ", + textPrompt, + ", generationConfig: ", + generationConfig, + ", safetySettings: ", + safetySettings, + " in ", + location, + "\n" + ); + + const result = await generativeModel.generateContentStream(chatInput); + + const chunks = []; + for await (const item of result.stream) { + const chunk = item.candidates[0].content.parts[0].text; + logger.log("Received chunk:", chunk); + chunks.push(chunk); + } + + return chunks.join(""); // Return the concatenated chunks + } catch (error) { + logger.error(error); + throw new HttpsError("internal", "Internal server error"); + } + } +); +// [END remote_config_server_vertex_function_logic] diff --git a/Node/call-vertex-remote-config-server/functions/package.json b/Node/call-vertex-remote-config-server/functions/package.json new file mode 100644 index 0000000000..7e8b956414 --- /dev/null +++ b/Node/call-vertex-remote-config-server/functions/package.json @@ -0,0 +1,25 @@ +{ + "name": "call-vertex-remote-config-server", + "description": "An example of a callable function that uses the Admin SDK with server-side Remote Config, App Check, and Vertex AI", + "scripts": { + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "18" + }, + "main": "index.js", + "dependencies": { + "@google-cloud/vertexai": "^1.2.0", + "cors": "^2.8.5", + "firebase-admin": "^12.1.0", + "firebase-functions": "^5.0.0" + }, + "devDependencies": { + "firebase-functions-test": "^3.1.0" + }, + "private": true +} diff --git a/Node/remote-config-server-with-vertex/README.md b/Node/remote-config-server-with-vertex/README.md new file mode 100644 index 0000000000..c3c5260197 --- /dev/null +++ b/Node/remote-config-server-with-vertex/README.md @@ -0,0 +1,51 @@ +# Use server-side Remote Config with Cloud Functions and Vertex AI + +This Cloud Function (`generateWithVertex`) demonstrates how to generate text +using Google's Vertex AI Gemini API. It uses +the Firebase Admin SDK for Node.js and Remote Config to manage model parameters, +safety settings, and feature flags. + +To protect your API endpoints, function is intended to run with a service +account with unauthenticated access blocked as described in +[Use server-side Remote Config with Cloud Functions and Vertex +AI](https://firebase.google.com/docs/remote-config/solution-server). + +For a callable function with App Check enabled, try the +[Call the Vertex AI Gemini API with Remote Config and App Check](../call-vertex-remote-config-server) +sample function and client. + +## Set up the sample + +Follow the [User server-side Remote Config with Cloud Functions and Vertex AI +guide](https://firebase.google.com/docs/remote-config/solution-server) to: + +* Set up your Firebase project. +* Enable required APIs and SDKs. +* Configure IAM permissions. +* Test your function in the Firebase emulator. +* Deploy your function. + +Important: Vertex AI and Cloud Functions require a billing account. Review +[Vertex AI pricing](https://cloud.google.com/vertex-ai/pricing) and +[Cloud Functions pricing](https://firebase.google.com/pricing) before running +this function. If you're new to Firebase and Google Cloud, check to see if +you're eligible for a +[$300 credit](https://firebase.google.com/support/faq#pricing-free-trial) and +a Free Trial Cloud Billing account. + +## Next steps + +Learn more about Remote Config server implementations at +[Use Remote Config in server +environments](https://firebase.google.com/docs/remote-config/server). + +Support +------- + +- [Firebase Support](https://firebase.google.com/support/) + +License +------- + +© Google, 2024. Licensed under an [Apache-2](../../LICENSE) license. + diff --git a/Node/remote-config-server-with-vertex/firebase.json b/Node/remote-config-server-with-vertex/firebase.json new file mode 100644 index 0000000000..d76e84112d --- /dev/null +++ b/Node/remote-config-server-with-vertex/firebase.json @@ -0,0 +1,5 @@ +{ + "functions": { + "codebase": "remote-config-server-with-vertex" + } +} diff --git a/Node/remote-config-server-with-vertex/functions/index.js b/Node/remote-config-server-with-vertex/functions/index.js new file mode 100644 index 0000000000..2f4d1d4519 --- /dev/null +++ b/Node/remote-config-server-with-vertex/functions/index.js @@ -0,0 +1,118 @@ +// [START remote_config_server_vertex_init] +const { onRequest } = require("firebase-functions/v2/https"); +const logger = require("firebase-functions/logger"); + +const { initializeApp } = require("firebase-admin/app"); +const { VertexAI } = require('@google-cloud/vertexai'); +const { getRemoteConfig } = require("firebase-admin/remote-config"); + +// Set and check environment variables. +const project = process.env.GCLOUD_PROJECT; + +// Initialize Firebase. +const app = initializeApp(); +// [END remote_config_server_vertex_init] + +// [START remote_config_server_vertex_default_values] +// Define default (fallback) parameter values for Remote Config. +const defaultConfig = { + + // Default values for Vertex AI. + model_name: "gemini-1.5-flash-preview-0514", + generation_config: [{ + "stopSequences": [], "temperature": 0.7, + "maxOutputTokens": 64, "topP": 0.1, "topK": 20 + }], + prompt: "I'm a developer who wants to learn about Firebase and you are a \ + helpful assistant who knows everything there is to know about Firebase!", + safety_settings: [{ + "category": + "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", + "threshold": "HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE" + }], + location: 'us-central1', + + // Disable Vertex AI Gemini API access for testing. + vertex_enabled: false +}; +// [END remote_config_server_vertex_default_values] + +// [START remote_config_server_vertex_create_function] +// Export the function. +exports.generateWithVertex = onRequest(async (request, response) => { + + try { + + // Set up Remote Config. + const rc = getRemoteConfig(app); + + // Get the Remote Config template and assign default values. + const template = await rc.getServerTemplate({ + defaultConfig: defaultConfig + }); + + // Add the template evaluation to a constant. + const config = template.evaluate(); + + // Obtain values from Remote Config. + const textModel = config.getString("model_name") || + defaultConfig.model_name; + const textPrompt = config.getString("prompt") || defaultConfig.prompt; + const generationConfig = config.getString("generation_config") || + defaultConfig.generation_config; + const safetySettings = config.getString("safety_settings") || + defaultConfig.safety_settings; + const location = config.getString("location") || + defaultConfig.location; + const vertexEnabled = config.getBoolean("is_vertex_enabled") || + defaultConfig.vertex_enabled; +// [END remote_config_server_vertex_create_function] + +// [START remote_config_server_vertex_function_logic] + // Allow user input. + const userInput = request.query.prompt || ''; + + // Instantiate Vertex AI. + const vertex_ai = new VertexAI({ project: project, location: location }); + const generativeModel = vertex_ai.getGenerativeModel({ + model: textModel, + safety_settings: safetySettings, + generation_config: generationConfig, + }); + + // Combine prompt from Remote Config with optional user input. + const chatInput = textPrompt + " " + userInput; + + if (!chatInput) { + return res.status(400).send('Missing text prompt'); + } + // If vertexEnabled isn't true, do not send queries to Vertex AI. + if (vertexEnabled !== true) { + response.status(200).send({ + message: "Vertex AI call skipped. Vertex is not enabled." + }); + return; + } + + logger.log("\nRunning with model ", textModel, ", prompt: ", textPrompt, + ", generationConfig: ", generationConfig, ", safetySettings: ", + safetySettings, " in ", location, "\n"); + + const result = await generativeModel.generateContentStream(chatInput); + response.writeHead(200, { 'Content-Type': 'text/plain' }); + + for await (const item of result.stream) { + const chunk = item.candidates[0].content.parts[0].text; + logger.log("Received chunk:", chunk); + response.write(chunk); + } + + response.end(); + + } catch (error) { + logger.error(error); + response.status(500).send('Internal server error'); + } +}); +// [END remote_config_server_vertex_function_logic] + diff --git a/Node/remote-config-server-with-vertex/functions/package.json b/Node/remote-config-server-with-vertex/functions/package.json new file mode 100644 index 0000000000..54834a3604 --- /dev/null +++ b/Node/remote-config-server-with-vertex/functions/package.json @@ -0,0 +1,24 @@ +{ + "name": "remote-config-server-with-vertex", + "description": "Cloud Functions for Firebase", + "scripts": { + "serve": "firebase emulators:start --only functions", + "shell": "firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "18" + }, + "main": "index.js", + "dependencies": { + "@google-cloud/vertexai": "^1.1.0", + "firebase-admin": "^12.1.0", + "firebase-functions": "^4.3.0" + }, + "devDependencies": { + "firebase-functions-test": "^3.1.0" + }, + "private": true +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f84cadcd89..132ac9ee96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1074,6 +1074,44 @@ importers: specifier: ^0.14.0 version: 0.14.0(eslint@8.44.0) + Node/call-vertex-remote-config-server/client: + dependencies: + '@firebase/functions': + specifier: ^0.11.5 + version: 0.11.5(@firebase/app@0.10.4) + firebase: + specifier: ^10.12.1 + version: 10.12.1 + showdown: + specifier: ^2.1.0 + version: 2.1.0 + devDependencies: + typescript: + specifier: ^5.1.6 + version: 5.1.6 + vite: + specifier: ^4.4.9 + version: 4.4.9 + + Node/call-vertex-remote-config-server/functions: + dependencies: + '@google-cloud/vertexai': + specifier: ^1.2.0 + version: 1.2.0 + cors: + specifier: ^2.8.5 + version: 2.8.5 + firebase-admin: + specifier: ^12.1.0 + version: 12.1.0 + firebase-functions: + specifier: ^5.0.0 + version: 5.0.0(firebase-admin@12.1.0) + devDependencies: + firebase-functions-test: + specifier: ^3.1.0 + version: 3.1.0(firebase-admin@12.1.0)(firebase-functions@5.0.0)(jest@28.1.3) + Node/delete-unused-accounts-cron/functions: dependencies: es6-promise-pool: @@ -1113,7 +1151,7 @@ importers: dependencies: '@google-cloud/opentelemetry-cloud-trace-exporter': specifier: ^1.1.0 - version: 1.1.0(@opentelemetry/api@1.2.0)(@opentelemetry/core@1.15.0)(@opentelemetry/resources@1.15.0)(@opentelemetry/sdk-trace-base@1.15.0)(@opentelemetry/semantic-conventions@1.15.0) + version: 1.1.0(@opentelemetry/api@1.2.0)(@opentelemetry/core@1.15.0)(@opentelemetry/resources@1.15.0)(@opentelemetry/sdk-trace-base@1.15.0)(@opentelemetry/semantic-conventions@1.21.0) '@google-cloud/opentelemetry-cloud-trace-propagator': specifier: ^0.14.0 version: 0.14.0(@opentelemetry/api@1.2.0)(@opentelemetry/core@1.15.0) @@ -1386,6 +1424,22 @@ importers: specifier: ^8.40.0 version: 8.44.0 + Node/remote-config-server-with-vertex/functions: + dependencies: + '@google-cloud/vertexai': + specifier: ^1.1.0 + version: 1.1.0 + firebase-admin: + specifier: ^12.1.0 + version: 12.1.0 + firebase-functions: + specifier: ^4.3.0 + version: 4.9.0(firebase-admin@12.1.0) + devDependencies: + firebase-functions-test: + specifier: ^3.1.0 + version: 3.1.0(firebase-admin@12.1.0)(firebase-functions@4.9.0)(jest@28.1.3) + Node/taskqueues-backup-images/functions: dependencies: firebase-admin: @@ -1989,6 +2043,204 @@ packages: - supports-color dev: false + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2038,18 +2290,178 @@ packages: dependencies: text-decoding: 1.0.0 + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + /@firebase/analytics-compat@0.2.10(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4): + resolution: {integrity: sha512-ia68RcLQLLMFWrM10JfmFod7eJGwqr4/uyrtzHpTDnxGX/6gNCBTOuxdAbyWIqXI5XmcMQdz9hDijGKOHgDfPw==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/analytics': 0.10.4(@firebase/app@0.10.4) + '@firebase/analytics-types': 0.8.2 + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/analytics-types@0.8.2: + resolution: {integrity: sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==} + dev: false + + /@firebase/analytics@0.10.4(@firebase/app@0.10.4): + resolution: {integrity: sha512-OJEl/8Oye/k+vJ1zV/1L6eGpc1XzAj+WG2TPznJ7PszL7sOFLBXkL9IjHfOCGDGpXeO3btozy/cYUqv4zgNeHg==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/installations': 0.6.7(@firebase/app@0.10.4) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + dev: false + + /@firebase/app-check-compat@0.3.11(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4): + resolution: {integrity: sha512-t01zaH3RJpKEey0nGduz3Is+uSz7Sj4U5nwOV6lWb+86s5xtxpIvBJzu/lKxJfYyfZ29eJwpdjEgT1/lm4iQyA==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-check': 0.8.4(@firebase/app@0.10.4) + '@firebase/app-check-types': 0.5.2 + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/app-check-interop-types@0.3.2: + resolution: {integrity: sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==} + + /@firebase/app-check-types@0.5.2: + resolution: {integrity: sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==} + dev: false + + /@firebase/app-check@0.8.4(@firebase/app@0.10.4): + resolution: {integrity: sha512-2tjRDaxcM5G7BEpytiDcIl+NovV99q8yEqRMKDbn4J4i/XjjuThuB4S+4PkmTnZiCbdLXQiBhkVxNlUDcfog5Q==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + dev: false + + /@firebase/app-compat@0.2.34: + resolution: {integrity: sha512-enteBla1gBYObauvsC9bRRoqHZnOW48ahYABZ+l+FEiWil1rw0gVihl8D4eLqtQp/ci8+fbOBf3ZL19uFq/OCw==} + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + dev: false + /@firebase/app-types@0.9.0: resolution: {integrity: sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==} + /@firebase/app-types@0.9.2: + resolution: {integrity: sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==} + + /@firebase/app@0.10.4: + resolution: {integrity: sha512-oKd5cT+fDbQ22X8Am3tBOrSFdDp8n4NJDqld4uo+H/PL9F+D3ogtTeiPyDWw1lZK7FsMbmtRrPRozlmJFzSKAQ==} + dependencies: + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + idb: 7.1.1 + tslib: 2.6.0 + dev: false + + /@firebase/auth-compat@0.5.8(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4): + resolution: {integrity: sha512-qUgmv/mcth9wHPTOCKgAOeHe5c+BIOJVcbX2RfcjlXO3xnd8nRafwEkZKBNJUjy4oihYhqFMEMnTHLhwLJwLig==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/auth': 1.7.3(@firebase/app@0.10.4) + '@firebase/auth-types': 0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.6) + '@firebase/component': 0.6.7 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + undici: 5.28.4 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + - '@react-native-async-storage/async-storage' + dev: false + /@firebase/auth-interop-types@0.2.1: resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} + /@firebase/auth-interop-types@0.2.3: + resolution: {integrity: sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==} + + /@firebase/auth-types@0.12.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.6): + resolution: {integrity: sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + peerDependenciesMeta: + '@firebase/app-types': + optional: true + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.6 + dev: false + + /@firebase/auth@1.7.3(@firebase/app@0.10.4): + resolution: {integrity: sha512-RiU1PjziOxLuyswtYtLK2qSjHIQJQGCk1h986SUFRbMQfzLXbQg8ZgXwxac1UAfDOzgzqPNCXhBuIlSK2UomoQ==} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + undici: 5.28.4 + dev: false + /@firebase/component@0.6.4: resolution: {integrity: sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==} dependencies: '@firebase/util': 1.9.3 tslib: 2.6.0 + /@firebase/component@0.6.7: + resolution: {integrity: sha512-baH1AA5zxfaz4O8w0vDwETByrKTQqB5CDjRls79Sa4eAGAoERw4Tnung7XbMl3jbJ4B/dmmtsMrdki0KikwDYA==} + dependencies: + '@firebase/util': 1.9.6 + tslib: 2.6.0 + /@firebase/database-compat@0.3.4: resolution: {integrity: sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==} dependencies: @@ -2060,12 +2472,28 @@ packages: '@firebase/util': 1.9.3 tslib: 2.6.0 + /@firebase/database-compat@1.0.5: + resolution: {integrity: sha512-NDSMaDjQ+TZEMDMmzJwlTL05kh1+0Y84C+kVMaOmNOzRGRM7VHi29I6YUhCetXH+/b1Wh4ZZRyp1CuWkd8s6hg==} + dependencies: + '@firebase/component': 0.6.7 + '@firebase/database': 1.0.5 + '@firebase/database-types': 1.0.3 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + /@firebase/database-types@0.10.4: resolution: {integrity: sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==} dependencies: '@firebase/app-types': 0.9.0 '@firebase/util': 1.9.3 + /@firebase/database-types@1.0.3: + resolution: {integrity: sha512-39V/Riv2R3O/aUjYKh0xypj7NTNXNAK1bcgY5Kx+hdQPRS/aPTS8/5c0CGFYKgVuFbYlnlnhrCTYsh2uNhGwzA==} + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.6 + /@firebase/database@0.14.4: resolution: {integrity: sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==} dependencies: @@ -2076,16 +2504,339 @@ packages: faye-websocket: 0.11.4 tslib: 2.6.0 + /@firebase/database@1.0.5: + resolution: {integrity: sha512-cAfwBqMQuW6HbhwI3Cb/gDqZg7aR0OmaJ85WUxlnoYW2Tm4eR0hFl5FEijI3/gYPUiUcUPQvTkGV222VkT7KPw==} + dependencies: + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + faye-websocket: 0.11.4 + tslib: 2.6.0 + + /@firebase/firestore-compat@0.3.32(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4): + resolution: {integrity: sha512-at71mwK7a/mUXH0OgyY0+gUzedm/EUydDFYSFsBoO8DYowZ23Mgd6P4Rzq/Ll3zI/3xJN7LGe7Qp4iE/V/3Arg==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/firestore': 4.6.3(@firebase/app@0.10.4) + '@firebase/firestore-types': 3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.6) + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: false + + /@firebase/firestore-types@3.0.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.6): + resolution: {integrity: sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + peerDependenciesMeta: + '@firebase/app-types': + optional: true + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.6 + dev: false + + /@firebase/firestore@4.6.3(@firebase/app@0.10.4): + resolution: {integrity: sha512-d/+N2iUsiJ/Dc7fApdpdmmTXzwuTCromsdA1lKwYfZtMIOd1fI881NSLwK2wV4I38wkLnvfKJUV6WpU1f3/ONg==} + engines: {node: '>=10.10.0'} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + '@firebase/webchannel-wrapper': 1.0.0 + '@grpc/grpc-js': 1.9.14 + '@grpc/proto-loader': 0.7.13 + tslib: 2.6.0 + undici: 5.28.4 + dev: false + + /@firebase/functions-compat@0.3.11(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4): + resolution: {integrity: sha512-Qn+ts/M6Lj2/6i1cp5V5TRR+Hi9kyXyHbo+w9GguINJ87zxrCe6ulx3TI5AGQkoQa8YFHUhT3DMGmLFiJjWTSQ==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/functions': 0.11.5(@firebase/app@0.10.4) + '@firebase/functions-types': 0.6.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/functions-types@0.6.2: + resolution: {integrity: sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==} + dev: false + + /@firebase/functions@0.11.5(@firebase/app@0.10.4): + resolution: {integrity: sha512-qrHJ+l62mZiU5UZiVi84t/iLXZlhRuSvBQsa2qvNLgPsEWR7wdpWhRmVdB7AU8ndkSHJjGlMICqrVnz47sgU7Q==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/auth-interop-types': 0.2.3 + '@firebase/component': 0.6.7 + '@firebase/messaging-interop-types': 0.2.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + undici: 5.28.4 + dev: false + + /@firebase/installations-compat@0.2.7(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4): + resolution: {integrity: sha512-RPcbD+3nqHbnhVjIOpWK2H5qzZ8pAAAScceiWph0VNTqpKyPQ5tDcp4V5fS0ELpfgsHYvroMLDKfeHxpfvm8cw==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/installations': 0.6.7(@firebase/app@0.10.4) + '@firebase/installations-types': 0.5.2(@firebase/app-types@0.9.2) + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: false + + /@firebase/installations-types@0.5.2(@firebase/app-types@0.9.2): + resolution: {integrity: sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==} + peerDependencies: + '@firebase/app-types': 0.x + peerDependenciesMeta: + '@firebase/app-types': + optional: true + dependencies: + '@firebase/app-types': 0.9.2 + dev: false + + /@firebase/installations@0.6.7(@firebase/app@0.10.4): + resolution: {integrity: sha512-i6iGoXRu5mX4rTsiMSSKrgh9pSEzD4hwBEzRh5kEhOTr8xN/wvQcCPZDSMVYKwM2XyCPBLVq0JzjyerwL0Rihg==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/util': 1.9.6 + idb: 7.1.1 + tslib: 2.6.0 + dev: false + /@firebase/logger@0.4.0: resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} dependencies: tslib: 2.6.0 + /@firebase/logger@0.4.2: + resolution: {integrity: sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==} + dependencies: + tslib: 2.6.0 + + /@firebase/messaging-compat@0.2.9(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4): + resolution: {integrity: sha512-5jN6wyhwPgBH02zOtmmoOeyfsmoD7ty48D1m0vVPsFg55RqN2Z3Q9gkZ5GmPklFPjTPLcxB1ObcHOZvThTkm7g==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/messaging': 0.12.9(@firebase/app@0.10.4) + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/messaging-interop-types@0.2.2: + resolution: {integrity: sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==} + dev: false + + /@firebase/messaging@0.12.9(@firebase/app@0.10.4): + resolution: {integrity: sha512-IH+JJmzbFGZXV3+TDyKdqqKPVfKRqBBg2BfYYOy7cm7J+SwV+uJMe8EnDKYeQLEQhtpwciPfJ3qQXJs2lbxDTw==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/installations': 0.6.7(@firebase/app@0.10.4) + '@firebase/messaging-interop-types': 0.2.2 + '@firebase/util': 1.9.6 + idb: 7.1.1 + tslib: 2.6.0 + dev: false + + /@firebase/performance-compat@0.2.7(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4): + resolution: {integrity: sha512-cb8ge/5iTstxfIGW+iiY+7l3FtN8gobNh9JSQNZgLC9xmcfBYWEs8IeEWMI6S8T+At0oHc3lv+b2kpRMUWr8zQ==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/performance': 0.6.7(@firebase/app@0.10.4) + '@firebase/performance-types': 0.2.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/performance-types@0.2.2: + resolution: {integrity: sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==} + dev: false + + /@firebase/performance@0.6.7(@firebase/app@0.10.4): + resolution: {integrity: sha512-d+Q4ltjdJZqjzcdms5i0UC9KLYX7vKGcygZ+7zHA/Xk+bAbMD2CPU0nWTnlNFWifZWIcXZ/2mAMvaGMW3lypUA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/installations': 0.6.7(@firebase/app@0.10.4) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + dev: false + + /@firebase/remote-config-compat@0.2.7(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4): + resolution: {integrity: sha512-Fq0oneQ4SluLnfr5/HfzRS1TZf1ANj1rWbCCW3+oC98An3nE+sCdp+FSuHsEVNwgMg4Tkwx9Oom2lkKeU+Vn+w==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/remote-config': 0.4.7(@firebase/app@0.10.4) + '@firebase/remote-config-types': 0.3.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/remote-config-types@0.3.2: + resolution: {integrity: sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==} + dev: false + + /@firebase/remote-config@0.4.7(@firebase/app@0.10.4): + resolution: {integrity: sha512-5oPNrPFLsbsjpq0lUEIXoDF2eJK7vAbyXe/DEuZQxnwJlfR7aQbtUlEkRgQWcicXpyDmAmDLo7q7lDbCYa6CpA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/installations': 0.6.7(@firebase/app@0.10.4) + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + dev: false + + /@firebase/storage-compat@0.3.8(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4): + resolution: {integrity: sha512-qDfY9kMb6Ch2hZb40sBjDQ8YPxbjGOxuT+gU1Z0iIVSSpSX0f4YpGJCypUXiA0T11n6InCXB+T/Dknh2yxVTkg==} + peerDependencies: + '@firebase/app-compat': 0.x + peerDependenciesMeta: + '@firebase/app-compat': + optional: true + dependencies: + '@firebase/app-compat': 0.2.34 + '@firebase/component': 0.6.7 + '@firebase/storage': 0.12.5(@firebase/app@0.10.4) + '@firebase/storage-types': 0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.6) + '@firebase/util': 1.9.6 + tslib: 2.6.0 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: false + + /@firebase/storage-types@0.8.2(@firebase/app-types@0.9.2)(@firebase/util@1.9.6): + resolution: {integrity: sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + peerDependenciesMeta: + '@firebase/app-types': + optional: true + dependencies: + '@firebase/app-types': 0.9.2 + '@firebase/util': 1.9.6 + dev: false + + /@firebase/storage@0.12.5(@firebase/app@0.10.4): + resolution: {integrity: sha512-nGWBOGFNr10j0LA4NJ3/Yh3us/lb0Q1xSIKZ38N6FcS+vY54nqJ7k3zE3PENregHC8+8txRow++A568G3v8hOA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.4 + '@firebase/component': 0.6.7 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + undici: 5.28.4 + dev: false + /@firebase/util@1.9.3: resolution: {integrity: sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==} dependencies: tslib: 2.6.0 + /@firebase/util@1.9.6: + resolution: {integrity: sha512-IBr1MZbp4d5MjBCXL3TW1dK/PDXX4yOGbiwRNh1oAbE/+ci5Uuvy9KIrsFYY80as1I0iOaD5oOMA9Q8j4TJWcw==} + dependencies: + tslib: 2.6.0 + + /@firebase/vertexai-preview@0.0.1(@firebase/app-types@0.9.2)(@firebase/app@0.10.4): + resolution: {integrity: sha512-N8m9Xr0YZKy0t9SpQDuHrL2ppEAT/iqf88Y/O00QNA/Td/BMCL8sJ0c+Savh1TVrqh0rNp9n6HkZ39e/O5mwhA==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-types': 0.x + peerDependenciesMeta: + '@firebase/app-types': + optional: true + dependencies: + '@firebase/app': 0.10.4 + '@firebase/app-check-interop-types': 0.3.2 + '@firebase/app-types': 0.9.2 + '@firebase/component': 0.6.7 + '@firebase/logger': 0.4.2 + '@firebase/util': 1.9.6 + tslib: 2.6.0 + dev: false + + /@firebase/webchannel-wrapper@1.0.0: + resolution: {integrity: sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA==} + dev: false + /@google-cloud/bigquery@4.7.0: resolution: {integrity: sha512-u3VN1VUWcbVaW2vH5v2t0Zn5RSC4Hj3VCpf6sUO5xqcNTcHQyrjSd21aIBk28HgQO1H+9Gd1E0tGBfknGNONHw==} engines: {node: '>=8.10.0'} @@ -2138,6 +2889,20 @@ packages: - supports-color optional: true + /@google-cloud/firestore@7.7.0: + resolution: {integrity: sha512-41/vBFXOeSYjFI/2mJuJrDwg2umGk+FDrI/SCGzBRUe+UZWDN4GoahIbGZ19YQsY0ANNl6DRiAy4wD6JezK02g==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + fast-deep-equal: 3.1.3 + functional-red-black-tree: 1.0.1 + google-gax: 4.3.3 + protobufjs: 7.3.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + /@google-cloud/language@3.8.0: resolution: {integrity: sha512-qWzzmJ18y6PE0LEJKVtKSy/EibKoPlvKc6wsgxqBoNPbVFsxdrDyKx81M3QpXg6kE3ktL0iTkwbSbsqMxX5ysA==} engines: {node: '>=8.10.0'} @@ -2176,7 +2941,7 @@ packages: - supports-color dev: false - /@google-cloud/opentelemetry-cloud-trace-exporter@1.1.0(@opentelemetry/api@1.2.0)(@opentelemetry/core@1.15.0)(@opentelemetry/resources@1.15.0)(@opentelemetry/sdk-trace-base@1.15.0)(@opentelemetry/semantic-conventions@1.15.0): + /@google-cloud/opentelemetry-cloud-trace-exporter@1.1.0(@opentelemetry/api@1.2.0)(@opentelemetry/core@1.15.0)(@opentelemetry/resources@1.15.0)(@opentelemetry/sdk-trace-base@1.15.0)(@opentelemetry/semantic-conventions@1.21.0): resolution: {integrity: sha512-pAgk5ieNcOOWBO2OQQsgZ7ZXbutVDCdlVg7srfQT7txTf2UlVajT1DlisEveMpMjjNjHeizjf/4P3NZ8btUlFw==} engines: {node: '>=10'} peerDependencies: @@ -2185,7 +2950,7 @@ packages: '@opentelemetry/resources': ^1.0.0 '@opentelemetry/sdk-trace-base': ^1.0.0 dependencies: - '@google-cloud/opentelemetry-resource-util': 1.2.0(@opentelemetry/resources@1.15.0)(@opentelemetry/semantic-conventions@1.15.0) + '@google-cloud/opentelemetry-resource-util': 1.2.0(@opentelemetry/resources@1.15.0)(@opentelemetry/semantic-conventions@1.21.0) '@grpc/grpc-js': 1.8.14 '@grpc/proto-loader': 0.6.13 '@opentelemetry/api': 1.2.0 @@ -2212,7 +2977,7 @@ packages: hex2dec: 1.1.2 dev: false - /@google-cloud/opentelemetry-resource-util@1.2.0(@opentelemetry/resources@1.15.0)(@opentelemetry/semantic-conventions@1.15.0): + /@google-cloud/opentelemetry-resource-util@1.2.0(@opentelemetry/resources@1.15.0)(@opentelemetry/semantic-conventions@1.21.0): resolution: {integrity: sha512-1NCk5o4mJEMgeJaCjffwAsbdrfRepFJ0ZbfSQ3eS4IyqnUZn5wyX027xtk7lNy0RBJF7lyhQwxtN7sSbtvp+YA==} engines: {node: '>=10'} peerDependencies: @@ -2220,7 +2985,7 @@ packages: '@opentelemetry/semantic-conventions': ^1.0.0 dependencies: '@opentelemetry/resources': 1.15.0(@opentelemetry/api@1.2.0) - '@opentelemetry/semantic-conventions': 1.15.0 + '@opentelemetry/semantic-conventions': 1.21.0 dev: false /@google-cloud/paginator@2.0.3: @@ -2240,6 +3005,14 @@ packages: extend: 3.0.2 optional: true + /@google-cloud/paginator@5.0.0: + resolution: {integrity: sha512-87aeg6QQcEPxGCOthnpUjvw4xAZ57G7pL8FS0C4e/81fr3FjkpUpibf1s2v5XGyGhUVGF4Jfg7yEcxqn2iUw1w==} + engines: {node: '>=14.0.0'} + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + optional: true + /@google-cloud/projectify@1.0.4: resolution: {integrity: sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==} engines: {node: '>=8.10.0'} @@ -2251,6 +3024,11 @@ packages: requiresBuild: true optional: true + /@google-cloud/projectify@4.0.0: + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + optional: true + /@google-cloud/promisify@1.0.4: resolution: {integrity: sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==} engines: {node: '>=8.10.0'} @@ -2267,6 +3045,11 @@ packages: requiresBuild: true optional: true + /@google-cloud/promisify@4.0.0: + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} + optional: true + /@google-cloud/storage@4.7.2: resolution: {integrity: sha512-nlXYhJyC6ErFQX34tMLruknJ9fljN3JepgXEC9MZlQ64/2h9Ee8MJ7FCowdBnTiZ863IkbvctWtNZRrSxfyqSQ==} engines: {node: '>=8.10.0'} @@ -2325,6 +3108,31 @@ packages: - supports-color optional: true + /@google-cloud/storage@7.11.1: + resolution: {integrity: sha512-tibLSvgw7nDohMyIelt26kBpJ59YGWA2Rzep++DFNzEzKaSuCSp56Se9iM13ZlM3j5nLzR21IBkpRN58CmvCIw==} + engines: {node: '>=14'} + requiresBuild: 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 + duplexify: 4.1.3 + fast-xml-parser: 4.4.0 + gaxios: 6.6.0 + google-auth-library: 9.10.0 + html-entities: 2.5.2 + mime: 3.0.0 + p-limit: 3.1.0 + retry-request: 7.0.2 + teeny-request: 9.0.0 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + /@google-cloud/translate@5.3.0: resolution: {integrity: sha512-bQmPe7LYiPNM7F6m0IzoDxG1FqQJdjq5PboOpXt+OBOUR7UKNmAfn8nMVOdKNZTlA7nQdQwX/YKd2wQT2h1d9g==} engines: {node: '>=8.10.0'} @@ -2342,6 +3150,26 @@ packages: - supports-color dev: false + /@google-cloud/vertexai@1.1.0: + resolution: {integrity: sha512-hfwfdlVpJ+kM6o2b5UFfPnweBcz8tgHAFRswnqUKYqLJsvKU0DDD0Z2/YKoHyAUoPJAv20qg6KlC3msNeUKUiw==} + engines: {node: '>=18.0.0'} + dependencies: + google-auth-library: 9.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@google-cloud/vertexai@1.2.0: + resolution: {integrity: sha512-EH0dnoMRIBQzJEEOUWN03eWPSdLBFdsZA/am3eU+qYrnNyY9okUueOajZd79U48KwgFbqoFrCA9yHQ30DgfD8Q==} + engines: {node: '>=18.0.0'} + dependencies: + google-auth-library: 9.10.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@google-cloud/vision@2.4.2: resolution: {integrity: sha512-2IazcBR9K0JJtFJWVXq0Ko3VQtcHG1/xAaxpfJ550aSK7gGq6o4gmDt+z6J61qWYlcE9w7Wb3b+lH6YzqF/HgQ==} engines: {node: '>=10'} @@ -2354,6 +3182,14 @@ packages: - supports-color dev: false + /@grpc/grpc-js@1.10.8: + resolution: {integrity: sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==} + engines: {node: '>=12.10.0'} + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + optional: true + /@grpc/grpc-js@1.3.8: resolution: {integrity: sha512-4qJqqn+CU/nBydz9ePJP+oa8dz0U42Ut/GejlbyaQ1xTkynCc+ndNHHnISlNeHawDsv4MOAyP3mV/EnDNUw2zA==} engines: {node: ^8.13.0 || >=10.10.0} @@ -2365,7 +3201,7 @@ packages: resolution: {integrity: sha512-JmvQ03OTSpVd9JTlj/K3IWHSz4Gk/JMLUTtW7Zb0KvO1LcOYGATh5cNuRYzCAeDR3O8wq+q8FZe97eO9MBrkUw==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.7 + '@grpc/proto-loader': 0.7.13 '@types/node': 17.0.45 dev: false @@ -2373,7 +3209,7 @@ packages: resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.7 + '@grpc/proto-loader': 0.7.13 '@types/node': 17.0.45 dev: false @@ -2382,10 +3218,18 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} requiresBuild: true dependencies: - '@grpc/proto-loader': 0.7.7 + '@grpc/proto-loader': 0.7.13 '@types/node': 17.0.45 optional: true + /@grpc/grpc-js@1.9.14: + resolution: {integrity: sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.13 + '@types/node': 17.0.45 + dev: false + /@grpc/proto-loader@0.5.6: resolution: {integrity: sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==} engines: {node: '>=6'} @@ -2406,15 +3250,14 @@ packages: yargs: 16.2.0 dev: false - /@grpc/proto-loader@0.7.7: - resolution: {integrity: sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==} + /@grpc/proto-loader@0.7.13: + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} engines: {node: '>=6'} hasBin: true dependencies: - '@types/long': 4.0.2 lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 7.2.4 + long: 5.2.3 + protobufjs: 7.3.0 yargs: 17.7.2 /@hapi/address@2.1.4: @@ -2760,6 +3603,10 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@js-sdsl/ordered-map@4.4.2: + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + optional: true + /@jsdoc/salty@0.2.5: resolution: {integrity: sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw==} engines: {node: '>=v12.0.0'} @@ -2876,7 +3723,7 @@ packages: engines: {node: '>=8.12.0'} deprecated: Please use @opentelemetry/api >= 1.3.0 dependencies: - '@opentelemetry/api': 1.2.0 + '@opentelemetry/api': 1.8.0 dev: false /@opentelemetry/api-metrics@0.33.0: @@ -2884,7 +3731,7 @@ packages: engines: {node: '>=14'} deprecated: Please use @opentelemetry/api >= 1.3.0 dependencies: - '@opentelemetry/api': 1.2.0 + '@opentelemetry/api': 1.8.0 dev: false /@opentelemetry/api@1.2.0: @@ -2892,6 +3739,11 @@ packages: engines: {node: '>=8.0.0'} dev: false + /@opentelemetry/api@1.8.0: + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + dev: false + /@opentelemetry/context-async-hooks@1.7.0(@opentelemetry/api@1.2.0): resolution: {integrity: sha512-g4bMzyVW5dVBeMkyadaf3NRFpmNrdD4Pp9OJsrP29HwIam/zVMNfIWQpT5IBzjtTSMhl/ED5YQYR+UOSjVq3sQ==} engines: {node: '>=14'} @@ -3120,6 +3972,11 @@ packages: tslib: 2.6.0 dev: false + /@opentelemetry/semantic-conventions@1.21.0: + resolution: {integrity: sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g==} + engines: {node: '>=14'} + dev: false + /@opentelemetry/semantic-conventions@1.7.0: resolution: {integrity: sha512-FGBx/Qd09lMaqQcogCHyYrFEpTx4cAjeS+48lMIR12z7LdH+zofGDVQSubN59nL6IpubfKqTeIDu9rNO28iHVA==} engines: {node: '>=14'} @@ -3285,6 +4142,10 @@ packages: '@types/connect': 3.4.35 '@types/node': 17.0.45 + /@types/caseless@0.12.5: + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + optional: true + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: @@ -3464,6 +4325,11 @@ packages: /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + /@types/node@20.12.12: + resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + dependencies: + undici-types: 5.26.5 + /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} dev: true @@ -3474,6 +4340,15 @@ packages: /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + /@types/request@2.48.12: + resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 17.0.45 + '@types/tough-cookie': 4.0.2 + form-data: 2.5.1 + optional: true + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: @@ -3511,7 +4386,6 @@ packages: /@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} - dev: false /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -3712,6 +4586,14 @@ packages: transitivePeerDependencies: - supports-color + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -3811,6 +4693,7 @@ packages: /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} + deprecated: This package is no longer supported. dependencies: delegates: 1.0.0 readable-stream: 3.6.2 @@ -3916,7 +4799,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} @@ -4077,7 +4959,6 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -4182,7 +5063,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -4342,7 +5222,6 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -4465,6 +5344,10 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} dev: false /component-emitter@1.3.0: @@ -4733,7 +5616,6 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: false /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -4749,7 +5631,6 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: false /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -4773,7 +5654,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: false /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -4795,7 +5675,6 @@ packages: /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} - dev: false /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} @@ -4934,6 +5813,15 @@ packages: readable-stream: 3.6.2 stream-shift: 1.0.1 + /duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + optional: true + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: @@ -5095,6 +5983,36 @@ packages: es6-promise: 4.2.8 dev: false + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -5364,7 +6282,6 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - dev: false /expect@28.1.3: resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} @@ -5438,6 +6355,14 @@ packages: engines: {'0': node >=0.6.0} dev: false + /farmhash@3.3.1: + resolution: {integrity: sha512-XUizHanzlr/v7suBr/o85HSakOoWh6HKXZjFYl5C2+Gj0f0rkw+XTUZzrd9odDsgI9G5tRUcF4wSbKaX04T0DQ==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + node-addon-api: 5.1.0 + prebuild-install: 7.1.2 + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5461,6 +6386,13 @@ packages: /fast-text-encoding@1.0.6: resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} + /fast-xml-parser@4.4.0: + resolution: {integrity: sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==} + hasBin: true + dependencies: + strnum: 1.0.5 + optional: true + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -5555,17 +6487,38 @@ packages: resolution: {integrity: sha512-My7qrInVZFmImX8aTulrp9kgY6d88Wn+ie8UIXKzZ3SJqQQhDwFT7Q3pgQXK9RfdsUtcxJJ3rCK7MWBm4GGtuw==} engines: {node: '>=14'} dependencies: - '@fastify/busboy': 1.2.1 - '@firebase/database-compat': 0.3.4 - '@firebase/database-types': 0.10.4 - '@types/node': 17.0.45 + '@fastify/busboy': 1.2.1 + '@firebase/database-compat': 0.3.4 + '@firebase/database-types': 0.10.4 + '@types/node': 17.0.45 + jsonwebtoken: 9.0.1 + jwks-rsa: 3.0.1 + node-forge: 1.3.1 + uuid: 9.0.0 + optionalDependencies: + '@google-cloud/firestore': 6.6.1 + '@google-cloud/storage': 6.11.0 + transitivePeerDependencies: + - encoding + - supports-color + + /firebase-admin@12.1.0: + resolution: {integrity: sha512-bU7uPKMmIXAihWxntpY/Ma9zucn5y3ec+HQPqFQ/zcEfP9Avk9E/6D8u+yT/VwKHNZyg7yDVWOoJi73TIdR4Ww==} + engines: {node: '>=14'} + dependencies: + '@fastify/busboy': 2.1.1 + '@firebase/database-compat': 1.0.5 + '@firebase/database-types': 1.0.3 + '@types/node': 20.12.12 + farmhash: 3.3.1 jsonwebtoken: 9.0.1 jwks-rsa: 3.0.1 + long: 5.2.3 node-forge: 1.3.1 - uuid: 9.0.0 + uuid: 9.0.1 optionalDependencies: - '@google-cloud/firestore': 6.6.1 - '@google-cloud/storage': 6.11.0 + '@google-cloud/firestore': 7.7.0 + '@google-cloud/storage': 7.11.1 transitivePeerDependencies: - encoding - supports-color @@ -5586,6 +6539,38 @@ packages: ts-deepmerge: 2.0.7 dev: true + /firebase-functions-test@3.1.0(firebase-admin@12.1.0)(firebase-functions@4.9.0)(jest@28.1.3): + resolution: {integrity: sha512-yfm9ToguShxmRXb7TINN88zE2bM9gsBbs7vMWVKJAxGcl/n1f/U0sT5k2yho676QIcSqXVSjCONU8W4cUEL+Sw==} + engines: {node: '>=14.0.0'} + peerDependencies: + firebase-admin: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + firebase-functions: '>=4.3.0' + jest: '>=28.0.0' + dependencies: + '@types/lodash': 4.14.194 + firebase-admin: 12.1.0 + firebase-functions: 4.9.0(firebase-admin@12.1.0) + jest: 28.1.3(@types/node@17.0.45) + lodash: 4.17.21 + ts-deepmerge: 2.0.7 + dev: true + + /firebase-functions-test@3.1.0(firebase-admin@12.1.0)(firebase-functions@5.0.0)(jest@28.1.3): + resolution: {integrity: sha512-yfm9ToguShxmRXb7TINN88zE2bM9gsBbs7vMWVKJAxGcl/n1f/U0sT5k2yho676QIcSqXVSjCONU8W4cUEL+Sw==} + engines: {node: '>=14.0.0'} + peerDependencies: + firebase-admin: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + firebase-functions: '>=4.3.0' + jest: '>=28.0.0' + dependencies: + '@types/lodash': 4.14.194 + firebase-admin: 12.1.0 + firebase-functions: 5.0.0(firebase-admin@12.1.0) + jest: 28.1.3(@types/node@17.0.45) + lodash: 4.17.21 + ts-deepmerge: 2.0.7 + dev: true + /firebase-functions@4.4.1(firebase-admin@11.9.0): resolution: {integrity: sha512-3no53Lg12ToNlPSgLZtAFLQAz6si7ilHvzO8NC3/2EybyUwegpj5YhHwNiCw839lmAWp3znjATJDTvADFiZMrg==} engines: {node: '>=14.10.0'} @@ -5621,6 +6606,72 @@ packages: - supports-color dev: false + /firebase-functions@4.9.0(firebase-admin@12.1.0): + resolution: {integrity: sha512-IqxOEsVAWGcRv9KRGzWQR5mOFuNsil3vsfkRPPiaV1U/ATC27/jbahh4z8I4rW8Xqa6cQE5xqnw0ueyMH7i7Ag==} + engines: {node: '>=14.10.0'} + hasBin: true + peerDependencies: + firebase-admin: ^10.0.0 || ^11.0.0 || ^12.0.0 + dependencies: + '@types/cors': 2.8.13 + '@types/express': 4.17.3 + cors: 2.8.5 + express: 4.18.2 + firebase-admin: 12.1.0 + protobufjs: 7.2.4 + transitivePeerDependencies: + - supports-color + + /firebase-functions@5.0.0(firebase-admin@12.1.0): + resolution: {integrity: sha512-iGG41MavOS+RtEsbcq2j/ltQ8L2Oji71dRpwVur+meIQWkvXCYb2QJtnyp0ryQVnV3NyjV+3Vdx7OnmD+Hanuw==} + engines: {node: '>=14.10.0'} + hasBin: true + peerDependencies: + firebase-admin: ^11.10.0 || ^12.0.0 + dependencies: + '@types/cors': 2.8.13 + '@types/express': 4.17.3 + cors: 2.8.5 + express: 4.18.2 + firebase-admin: 12.1.0 + protobufjs: 7.3.0 + transitivePeerDependencies: + - supports-color + + /firebase@10.12.1: + resolution: {integrity: sha512-B/R3BX26OAgreA64JN0lYspYRHMS36E19/Sv9WsyQu1RqPGBzWkBlt1RW6+38SdtMDlAnk3ibKL/SRSQHb1xRw==} + dependencies: + '@firebase/analytics': 0.10.4(@firebase/app@0.10.4) + '@firebase/analytics-compat': 0.2.10(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4) + '@firebase/app': 0.10.4 + '@firebase/app-check': 0.8.4(@firebase/app@0.10.4) + '@firebase/app-check-compat': 0.3.11(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4) + '@firebase/app-compat': 0.2.34 + '@firebase/app-types': 0.9.2 + '@firebase/auth': 1.7.3(@firebase/app@0.10.4) + '@firebase/auth-compat': 0.5.8(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4) + '@firebase/database': 1.0.5 + '@firebase/database-compat': 1.0.5 + '@firebase/firestore': 4.6.3(@firebase/app@0.10.4) + '@firebase/firestore-compat': 0.3.32(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4) + '@firebase/functions': 0.11.5(@firebase/app@0.10.4) + '@firebase/functions-compat': 0.3.11(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4) + '@firebase/installations': 0.6.7(@firebase/app@0.10.4) + '@firebase/installations-compat': 0.2.7(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4) + '@firebase/messaging': 0.12.9(@firebase/app@0.10.4) + '@firebase/messaging-compat': 0.2.9(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4) + '@firebase/performance': 0.6.7(@firebase/app@0.10.4) + '@firebase/performance-compat': 0.2.7(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4) + '@firebase/remote-config': 0.4.7(@firebase/app@0.10.4) + '@firebase/remote-config-compat': 0.2.7(@firebase/app-compat@0.2.34)(@firebase/app@0.10.4) + '@firebase/storage': 0.12.5(@firebase/app@0.10.4) + '@firebase/storage-compat': 0.3.8(@firebase/app-compat@0.2.34)(@firebase/app-types@0.9.2)(@firebase/app@0.10.4) + '@firebase/util': 1.9.6 + '@firebase/vertexai-preview': 0.0.1(@firebase/app-types@0.9.2)(@firebase/app@0.10.4) + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + dev: false + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5698,7 +6749,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: false /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} @@ -5722,7 +6772,6 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} @@ -5776,6 +6825,7 @@ packages: /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} + deprecated: This package is no longer supported. dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -5867,6 +6917,19 @@ packages: - encoding - supports-color + /gaxios@6.6.0: + resolution: {integrity: sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==} + engines: {node: '>=14'} + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.4 + is-stream: 2.0.1 + node-fetch: 2.6.12 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + /gcp-metadata@0.6.3: resolution: {integrity: sha512-MSmczZctbz91AxCvqp9GHBoZOSbJKAICV7Ow/AIWSJZRrRchUd5NL1b2P4OfP+4m490BEUPhhARfpHdqCxuCvg==} engines: {node: '>=4'} @@ -5934,6 +6997,16 @@ packages: - supports-color optional: true + /gcp-metadata@6.1.0: + resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==} + engines: {node: '>=14'} + dependencies: + gaxios: 6.6.0 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + /gcs-resumable-upload@2.3.3: resolution: {integrity: sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==} engines: {node: '>=8.10.0'} @@ -6011,7 +7084,6 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -6227,6 +7299,20 @@ packages: - supports-color optional: true + /google-auth-library@9.10.0: + resolution: {integrity: sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==} + engines: {node: '>=14'} + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.6.0 + gcp-metadata: 6.1.0 + gtoken: 7.1.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + /google-gax@1.15.4: resolution: {integrity: sha512-Wzl43ueWEKNsLcMJ33sPps179nD7wn6Jcl/P+ZQNS+HxdCJcoQEgJe3AmulsJnatwjBE3pVPIE4HFJNhpRGvUw==} engines: {node: '>=8.10.0'} @@ -6282,11 +7368,11 @@ packages: requiresBuild: true dependencies: '@grpc/grpc-js': 1.8.17 - '@grpc/proto-loader': 0.7.7 + '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 '@types/rimraf': 3.0.2 abort-controller: 3.0.0 - duplexify: 4.1.2 + duplexify: 4.1.3 fast-text-encoding: 1.0.6 google-auth-library: 8.9.0 is-stream-ended: 0.1.4 @@ -6301,6 +7387,27 @@ packages: - supports-color optional: true + /google-gax@4.3.3: + resolution: {integrity: sha512-f4F2Y9X4+mqsrJuLZsuTljYuQpcBnQsCt9ScvZpdM8jGjqrcxyJi5JUiqtq0jtpdHVPzyit0N7f5t07e+kH5EA==} + engines: {node: '>=14'} + dependencies: + '@grpc/grpc-js': 1.10.8 + '@grpc/proto-loader': 0.7.13 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.3 + google-auth-library: 9.10.0 + node-fetch: 2.6.12 + object-hash: 3.0.0 + proto3-json-serializer: 2.0.1 + protobufjs: 7.2.6 + retry-request: 7.0.2 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + /google-p12-pem@1.0.5: resolution: {integrity: sha512-50rTrqYPTPPwlu9TNl/HkJbBENEpbRzTOVLFJ4YWM86njZgXHFy+FP+tLRSd9m132Li9Dqi27Z3KIWDEv5y+EA==} hasBin: true @@ -6508,6 +7615,16 @@ packages: - encoding - supports-color + /gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + dependencies: + gaxios: 6.6.0 + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + /handlebars@4.7.7: resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} engines: {node: '>=0.4.7'} @@ -6600,6 +7717,10 @@ packages: resolution: {integrity: sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==} dev: false + /html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + optional: true + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true @@ -6704,6 +7825,15 @@ packages: transitivePeerDependencies: - supports-color + /https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -6715,9 +7845,12 @@ packages: dependencies: safer-buffer: 2.1.2 + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: false + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} @@ -6752,6 +7885,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -6761,7 +7895,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} @@ -7829,6 +8962,7 @@ packages: /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} @@ -8016,7 +9150,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: false /minimatch@3.0.4: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} @@ -8075,7 +9208,6 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false /mkdirp@0.5.5: resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} @@ -8179,9 +9311,14 @@ packages: hasBin: true dev: true + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -8233,7 +9370,9 @@ packages: engines: {node: '>=10'} dependencies: semver: 7.5.3 - dev: false + + /node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} @@ -8357,6 +9496,7 @@ packages: /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 @@ -8699,6 +9839,15 @@ packages: hasBin: true dev: true + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: true + /prebuild-install@7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} @@ -8718,6 +9867,24 @@ packages: tunnel-agent: 0.6.0 dev: false + /prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.40.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -8791,7 +9958,14 @@ packages: engines: {node: '>=12.0.0'} requiresBuild: true dependencies: - protobufjs: 7.2.4 + protobufjs: 7.3.0 + optional: true + + /proto3-json-serializer@2.0.1: + resolution: {integrity: sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==} + engines: {node: '>=14.0.0'} + dependencies: + protobufjs: 7.3.0 optional: true /protobufjs-cli@1.1.1(protobufjs@7.2.3): @@ -8872,6 +10046,43 @@ packages: '@types/node': 17.0.45 long: 5.2.3 + /protobufjs@7.2.6: + resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + engines: {node: '>=12.0.0'} + requiresBuild: 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': 17.0.45 + long: 5.2.3 + optional: true + + /protobufjs@7.3.0: + resolution: {integrity: sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==} + engines: {node: '>=12.0.0'} + requiresBuild: 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': 17.0.45 + long: 5.2.3 + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -8891,7 +10102,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false /pumpify@2.0.1: resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} @@ -8976,7 +10186,6 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: false /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -9184,6 +10393,18 @@ packages: - supports-color optional: true + /retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + dependencies: + '@types/request': 2.48.12 + extend: 3.0.2 + teeny-request: 9.0.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + /retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -9205,6 +10426,14 @@ packages: resolution: {integrity: sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==} dev: false + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -9348,6 +10577,13 @@ packages: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} dev: false + /showdown@2.1.0: + resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} + hasBin: true + dependencies: + commander: 9.5.0 + dev: false + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -9360,7 +10596,6 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false /simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} @@ -9376,7 +10611,6 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: false /simple-oauth2@3.4.0: resolution: {integrity: sha512-gDPCC/xjq82FJnzF7+XGUUMWWfHeibuGsp3OYOV7yHwIibxHkq4+WSxywY63/3BF9j8SfIDygGqBrPLynx/iuQ==} @@ -9441,6 +10675,11 @@ packages: resolution: {integrity: sha512-ot3bb6pQt6IVq5G/JQ640ceSYTPtriVrwNyfoUw1LmQQGzPMAGxE5F+ded2UwSUCyf2PW1fFAYUnVEX21PWbpQ==} dev: false + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -9509,6 +10748,10 @@ packages: /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + optional: true + /string-format-obj@1.1.1: resolution: {integrity: sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==} dev: false @@ -9643,6 +10886,10 @@ packages: qs: 6.11.1 dev: false + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + optional: true + /stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} @@ -9710,7 +10957,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: false /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -9721,7 +10967,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false /tar@6.1.14: resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} @@ -9757,7 +11002,21 @@ packages: https-proxy-agent: 5.0.1 node-fetch: 2.6.12 stream-events: 1.0.5 - uuid: 9.0.0 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + /teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.12 + stream-events: 1.0.5 + uuid: 9.0.1 transitivePeerDependencies: - encoding - supports-color @@ -9931,7 +11190,6 @@ packages: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 - dev: false /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -10008,6 +11266,12 @@ packages: hasBin: true dev: true + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /typesense@0.13.0(@babel/runtime@7.20.1): resolution: {integrity: sha512-ERSwH5CLgM69UWGVk8WuNR7VQ4wGRc8g/0vbsTqu0gNnuVCLxN4sI5AjNmn6mHBrdCXS9DfOvcN+6h9ldRfbwA==} peerDependencies: @@ -10053,6 +11317,16 @@ packages: requiresBuild: true optional: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: false + /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -10117,6 +11391,10 @@ packages: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + /v8-to-istanbul@9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} @@ -10147,6 +11425,41 @@ packages: resolution: {integrity: sha512-yLTU+/TMf4gaHnbfcV0DQJRQuhp6dh0Jsl1g26sXNV93wLswly6/azFwvZrtm/QBMD8r82/N3+5YpsiQ+jcdkA==} dev: false + /vite@4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.38 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /walkdir@0.4.1: resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==} engines: {node: '>=6.0.0'}