From 4ac9ce8815668777e2817db30b15fc5b3784c50c Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Thu, 2 May 2024 21:01:55 +0530 Subject: [PATCH 01/17] GUI for onix --- onix-gui/.eslintrc.json | 3 + onix-gui/.gitignore | 36 + onix-gui/README.md | 52 + onix-gui/app/Infy_Pending.pdf | Bin 0 -> 101618 bytes onix-gui/app/api/check-layer2/route.js | 66 + onix-gui/app/api/clonning-repo/route.js | 36 + onix-gui/app/api/install-bap/route.js | 116 + onix-gui/app/api/install-bpp/route.js | 128 + onix-gui/app/api/install-gateway/route.js | 92 + onix-gui/app/api/install-layer2/route.js | 38 + onix-gui/app/api/install-registry/route.js | 156 + onix-gui/app/favicon.ico | Bin 0 -> 25931 bytes onix-gui/app/globals.css | 19 + onix-gui/app/install/configure/page.js | 58 + onix-gui/app/install/create/page.js | 67 + onix-gui/app/install/join/page.js | 68 + onix-gui/app/install/local/page.js | 60 + onix-gui/app/install/merge/page.js | 58 + onix-gui/app/install/page.js | 54 + onix-gui/app/layout.js | 22 + onix-gui/app/page.js | 55 + onix-gui/app/page.module.css | 182 + onix-gui/app/setup/bap/page.js | 132 + onix-gui/app/setup/bpp/page.js | 146 + onix-gui/app/setup/gateway/page.js | 126 + onix-gui/app/setup/registry/page.js | 96 + onix-gui/app/template.csv | 1 + onix-gui/app/yaml-gen/install-yaml/page.js | 105 + onix-gui/app/yaml-gen/page.js | 183 + .../components/Buttons/Buttons.module.css | 24 + onix-gui/components/Buttons/PrimaryButton.js | 16 + .../components/Buttons/SecondaryButton.jsx | 8 + onix-gui/components/InputField/InputField.jsx | 19 + .../InputField/InputField.module.css | 23 + onix-gui/components/Slider/Slider.jsx | 20 + onix-gui/components/Slider/Slider.module.css | 67 + onix-gui/jsconfig.json | 7 + onix-gui/next.config.mjs | 4 + onix-gui/package-lock.json | 4247 +++++++++++++++++ onix-gui/package.json | 22 + onix-gui/public/arrow.png | Bin 0 -> 261 bytes onix-gui/scripts/start.sh | 49 + 42 files changed, 6661 insertions(+) create mode 100644 onix-gui/.eslintrc.json create mode 100644 onix-gui/.gitignore create mode 100644 onix-gui/README.md create mode 100644 onix-gui/app/Infy_Pending.pdf create mode 100644 onix-gui/app/api/check-layer2/route.js create mode 100644 onix-gui/app/api/clonning-repo/route.js create mode 100644 onix-gui/app/api/install-bap/route.js create mode 100644 onix-gui/app/api/install-bpp/route.js create mode 100644 onix-gui/app/api/install-gateway/route.js create mode 100644 onix-gui/app/api/install-layer2/route.js create mode 100644 onix-gui/app/api/install-registry/route.js create mode 100644 onix-gui/app/favicon.ico create mode 100644 onix-gui/app/globals.css create mode 100644 onix-gui/app/install/configure/page.js create mode 100644 onix-gui/app/install/create/page.js create mode 100644 onix-gui/app/install/join/page.js create mode 100644 onix-gui/app/install/local/page.js create mode 100644 onix-gui/app/install/merge/page.js create mode 100644 onix-gui/app/install/page.js create mode 100644 onix-gui/app/layout.js create mode 100644 onix-gui/app/page.js create mode 100644 onix-gui/app/page.module.css create mode 100644 onix-gui/app/setup/bap/page.js create mode 100644 onix-gui/app/setup/bpp/page.js create mode 100644 onix-gui/app/setup/gateway/page.js create mode 100644 onix-gui/app/setup/registry/page.js create mode 100644 onix-gui/app/template.csv create mode 100644 onix-gui/app/yaml-gen/install-yaml/page.js create mode 100644 onix-gui/app/yaml-gen/page.js create mode 100644 onix-gui/components/Buttons/Buttons.module.css create mode 100644 onix-gui/components/Buttons/PrimaryButton.js create mode 100644 onix-gui/components/Buttons/SecondaryButton.jsx create mode 100644 onix-gui/components/InputField/InputField.jsx create mode 100644 onix-gui/components/InputField/InputField.module.css create mode 100644 onix-gui/components/Slider/Slider.jsx create mode 100644 onix-gui/components/Slider/Slider.module.css create mode 100644 onix-gui/jsconfig.json create mode 100644 onix-gui/next.config.mjs create mode 100644 onix-gui/package-lock.json create mode 100644 onix-gui/package.json create mode 100644 onix-gui/public/arrow.png create mode 100755 onix-gui/scripts/start.sh diff --git a/onix-gui/.eslintrc.json b/onix-gui/.eslintrc.json new file mode 100644 index 0000000..bffb357 --- /dev/null +++ b/onix-gui/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/onix-gui/.gitignore b/onix-gui/.gitignore new file mode 100644 index 0000000..fd3dbb5 --- /dev/null +++ b/onix-gui/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/onix-gui/README.md b/onix-gui/README.md new file mode 100644 index 0000000..5453b9b --- /dev/null +++ b/onix-gui/README.md @@ -0,0 +1,52 @@ +# beckn-onix-gui + +The GUI for the beckn-onix cli tool. + +## Pre-requisites + +1. 4 server/instances +2. 4 sub-domains mapped to each instance + +## User Guide + +### Step 1: Clone the beckn-onix-gui repo + +``` +git clone https://github.com/Mishalabdullah/beckn-onix-gui.git +``` + +### Step 2: Change directory to the nextjs project + +``` +cd onix-gui +``` + +### Step 3: Run nextjs on port 3005 + +For running the installation script just run this command. The sudo privilages are required when installing packages and configuring the nginx reverse proxy + +``` +sudo ./start.sh +``` + +Note: Port 3000 is being used by onix, so we're using port 3005 instead. + +### Step 4: Configure a reverse proxy using NGINX + +Map port 3005 to a domain or use your machine IP:3005 to access the GUI from your browser. + +### Step 5: Secure with certbot + +Use certbot to obtain an SSL certificate and secure your GUI. + +## Contributing + +Contributions are welcome! If you'd like to contribute to the beckn-onix-gui project, please fork the repo and submit a pull request. + +## License + +The beckn-onix-gui project is licensed under the MIT License. See the LICENSE file for more information. + +## Contact + +If you have any questions or issues with the beckn-onix-gui project, please don't hesitate to reach out. diff --git a/onix-gui/app/Infy_Pending.pdf b/onix-gui/app/Infy_Pending.pdf new file mode 100644 index 0000000000000000000000000000000000000000..30a4d43cb28dc10ae96ca3ae1803b15560e79c52 GIT binary patch literal 101618 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�cl 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 literal 0 HcmV?d00001 diff --git a/onix-gui/app/api/check-layer2/route.js b/onix-gui/app/api/check-layer2/route.js new file mode 100644 index 0000000..1fb27cf --- /dev/null +++ b/onix-gui/app/api/check-layer2/route.js @@ -0,0 +1,66 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; + +export async function POST(req) { + const request = await req.json(); + const containerName = request.checked ? "bpp-network" : "bap-network"; + const fileToCheck = request.fileName; + + const executeShellCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + if (stderr) { + console.error("Error:", stderr); + reject(new Error(stderr)); + return; + } + const output = stdout; + console.log("Output:", output); + resolve(output); + }); + }); + }; + + try { + const containerExists = await executeShellCommand( + `docker ps -a --filter "name=${containerName}" --format "{{.Names}}"` + ); + if (!containerExists.trim()) { + return new NextResponse(`Error: ${containerName} server not present`, { + status: 500, + }); + } + + const result = await executeShellCommand( + `docker exec ${containerName} /bin/sh -c "[ -f '/usr/src/app/schemas/${fileToCheck}' ] && echo 'File found' || echo 'File not found'"` + ); + if (result.trim() === "File found") { + return NextResponse.json( + { message: true }, + { + status: 200, + } + ); + } else { + return NextResponse.json( + { message: false }, + { + status: 200, + } + ); + } + } catch (error) { + console.error(`exec error: ${error}`); + return NextResponse.json( + { message: `Error executing shell command: ${error}` }, + { + status: 500, + } + ); + } +} diff --git a/onix-gui/app/api/clonning-repo/route.js b/onix-gui/app/api/clonning-repo/route.js new file mode 100644 index 0000000..e8c0225 --- /dev/null +++ b/onix-gui/app/api/clonning-repo/route.js @@ -0,0 +1,36 @@ +import { spawn } from "child_process"; +import { NextResponse } from "next/server"; +import os from "os"; +import path from "path"; +// This function is used to clone the github repository of beckn-onix +export async function GET(req) { + console.log("Cloning GitHub repository..."); + const repoUrl = "https://github.com/beckn/beckn-onix"; + const destination = path.join(os.homedir(), "beckn-onix"); + const gitProcess = spawn("git", ["clone", repoUrl, destination]); + + gitProcess.stdout.on("data", (data) => { + console.log(`stdout: ${data}`); + }); + + gitProcess.stderr.on("data", (data) => { + console.error(`stderr: ${data}`); + }); + + return new Promise((resolve, reject) => { + gitProcess.on("close", (code) => {const destination = "~/beckn-onix"; + if (code === 0) { + console.log("Repository cloned successfully"); + resolve( + NextResponse.json( + { success: true, data: "Repo Cloned Successfully" }, + { status: 200 } + ) + ); + } else { + console.error(`git process exited with code ${code}`); + resolve(NextResponse.json({ success: false }, { status: 500 })); + } + }); + }); +} diff --git a/onix-gui/app/api/install-bap/route.js b/onix-gui/app/api/install-bap/route.js new file mode 100644 index 0000000..2c5fb04 --- /dev/null +++ b/onix-gui/app/api/install-bap/route.js @@ -0,0 +1,116 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; +import { promises as fs } from "fs"; +import { join } from "path"; +import os from "os"; + +const pathDir = join(os.homedir(), "beckn-onix"); + +const executeCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + const output = stdout + stderr; + console.log("Output:", output); + resolve(output); + }); + }); +}; + +async function directoryExists(path) { + try { + await fs.access(path); + return true; + } catch (error) { + return false; + } +} +export async function startSupportServices() { + try { + process.env.COMPOSE_IGNORE_ORPHANS = "1"; + + const result1 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d mongo_db` + ); + console.log("Result 1:", result1); + + const result2 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d queue_service` + ); + console.log("Result 2:", result2); + + const result3 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` + ); + console.log("Result 3:", result3); + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + await executeCommand("docker volume create gateway_data_volume"); + await executeCommand("docker volume create gateway_database_volume"); + return NextResponse.json({ result1, result2, result3 }); + } catch (error) { + console.error("An error occurred:", error); + return NextResponse.json({ error: "An error occurred" }, { status: 500 }); + } +} + +export async function POST(req) { + const becknOnixDirExists = await directoryExists(pathDir); + + if (!becknOnixDirExists) { + console.log(`Directory "${pathDir}" does not exist. Cloning repository...`); + try { + const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); + if (!response.ok) { + console.error( + `Failed to clone repository: ${response.status} ${response.statusText}` + ); + return NextResponse.json( + { + error: `Failed to clone repository: ${response.status} ${response.statusText}`, + }, + { status: 500 } + ); + } + console.log("Repository cloned successfully."); + } catch (error) { + console.error("An error occurred while cloning the repository:", error); + return NextResponse.json( + { error: "An error occurred while cloning the repository" }, + { status: 500 } + ); + } + } + + try { + await startSupportServices(); + const data = await req.json(); + + const registryUrl = data.registryUrl; + const bppSubscriberId = data.subscriberId; + const bppSubscriberUrl = data.subscriberUrl; + const networkconfigurl = data.networkconfigurl; + + let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bap_config.sh ${registryUrl} ${bppSubscriberId} ${bppSubscriberUrl} ${networkconfigurl}`; + const result1 = await executeCommand(updateBppConfigCommand); + console.log("Result 1:", result1); + const result3 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-client"` + ); + console.log("Result 3:", result3); + + const result4 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-network"` + ); + console.log("Result 4:", result4); + + return NextResponse.json({ result1, result3, result4 }); + } catch (error) { + console.error("An error occurred:", error); + return NextResponse.json({ error: "An error occurred" }, { status: 500 }); + } +} diff --git a/onix-gui/app/api/install-bpp/route.js b/onix-gui/app/api/install-bpp/route.js new file mode 100644 index 0000000..2ac5ca0 --- /dev/null +++ b/onix-gui/app/api/install-bpp/route.js @@ -0,0 +1,128 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; +import { promises as fs } from "fs"; +import { join } from "path"; +import os from "os"; + +const pathDir = join(os.homedir(), "beckn-onix"); +async function directoryExists(path) { + try { + await fs.access(path); + return true; + } catch (error) { + return false; + } +} + +const executeCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + const output = stdout + stderr; + console.log("Output:", output); + resolve(output); + }); + }); +}; + +export async function startSupportServices() { + try { + process.env.COMPOSE_IGNORE_ORPHANS = "1"; + + const result1 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d mongo_db` + ); + console.log("Result 1:", result1); + + const result2 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d queue_service` + ); + console.log("Result 2:", result2); + + const result3 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` + ); + console.log("Result 3:", result3); + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + await executeCommand("docker volume create gateway_data_volume"); + await executeCommand("docker volume create gateway_database_volume"); + return NextResponse.json({ result1, result2, result3 }); + } catch (error) { + console.error("An error occurred:", error); + return NextResponse.json({ error: "An error occurred" }, { status: 500 }); + } +} + +export async function POST(req, res) { + const becknOnixDirExists = await directoryExists(pathDir); + console.log("Installing Beckn Onix...", becknOnixDirExists); + + if (!becknOnixDirExists) { + console.log(`Directory beckn-onix does not exist. Cloning repository...`); + try { + const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); + if (!response.ok) { + console.error( + `Failed to clone repository: ${response.status} ${response.statusText}` + ); + return NextResponse.json( + { + error: `Failed to clone repository: ${response.status} ${response.statusText}`, + }, + { status: 500 } + ); + } + console.log("Repository cloned successfully."); + } catch (error) { + console.error("An error occurred while cloning the repository:", error); + return NextResponse.json( + { error: "An error occurred while cloning the repository" }, + { status: 500 } + ); + } + } + + try { + await startSupportServices(); + const data = req.json(); + const registryUrl = data.registryUrl; + const bppSubscriberId = data.subscriberId; + const bppSubscriberUrl = data.subscriberUrl; + const webhookUrl = data.webhookUrl; + // const webhookUrl = "https://unified-bpp.becknprotocol.io/beckn-bpp-adapter"; + + // let updateBppConfigCommand = "bash scripts/update_bpp_config.sh"; + // if (registryUrl) { + // updateBppConfigCommand += ``; + // } + let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bpp_config.sh ${registryUrl} ${bppSubscriberId} ${bppSubscriberUrl} ${webhookUrl}`; + const result1 = await executeCommand(updateBppConfigCommand); + console.log("Result 1:", result1); + + const result2 = await executeCommand("sleep 10"); + console.log("Result 2:", result2); + + const result3 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d bpp-client` + ); + console.log("Result 3:", result3); + + const result4 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d bpp-network` + ); + console.log("Result 4:", result4); + + const result5 = await executeCommand("sleep 10"); + console.log("Result 5:", result5); + + return NextResponse.json({ result1, result2, result3, result4, result5 }); + } catch (error) { + console.error("An error occurred:", error); + return NextResponse.json({ error: "An error occurred" }, { status: 500 }); + } +} diff --git a/onix-gui/app/api/install-gateway/route.js b/onix-gui/app/api/install-gateway/route.js new file mode 100644 index 0000000..3545f6e --- /dev/null +++ b/onix-gui/app/api/install-gateway/route.js @@ -0,0 +1,92 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; +import { promises as fs } from "fs"; +import { join } from "path"; +import os from "os"; + +async function directoryExists(path) { + try { + await fs.access(path); + return true; + } catch (error) { + return false; + } +} + +export async function POST(req, res) { + const pathDir = join(os.homedir(), "beckn-onix"); + const becknOnixDirExists = await directoryExists(pathDir); + console.log("Installing Beckn Onix...", becknOnixDirExists); + + if (!becknOnixDirExists) { + console.log(`Directory beckn-onix does not exist. Cloning repository...`); + try { + const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); + if (!response.ok) { + console.error( + `Failed to clone repository: ${response.status} ${response.statusText}` + ); + return NextResponse.json( + { + error: `Failed to clone repository: ${response.status} ${response.statusText}`, + }, + { status: 500 } + ); + } + console.log("Repository cloned successfully."); + } catch (error) { + console.error("An error occurred while cloning the repository:", error); + return NextResponse.json( + { error: "An error occurred while cloning the repository" }, + { status: 500 } + ); + } + } + + const data = await req.json(); + const executeCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + const output = stdout + stderr; + console.log("Output:", output); + resolve(output); + }); + }); + }; + + try { + const result1 = await executeCommand( + `bash ${pathDir}/install/scripts/package_manager.sh` + ); + console.log("Result 1:", result1); + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + const result2 = await executeCommand( + ` bash ${pathDir}/install/scripts/update_gateway_details.sh ${data.registryUrl} ${data.gatewayUrl}` + ); + console.log("Result 2:", result2); + + const result3 = await executeCommand( + `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d gateway` + ); + console.log("Result 3:", result3); + + const result4 = await executeCommand(`sleep 2`); + console.log("Result 4:", result4); + + const result5 = await executeCommand( + `bash ${pathDir}/install/scripts/register_gateway.sh ${data.gatewayUrl}` + ); + console.log("Result 5:", result5); + + return NextResponse.json({ result1, result2, result3, result4, result5 }); + } catch (error) { + console.error("An error occurred:", error); + return NextResponse.json({ error: "An error occurred" }, { status: 500 }); + } +} diff --git a/onix-gui/app/api/install-layer2/route.js b/onix-gui/app/api/install-layer2/route.js new file mode 100644 index 0000000..c795226 --- /dev/null +++ b/onix-gui/app/api/install-layer2/route.js @@ -0,0 +1,38 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; + +export async function POST(req) { + const request = await req.json(); + const fileURL = request.yamlUrl; + const containerName = request.container; + + const executeShellCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + if (stderr) { + console.error("Error:", stderr); + reject(new Error(stderr)); + return; + } + const output = stdout; + console.log("Output:", output); + resolve(output); + }); + }); + }; + + try { + await executeShellCommand( + `docker exec ${containerName} wget -P /usr/src/app/schemas/ ${fileURL}` + ); + return NextResponse.json({ status: 200 }); + } catch (error) { + console.error(`exec error: ${error}`); + return NextResponse.json({ status: 500 }); + } +} diff --git a/onix-gui/app/api/install-registry/route.js b/onix-gui/app/api/install-registry/route.js new file mode 100644 index 0000000..70c4102 --- /dev/null +++ b/onix-gui/app/api/install-registry/route.js @@ -0,0 +1,156 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; +import { promises as fs } from "fs"; +import { tmpdir } from "os"; +import { join } from "path"; +import os from "os"; + +async function directoryExists(path) { + try { + await fs.access(path); + return true; + } catch (error) { + return false; + } +} + +export async function POST(req, res) { + const pathDir = join(os.homedir(), "beckn-onix"); + const becknOnixDirExists = await directoryExists(pathDir); + console.log("Installing Beckn Onix...", becknOnixDirExists); + + if (!becknOnixDirExists) { + console.log(`Directory beckn-onix does not exist. Cloning repository...`); + try { + const response = await fetch(`${req.nextUrl.origin}/api/clonning-repo`); + if (!response.ok) { + console.error( + `Failed to clone repository: ${response.status} ${response.statusText}` + ); + return NextResponse.json( + { + error: `Failed to clone repository: ${response.status} ${response.statusText}`, + }, + { status: 500 } + ); + } + console.log("Repository cloned successfully."); + } catch (error) { + console.error("An error occurred while cloning the repository:", error); + return NextResponse.json( + { error: "An error occurred while cloning the repository" }, + { status: 500 } + ); + } + } + + const data = await req.json(); + const executeCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + const output = stdout + stderr; + console.log("Output:", output); + resolve(output); + }); + }); + }; + const updateRegistryDetails = async (url) => { + let registryUrl = ""; + let registryPort = ""; + let protocol = ""; + + if (url) { + if (url.startsWith("https://")) { + registryUrl = url.replace("https://", ""); + registryPort = "443"; + protocol = "https"; + } else if (url.startsWith("http://")) { + registryUrl = url.replace("http://", ""); + registryPort = "80"; + protocol = "http"; + } + } else { + registryUrl = "registry"; + registryPort = "3030"; + protocol = "http"; + } + + console.log("Registry URL:", registryUrl); + + const configFile = join( + pathDir, + "install", + "registry_data", + "config", + "swf.properties" + ); + const sampleFile = join( + pathDir, + "install", + "registry_data", + "config", + "swf.properties-sample" + ); + + try { + await fs.copyFile(sampleFile, configFile); + const tempDir = join(os.homedir(), "beckn-onix", "tmp"); + await fs.mkdir(tempDir, { recursive: true }); // Create the temporary directory if it doesn't exist + + const tempFile = join(tempDir, "tempfile.XXXXXXXXXX"); + const configData = await fs.readFile(configFile, "utf8"); + const updatedConfigData = configData + .replace(/REGISTRY_URL/g, registryUrl) + .replace(/REGISTRY_PORT/g, registryPort) + .replace(/PROTOCOL/g, protocol); + + await fs.writeFile(tempFile, updatedConfigData); + await fs.rename(tempFile, configFile); + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + await executeCommand("docker volume create gateway_data_volume"); + await executeCommand("docker volume create gateway_database_volume"); + await executeCommand( + `docker run --rm -v ${join( + pathDir, + "install", + "registry_data", + "config" + )}:/source -v registry_data_volume:/target busybox sh -c "cp /source/envvars /target/ && cp /source/logger.properties /target/ && cp /source/swf.properties /target/"` + ); + + // Start the registry container + await executeCommand( + `docker-compose -f ${join( + pathDir, + "install", + "docker-compose-v2.yml" + )} up -d registry` + ); + + // Wait for 10 seconds + await new Promise((resolve) => setTimeout(resolve, 10000)); + + console.log("Registry installation successful"); + } catch (error) { + console.error("Error updating registry details:", error); + throw error; + } + }; + + try { + const url = data.registryUrl; + await updateRegistryDetails(url); + return NextResponse.json({ + message: "Registry details updated successfully", + }); + } catch (error) { + console.error("An error occurred:", error); + return NextResponse.json({ error: "An error occurred" }, { status: 500 }); + } +} diff --git a/onix-gui/app/favicon.ico b/onix-gui/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/onix-gui/app/globals.css b/onix-gui/app/globals.css new file mode 100644 index 0000000..d0e8c4c --- /dev/null +++ b/onix-gui/app/globals.css @@ -0,0 +1,19 @@ +* { + padding: 0; + margin: 0; +} + +body{ + min-width: 100vw; + min-height: 100vh; + background-color: #000000; + color: white; + font-family: "Ubuntu Mono", monospace; + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + +} diff --git a/onix-gui/app/install/configure/page.js b/onix-gui/app/install/configure/page.js new file mode 100644 index 0000000..4da2300 --- /dev/null +++ b/onix-gui/app/install/configure/page.js @@ -0,0 +1,58 @@ +"use client"; + +import Link from "next/link"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+ +

Configure Existing Network

+
+ +
+ arrow +

Gateway

+
+ + +
+ arrow +

BAP Adapter

+
+ + +
+ arrow +

BPP Adapter

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/install/create/page.js b/onix-gui/app/install/create/page.js new file mode 100644 index 0000000..0cf9db7 --- /dev/null +++ b/onix-gui/app/install/create/page.js @@ -0,0 +1,67 @@ +"use client"; + +import Link from "next/link"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+ +

Create a Production Network

+
+ +
+ arrow +

Gateway

+
+ + +
+ arrow +

BAP Adapter

+
+ + +
+ arrow +

BPP Adapter

+
+ + +
+ arrow +

Registry

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/install/join/page.js b/onix-gui/app/install/join/page.js new file mode 100644 index 0000000..619e14b --- /dev/null +++ b/onix-gui/app/install/join/page.js @@ -0,0 +1,68 @@ +"use client"; + +import Link from "next/link"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+ +

Join an existing network

+ +
+ +
+ arrow +

Gateway

+
+ + +
+ arrow +

BAP Adapter

+
+ + +
+ arrow +

BPP Adapter

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/install/local/page.js b/onix-gui/app/install/local/page.js new file mode 100644 index 0000000..7dbd607 --- /dev/null +++ b/onix-gui/app/install/local/page.js @@ -0,0 +1,60 @@ +"use client"; + +import Link from "next/link"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+ +

+ Set up a network on your local machine +

+
+ +
+ arrow +

Gateway

+
+ + +
+ arrow +

BAP Adapter

+
+ + +
+ arrow +

BPP Adapter

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/install/merge/page.js b/onix-gui/app/install/merge/page.js new file mode 100644 index 0000000..7391660 --- /dev/null +++ b/onix-gui/app/install/merge/page.js @@ -0,0 +1,58 @@ +"use client"; + +import Link from "next/link"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+ +

Merge multiple networks

+
+ +
+ arrow +

Gateway

+
+ + +
+ arrow +

BAP

+
+ + +
+ arrow +

BPP

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/install/page.js b/onix-gui/app/install/page.js new file mode 100644 index 0000000..a196231 --- /dev/null +++ b/onix-gui/app/install/page.js @@ -0,0 +1,54 @@ +"use client"; + +import Link from "next/link"; +import styles from "../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+ +

ONIX

+

+ Open Network In A Box, is a project designed to effortlessly set up + and maintain Beckn network that is scalable, secure and easy to + maintain. +

+
+ +
+ arrow +

Join an existing network

+
+ + +
+ arrow +

Create new production network

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/layout.js b/onix-gui/app/layout.js new file mode 100644 index 0000000..e461a93 --- /dev/null +++ b/onix-gui/app/layout.js @@ -0,0 +1,22 @@ +import { Inter } from "next/font/google"; +import "./globals.css"; +import { ToastContainer, toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import { Bounce } from "react-toastify"; +const inter = Inter({ subsets: ["latin"] }); + +export const metadata = { + title: "ONIX GUI", + description: "Generated by create next app", +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + + ); +} diff --git a/onix-gui/app/page.js b/onix-gui/app/page.js new file mode 100644 index 0000000..600fc62 --- /dev/null +++ b/onix-gui/app/page.js @@ -0,0 +1,55 @@ +import Link from "next/link"; +import styles from "./page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Image from "next/image"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + return ( + <> +
+
+

ONIX

+

+ Open Network In A Box, is a project designed to effortlessly set up + and maintain Beckn network that is scalable, secure and easy to + maintain. +

+
+ +
+ arrow +

Installation Wizard

+
+ + {/* +
+ arrow +

Network Monitor

+
+ */} + +
+ arrow +

Layer 2 Tester

+
+ +
+
+
+ + ); +} diff --git a/onix-gui/app/page.module.css b/onix-gui/app/page.module.css new file mode 100644 index 0000000..1947e56 --- /dev/null +++ b/onix-gui/app/page.module.css @@ -0,0 +1,182 @@ +.mainHeading { + font-size: 5rem; + margin-bottom: 1rem; + text-align: center; +} + +.mainText { + font-size: 1.5rem; + max-width: 55rem; + text-align: center; + margin: auto; + margin-bottom: 1rem; +} + +.boxesContainer { + margin-top: 2rem; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + + flex-wrap: wrap; +} + +.secondBoxesContainer { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: wrap; +} + +.box { + position: relative; + + width: 15rem; + height: 15rem; + border: 1px solid rgb(61, 61, 61); + + display: flex; + flex-direction: column; + justify-content: flex-end; + align-self: center; + text-align: center; + + font-size: 1.25rem; + padding: 1rem; +} + +.box p { + max-width: 12rem; + margin: 0 auto; +} + +.box img { + width: 2rem; + position: absolute; + + top: 1rem; + right: 1rem; +} + +.smallbox { + position: relative; + + width: 12rem; + height: 12rem; + border: 1px solid rgb(61, 61, 61); + + display: flex; + flex-direction: column; + justify-content: flex-end; + align-self: center; + text-align: center; + + font-size: 1.25rem; + padding: 1rem; +} + +.smallbox p { + max-width: 12rem; + margin: 0 auto; +} + +.smallbox img { + width: 2rem; + position: absolute; + + top: 1rem; + right: 1rem; +} + + +.formContainer { + padding: 1rem; + border: 1px solid rgb(61, 61, 61); + border-radius: 30px; +} + +.buttonsContainer { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + column-gap: 0.5rem; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.currentRoute { + margin-bottom: 6rem; + font-family: "Ubuntu Mono", monospace; + font-size: 1.25rem; + font-weight: 600; + + text-align: center; +} + +.backButton { + position: absolute; + top: 1rem; + left: 1rem; + font-size: 1.25rem; + padding: 0.5rem; + border: 1px solid rgb(61, 61, 61); + background-color: transparent; + color: white; + cursor: pointer; +} + +.dashboard { + margin-bottom: 2rem; +} + +.dashboardHeading { + font-size: 2rem; + margin-bottom: 1rem; + text-align: center; +} + +.dashboardTable { + width: 100%; + border-collapse: collapse; + font-size: 1.25rem; + font-family: "Ubuntu Mono", monospace; + border: 1px solid rgb(61, 61, 61); +} + +.dashboardTable th, +.dashboardTable td { + padding: 1rem; + text-align: left; + border-bottom: 1px solid rgb(61, 61, 61); +} + +.dashboardTable th { + font-weight: 600; +} + +@media screen and (max-width: 600px) { + .dashboardTable { + font-size: 1rem; + } + + .dashboardTable th, + .dashboardTable td { + padding: 0.5rem; + } +} + +.counts { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + margin-top: 1rem; + margin-bottom: 2rem; +} + +.count { + max-width: 10rem; +} \ No newline at end of file diff --git a/onix-gui/app/setup/bap/page.js b/onix-gui/app/setup/bap/page.js new file mode 100644 index 0000000..2613e6e --- /dev/null +++ b/onix-gui/app/setup/bap/page.js @@ -0,0 +1,132 @@ +"use client"; + +import InputField from "@/components/InputField/InputField"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import { useState, useCallback } from "react"; +import { toast } from "react-toastify"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + const [subscriberUrl, setSubscriberUrl] = useState(""); + const [subscriberId, setSubscriberId] = useState(""); + const [registryUrl, setRegistryUrl] = useState(""); + const [buttonDisable, setButtonDisable] = useState(false); + const [networkconfigurl, setNetworkconfigurl] = useState(""); + + const handleSubscriberUrlChange = (event) => { + setSubscriberUrl(event.target.value); + }; + + const handleSubscriberIdChange = (event) => { + setSubscriberId(event.target.value); + }; + + const handleRegistryUrlChange = (event) => { + setRegistryUrl(event.target.value); + }; + + const handleNetworkconfigurlChange = (event) => { + setNetworkconfigurl(event.target.value); + }; + const installBap = useCallback(async () => { + const toastId = toast.loading("Installing BAP..."); + setButtonDisable(true); + try { + const response = await fetch("/api/install-bap", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + subscriberUrl, + subscriberId, + registryUrl, + networkconfigurl, + }), + }); + + if (response.ok) { + console.log("BPP installed successfully"); + toast.update(toastId, { + render: "BPP installed successfully 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } else { + console.error("Failed to install BAP"); + toast.update(toastId, { + render: "Failed to install BAP 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + toast.update(toastId, { + render: "Bap installation done", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } + setButtonDisable(false); + }, [subscriberUrl, subscriberId, registryUrl, networkconfigurl]); + + return ( + <> +
+
+ +

BAP

+
+ + + + + + +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/app/setup/bpp/page.js b/onix-gui/app/setup/bpp/page.js new file mode 100644 index 0000000..3d37d00 --- /dev/null +++ b/onix-gui/app/setup/bpp/page.js @@ -0,0 +1,146 @@ +"use client"; + +import InputField from "@/components/InputField/InputField"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import { useState, useCallback } from "react"; +import { toast } from "react-toastify"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + const [subscriberUrl, setSubscriberUrl] = useState(""); + const [subscriberId, setSubscriberId] = useState(""); + const [registryUrl, setRegistryUrl] = useState(""); + const [networkconfigurl, setNetworkconfigurl] = useState(""); + const [webhookUrl, setWebhookUrl] = useState(""); + const [buttonDisable, setButtonDisable] = useState(false); + const handleSubscriberUrlChange = (event) => { + setSubscriberUrl(event.target.value); + }; + + const handleSubscriberIdChange = (event) => { + setSubscriberId(event.target.value); + }; + + const handleRegistryUrlChange = (event) => { + setRegistryUrl(event.target.value); + }; + const handleNetworkconfigurlChange = (event) => { + setNetworkconfigurl(event.target.value); + }; + const handleWebhookUrlChange = (event) => { + setWebhookUrl(event.target.value); + }; + + const installBpp = useCallback(async () => { + const toastId = toast.loading("Installing BPP..."); + setButtonDisable(true); + try { + const response = await toast.promise( + fetch("/api/install-bpp", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + subscriberUrl: subscriberUrl, + subscriberId: subscriberId, + registryUrl: registryUrl, + networkconfigurl: networkconfigurl, + webhookUrl: webhookUrl, + }), + }), + { + success: "BPP installed successfully 👌", + error: "Failed to install BPP 🤯", + } + ); + + if (response.ok) { + console.log("BPP installed successfully"); + toast.update(toastId, { + render: "BPP installed successfully 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } else { + console.error("Failed to install BPP"); + toast.update(toastId, { + render: "Failed to install BPP 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + toast.update(toastId, { + render: "An error occurred while installing BPP 😥", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + setButtonDisable(false); + }, [subscriberUrl, subscriberId, registryUrl, networkconfigurl, webhookUrl]); + return ( + <> +
+
+ +

BPP

+
+ + + + + + + +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/app/setup/gateway/page.js b/onix-gui/app/setup/gateway/page.js new file mode 100644 index 0000000..41be273 --- /dev/null +++ b/onix-gui/app/setup/gateway/page.js @@ -0,0 +1,126 @@ +"use client"; + +import InputField from "@/components/InputField/InputField"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import { useState, useCallback } from "react"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import { usePathname } from "next/navigation"; +import { toast } from "react-toastify"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + let pathname = usePathname(); + const [gatewayUrl, setGatewayUrl] = useState(""); + const [registryUrl, setRegistryUrl] = useState(""); + const [networkconfigurl, setNetworkconfigurl] = useState(""); + + const handleGatewayUrlChange = (event) => { + setGatewayUrl(event.target.value); + }; + const handleRegistryUrlChange = (event) => { + setRegistryUrl(event.target.value); + }; + const handleNetworkconfigurlChange = (event) => { + setNetworkconfigurl(event.target.value); + }; + + const installGateway = useCallback(async () => { + const toastId = toast.loading("Installing gateway..."); + + try { + const response = await toast.promise( + fetch("/api/install-gateway", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + gatewayUrl: gatewayUrl, + registryUrl: registryUrl, + networkconfigurl: networkconfigurl, + }), + }), + { + success: "gateway installed successfully 👌", + error: "Failed to install BAP 🤯", + } + ); + + if (response.ok) { + console.log("Gateway installed successfully"); + toast.update(toastId, { + render: "Gateway installed successfully 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } else { + console.error("Failed to install gateway"); + toast.update(toastId, { + render: "Failed to install gateway 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + toast.update(toastId, { + render: "An error occurred while installing the gateway 😥", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + }, [gatewayUrl, registryUrl, networkconfigurl]); + return ( + <> +
+
+ +

Gateway

+
+ {/* To do todo + 1. Create a check function so that the url formats are correct + 2. Send response when installing and also erros that happen when an envet happens to the user + 3. a gear dialog where the user's can specify to where the beckn repo to be cloned. + */} + + + + + +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/app/setup/registry/page.js b/onix-gui/app/setup/registry/page.js new file mode 100644 index 0000000..6fce954 --- /dev/null +++ b/onix-gui/app/setup/registry/page.js @@ -0,0 +1,96 @@ +"use client"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import InputField from "@/components/InputField/InputField"; +import { useState, useCallback } from "react"; +import { toast } from "react-toastify"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + const [registryUrl, setRegistryUrl] = useState(""); + + const handleRegistryUrlChange = (event) => { + setRegistryUrl(event.target.value); + }; + + const installRegistry = useCallback(async () => { + const toastId = toast.loading("Installing registry..."); + + try { + const response = await toast.promise( + fetch("/api/install-registry", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ registryUrl: registryUrl }), + }), + { + success: "registry installed successfully 👌", + error: "Failed to install registry 🤯", + } + ); + console.log("console.log of response", response); + + if (response.ok) { + console.log("Repository cloned successfully"); + toast.update(toastId, { + render: "Registry installed successfully 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } else { + console.error("Failed to clone repository"); + toast.update(toastId, { + render: "Failed to install registry 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + toast.update(toastId, { + render: "An error occurred while installing the registry 😥", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + }, [registryUrl]); + + return ( + <> +
+
+ +

Registry

+
+ +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/app/template.csv b/onix-gui/app/template.csv new file mode 100644 index 0000000..d9ea810 --- /dev/null +++ b/onix-gui/app/template.csv @@ -0,0 +1 @@ +name,email,phone_number,district,category,organization,customfile,checkbox_field,date_field,datetime_field,time_field,number_field,rating_field diff --git a/onix-gui/app/yaml-gen/install-yaml/page.js b/onix-gui/app/yaml-gen/install-yaml/page.js new file mode 100644 index 0000000..22ad80c --- /dev/null +++ b/onix-gui/app/yaml-gen/install-yaml/page.js @@ -0,0 +1,105 @@ +"use client"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Slider from "@/components/Slider/Slider"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import InputField from "@/components/InputField/InputField"; +import { useState, useCallback } from "react"; +import { toast } from "react-toastify"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function InstallYaml() { + const [yamlUrl, setYamlUrl] = useState(""); + const [checked, setChecked] = useState(false); + + const container = checked ? "bpp-network" : "bap-network"; + + const handleRegistryUrlChange = (event) => { + setYamlUrl(event.target.value); + }; + + const installYaml = useCallback(async () => { + const toastId = toast.loading("Installing Layer 2 Config file..."); + + try { + const response = await fetch("/api/install-layer2", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ container, yamlUrl }), + }); + + if (response.ok) { + const data = await response.json(); + console.log(data); + const FileFound = data.message; + if (FileFound == false) { + setShowDownloadLayer2Button(true); + toast.update(toastId, { + render: "No Layer 2 Config Present 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } else { + toast.update(toastId, { + render: "Yaml File Present 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } + } else { + console.error("Failed to check yaml"); + toast.update(toastId, { + render: "Container Not Found 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + } + }); + + return ( + <> +
+
+ +

Install Yaml

+
+ + +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/app/yaml-gen/page.js b/onix-gui/app/yaml-gen/page.js new file mode 100644 index 0000000..b80f556 --- /dev/null +++ b/onix-gui/app/yaml-gen/page.js @@ -0,0 +1,183 @@ +"use client"; +import { useState } from "react"; +import { Ubuntu_Mono } from "next/font/google"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import InputField from "@/components/InputField/InputField"; +import Slider from "@/components/Slider/Slider"; +import styles from "../page.module.css"; +import { toast } from "react-toastify"; + +import Link from "next/link"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function CheckYaml() { + const [domainName, setDomainName] = useState(""); + const [versionNumber, setversionNumber] = useState(""); + const [checked, setChecked] = useState(false); + const [showDownloadLayer2Button, setShowDownloadLayer2Button] = + useState(false); + const [propertyLink, setPropertyLink] = useState(""); + + const handleYamlChange = (event) => { + setPropertyLink(event.target.value); + }; + const handledomainNameChange = (event) => { + setDomainName(event.target.value); + }; + const handleVersionChange = (event) => { + setversionNumber(event.target.value); + }; + const nameGenerator = async () => { + const parts = domainName.split(":"); + const domainNameWithoutVersion = parts[0]; + const domainVersion = parts[1] || ""; + const filename = `${domainNameWithoutVersion}_${domainVersion}_${versionNumber}.yaml`; + return filename; + }; + const handleDownload = async () => { + const userInput = prompt("Enter the URL of the Layer 2 Config file"); + try { + const response = await fetch("/api/install-layer2", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ checked, userInput }), + }); + + if (response.ok) { + const data = await response.json(); + console.log(data); + const FileFound = data.message; + if (FileFound == false) { + setShowDownloadLayer2Button(true); + toast.update(toastId, { + render: "No Layer 2 Config Present 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } else { + toast.update(toastId, { + render: "Yaml File Present 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } + } else { + console.error("Failed to check yaml"); + toast.update(toastId, { + render: "Container Not Found 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + } + }; + + const handleOnclick = async () => { + const fileName = await nameGenerator(); + const toastId = toast.loading("Checking for layer2 yaml file"); + try { + const response = await fetch("/api/check-layer2", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ checked, fileName }), + }); + + if (response.ok) { + const data = await response.json(); + const FileFound = data.message; + if (FileFound == false) { + setShowDownloadLayer2Button(true); + toast.update(toastId, { + render: "No Layer 2 Config Present 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } else { + toast.update(toastId, { + render: "Yaml File Present 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } + } else { + console.error("Failed to check yaml"); + toast.update(toastId, { + render: "Container Not Found 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + } + }; + return ( + <> +
+ + +
+

+ Yaml File Checker +

+ +
+ + + + + +
+ +
+ {showDownloadLayer2Button && ( + + )} +
+
+
+ + ); +} diff --git a/onix-gui/components/Buttons/Buttons.module.css b/onix-gui/components/Buttons/Buttons.module.css new file mode 100644 index 0000000..64f7a6a --- /dev/null +++ b/onix-gui/components/Buttons/Buttons.module.css @@ -0,0 +1,24 @@ +.primaryButton { + background-color: #abd4fa; + color: #000000; + padding: 0.5rem 1rem; + border-radius: 10px; + border: none; + font-size: 1rem; + cursor: pointer; + + padding: 0.75rem 2rem; +} + +.secondaryButton { + background-color: #000000; + color: #abd4fa; + padding: 0.5rem 1rem; + border-radius: 10px; + border: none; + font-size: 1rem; + cursor: pointer; + + border: 1px solid #abd4fa; + padding: 0.75rem 2.25rem; +} diff --git a/onix-gui/components/Buttons/PrimaryButton.js b/onix-gui/components/Buttons/PrimaryButton.js new file mode 100644 index 0000000..57a18c5 --- /dev/null +++ b/onix-gui/components/Buttons/PrimaryButton.js @@ -0,0 +1,16 @@ +import React from "react"; +import styles from "./Buttons.module.css"; + +const PrimaryButton = ({ label = "continue", onClick, disabled = false }) => { + return ( + + ); +}; + +export default PrimaryButton; diff --git a/onix-gui/components/Buttons/SecondaryButton.jsx b/onix-gui/components/Buttons/SecondaryButton.jsx new file mode 100644 index 0000000..97a3564 --- /dev/null +++ b/onix-gui/components/Buttons/SecondaryButton.jsx @@ -0,0 +1,8 @@ +import React from "react"; +import styles from "./Buttons.module.css"; + +const SecondaryButton = () => { + return ; +}; + +export default SecondaryButton; diff --git a/onix-gui/components/InputField/InputField.jsx b/onix-gui/components/InputField/InputField.jsx new file mode 100644 index 0000000..aac6551 --- /dev/null +++ b/onix-gui/components/InputField/InputField.jsx @@ -0,0 +1,19 @@ +import React from "react"; +import styles from "./InputField.module.css"; + +const InputField = ({ label, value, onChange, placeholder = "Input Text" }) => { + return ( +
+ + +
+ ); +}; + +export default InputField; diff --git a/onix-gui/components/InputField/InputField.module.css b/onix-gui/components/InputField/InputField.module.css new file mode 100644 index 0000000..e3c2efc --- /dev/null +++ b/onix-gui/components/InputField/InputField.module.css @@ -0,0 +1,23 @@ +.inputContainer { + display: flex; + flex-direction: column; + margin: 1.5rem 1rem; +} + +.inputLabel { + font-size: 1rem; + font-weight: bold; + margin-bottom: 0.5rem; +} + +.inputField { + padding: 1rem; + font-family: "Ubuntu Mono", sans-serif; + color: white; + font-size: 1rem; + border-radius: 15px; + border: 1px solid rgb(61, 61, 61); + background: #000000; + + min-width:15rem +} diff --git a/onix-gui/components/Slider/Slider.jsx b/onix-gui/components/Slider/Slider.jsx new file mode 100644 index 0000000..5c03937 --- /dev/null +++ b/onix-gui/components/Slider/Slider.jsx @@ -0,0 +1,20 @@ +import React from "react"; +import styles from "./Slider.module.css"; + +const Slider = ({ label, checked, toggleChecked }) => { + return ( +
+ + +
+ ); +}; + +export default Slider; diff --git a/onix-gui/components/Slider/Slider.module.css b/onix-gui/components/Slider/Slider.module.css new file mode 100644 index 0000000..749e1c3 --- /dev/null +++ b/onix-gui/components/Slider/Slider.module.css @@ -0,0 +1,67 @@ +.switch { + transform: scale(0.75); + position: relative; + display: inline-block; + width: 60px; + height: 34px; +} + +.inputContainer { + display: flex; + + align-items: center; + justify-content: space-around; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: black; + -webkit-transition: .4s; + transition: .4s; +} + +input:checked+.slider { + background-color: #9dc5e6; +} + +input:focus+.slider { + box-shadow: 0 0 1px white; +} + +input:checked+.slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} \ No newline at end of file diff --git a/onix-gui/jsconfig.json b/onix-gui/jsconfig.json new file mode 100644 index 0000000..2a2e4b3 --- /dev/null +++ b/onix-gui/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/onix-gui/next.config.mjs b/onix-gui/next.config.mjs new file mode 100644 index 0000000..4678774 --- /dev/null +++ b/onix-gui/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/onix-gui/package-lock.json b/onix-gui/package-lock.json new file mode 100644 index 0000000..6714052 --- /dev/null +++ b/onix-gui/package-lock.json @@ -0,0 +1,4247 @@ +{ + "name": "onix-gui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "onix-gui", + "version": "0.1.0", + "dependencies": { + "child_process": "^1.0.2", + "next": "14.1.4", + "react": "^18", + "react-dom": "^18", + "react-toastify": "^10.0.5" + }, + "devDependencies": { + "eslint": "^8", + "eslint-config-next": "14.1.4" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@next/env": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz", + "integrity": "sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz", + "integrity": "sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz", + "integrity": "sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz", + "integrity": "sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz", + "integrity": "sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz", + "integrity": "sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz", + "integrity": "sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz", + "integrity": "sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz", + "integrity": "sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz", + "integrity": "sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz", + "integrity": "sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.9.0.tgz", + "integrity": "sha512-AAWymnpvHbGty1BmgbdfbqQDboXs6xN6h2yAacO4yKVyyUUBnpYkp+P9jjPrV9zrAGw7JVVriRtGOHPInnfjZQ==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.4.tgz", + "integrity": "sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.1.4", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next": { + "version": "14.1.4", + "resolved": "https://registry.npmjs.org/next/-/next-14.1.4.tgz", + "integrity": "sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==", + "dependencies": { + "@next/env": "14.1.4", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.1.4", + "@next/swc-darwin-x64": "14.1.4", + "@next/swc-linux-arm64-gnu": "14.1.4", + "@next/swc-linux-arm64-musl": "14.1.4", + "@next/swc-linux-x64-gnu": "14.1.4", + "@next/swc-linux-x64-musl": "14.1.4", + "@next/swc-win32-arm64-msvc": "14.1.4", + "@next/swc-win32-ia32-msvc": "14.1.4", + "@next/swc-win32-x64-msvc": "14.1.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-toastify": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", + "integrity": "sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==", + "dependencies": { + "clsx": "^2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/onix-gui/package.json b/onix-gui/package.json new file mode 100644 index 0000000..38899c1 --- /dev/null +++ b/onix-gui/package.json @@ -0,0 +1,22 @@ +{ + "name": "onix-gui", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "child_process": "^1.0.2", + "next": "14.1.4", + "react": "^18", + "react-dom": "^18", + "react-toastify": "^10.0.5" + }, + "devDependencies": { + "eslint": "^8", + "eslint-config-next": "14.1.4" + } +} diff --git a/onix-gui/public/arrow.png b/onix-gui/public/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..7151c6858502a3d1f64538a7b62aecb4c1ca5980 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoM!3HGxw}u@9Qk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmFK>jRG7srqa#;xaX^EN2(v_70=!JxdOQ`@3R z`2~v=m-3E@ixpJtCbVT&{}6V1(Ae)M@^sGazuSbiO_oTK-Itp7N?7O8)}N^vA^)z2 zX9+nSW#D#~C}?kA$ie>4T4oZ{0uR0hMOB8TD-5QWm{v>(bLjcPptMB%g`0|lxDx9u zLEZ~38I4*^3|$;tCzL!CntXU#4tKK@Wl6kW;8+{Ew{yazv)Uy /dev/null 2>&1 & + +# Wait for the Next.js app to start +echo "Waiting for Next.js app to start on port $PORT..." +until nc -z localhost "$PORT"; do + sleep 1 + echo "Loding ..." +done + +# Install the tunnel service if not installed + + + +echo "Exposing local port $PORT using $TUNNEL_SERVICE..." +lt --port "$PORT" > /tmp/lt.log 2>&1 & + +# Wait for the tunnel service to start +echo "Waiting for tunnel service to start..." +sleep 5 + +# Get the tunnel URL from the log file +TUNNEL_URL=$(grep -o 'https://[^[:blank:]]*' /tmp/lt.log) +#Get the tunnel password +echo "Getting Tunnel Password" +TUNNEL_PASSWORD=$(curl https://loca.lt/mytunnelpassword)&& + +# Print the tunnel URL and password +echo "---------------------------------------" +echo "Next.js app is running locally on port $PORT" +echo "Tunnel Service URL: $TUNNEL_URL" +echo "Tunnel Password: $TUNNEL_PASSWORD" +echo "---------------------------------------" From d5ea660d7ede66b65b7f6839f6e3369d5cbd54ad Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Thu, 2 May 2024 21:44:17 +0530 Subject: [PATCH 02/17] added the GUI --- onix-gui/app/api/install-layer2/route.js | 38 ---- onix-gui/app/yaml-gen/page.js | 183 ------------------ onix-gui/{ => onix}/.eslintrc.json | 0 onix-gui/{ => onix}/.gitignore | 0 onix-gui/{ => onix}/README.md | 21 +- onix-gui/{ => onix}/app/Infy_Pending.pdf | Bin .../{ => onix}/app/api/check-layer2/route.js | 36 ++-- .../{ => onix}/app/api/clonning-repo/route.js | 0 .../app/api/get-network-participant/route.js | 27 +++ .../{ => onix}/app/api/install-bap/route.js | 7 +- .../{ => onix}/app/api/install-bpp/route.js | 5 +- .../app/api/install-gateway/route.js | 5 +- .../app/api/install-registry/route.js | 14 -- onix-gui/{ => onix}/app/favicon.ico | Bin onix-gui/{ => onix}/app/globals.css | 0 .../{ => onix}/app/install/configure/page.js | 8 +- .../{ => onix}/app/install/create/page.js | 10 +- onix-gui/{ => onix}/app/install/join/page.js | 8 +- onix-gui/{ => onix}/app/install/local/page.js | 8 +- onix-gui/{ => onix}/app/install/merge/page.js | 15 +- onix-gui/{ => onix}/app/install/page.js | 35 +++- onix-gui/{ => onix}/app/layout.js | 0 onix-gui/onix/app/monitor/dashboard/page.js | 95 +++++++++ onix-gui/onix/app/monitor/page.js | 74 +++++++ onix-gui/{ => onix}/app/page.js | 14 +- onix-gui/{ => onix}/app/page.module.css | 0 onix-gui/{ => onix}/app/setup/bap/page.js | 2 +- onix-gui/{ => onix}/app/setup/bpp/page.js | 2 +- onix-gui/{ => onix}/app/setup/gateway/page.js | 2 +- .../{ => onix}/app/setup/registry/page.js | 2 +- onix-gui/{ => onix}/app/template.csv | 0 .../app/yaml-gen/check-yaml}/page.js | 70 +++---- onix-gui/onix/app/yaml-gen/option/bap/page.js | 64 ++++++ onix-gui/onix/app/yaml-gen/option/bpp/page.js | 64 ++++++ onix-gui/onix/app/yaml-gen/option/page.js | 43 ++++ onix-gui/onix/app/yaml-gen/page.js | 122 ++++++++++++ .../components/Buttons/Buttons.module.css | 0 .../components/Buttons/PrimaryButton.js | 0 .../components/Buttons/SecondaryButton.jsx | 0 .../components/InputField/InputField.jsx | 4 +- .../InputField/InputField.module.css | 0 .../{ => onix}/components/Slider/Slider.jsx | 0 .../components/Slider/Slider.module.css | 0 onix-gui/{ => onix}/jsconfig.json | 0 onix-gui/{ => onix}/next.config.mjs | 0 onix-gui/{ => onix}/package-lock.json | 0 onix-gui/{ => onix}/package.json | 0 onix-gui/{ => onix}/public/arrow.png | Bin onix-gui/{scripts => }/start.sh | 3 +- 49 files changed, 617 insertions(+), 364 deletions(-) delete mode 100644 onix-gui/app/api/install-layer2/route.js delete mode 100644 onix-gui/app/yaml-gen/page.js rename onix-gui/{ => onix}/.eslintrc.json (100%) rename onix-gui/{ => onix}/.gitignore (100%) rename onix-gui/{ => onix}/README.md (68%) rename onix-gui/{ => onix}/app/Infy_Pending.pdf (100%) rename onix-gui/{ => onix}/app/api/check-layer2/route.js (60%) rename onix-gui/{ => onix}/app/api/clonning-repo/route.js (100%) create mode 100644 onix-gui/onix/app/api/get-network-participant/route.js rename onix-gui/{ => onix}/app/api/install-bap/route.js (92%) rename onix-gui/{ => onix}/app/api/install-bpp/route.js (93%) rename onix-gui/{ => onix}/app/api/install-gateway/route.js (93%) rename onix-gui/{ => onix}/app/api/install-registry/route.js (85%) rename onix-gui/{ => onix}/app/favicon.ico (100%) rename onix-gui/{ => onix}/app/globals.css (100%) rename onix-gui/{ => onix}/app/install/configure/page.js (85%) rename onix-gui/{ => onix}/app/install/create/page.js (84%) rename onix-gui/{ => onix}/app/install/join/page.js (86%) rename onix-gui/{ => onix}/app/install/local/page.js (85%) rename onix-gui/{ => onix}/app/install/merge/page.js (76%) rename onix-gui/{ => onix}/app/install/page.js (56%) rename onix-gui/{ => onix}/app/layout.js (100%) create mode 100644 onix-gui/onix/app/monitor/dashboard/page.js create mode 100644 onix-gui/onix/app/monitor/page.js rename onix-gui/{ => onix}/app/page.js (81%) rename onix-gui/{ => onix}/app/page.module.css (100%) rename onix-gui/{ => onix}/app/setup/bap/page.js (98%) rename onix-gui/{ => onix}/app/setup/bpp/page.js (98%) rename onix-gui/{ => onix}/app/setup/gateway/page.js (98%) rename onix-gui/{ => onix}/app/setup/registry/page.js (97%) rename onix-gui/{ => onix}/app/template.csv (100%) rename onix-gui/{app/yaml-gen/install-yaml => onix/app/yaml-gen/check-yaml}/page.js (59%) create mode 100644 onix-gui/onix/app/yaml-gen/option/bap/page.js create mode 100644 onix-gui/onix/app/yaml-gen/option/bpp/page.js create mode 100644 onix-gui/onix/app/yaml-gen/option/page.js create mode 100644 onix-gui/onix/app/yaml-gen/page.js rename onix-gui/{ => onix}/components/Buttons/Buttons.module.css (100%) rename onix-gui/{ => onix}/components/Buttons/PrimaryButton.js (100%) rename onix-gui/{ => onix}/components/Buttons/SecondaryButton.jsx (100%) rename onix-gui/{ => onix}/components/InputField/InputField.jsx (76%) rename onix-gui/{ => onix}/components/InputField/InputField.module.css (100%) rename onix-gui/{ => onix}/components/Slider/Slider.jsx (100%) rename onix-gui/{ => onix}/components/Slider/Slider.module.css (100%) rename onix-gui/{ => onix}/jsconfig.json (100%) rename onix-gui/{ => onix}/next.config.mjs (100%) rename onix-gui/{ => onix}/package-lock.json (100%) rename onix-gui/{ => onix}/package.json (100%) rename onix-gui/{ => onix}/public/arrow.png (100%) rename onix-gui/{scripts => }/start.sh (95%) diff --git a/onix-gui/app/api/install-layer2/route.js b/onix-gui/app/api/install-layer2/route.js deleted file mode 100644 index c795226..0000000 --- a/onix-gui/app/api/install-layer2/route.js +++ /dev/null @@ -1,38 +0,0 @@ -import { exec } from "child_process"; -import { NextResponse } from "next/server"; - -export async function POST(req) { - const request = await req.json(); - const fileURL = request.yamlUrl; - const containerName = request.container; - - const executeShellCommand = (command) => { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - console.error("Error:", error); - reject(error); - return; - } - if (stderr) { - console.error("Error:", stderr); - reject(new Error(stderr)); - return; - } - const output = stdout; - console.log("Output:", output); - resolve(output); - }); - }); - }; - - try { - await executeShellCommand( - `docker exec ${containerName} wget -P /usr/src/app/schemas/ ${fileURL}` - ); - return NextResponse.json({ status: 200 }); - } catch (error) { - console.error(`exec error: ${error}`); - return NextResponse.json({ status: 500 }); - } -} diff --git a/onix-gui/app/yaml-gen/page.js b/onix-gui/app/yaml-gen/page.js deleted file mode 100644 index b80f556..0000000 --- a/onix-gui/app/yaml-gen/page.js +++ /dev/null @@ -1,183 +0,0 @@ -"use client"; -import { useState } from "react"; -import { Ubuntu_Mono } from "next/font/google"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import InputField from "@/components/InputField/InputField"; -import Slider from "@/components/Slider/Slider"; -import styles from "../page.module.css"; -import { toast } from "react-toastify"; - -import Link from "next/link"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function CheckYaml() { - const [domainName, setDomainName] = useState(""); - const [versionNumber, setversionNumber] = useState(""); - const [checked, setChecked] = useState(false); - const [showDownloadLayer2Button, setShowDownloadLayer2Button] = - useState(false); - const [propertyLink, setPropertyLink] = useState(""); - - const handleYamlChange = (event) => { - setPropertyLink(event.target.value); - }; - const handledomainNameChange = (event) => { - setDomainName(event.target.value); - }; - const handleVersionChange = (event) => { - setversionNumber(event.target.value); - }; - const nameGenerator = async () => { - const parts = domainName.split(":"); - const domainNameWithoutVersion = parts[0]; - const domainVersion = parts[1] || ""; - const filename = `${domainNameWithoutVersion}_${domainVersion}_${versionNumber}.yaml`; - return filename; - }; - const handleDownload = async () => { - const userInput = prompt("Enter the URL of the Layer 2 Config file"); - try { - const response = await fetch("/api/install-layer2", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ checked, userInput }), - }); - - if (response.ok) { - const data = await response.json(); - console.log(data); - const FileFound = data.message; - if (FileFound == false) { - setShowDownloadLayer2Button(true); - toast.update(toastId, { - render: "No Layer 2 Config Present 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } else { - toast.update(toastId, { - render: "Yaml File Present 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } - } else { - console.error("Failed to check yaml"); - toast.update(toastId, { - render: "Container Not Found 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - } - }; - - const handleOnclick = async () => { - const fileName = await nameGenerator(); - const toastId = toast.loading("Checking for layer2 yaml file"); - try { - const response = await fetch("/api/check-layer2", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ checked, fileName }), - }); - - if (response.ok) { - const data = await response.json(); - const FileFound = data.message; - if (FileFound == false) { - setShowDownloadLayer2Button(true); - toast.update(toastId, { - render: "No Layer 2 Config Present 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } else { - toast.update(toastId, { - render: "Yaml File Present 👌", - type: "success", - isLoading: false, - autoClose: 5000, - }); - } - } else { - console.error("Failed to check yaml"); - toast.update(toastId, { - render: "Container Not Found 🤯", - type: "error", - isLoading: false, - autoClose: 5000, - }); - } - } catch (error) { - console.error("An error occurred:", error); - } - }; - return ( - <> -
- - -
-

- Yaml File Checker -

- -
- - - - - -
- -
- {showDownloadLayer2Button && ( - - )} -
-
-
- - ); -} diff --git a/onix-gui/.eslintrc.json b/onix-gui/onix/.eslintrc.json similarity index 100% rename from onix-gui/.eslintrc.json rename to onix-gui/onix/.eslintrc.json diff --git a/onix-gui/.gitignore b/onix-gui/onix/.gitignore similarity index 100% rename from onix-gui/.gitignore rename to onix-gui/onix/.gitignore diff --git a/onix-gui/README.md b/onix-gui/onix/README.md similarity index 68% rename from onix-gui/README.md rename to onix-gui/onix/README.md index 5453b9b..a18038f 100644 --- a/onix-gui/README.md +++ b/onix-gui/onix/README.md @@ -6,28 +6,23 @@ The GUI for the beckn-onix cli tool. 1. 4 server/instances 2. 4 sub-domains mapped to each instance +3. Local Tunnel + `npm i -g localtunnel` ## User Guide -### Step 1: Clone the beckn-onix-gui repo +### Step 1: Run the `start.sh` script ``` -git clone https://github.com/Mishalabdullah/beckn-onix-gui.git +cd .. && ./start.sh ``` -### Step 2: Change directory to the nextjs project +### Step 2: Accessing the GUI. -``` -cd onix-gui -``` +You will be getting a URL and password as on output of the script. Open the url in the browser and then +paste the password. -### Step 3: Run nextjs on port 3005 - -For running the installation script just run this command. The sudo privilages are required when installing packages and configuring the nginx reverse proxy - -``` -sudo ./start.sh -``` +### Step 3: Install and setup your network Note: Port 3000 is being used by onix, so we're using port 3005 instead. diff --git a/onix-gui/app/Infy_Pending.pdf b/onix-gui/onix/app/Infy_Pending.pdf similarity index 100% rename from onix-gui/app/Infy_Pending.pdf rename to onix-gui/onix/app/Infy_Pending.pdf diff --git a/onix-gui/app/api/check-layer2/route.js b/onix-gui/onix/app/api/check-layer2/route.js similarity index 60% rename from onix-gui/app/api/check-layer2/route.js rename to onix-gui/onix/app/api/check-layer2/route.js index 1fb27cf..9ffccdf 100644 --- a/onix-gui/app/api/check-layer2/route.js +++ b/onix-gui/onix/app/api/check-layer2/route.js @@ -2,9 +2,8 @@ import { exec } from "child_process"; import { NextResponse } from "next/server"; export async function POST(req) { - const request = await req.json(); - const containerName = request.checked ? "bpp-network" : "bap-network"; - const fileToCheck = request.fileName; + const checked = await req.json(); + const containerName = checked.checked ? "bpp-network" : "bap-network"; const executeShellCommand = (command) => { return new Promise((resolve, reject) => { @@ -14,11 +13,13 @@ export async function POST(req) { reject(error); return; } + if (stderr) { console.error("Error:", stderr); reject(new Error(stderr)); return; } + const output = stdout; console.log("Output:", output); resolve(output); @@ -30,6 +31,7 @@ export async function POST(req) { const containerExists = await executeShellCommand( `docker ps -a --filter "name=${containerName}" --format "{{.Names}}"` ); + if (!containerExists.trim()) { return new NextResponse(`Error: ${containerName} server not present`, { status: 500, @@ -37,30 +39,14 @@ export async function POST(req) { } const result = await executeShellCommand( - `docker exec ${containerName} /bin/sh -c "[ -f '/usr/src/app/schemas/${fileToCheck}' ] && echo 'File found' || echo 'File not found'"` + `docker exec ${containerName} ls /usr/src/app/schemas/ | grep -v "core" | grep ".yaml" | wc -l` ); - if (result.trim() === "File found") { - return NextResponse.json( - { message: true }, - { - status: 200, - } - ); - } else { - return NextResponse.json( - { message: false }, - { - status: 200, - } - ); - } + + return new NextResponse(result); } catch (error) { console.error(`exec error: ${error}`); - return NextResponse.json( - { message: `Error executing shell command: ${error}` }, - { - status: 500, - } - ); + return new NextResponse(`Error executing shell command: ${error}`, { + status: 500, + }); } } diff --git a/onix-gui/app/api/clonning-repo/route.js b/onix-gui/onix/app/api/clonning-repo/route.js similarity index 100% rename from onix-gui/app/api/clonning-repo/route.js rename to onix-gui/onix/app/api/clonning-repo/route.js diff --git a/onix-gui/onix/app/api/get-network-participant/route.js b/onix-gui/onix/app/api/get-network-participant/route.js new file mode 100644 index 0000000..45f68f5 --- /dev/null +++ b/onix-gui/onix/app/api/get-network-participant/route.js @@ -0,0 +1,27 @@ +import { NextResponse } from "next/server"; + +export async function POST(req, res) { + const request = await req.json(); + const registryUrl = request.registryUrl; + const body = { type: "BPP" }; + + try { + const response = await fetch(registryUrl, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + + const data = await response.json(); + return NextResponse.json(data, { status: 200 }); + } catch (error) { + console.error(error); + return NextResponse.json( + { error: "Error making request to registry" }, + { status: 500 } + ); + } +} diff --git a/onix-gui/app/api/install-bap/route.js b/onix-gui/onix/app/api/install-bap/route.js similarity index 92% rename from onix-gui/app/api/install-bap/route.js rename to onix-gui/onix/app/api/install-bap/route.js index 2c5fb04..9236941 100644 --- a/onix-gui/app/api/install-bap/route.js +++ b/onix-gui/onix/app/api/install-bap/route.js @@ -47,10 +47,7 @@ export async function startSupportServices() { `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` ); console.log("Result 3:", result3); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - await executeCommand("docker volume create gateway_data_volume"); - await executeCommand("docker volume create gateway_database_volume"); + return NextResponse.json({ result1, result2, result3 }); } catch (error) { console.error("An error occurred:", error); @@ -94,10 +91,10 @@ export async function POST(req) { const bppSubscriberId = data.subscriberId; const bppSubscriberUrl = data.subscriberUrl; const networkconfigurl = data.networkconfigurl; - let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bap_config.sh ${registryUrl} ${bppSubscriberId} ${bppSubscriberUrl} ${networkconfigurl}`; const result1 = await executeCommand(updateBppConfigCommand); console.log("Result 1:", result1); + const result3 = await executeCommand( `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-client"` ); diff --git a/onix-gui/app/api/install-bpp/route.js b/onix-gui/onix/app/api/install-bpp/route.js similarity index 93% rename from onix-gui/app/api/install-bpp/route.js rename to onix-gui/onix/app/api/install-bpp/route.js index 2ac5ca0..9943be4 100644 --- a/onix-gui/app/api/install-bpp/route.js +++ b/onix-gui/onix/app/api/install-bpp/route.js @@ -47,10 +47,7 @@ export async function startSupportServices() { `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` ); console.log("Result 3:", result3); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - await executeCommand("docker volume create gateway_data_volume"); - await executeCommand("docker volume create gateway_database_volume"); + return NextResponse.json({ result1, result2, result3 }); } catch (error) { console.error("An error occurred:", error); diff --git a/onix-gui/app/api/install-gateway/route.js b/onix-gui/onix/app/api/install-gateway/route.js similarity index 93% rename from onix-gui/app/api/install-gateway/route.js rename to onix-gui/onix/app/api/install-gateway/route.js index 3545f6e..46b150b 100644 --- a/onix-gui/app/api/install-gateway/route.js +++ b/onix-gui/onix/app/api/install-gateway/route.js @@ -64,8 +64,7 @@ export async function POST(req, res) { `bash ${pathDir}/install/scripts/package_manager.sh` ); console.log("Result 1:", result1); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); + const result2 = await executeCommand( ` bash ${pathDir}/install/scripts/update_gateway_details.sh ${data.registryUrl} ${data.gatewayUrl}` ); @@ -76,7 +75,7 @@ export async function POST(req, res) { ); console.log("Result 3:", result3); - const result4 = await executeCommand(`sleep 2`); + const result4 = await executeCommand(`sleep 10`); console.log("Result 4:", result4); const result5 = await executeCommand( diff --git a/onix-gui/app/api/install-registry/route.js b/onix-gui/onix/app/api/install-registry/route.js similarity index 85% rename from onix-gui/app/api/install-registry/route.js rename to onix-gui/onix/app/api/install-registry/route.js index 70c4102..fbffb7b 100644 --- a/onix-gui/app/api/install-registry/route.js +++ b/onix-gui/onix/app/api/install-registry/route.js @@ -111,20 +111,6 @@ export async function POST(req, res) { await fs.writeFile(tempFile, updatedConfigData); await fs.rename(tempFile, configFile); - await executeCommand("docker volume create registry_data_volume"); - await executeCommand("docker volume create registry_database_volume"); - await executeCommand("docker volume create gateway_data_volume"); - await executeCommand("docker volume create gateway_database_volume"); - await executeCommand( - `docker run --rm -v ${join( - pathDir, - "install", - "registry_data", - "config" - )}:/source -v registry_data_volume:/target busybox sh -c "cp /source/envvars /target/ && cp /source/logger.properties /target/ && cp /source/swf.properties /target/"` - ); - - // Start the registry container await executeCommand( `docker-compose -f ${join( pathDir, diff --git a/onix-gui/app/favicon.ico b/onix-gui/onix/app/favicon.ico similarity index 100% rename from onix-gui/app/favicon.ico rename to onix-gui/onix/app/favicon.ico diff --git a/onix-gui/app/globals.css b/onix-gui/onix/app/globals.css similarity index 100% rename from onix-gui/app/globals.css rename to onix-gui/onix/app/globals.css diff --git a/onix-gui/app/install/configure/page.js b/onix-gui/onix/app/install/configure/page.js similarity index 85% rename from onix-gui/app/install/configure/page.js rename to onix-gui/onix/app/install/configure/page.js index 4da2300..f0749f9 100644 --- a/onix-gui/app/install/configure/page.js +++ b/onix-gui/onix/app/install/configure/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -28,7 +28,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Gateway

@@ -37,7 +37,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

BAP Adapter

@@ -46,7 +46,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

BPP Adapter

diff --git a/onix-gui/app/install/create/page.js b/onix-gui/onix/app/install/create/page.js similarity index 84% rename from onix-gui/app/install/create/page.js rename to onix-gui/onix/app/install/create/page.js index 0cf9db7..14e38e6 100644 --- a/onix-gui/app/install/create/page.js +++ b/onix-gui/onix/app/install/create/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -28,7 +28,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Gateway

@@ -37,7 +37,7 @@ export default function Home() { className={styles.box} style={{ textDecoration: "underline", color: "white" }} > - arrow +

BAP Adapter

@@ -46,7 +46,7 @@ export default function Home() { className={styles.box} style={{ textDecoration: "underline", color: "white" }} > - arrow +

BPP Adapter

@@ -55,7 +55,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Registry

diff --git a/onix-gui/app/install/join/page.js b/onix-gui/onix/app/install/join/page.js similarity index 86% rename from onix-gui/app/install/join/page.js rename to onix-gui/onix/app/install/join/page.js index 619e14b..5223af5 100644 --- a/onix-gui/app/install/join/page.js +++ b/onix-gui/onix/app/install/join/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -32,7 +32,7 @@ export default function Home() { }} >
- arrow +

Gateway

@@ -44,7 +44,7 @@ export default function Home() { }} >
- arrow +

BAP Adapter

@@ -56,7 +56,7 @@ export default function Home() { }} >
- arrow +

BPP Adapter

diff --git a/onix-gui/app/install/local/page.js b/onix-gui/onix/app/install/local/page.js similarity index 85% rename from onix-gui/app/install/local/page.js rename to onix-gui/onix/app/install/local/page.js index 7dbd607..a698588 100644 --- a/onix-gui/app/install/local/page.js +++ b/onix-gui/onix/app/install/local/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -30,7 +30,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Gateway

@@ -39,7 +39,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

BAP Adapter

@@ -48,7 +48,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

BPP Adapter

diff --git a/onix-gui/app/install/merge/page.js b/onix-gui/onix/app/install/merge/page.js similarity index 76% rename from onix-gui/app/install/merge/page.js rename to onix-gui/onix/app/install/merge/page.js index 7391660..7e256d9 100644 --- a/onix-gui/app/install/merge/page.js +++ b/onix-gui/onix/app/install/merge/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -15,12 +15,7 @@ export default function Home() { <>
- +

Merge multiple networks

- arrow +

Gateway

@@ -37,7 +32,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

BAP

@@ -46,7 +41,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

BPP

diff --git a/onix-gui/app/install/page.js b/onix-gui/onix/app/install/page.js similarity index 56% rename from onix-gui/app/install/page.js rename to onix-gui/onix/app/install/page.js index a196231..e104190 100644 --- a/onix-gui/app/install/page.js +++ b/onix-gui/onix/app/install/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -33,7 +33,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Join an existing network

@@ -42,10 +42,39 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Create new production network

+ +
+ +

+ Set up a network on your local machine +

+
+ + {/* +
+ +

Merge multiple networks

+
+ + +
+ +

Configure Existing Network

+
+ */}
diff --git a/onix-gui/app/layout.js b/onix-gui/onix/app/layout.js similarity index 100% rename from onix-gui/app/layout.js rename to onix-gui/onix/app/layout.js diff --git a/onix-gui/onix/app/monitor/dashboard/page.js b/onix-gui/onix/app/monitor/dashboard/page.js new file mode 100644 index 0000000..072b95d --- /dev/null +++ b/onix-gui/onix/app/monitor/dashboard/page.js @@ -0,0 +1,95 @@ +import styles from "../../page.module.css"; + +const page = () => { + const data = [ + { + ip: "192.168.1.1", + status: "Live", + cpu: "2%", + memory: "18.8 MB", + uptime: "10 days", + }, + { + ip: "10.0.0.1", + status: "404", + cpu: "0%", + memory: "0 MB", + uptime: "5 days", + }, + { + ip: "172.16.0.1", + status: "Live", + cpu: "6%", + memory: "56.4 MB", + uptime: "15 days", + }, + { + ip: "192.0.2.1", + status: "Live", + cpu: "69%", + memory: "648.6 MB", + uptime: "20 days", + }, + { + ip: "198.51.100.1", + status: "404", + cpu: "0%", + memory: "0 MB", + uptime: "3 days", + }, + { + ip: "203.0.113.1", + status: "Live", + cpu: ".4%", + memory: "3.7 MB", + uptime: "8 days", + }, + ]; + return ( +
+
+

+ Uptime Network Participants: 10 +

+

+ Uptime Network Participants: 10 +

+
+

Dashboard

+ + + + + + + + + + + + {data.map((item, index) => ( + + + + + + + + ))} + +
S/NIP / Domain NameStatusCPUMemory
{index + 1}{item.ip}{item.status}{item.cpu}{item.memory}
+
+ ); +}; + +export default page; diff --git a/onix-gui/onix/app/monitor/page.js b/onix-gui/onix/app/monitor/page.js new file mode 100644 index 0000000..5e042e2 --- /dev/null +++ b/onix-gui/onix/app/monitor/page.js @@ -0,0 +1,74 @@ +"use client"; +import { useState } from "react"; +import InputField from "@/components/InputField/InputField"; +import styles from "../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import { useRouter } from "next/navigation"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function Home() { + const [registryUrl, setRegistryUrl] = useState(""); + const router = useRouter(); + const handleRegistryUrlChange = (event) => { + setRegistryUrl(event.target.value); + }; + const handleContinue = async () => { + try { + const response = await fetch("/api/get-network-participant", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ registryUrl }), + }); + + if (response.ok) { + const networkParticipantsData = await response.json(); + router.push("/monitor/dashboard"); + // redirecting to the dashboard page + } else { + console.log("error fetching participant data"); + } + } catch (error) { + console.error("Error:", error); + } + }; + + return ( + <> +
+
+ + {/*

ONIX{pathname}

*/} +

Network Registry

+
+ + {/* */} + {/* */} + {/* */} + +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/app/page.js b/onix-gui/onix/app/page.js similarity index 81% rename from onix-gui/app/page.js rename to onix-gui/onix/app/page.js index 600fc62..33f3594 100644 --- a/onix-gui/app/page.js +++ b/onix-gui/onix/app/page.js @@ -1,7 +1,7 @@ import Link from "next/link"; import styles from "./page.module.css"; import { Ubuntu_Mono } from "next/font/google"; -import Image from "next/image"; + const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -25,25 +25,25 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- arrow +

Installation Wizard

- {/*
- arrow +

Network Monitor

- */} +
- arrow +

Layer 2 Tester

diff --git a/onix-gui/app/page.module.css b/onix-gui/onix/app/page.module.css similarity index 100% rename from onix-gui/app/page.module.css rename to onix-gui/onix/app/page.module.css diff --git a/onix-gui/app/setup/bap/page.js b/onix-gui/onix/app/setup/bap/page.js similarity index 98% rename from onix-gui/app/setup/bap/page.js rename to onix-gui/onix/app/setup/bap/page.js index 2613e6e..ff4b4f8 100644 --- a/onix-gui/app/setup/bap/page.js +++ b/onix-gui/onix/app/setup/bap/page.js @@ -117,7 +117,7 @@ export default function Home() { />
- {/* */} +
- {/* */} +
- {/* */} +
diff --git a/onix-gui/app/setup/registry/page.js b/onix-gui/onix/app/setup/registry/page.js similarity index 97% rename from onix-gui/app/setup/registry/page.js rename to onix-gui/onix/app/setup/registry/page.js index 6fce954..8bc57c2 100644 --- a/onix-gui/app/setup/registry/page.js +++ b/onix-gui/onix/app/setup/registry/page.js @@ -85,7 +85,7 @@ export default function Home() { onChange={handleRegistryUrlChange} />
- {/* */} +
diff --git a/onix-gui/app/template.csv b/onix-gui/onix/app/template.csv similarity index 100% rename from onix-gui/app/template.csv rename to onix-gui/onix/app/template.csv diff --git a/onix-gui/app/yaml-gen/install-yaml/page.js b/onix-gui/onix/app/yaml-gen/check-yaml/page.js similarity index 59% rename from onix-gui/app/yaml-gen/install-yaml/page.js rename to onix-gui/onix/app/yaml-gen/check-yaml/page.js index 22ad80c..4ebbcf6 100644 --- a/onix-gui/app/yaml-gen/install-yaml/page.js +++ b/onix-gui/onix/app/yaml-gen/check-yaml/page.js @@ -1,12 +1,12 @@ "use client"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import styles from "../../page.module.css"; +import { useState } from "react"; import { Ubuntu_Mono } from "next/font/google"; -import Slider from "@/components/Slider/Slider"; import PrimaryButton from "@/components/Buttons/PrimaryButton"; import InputField from "@/components/InputField/InputField"; -import { useState, useCallback } from "react"; +import Slider from "@/components/Slider/Slider"; +import styles from "../../page.module.css"; import { toast } from "react-toastify"; +import Link from "next/link"; const ubuntuMono = Ubuntu_Mono({ weight: "400", @@ -14,34 +14,30 @@ const ubuntuMono = Ubuntu_Mono({ subsets: ["latin"], }); -export default function InstallYaml() { - const [yamlUrl, setYamlUrl] = useState(""); +export default function CheckYaml() { const [checked, setChecked] = useState(false); + const [propertyLink, setPropertyLink] = useState(""); - const container = checked ? "bpp-network" : "bap-network"; - - const handleRegistryUrlChange = (event) => { - setYamlUrl(event.target.value); + const handleYamlChange = (event) => { + setPropertyLink(event.target.value); }; - const installYaml = useCallback(async () => { - const toastId = toast.loading("Installing Layer 2 Config file..."); - + const handleOnclick = async () => { + const toastId = toast.loading("Checking for layer2 yaml file"); try { - const response = await fetch("/api/install-layer2", { + const response = await fetch("/api/check-layer2", { method: "POST", headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ container, yamlUrl }), + body: JSON.stringify({ checked }), }); if (response.ok) { const data = await response.json(); - console.log(data); - const FileFound = data.message; - if (FileFound == false) { - setShowDownloadLayer2Button(true); + const yamlFile = data; + console.log("YAML", yamlFile); + if (yamlFile == 0) { toast.update(toastId, { render: "No Layer 2 Config Present 🤯", type: "error", @@ -68,19 +64,22 @@ export default function InstallYaml() { } catch (error) { console.error("An error occurred:", error); } - }); - + }; return ( <>
+ +
- -

Install Yaml

+

+ Yaml File Checker +

+
+ {/* */} +
- {/* */} - +
diff --git a/onix-gui/onix/app/yaml-gen/option/bap/page.js b/onix-gui/onix/app/yaml-gen/option/bap/page.js new file mode 100644 index 0000000..974a6a9 --- /dev/null +++ b/onix-gui/onix/app/yaml-gen/option/bap/page.js @@ -0,0 +1,64 @@ +"use client"; + +import InputField from "@/components/InputField/InputField"; +import styles from "../../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import { usePathname } from "next/navigation"; +import { useState, useCallback } from "react"; +import Slider from "@/components/Slider/Slider" + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + + +export default function Bap() { + + const [checked, setChecked] = useState(false); + const [propertyName, setPropertyName] = useState(""); + const [propertyLink, setPropertyLink] = useState(""); + const [propertyOption, setPropertyOption] = useState(""); + + return ( + <> +
+
+

BAP

+
+ + + + + + + +
+ + +
+
+
+
+ + ) +} \ No newline at end of file diff --git a/onix-gui/onix/app/yaml-gen/option/bpp/page.js b/onix-gui/onix/app/yaml-gen/option/bpp/page.js new file mode 100644 index 0000000..c4ff616 --- /dev/null +++ b/onix-gui/onix/app/yaml-gen/option/bpp/page.js @@ -0,0 +1,64 @@ +"use client"; + +import InputField from "@/components/InputField/InputField"; +import styles from "../../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import { usePathname } from "next/navigation"; +import { useState, useCallback } from "react"; +import Slider from "@/components/Slider/Slider" + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + + +export default function Bpp() { + + const [checked, setChecked] = useState(false); + const [propertyName, setPropertyName] = useState(""); + const [propertyLink, setPropertyLink] = useState(""); + const [propertyOption, setPropertyOption] = useState(""); + + return ( + <> +
+
+

BPP

+
+ + + + + + + +
+ + +
+
+
+
+ + ) +} \ No newline at end of file diff --git a/onix-gui/onix/app/yaml-gen/option/page.js b/onix-gui/onix/app/yaml-gen/option/page.js new file mode 100644 index 0000000..b8a9b35 --- /dev/null +++ b/onix-gui/onix/app/yaml-gen/option/page.js @@ -0,0 +1,43 @@ +import Link from "next/link"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + + +export default function Option() { + return ( + <> +
+
+

Yaml File Generator

+
+ +
+ +

BAP

+
+ + +
+ +

BPP

+
+ +
+ +
+
+ + ) +} \ No newline at end of file diff --git a/onix-gui/onix/app/yaml-gen/page.js b/onix-gui/onix/app/yaml-gen/page.js new file mode 100644 index 0000000..1fcf514 --- /dev/null +++ b/onix-gui/onix/app/yaml-gen/page.js @@ -0,0 +1,122 @@ +import Link from "next/link"; +import styles from "../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import btnstyles from "@/components/Buttons/Buttons.module.css"; +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function YamlGen() { + return ( + <> +
+
+

+ Yaml File Generator +

+
+ +
+ +

Search

+
+ + +
+ +

Select

+
+ + +
+ +

Init

+
+ + +
+ +

Confirm

+
+ + +
+ +

Status

+
+ +
+
+ +
+ +

Track

+
+ + +
+ +

Cancel

+
+ + +
+ +

Update

+
+ + +
+ +

Rating

+
+ + +
+ +

Support

+
+ +
+
+ +
+ + ); +} diff --git a/onix-gui/components/Buttons/Buttons.module.css b/onix-gui/onix/components/Buttons/Buttons.module.css similarity index 100% rename from onix-gui/components/Buttons/Buttons.module.css rename to onix-gui/onix/components/Buttons/Buttons.module.css diff --git a/onix-gui/components/Buttons/PrimaryButton.js b/onix-gui/onix/components/Buttons/PrimaryButton.js similarity index 100% rename from onix-gui/components/Buttons/PrimaryButton.js rename to onix-gui/onix/components/Buttons/PrimaryButton.js diff --git a/onix-gui/components/Buttons/SecondaryButton.jsx b/onix-gui/onix/components/Buttons/SecondaryButton.jsx similarity index 100% rename from onix-gui/components/Buttons/SecondaryButton.jsx rename to onix-gui/onix/components/Buttons/SecondaryButton.jsx diff --git a/onix-gui/components/InputField/InputField.jsx b/onix-gui/onix/components/InputField/InputField.jsx similarity index 76% rename from onix-gui/components/InputField/InputField.jsx rename to onix-gui/onix/components/InputField/InputField.jsx index aac6551..e20ce98 100644 --- a/onix-gui/components/InputField/InputField.jsx +++ b/onix-gui/onix/components/InputField/InputField.jsx @@ -1,12 +1,12 @@ import React from "react"; import styles from "./InputField.module.css"; -const InputField = ({ label, value, onChange, placeholder = "Input Text" }) => { +const InputField = ({ label, value, onChange }) => { return (
Date: Thu, 2 May 2024 21:53:36 +0530 Subject: [PATCH 03/17] contributors --- onix-gui/onix/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/onix-gui/onix/README.md b/onix-gui/onix/README.md index a18038f..b701976 100644 --- a/onix-gui/onix/README.md +++ b/onix-gui/onix/README.md @@ -42,6 +42,15 @@ Contributions are welcome! If you'd like to contribute to the beckn-onix-gui pro The beckn-onix-gui project is licensed under the MIT License. See the LICENSE file for more information. + ## Contact If you have any questions or issues with the beckn-onix-gui project, please don't hesitate to reach out. + +### Made with ❤️ + +built by the [Mulearn Team](https://mulearn.org/) +1. [Mishal Abdullah](https://github.com/Mishalabdullah/) +2. [Aswin Asok](https://github.com/AswinAsok) +3. [Viraj Prabhu ](https://github.com/viraka) +4. [Adasrsh](https://adarshmohanks.framer.website/) From ff0cd836137e03bddef92e53a494df4c13c098c7 Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Fri, 3 May 2024 11:10:14 +0530 Subject: [PATCH 04/17] copied new version --- onix-gui/{onix => GUI}/README.md | 30 ++--- onix-gui/{onix => GUI}/app/Infy_Pending.pdf | Bin .../app/api/check-layer2/route.js | 36 ++++-- .../app/api/clonning-repo/route.js | 0 .../app/api/install-bap/route.js | 7 +- .../app/api/install-bpp/route.js | 5 +- .../app/api/install-gateway/route.js | 5 +- onix-gui/GUI/app/api/install-layer2/route.js | 38 ++++++ .../app/api/install-registry/route.js | 14 ++ onix-gui/{onix => GUI}/app/favicon.ico | Bin onix-gui/{onix => GUI}/app/globals.css | 0 .../app/install/configure/page.js | 8 +- .../{onix => GUI}/app/install/create/page.js | 10 +- .../{onix => GUI}/app/install/join/page.js | 8 +- .../{onix => GUI}/app/install/local/page.js | 8 +- .../{onix => GUI}/app/install/merge/page.js | 15 ++- onix-gui/{onix => GUI}/app/install/page.js | 35 +---- onix-gui/{onix => GUI}/app/layout.js | 0 onix-gui/{onix => GUI}/app/page.js | 14 +- onix-gui/{onix => GUI}/app/page.module.css | 0 onix-gui/{onix => GUI}/app/setup/bap/page.js | 2 +- onix-gui/{onix => GUI}/app/setup/bpp/page.js | 2 +- .../{onix => GUI}/app/setup/gateway/page.js | 2 +- .../{onix => GUI}/app/setup/registry/page.js | 2 +- onix-gui/{onix => GUI}/app/template.csv | 0 .../GUI/app/yaml-gen/install-yaml/page.js | 105 +++++++++++++++ .../check-yaml => GUI/app/yaml-gen}/page.js | 59 +++++++-- .../components/Buttons/Buttons.module.css | 0 .../components/Buttons/PrimaryButton.js | 0 .../components/Buttons/SecondaryButton.jsx | 0 .../components/InputField/InputField.jsx | 4 +- .../InputField/InputField.module.css | 0 .../components/Slider/Slider.jsx | 0 .../components/Slider/Slider.module.css | 0 onix-gui/{onix => GUI}/jsconfig.json | 0 onix-gui/{onix => GUI}/package-lock.json | 0 onix-gui/{onix => GUI}/package.json | 0 onix-gui/{onix => GUI}/public/arrow.png | Bin onix-gui/onix/.eslintrc.json | 3 - onix-gui/onix/.gitignore | 36 ------ .../app/api/get-network-participant/route.js | 27 ---- onix-gui/onix/app/monitor/dashboard/page.js | 95 -------------- onix-gui/onix/app/monitor/page.js | 74 ----------- onix-gui/onix/app/yaml-gen/option/bap/page.js | 64 --------- onix-gui/onix/app/yaml-gen/option/bpp/page.js | 64 --------- onix-gui/onix/app/yaml-gen/option/page.js | 43 ------ onix-gui/onix/app/yaml-gen/page.js | 122 ------------------ onix-gui/onix/next.config.mjs | 4 - onix-gui/start.sh | 3 +- 49 files changed, 300 insertions(+), 644 deletions(-) rename onix-gui/{onix => GUI}/README.md (60%) rename onix-gui/{onix => GUI}/app/Infy_Pending.pdf (100%) rename onix-gui/{onix => GUI}/app/api/check-layer2/route.js (60%) rename onix-gui/{onix => GUI}/app/api/clonning-repo/route.js (100%) rename onix-gui/{onix => GUI}/app/api/install-bap/route.js (92%) rename onix-gui/{onix => GUI}/app/api/install-bpp/route.js (93%) rename onix-gui/{onix => GUI}/app/api/install-gateway/route.js (93%) create mode 100644 onix-gui/GUI/app/api/install-layer2/route.js rename onix-gui/{onix => GUI}/app/api/install-registry/route.js (85%) rename onix-gui/{onix => GUI}/app/favicon.ico (100%) rename onix-gui/{onix => GUI}/app/globals.css (100%) rename onix-gui/{onix => GUI}/app/install/configure/page.js (85%) rename onix-gui/{onix => GUI}/app/install/create/page.js (84%) rename onix-gui/{onix => GUI}/app/install/join/page.js (86%) rename onix-gui/{onix => GUI}/app/install/local/page.js (85%) rename onix-gui/{onix => GUI}/app/install/merge/page.js (76%) rename onix-gui/{onix => GUI}/app/install/page.js (56%) rename onix-gui/{onix => GUI}/app/layout.js (100%) rename onix-gui/{onix => GUI}/app/page.js (81%) rename onix-gui/{onix => GUI}/app/page.module.css (100%) rename onix-gui/{onix => GUI}/app/setup/bap/page.js (98%) rename onix-gui/{onix => GUI}/app/setup/bpp/page.js (98%) rename onix-gui/{onix => GUI}/app/setup/gateway/page.js (98%) rename onix-gui/{onix => GUI}/app/setup/registry/page.js (97%) rename onix-gui/{onix => GUI}/app/template.csv (100%) create mode 100644 onix-gui/GUI/app/yaml-gen/install-yaml/page.js rename onix-gui/{onix/app/yaml-gen/check-yaml => GUI/app/yaml-gen}/page.js (59%) rename onix-gui/{onix => GUI}/components/Buttons/Buttons.module.css (100%) rename onix-gui/{onix => GUI}/components/Buttons/PrimaryButton.js (100%) rename onix-gui/{onix => GUI}/components/Buttons/SecondaryButton.jsx (100%) rename onix-gui/{onix => GUI}/components/InputField/InputField.jsx (76%) rename onix-gui/{onix => GUI}/components/InputField/InputField.module.css (100%) rename onix-gui/{onix => GUI}/components/Slider/Slider.jsx (100%) rename onix-gui/{onix => GUI}/components/Slider/Slider.module.css (100%) rename onix-gui/{onix => GUI}/jsconfig.json (100%) rename onix-gui/{onix => GUI}/package-lock.json (100%) rename onix-gui/{onix => GUI}/package.json (100%) rename onix-gui/{onix => GUI}/public/arrow.png (100%) delete mode 100644 onix-gui/onix/.eslintrc.json delete mode 100644 onix-gui/onix/.gitignore delete mode 100644 onix-gui/onix/app/api/get-network-participant/route.js delete mode 100644 onix-gui/onix/app/monitor/dashboard/page.js delete mode 100644 onix-gui/onix/app/monitor/page.js delete mode 100644 onix-gui/onix/app/yaml-gen/option/bap/page.js delete mode 100644 onix-gui/onix/app/yaml-gen/option/bpp/page.js delete mode 100644 onix-gui/onix/app/yaml-gen/option/page.js delete mode 100644 onix-gui/onix/app/yaml-gen/page.js delete mode 100644 onix-gui/onix/next.config.mjs diff --git a/onix-gui/onix/README.md b/onix-gui/GUI/README.md similarity index 60% rename from onix-gui/onix/README.md rename to onix-gui/GUI/README.md index b701976..5453b9b 100644 --- a/onix-gui/onix/README.md +++ b/onix-gui/GUI/README.md @@ -6,23 +6,28 @@ The GUI for the beckn-onix cli tool. 1. 4 server/instances 2. 4 sub-domains mapped to each instance -3. Local Tunnel - `npm i -g localtunnel` ## User Guide -### Step 1: Run the `start.sh` script +### Step 1: Clone the beckn-onix-gui repo ``` -cd .. && ./start.sh +git clone https://github.com/Mishalabdullah/beckn-onix-gui.git ``` -### Step 2: Accessing the GUI. +### Step 2: Change directory to the nextjs project -You will be getting a URL and password as on output of the script. Open the url in the browser and then -paste the password. +``` +cd onix-gui +``` -### Step 3: Install and setup your network +### Step 3: Run nextjs on port 3005 + +For running the installation script just run this command. The sudo privilages are required when installing packages and configuring the nginx reverse proxy + +``` +sudo ./start.sh +``` Note: Port 3000 is being used by onix, so we're using port 3005 instead. @@ -42,15 +47,6 @@ Contributions are welcome! If you'd like to contribute to the beckn-onix-gui pro The beckn-onix-gui project is licensed under the MIT License. See the LICENSE file for more information. - ## Contact If you have any questions or issues with the beckn-onix-gui project, please don't hesitate to reach out. - -### Made with ❤️ - -built by the [Mulearn Team](https://mulearn.org/) -1. [Mishal Abdullah](https://github.com/Mishalabdullah/) -2. [Aswin Asok](https://github.com/AswinAsok) -3. [Viraj Prabhu ](https://github.com/viraka) -4. [Adasrsh](https://adarshmohanks.framer.website/) diff --git a/onix-gui/onix/app/Infy_Pending.pdf b/onix-gui/GUI/app/Infy_Pending.pdf similarity index 100% rename from onix-gui/onix/app/Infy_Pending.pdf rename to onix-gui/GUI/app/Infy_Pending.pdf diff --git a/onix-gui/onix/app/api/check-layer2/route.js b/onix-gui/GUI/app/api/check-layer2/route.js similarity index 60% rename from onix-gui/onix/app/api/check-layer2/route.js rename to onix-gui/GUI/app/api/check-layer2/route.js index 9ffccdf..1fb27cf 100644 --- a/onix-gui/onix/app/api/check-layer2/route.js +++ b/onix-gui/GUI/app/api/check-layer2/route.js @@ -2,8 +2,9 @@ import { exec } from "child_process"; import { NextResponse } from "next/server"; export async function POST(req) { - const checked = await req.json(); - const containerName = checked.checked ? "bpp-network" : "bap-network"; + const request = await req.json(); + const containerName = request.checked ? "bpp-network" : "bap-network"; + const fileToCheck = request.fileName; const executeShellCommand = (command) => { return new Promise((resolve, reject) => { @@ -13,13 +14,11 @@ export async function POST(req) { reject(error); return; } - if (stderr) { console.error("Error:", stderr); reject(new Error(stderr)); return; } - const output = stdout; console.log("Output:", output); resolve(output); @@ -31,7 +30,6 @@ export async function POST(req) { const containerExists = await executeShellCommand( `docker ps -a --filter "name=${containerName}" --format "{{.Names}}"` ); - if (!containerExists.trim()) { return new NextResponse(`Error: ${containerName} server not present`, { status: 500, @@ -39,14 +37,30 @@ export async function POST(req) { } const result = await executeShellCommand( - `docker exec ${containerName} ls /usr/src/app/schemas/ | grep -v "core" | grep ".yaml" | wc -l` + `docker exec ${containerName} /bin/sh -c "[ -f '/usr/src/app/schemas/${fileToCheck}' ] && echo 'File found' || echo 'File not found'"` ); - - return new NextResponse(result); + if (result.trim() === "File found") { + return NextResponse.json( + { message: true }, + { + status: 200, + } + ); + } else { + return NextResponse.json( + { message: false }, + { + status: 200, + } + ); + } } catch (error) { console.error(`exec error: ${error}`); - return new NextResponse(`Error executing shell command: ${error}`, { - status: 500, - }); + return NextResponse.json( + { message: `Error executing shell command: ${error}` }, + { + status: 500, + } + ); } } diff --git a/onix-gui/onix/app/api/clonning-repo/route.js b/onix-gui/GUI/app/api/clonning-repo/route.js similarity index 100% rename from onix-gui/onix/app/api/clonning-repo/route.js rename to onix-gui/GUI/app/api/clonning-repo/route.js diff --git a/onix-gui/onix/app/api/install-bap/route.js b/onix-gui/GUI/app/api/install-bap/route.js similarity index 92% rename from onix-gui/onix/app/api/install-bap/route.js rename to onix-gui/GUI/app/api/install-bap/route.js index 9236941..2c5fb04 100644 --- a/onix-gui/onix/app/api/install-bap/route.js +++ b/onix-gui/GUI/app/api/install-bap/route.js @@ -47,7 +47,10 @@ export async function startSupportServices() { `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` ); console.log("Result 3:", result3); - + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + await executeCommand("docker volume create gateway_data_volume"); + await executeCommand("docker volume create gateway_database_volume"); return NextResponse.json({ result1, result2, result3 }); } catch (error) { console.error("An error occurred:", error); @@ -91,10 +94,10 @@ export async function POST(req) { const bppSubscriberId = data.subscriberId; const bppSubscriberUrl = data.subscriberUrl; const networkconfigurl = data.networkconfigurl; + let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bap_config.sh ${registryUrl} ${bppSubscriberId} ${bppSubscriberUrl} ${networkconfigurl}`; const result1 = await executeCommand(updateBppConfigCommand); console.log("Result 1:", result1); - const result3 = await executeCommand( `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-client"` ); diff --git a/onix-gui/onix/app/api/install-bpp/route.js b/onix-gui/GUI/app/api/install-bpp/route.js similarity index 93% rename from onix-gui/onix/app/api/install-bpp/route.js rename to onix-gui/GUI/app/api/install-bpp/route.js index 9943be4..2ac5ca0 100644 --- a/onix-gui/onix/app/api/install-bpp/route.js +++ b/onix-gui/GUI/app/api/install-bpp/route.js @@ -47,7 +47,10 @@ export async function startSupportServices() { `docker-compose -f ${pathDir}/install/docker-compose-app.yml up -d redis_db` ); console.log("Result 3:", result3); - + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + await executeCommand("docker volume create gateway_data_volume"); + await executeCommand("docker volume create gateway_database_volume"); return NextResponse.json({ result1, result2, result3 }); } catch (error) { console.error("An error occurred:", error); diff --git a/onix-gui/onix/app/api/install-gateway/route.js b/onix-gui/GUI/app/api/install-gateway/route.js similarity index 93% rename from onix-gui/onix/app/api/install-gateway/route.js rename to onix-gui/GUI/app/api/install-gateway/route.js index 46b150b..3545f6e 100644 --- a/onix-gui/onix/app/api/install-gateway/route.js +++ b/onix-gui/GUI/app/api/install-gateway/route.js @@ -64,7 +64,8 @@ export async function POST(req, res) { `bash ${pathDir}/install/scripts/package_manager.sh` ); console.log("Result 1:", result1); - + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); const result2 = await executeCommand( ` bash ${pathDir}/install/scripts/update_gateway_details.sh ${data.registryUrl} ${data.gatewayUrl}` ); @@ -75,7 +76,7 @@ export async function POST(req, res) { ); console.log("Result 3:", result3); - const result4 = await executeCommand(`sleep 10`); + const result4 = await executeCommand(`sleep 2`); console.log("Result 4:", result4); const result5 = await executeCommand( diff --git a/onix-gui/GUI/app/api/install-layer2/route.js b/onix-gui/GUI/app/api/install-layer2/route.js new file mode 100644 index 0000000..c795226 --- /dev/null +++ b/onix-gui/GUI/app/api/install-layer2/route.js @@ -0,0 +1,38 @@ +import { exec } from "child_process"; +import { NextResponse } from "next/server"; + +export async function POST(req) { + const request = await req.json(); + const fileURL = request.yamlUrl; + const containerName = request.container; + + const executeShellCommand = (command) => { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + if (error) { + console.error("Error:", error); + reject(error); + return; + } + if (stderr) { + console.error("Error:", stderr); + reject(new Error(stderr)); + return; + } + const output = stdout; + console.log("Output:", output); + resolve(output); + }); + }); + }; + + try { + await executeShellCommand( + `docker exec ${containerName} wget -P /usr/src/app/schemas/ ${fileURL}` + ); + return NextResponse.json({ status: 200 }); + } catch (error) { + console.error(`exec error: ${error}`); + return NextResponse.json({ status: 500 }); + } +} diff --git a/onix-gui/onix/app/api/install-registry/route.js b/onix-gui/GUI/app/api/install-registry/route.js similarity index 85% rename from onix-gui/onix/app/api/install-registry/route.js rename to onix-gui/GUI/app/api/install-registry/route.js index fbffb7b..70c4102 100644 --- a/onix-gui/onix/app/api/install-registry/route.js +++ b/onix-gui/GUI/app/api/install-registry/route.js @@ -111,6 +111,20 @@ export async function POST(req, res) { await fs.writeFile(tempFile, updatedConfigData); await fs.rename(tempFile, configFile); + await executeCommand("docker volume create registry_data_volume"); + await executeCommand("docker volume create registry_database_volume"); + await executeCommand("docker volume create gateway_data_volume"); + await executeCommand("docker volume create gateway_database_volume"); + await executeCommand( + `docker run --rm -v ${join( + pathDir, + "install", + "registry_data", + "config" + )}:/source -v registry_data_volume:/target busybox sh -c "cp /source/envvars /target/ && cp /source/logger.properties /target/ && cp /source/swf.properties /target/"` + ); + + // Start the registry container await executeCommand( `docker-compose -f ${join( pathDir, diff --git a/onix-gui/onix/app/favicon.ico b/onix-gui/GUI/app/favicon.ico similarity index 100% rename from onix-gui/onix/app/favicon.ico rename to onix-gui/GUI/app/favicon.ico diff --git a/onix-gui/onix/app/globals.css b/onix-gui/GUI/app/globals.css similarity index 100% rename from onix-gui/onix/app/globals.css rename to onix-gui/GUI/app/globals.css diff --git a/onix-gui/onix/app/install/configure/page.js b/onix-gui/GUI/app/install/configure/page.js similarity index 85% rename from onix-gui/onix/app/install/configure/page.js rename to onix-gui/GUI/app/install/configure/page.js index f0749f9..4da2300 100644 --- a/onix-gui/onix/app/install/configure/page.js +++ b/onix-gui/GUI/app/install/configure/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -28,7 +28,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Gateway

@@ -37,7 +37,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

BAP Adapter

@@ -46,7 +46,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

BPP Adapter

diff --git a/onix-gui/onix/app/install/create/page.js b/onix-gui/GUI/app/install/create/page.js similarity index 84% rename from onix-gui/onix/app/install/create/page.js rename to onix-gui/GUI/app/install/create/page.js index 14e38e6..0cf9db7 100644 --- a/onix-gui/onix/app/install/create/page.js +++ b/onix-gui/GUI/app/install/create/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -28,7 +28,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Gateway

@@ -37,7 +37,7 @@ export default function Home() { className={styles.box} style={{ textDecoration: "underline", color: "white" }} > - + arrow

BAP Adapter

@@ -46,7 +46,7 @@ export default function Home() { className={styles.box} style={{ textDecoration: "underline", color: "white" }} > - + arrow

BPP Adapter

@@ -55,7 +55,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Registry

diff --git a/onix-gui/onix/app/install/join/page.js b/onix-gui/GUI/app/install/join/page.js similarity index 86% rename from onix-gui/onix/app/install/join/page.js rename to onix-gui/GUI/app/install/join/page.js index 5223af5..619e14b 100644 --- a/onix-gui/onix/app/install/join/page.js +++ b/onix-gui/GUI/app/install/join/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -32,7 +32,7 @@ export default function Home() { }} >
- + arrow

Gateway

@@ -44,7 +44,7 @@ export default function Home() { }} >
- + arrow

BAP Adapter

@@ -56,7 +56,7 @@ export default function Home() { }} >
- + arrow

BPP Adapter

diff --git a/onix-gui/onix/app/install/local/page.js b/onix-gui/GUI/app/install/local/page.js similarity index 85% rename from onix-gui/onix/app/install/local/page.js rename to onix-gui/GUI/app/install/local/page.js index a698588..7dbd607 100644 --- a/onix-gui/onix/app/install/local/page.js +++ b/onix-gui/GUI/app/install/local/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -30,7 +30,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Gateway

@@ -39,7 +39,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

BAP Adapter

@@ -48,7 +48,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

BPP Adapter

diff --git a/onix-gui/onix/app/install/merge/page.js b/onix-gui/GUI/app/install/merge/page.js similarity index 76% rename from onix-gui/onix/app/install/merge/page.js rename to onix-gui/GUI/app/install/merge/page.js index 7e256d9..7391660 100644 --- a/onix-gui/onix/app/install/merge/page.js +++ b/onix-gui/GUI/app/install/merge/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -15,7 +15,12 @@ export default function Home() { <>
- +

Merge multiple networks

- + arrow

Gateway

@@ -32,7 +37,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

BAP

@@ -41,7 +46,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

BPP

diff --git a/onix-gui/onix/app/install/page.js b/onix-gui/GUI/app/install/page.js similarity index 56% rename from onix-gui/onix/app/install/page.js rename to onix-gui/GUI/app/install/page.js index e104190..a196231 100644 --- a/onix-gui/onix/app/install/page.js +++ b/onix-gui/GUI/app/install/page.js @@ -3,7 +3,7 @@ import Link from "next/link"; import styles from "../page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -33,7 +33,7 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Join an existing network

@@ -42,39 +42,10 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Create new production network

- -
- -

- Set up a network on your local machine -

-
- - {/* -
- -

Merge multiple networks

-
- - -
- -

Configure Existing Network

-
- */}
diff --git a/onix-gui/onix/app/layout.js b/onix-gui/GUI/app/layout.js similarity index 100% rename from onix-gui/onix/app/layout.js rename to onix-gui/GUI/app/layout.js diff --git a/onix-gui/onix/app/page.js b/onix-gui/GUI/app/page.js similarity index 81% rename from onix-gui/onix/app/page.js rename to onix-gui/GUI/app/page.js index 33f3594..600fc62 100644 --- a/onix-gui/onix/app/page.js +++ b/onix-gui/GUI/app/page.js @@ -1,7 +1,7 @@ import Link from "next/link"; import styles from "./page.module.css"; import { Ubuntu_Mono } from "next/font/google"; - +import Image from "next/image"; const ubuntuMono = Ubuntu_Mono({ weight: "400", style: "normal", @@ -25,25 +25,25 @@ export default function Home() { style={{ textDecoration: "underline", color: "white" }} >
- + arrow

Installation Wizard

-
- + arrow

Network Monitor

- + */}
- + arrow

Layer 2 Tester

diff --git a/onix-gui/onix/app/page.module.css b/onix-gui/GUI/app/page.module.css similarity index 100% rename from onix-gui/onix/app/page.module.css rename to onix-gui/GUI/app/page.module.css diff --git a/onix-gui/onix/app/setup/bap/page.js b/onix-gui/GUI/app/setup/bap/page.js similarity index 98% rename from onix-gui/onix/app/setup/bap/page.js rename to onix-gui/GUI/app/setup/bap/page.js index ff4b4f8..2613e6e 100644 --- a/onix-gui/onix/app/setup/bap/page.js +++ b/onix-gui/GUI/app/setup/bap/page.js @@ -117,7 +117,7 @@ export default function Home() { />
- + {/* */}
- + {/* */}
- + {/* */}
diff --git a/onix-gui/onix/app/setup/registry/page.js b/onix-gui/GUI/app/setup/registry/page.js similarity index 97% rename from onix-gui/onix/app/setup/registry/page.js rename to onix-gui/GUI/app/setup/registry/page.js index 8bc57c2..6fce954 100644 --- a/onix-gui/onix/app/setup/registry/page.js +++ b/onix-gui/GUI/app/setup/registry/page.js @@ -85,7 +85,7 @@ export default function Home() { onChange={handleRegistryUrlChange} />
- + {/* */}
diff --git a/onix-gui/onix/app/template.csv b/onix-gui/GUI/app/template.csv similarity index 100% rename from onix-gui/onix/app/template.csv rename to onix-gui/GUI/app/template.csv diff --git a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js new file mode 100644 index 0000000..22ad80c --- /dev/null +++ b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js @@ -0,0 +1,105 @@ +"use client"; +import SecondaryButton from "@/components/Buttons/SecondaryButton"; +import styles from "../../page.module.css"; +import { Ubuntu_Mono } from "next/font/google"; +import Slider from "@/components/Slider/Slider"; +import PrimaryButton from "@/components/Buttons/PrimaryButton"; +import InputField from "@/components/InputField/InputField"; +import { useState, useCallback } from "react"; +import { toast } from "react-toastify"; + +const ubuntuMono = Ubuntu_Mono({ + weight: "400", + style: "normal", + subsets: ["latin"], +}); + +export default function InstallYaml() { + const [yamlUrl, setYamlUrl] = useState(""); + const [checked, setChecked] = useState(false); + + const container = checked ? "bpp-network" : "bap-network"; + + const handleRegistryUrlChange = (event) => { + setYamlUrl(event.target.value); + }; + + const installYaml = useCallback(async () => { + const toastId = toast.loading("Installing Layer 2 Config file..."); + + try { + const response = await fetch("/api/install-layer2", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ container, yamlUrl }), + }); + + if (response.ok) { + const data = await response.json(); + console.log(data); + const FileFound = data.message; + if (FileFound == false) { + setShowDownloadLayer2Button(true); + toast.update(toastId, { + render: "No Layer 2 Config Present 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } else { + toast.update(toastId, { + render: "Yaml File Present 👌", + type: "success", + isLoading: false, + autoClose: 5000, + }); + } + } else { + console.error("Failed to check yaml"); + toast.update(toastId, { + render: "Container Not Found 🤯", + type: "error", + isLoading: false, + autoClose: 5000, + }); + } + } catch (error) { + console.error("An error occurred:", error); + } + }); + + return ( + <> +
+
+ +

Install Yaml

+
+ + +
+ {/* */} + +
+
+
+
+ + ); +} diff --git a/onix-gui/onix/app/yaml-gen/check-yaml/page.js b/onix-gui/GUI/app/yaml-gen/page.js similarity index 59% rename from onix-gui/onix/app/yaml-gen/check-yaml/page.js rename to onix-gui/GUI/app/yaml-gen/page.js index 4ebbcf6..937fa35 100644 --- a/onix-gui/onix/app/yaml-gen/check-yaml/page.js +++ b/onix-gui/GUI/app/yaml-gen/page.js @@ -4,8 +4,9 @@ import { Ubuntu_Mono } from "next/font/google"; import PrimaryButton from "@/components/Buttons/PrimaryButton"; import InputField from "@/components/InputField/InputField"; import Slider from "@/components/Slider/Slider"; -import styles from "../../page.module.css"; +import styles from "../page.module.css"; import { toast } from "react-toastify"; + import Link from "next/link"; const ubuntuMono = Ubuntu_Mono({ @@ -15,14 +16,37 @@ const ubuntuMono = Ubuntu_Mono({ }); export default function CheckYaml() { + const [domainName, setDomainName] = useState(""); + const [versionNumber, setversionNumber] = useState(""); const [checked, setChecked] = useState(false); + const [showDownloadLayer2Button, setShowDownloadLayer2Button] = + useState(false); const [propertyLink, setPropertyLink] = useState(""); const handleYamlChange = (event) => { setPropertyLink(event.target.value); }; + const handledomainNameChange = (event) => { + setDomainName(event.target.value); + }; + const handleVersionChange = (event) => { + setversionNumber(event.target.value); + }; + const nameGenerator = async () => { + const parts = domainName.split(":"); + const domainNameWithoutVersion = parts[0]; + let filename; + if (parts[1] === undefined || parts[1] === "") { + filename = `${domainNameWithoutVersion}_${versionNumber}.yaml`; + } else { + filename = `${domainNameWithoutVersion}_${parts[1]}_${versionNumber}.yaml`; + } + console.log(filename); + return filename; + }; const handleOnclick = async () => { + const fileName = await nameGenerator(); const toastId = toast.loading("Checking for layer2 yaml file"); try { const response = await fetch("/api/check-layer2", { @@ -30,14 +54,14 @@ export default function CheckYaml() { headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ checked }), + body: JSON.stringify({ checked, fileName }), }); if (response.ok) { const data = await response.json(); - const yamlFile = data; - console.log("YAML", yamlFile); - if (yamlFile == 0) { + const FileFound = data.message; + if (FileFound == false) { + setShowDownloadLayer2Button(true); toast.update(toastId, { render: "No Layer 2 Config Present 🤯", type: "error", @@ -89,16 +113,29 @@ export default function CheckYaml() { + + - {/* */}
- +
+ {showDownloadLayer2Button && ( + + )}
diff --git a/onix-gui/onix/components/Buttons/Buttons.module.css b/onix-gui/GUI/components/Buttons/Buttons.module.css similarity index 100% rename from onix-gui/onix/components/Buttons/Buttons.module.css rename to onix-gui/GUI/components/Buttons/Buttons.module.css diff --git a/onix-gui/onix/components/Buttons/PrimaryButton.js b/onix-gui/GUI/components/Buttons/PrimaryButton.js similarity index 100% rename from onix-gui/onix/components/Buttons/PrimaryButton.js rename to onix-gui/GUI/components/Buttons/PrimaryButton.js diff --git a/onix-gui/onix/components/Buttons/SecondaryButton.jsx b/onix-gui/GUI/components/Buttons/SecondaryButton.jsx similarity index 100% rename from onix-gui/onix/components/Buttons/SecondaryButton.jsx rename to onix-gui/GUI/components/Buttons/SecondaryButton.jsx diff --git a/onix-gui/onix/components/InputField/InputField.jsx b/onix-gui/GUI/components/InputField/InputField.jsx similarity index 76% rename from onix-gui/onix/components/InputField/InputField.jsx rename to onix-gui/GUI/components/InputField/InputField.jsx index e20ce98..aac6551 100644 --- a/onix-gui/onix/components/InputField/InputField.jsx +++ b/onix-gui/GUI/components/InputField/InputField.jsx @@ -1,12 +1,12 @@ import React from "react"; import styles from "./InputField.module.css"; -const InputField = ({ label, value, onChange }) => { +const InputField = ({ label, value, onChange, placeholder = "Input Text" }) => { return (
{ - const data = [ - { - ip: "192.168.1.1", - status: "Live", - cpu: "2%", - memory: "18.8 MB", - uptime: "10 days", - }, - { - ip: "10.0.0.1", - status: "404", - cpu: "0%", - memory: "0 MB", - uptime: "5 days", - }, - { - ip: "172.16.0.1", - status: "Live", - cpu: "6%", - memory: "56.4 MB", - uptime: "15 days", - }, - { - ip: "192.0.2.1", - status: "Live", - cpu: "69%", - memory: "648.6 MB", - uptime: "20 days", - }, - { - ip: "198.51.100.1", - status: "404", - cpu: "0%", - memory: "0 MB", - uptime: "3 days", - }, - { - ip: "203.0.113.1", - status: "Live", - cpu: ".4%", - memory: "3.7 MB", - uptime: "8 days", - }, - ]; - return ( -
-
-

- Uptime Network Participants: 10 -

-

- Uptime Network Participants: 10 -

-
-

Dashboard

- - - - - - - - - - - - {data.map((item, index) => ( - - - - - - - - ))} - -
S/NIP / Domain NameStatusCPUMemory
{index + 1}{item.ip}{item.status}{item.cpu}{item.memory}
-
- ); -}; - -export default page; diff --git a/onix-gui/onix/app/monitor/page.js b/onix-gui/onix/app/monitor/page.js deleted file mode 100644 index 5e042e2..0000000 --- a/onix-gui/onix/app/monitor/page.js +++ /dev/null @@ -1,74 +0,0 @@ -"use client"; -import { useState } from "react"; -import InputField from "@/components/InputField/InputField"; -import styles from "../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import { useRouter } from "next/navigation"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function Home() { - const [registryUrl, setRegistryUrl] = useState(""); - const router = useRouter(); - const handleRegistryUrlChange = (event) => { - setRegistryUrl(event.target.value); - }; - const handleContinue = async () => { - try { - const response = await fetch("/api/get-network-participant", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ registryUrl }), - }); - - if (response.ok) { - const networkParticipantsData = await response.json(); - router.push("/monitor/dashboard"); - // redirecting to the dashboard page - } else { - console.log("error fetching participant data"); - } - } catch (error) { - console.error("Error:", error); - } - }; - - return ( - <> -
-
- - {/*

ONIX{pathname}

*/} -

Network Registry

-
- - {/* */} - {/* */} - {/* */} - -
- {/* */} - -
-
-
-
- - ); -} diff --git a/onix-gui/onix/app/yaml-gen/option/bap/page.js b/onix-gui/onix/app/yaml-gen/option/bap/page.js deleted file mode 100644 index 974a6a9..0000000 --- a/onix-gui/onix/app/yaml-gen/option/bap/page.js +++ /dev/null @@ -1,64 +0,0 @@ -"use client"; - -import InputField from "@/components/InputField/InputField"; -import styles from "../../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import { usePathname } from "next/navigation"; -import { useState, useCallback } from "react"; -import Slider from "@/components/Slider/Slider" - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - - -export default function Bap() { - - const [checked, setChecked] = useState(false); - const [propertyName, setPropertyName] = useState(""); - const [propertyLink, setPropertyLink] = useState(""); - const [propertyOption, setPropertyOption] = useState(""); - - return ( - <> -
-
-

BAP

-
- - - - - - - -
- - -
-
-
-
- - ) -} \ No newline at end of file diff --git a/onix-gui/onix/app/yaml-gen/option/bpp/page.js b/onix-gui/onix/app/yaml-gen/option/bpp/page.js deleted file mode 100644 index c4ff616..0000000 --- a/onix-gui/onix/app/yaml-gen/option/bpp/page.js +++ /dev/null @@ -1,64 +0,0 @@ -"use client"; - -import InputField from "@/components/InputField/InputField"; -import styles from "../../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import SecondaryButton from "@/components/Buttons/SecondaryButton"; -import PrimaryButton from "@/components/Buttons/PrimaryButton"; -import { usePathname } from "next/navigation"; -import { useState, useCallback } from "react"; -import Slider from "@/components/Slider/Slider" - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - - -export default function Bpp() { - - const [checked, setChecked] = useState(false); - const [propertyName, setPropertyName] = useState(""); - const [propertyLink, setPropertyLink] = useState(""); - const [propertyOption, setPropertyOption] = useState(""); - - return ( - <> -
-
-

BPP

-
- - - - - - - -
- - -
-
-
-
- - ) -} \ No newline at end of file diff --git a/onix-gui/onix/app/yaml-gen/option/page.js b/onix-gui/onix/app/yaml-gen/option/page.js deleted file mode 100644 index b8a9b35..0000000 --- a/onix-gui/onix/app/yaml-gen/option/page.js +++ /dev/null @@ -1,43 +0,0 @@ -import Link from "next/link"; -import styles from "../../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; - -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - - -export default function Option() { - return ( - <> -
-
-

Yaml File Generator

-
- -
- -

BAP

-
- - -
- -

BPP

-
- -
- -
-
- - ) -} \ No newline at end of file diff --git a/onix-gui/onix/app/yaml-gen/page.js b/onix-gui/onix/app/yaml-gen/page.js deleted file mode 100644 index 1fcf514..0000000 --- a/onix-gui/onix/app/yaml-gen/page.js +++ /dev/null @@ -1,122 +0,0 @@ -import Link from "next/link"; -import styles from "../page.module.css"; -import { Ubuntu_Mono } from "next/font/google"; -import btnstyles from "@/components/Buttons/Buttons.module.css"; -const ubuntuMono = Ubuntu_Mono({ - weight: "400", - style: "normal", - subsets: ["latin"], -}); - -export default function YamlGen() { - return ( - <> -
-
-

- Yaml File Generator -

-
- -
- -

Search

-
- - -
- -

Select

-
- - -
- -

Init

-
- - -
- -

Confirm

-
- - -
- -

Status

-
- -
-
- -
- -

Track

-
- - -
- -

Cancel

-
- - -
- -

Update

-
- - -
- -

Rating

-
- - -
- -

Support

-
- -
-
- -
- - ); -} diff --git a/onix-gui/onix/next.config.mjs b/onix-gui/onix/next.config.mjs deleted file mode 100644 index 4678774..0000000 --- a/onix-gui/onix/next.config.mjs +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = {}; - -export default nextConfig; diff --git a/onix-gui/start.sh b/onix-gui/start.sh index ac2ecd3..4bc740b 100755 --- a/onix-gui/start.sh +++ b/onix-gui/start.sh @@ -1,7 +1,7 @@ #!/bin/bash # Set script variables -PROJECT_DIR="onix" +PROJECT_DIR="GUI" PORT=3005 TUNNEL_SERVICE="lt" @@ -14,6 +14,7 @@ echo "installing Dependencies" echo "Building and starting Next.js app..." npx next build && echo "Builing Web App = True" +sleep 3 npx next start -p "$PORT" > /dev/null 2>&1 & # Wait for the Next.js app to start From aceea8afd1b814dd468ef4069c258fc50a0b192b Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Fri, 3 May 2024 11:12:47 +0530 Subject: [PATCH 05/17] updated docs --- onix-gui/GUI/README.md | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/onix-gui/GUI/README.md b/onix-gui/GUI/README.md index 5453b9b..26cf942 100644 --- a/onix-gui/GUI/README.md +++ b/onix-gui/GUI/README.md @@ -6,28 +6,23 @@ The GUI for the beckn-onix cli tool. 1. 4 server/instances 2. 4 sub-domains mapped to each instance +3. Local Tunnel + `npm i -g localtunnel` ## User Guide -### Step 1: Clone the beckn-onix-gui repo +### Step 1: Run the `start.sh` script ``` -git clone https://github.com/Mishalabdullah/beckn-onix-gui.git +cd .. && ./start.sh ``` -### Step 2: Change directory to the nextjs project +### Step 2: Accessing the GUI. -``` -cd onix-gui -``` +You will be getting a URL and password as on output of the script. Open the url in the browser and then +paste the password. -### Step 3: Run nextjs on port 3005 - -For running the installation script just run this command. The sudo privilages are required when installing packages and configuring the nginx reverse proxy - -``` -sudo ./start.sh -``` +### Step 3: Install and setup your network Note: Port 3000 is being used by onix, so we're using port 3005 instead. @@ -47,6 +42,16 @@ Contributions are welcome! If you'd like to contribute to the beckn-onix-gui pro The beckn-onix-gui project is licensed under the MIT License. See the LICENSE file for more information. + ## Contact If you have any questions or issues with the beckn-onix-gui project, please don't hesitate to reach out. + +### Made with ❤️ + +built by the [Mulearn Team](https://mulearn.org/) +1. [Mishal Abdullah](https://github.com/Mishalabdullah/) +2. [Aswin Asok](https://github.com/AswinAsok) +3. [Viraj Prabhu ](https://github.com/viraka) +4. [Adasrsh](https://adarshmohanks.framer.website/) + From 17846f3bb1c916f65160efc125b5a4222ee6f76c Mon Sep 17 00:00:00 2001 From: MishalAbdullah <85678545+Mishalabdullah@users.noreply.github.com> Date: Fri, 3 May 2024 16:05:24 +0530 Subject: [PATCH 06/17] v.04 --- onix-gui/start.sh | 52 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/onix-gui/start.sh b/onix-gui/start.sh index 4bc740b..b30f10d 100755 --- a/onix-gui/start.sh +++ b/onix-gui/start.sh @@ -1,5 +1,40 @@ #!/bin/bash +# Installing dependencies + +sudo apt-get update +sudo apt-get install ca-certificates curl + +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +# Add the repository to Apt sources: +echo \ +"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ +$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ +sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +sudo apt-get update +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + +sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose + +echo "installing node" +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash && +source ~/.bashrc && +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion +nvm install Iron && +npm i -g localtunnel && + +# Add user to the docker group and apply permissions +sudo groupadd docker +sudo usermod -aG docker $USER +newgrp docker + # Set script variables PROJECT_DIR="GUI" PORT=3005 @@ -7,27 +42,21 @@ TUNNEL_SERVICE="lt" # Change to the project directory cd "$PROJECT_DIR" || exit + npm i && + # Build and start the Next.js app echo "installing Dependencies" - echo "Building and starting Next.js app..." npx next build && echo "Builing Web App = True" sleep 3 -npx next start -p "$PORT" > /dev/null 2>&1 & +npx next start -p "$PORT" & # Wait for the Next.js app to start -echo "Waiting for Next.js app to start on port $PORT..." -until nc -z localhost "$PORT"; do - sleep 1 - echo "Loding ..." -done # Install the tunnel service if not installed - - - +sleep 3 echo "Exposing local port $PORT using $TUNNEL_SERVICE..." lt --port "$PORT" > /tmp/lt.log 2>&1 & @@ -37,9 +66,10 @@ sleep 5 # Get the tunnel URL from the log file TUNNEL_URL=$(grep -o 'https://[^[:blank:]]*' /tmp/lt.log) + #Get the tunnel password echo "Getting Tunnel Password" -TUNNEL_PASSWORD=$(curl https://loca.lt/mytunnelpassword)&& +TUNNEL_PASSWORD=$(curl https://loca.lt/mytunnelpassword) && # Print the tunnel URL and password echo "---------------------------------------" From 02734ed34805d2d7971d6dfde6e3e7e16cf84836 Mon Sep 17 00:00:00 2001 From: MishalAbdullah <85678545+Mishalabdullah@users.noreply.github.com> Date: Fri, 3 May 2024 16:11:29 +0530 Subject: [PATCH 07/17] v0.5 --- onix-gui/start.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/onix-gui/start.sh b/onix-gui/start.sh index b30f10d..aff7e00 100755 --- a/onix-gui/start.sh +++ b/onix-gui/start.sh @@ -31,9 +31,9 @@ nvm install Iron && npm i -g localtunnel && # Add user to the docker group and apply permissions -sudo groupadd docker -sudo usermod -aG docker $USER -newgrp docker +sudo groupadd docker & +sudo usermod -aG docker $USER & +newgrp docker & # Set script variables PROJECT_DIR="GUI" From 99d831b5fb4a45542816e70094e0ff7e53a52258 Mon Sep 17 00:00:00 2001 From: MishalAbdullah <85678545+Mishalabdullah@users.noreply.github.com> Date: Fri, 3 May 2024 16:42:36 +0530 Subject: [PATCH 08/17] Update start.sh --- onix-gui/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onix-gui/start.sh b/onix-gui/start.sh index aff7e00..fa3073d 100755 --- a/onix-gui/start.sh +++ b/onix-gui/start.sh @@ -42,7 +42,7 @@ TUNNEL_SERVICE="lt" # Change to the project directory cd "$PROJECT_DIR" || exit - +nvm use 20 && npm i && # Build and start the Next.js app From 60f7a65d8b847755f3536fbe2124d5a52b83b8f7 Mon Sep 17 00:00:00 2001 From: MishalAbdullah <85678545+Mishalabdullah@users.noreply.github.com> Date: Fri, 3 May 2024 16:56:04 +0530 Subject: [PATCH 09/17] v 2 --- onix-gui/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/onix-gui/start.sh b/onix-gui/start.sh index fa3073d..8ffc509 100755 --- a/onix-gui/start.sh +++ b/onix-gui/start.sh @@ -27,7 +27,7 @@ source ~/.bashrc && export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion -nvm install Iron && +nvm install 20 && npm i -g localtunnel && # Add user to the docker group and apply permissions From f2a17624e2edfdc8425ba08cda03904c634d09ec Mon Sep 17 00:00:00 2001 From: MishalAbdullah <85678545+Mishalabdullah@users.noreply.github.com> Date: Fri, 3 May 2024 17:07:07 +0530 Subject: [PATCH 10/17] Create REAME.md --- onix-gui/REAME.md | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 onix-gui/REAME.md diff --git a/onix-gui/REAME.md b/onix-gui/REAME.md new file mode 100644 index 0000000..339f6dc --- /dev/null +++ b/onix-gui/REAME.md @@ -0,0 +1,77 @@ +# Beckn-Onix Installation Wizard + + + +The below provides an overview of the installation wizard and layer 2 tester & downloader features of Beckn-Onix. Follow the steps outlined below to successfully utilize these features. + + + +### Home Page + +- Visit the home page of the Beckn-Onix installation wizard. + + + +![Home Page](https://github.com/beckn/beckn-onix/assets/85678545/e8674a29-b6e2-4fb2-a5ad-c76166bf1174) + + + +### Installation Wizard + +- Navigate to the installation wizard section. + +- Fill in the required details as prompted. + + + +![Installation Wizard](https://github.com/beckn/beckn-onix/assets/85678545/e9cec587-299f-4793-9045-c7c01551ad51) + + + +### Continue Installation + +- Click on the "Continue" button to proceed with the installation. + +- Repeat the same process for all components. + + + +## Layer 2 + + + +![Layer 2](https://github.com/beckn/beckn-onix/assets/85678545/32978858-5303-43b2-b0b5-517ee98ec6c3) + + + +### Setup Configuration File + +- Select whether you want to set up the layer 2 config file in BAP or BPP. + +- Fill in the Domain and version number of the layer 2 config file. + + + +### Check File Presence + +- If the file is present, a success toast will be displayed. + +- If the file is not present, a link for downloading the layer 2 file to the protocol server will be provided. + + + +![Check File Presence](https://github.com/beckn/beckn-onix/assets/85678545/31aaf210-9fef-4c33-b651-7231cd900f0a) + + + +### Download File + +- Click on the download link to be redirected to another page for downloading. + +- Paste the YAML file URL and click "Continue". + +- If successful, a success toast will be displayed. If unsuccessful, an error toast will be shown. + + + +![Download File](https://github.com/beckn/beckn-onix/assets/85678545/0dd9d456-66ca-4e2a-abc1-ba8dd98719c1) From 457163d466eff1c8c4f136ea583608b32a28c1d0 Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Sun, 5 May 2024 14:18:14 +0530 Subject: [PATCH 11/17] updated unique key value --- onix-gui/GUI/app/api/install-bap/route.js | 10 ++++++---- onix-gui/GUI/app/api/install-bpp/route.js | 13 +++++-------- onix-gui/GUI/next.config.mjs | 4 ++++ 3 files changed, 15 insertions(+), 12 deletions(-) create mode 100644 onix-gui/GUI/next.config.mjs diff --git a/onix-gui/GUI/app/api/install-bap/route.js b/onix-gui/GUI/app/api/install-bap/route.js index 2c5fb04..3bad4fb 100644 --- a/onix-gui/GUI/app/api/install-bap/route.js +++ b/onix-gui/GUI/app/api/install-bap/route.js @@ -91,12 +91,14 @@ export async function POST(req) { const data = await req.json(); const registryUrl = data.registryUrl; - const bppSubscriberId = data.subscriberId; - const bppSubscriberUrl = data.subscriberUrl; + const bapSubscriberId = data.subscriberId; + const bapSubscriberUrl = data.subscriberUrl; const networkconfigurl = data.networkconfigurl; + // generating unqiuekey for bap subscriberId + const uniqueKeyId = bapSubscriberId + "-key"; - let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bap_config.sh ${registryUrl} ${bppSubscriberId} ${bppSubscriberUrl} ${networkconfigurl}`; - const result1 = await executeCommand(updateBppConfigCommand); + let updateBapConfigCommand = `bash ${pathDir}/install/scripts/update_bap_config.sh ${registryUrl} ${bapSubscriberId} ${uniqueKeyId} ${bapSubscriberUrl} ${networkconfigurl}`; + const result1 = await executeCommand(updateBapConfigCommand); console.log("Result 1:", result1); const result3 = await executeCommand( `docker-compose -f ${pathDir}/install/docker-compose-v2.yml up -d "bap-client"` diff --git a/onix-gui/GUI/app/api/install-bpp/route.js b/onix-gui/GUI/app/api/install-bpp/route.js index 2ac5ca0..49c2e80 100644 --- a/onix-gui/GUI/app/api/install-bpp/route.js +++ b/onix-gui/GUI/app/api/install-bpp/route.js @@ -89,18 +89,15 @@ export async function POST(req, res) { try { await startSupportServices(); - const data = req.json(); + const data = await req.json(); const registryUrl = data.registryUrl; const bppSubscriberId = data.subscriberId; const bppSubscriberUrl = data.subscriberUrl; const webhookUrl = data.webhookUrl; - // const webhookUrl = "https://unified-bpp.becknprotocol.io/beckn-bpp-adapter"; - - // let updateBppConfigCommand = "bash scripts/update_bpp_config.sh"; - // if (registryUrl) { - // updateBppConfigCommand += ``; - // } - let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bpp_config.sh ${registryUrl} ${bppSubscriberId} ${bppSubscriberUrl} ${webhookUrl}`; + // generating unqiuekey for bpp subscriberId + const uniqueKeyId = bppSubscriberId + "-key"; + let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bpp_config.sh ${registryUrl} ${bppSubscriberId} ${uniqueKeyId} ${bppSubscriberUrl} ${webhookUrl}`; + console.log("Update BPP Config Command:", updateBppConfigCommand); const result1 = await executeCommand(updateBppConfigCommand); console.log("Result 1:", result1); diff --git a/onix-gui/GUI/next.config.mjs b/onix-gui/GUI/next.config.mjs new file mode 100644 index 0000000..4678774 --- /dev/null +++ b/onix-gui/GUI/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; From 3450ebc0ab331fe12af89887a65081071ba21e61 Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Sun, 5 May 2024 14:23:40 +0530 Subject: [PATCH 12/17] removing the -t flag not required --- install/scripts/generate_keys.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/scripts/generate_keys.sh b/install/scripts/generate_keys.sh index f887fcf..fef5952 100755 --- a/install/scripts/generate_keys.sh +++ b/install/scripts/generate_keys.sh @@ -5,7 +5,7 @@ source $SCRIPT_DIR/variables.sh # Run the script that generates keys and capture the output get_keys() { docker pull fidedocker/protocol-server > /dev/null 2>&1 - docker run --name temp -itd fidedocker/protocol-server > /dev/null 2>&1 + docker run --name temp -i fidedocker/protocol-server > /dev/null 2>&1 output=$(docker exec -it temp node /usr/src/app/scripts/generate-keys 2>&1) docker stop temp > /dev/null 2>&1 docker rm temp > /dev/null 2>&1 @@ -24,4 +24,4 @@ else fi } -#get_keys \ No newline at end of file +#get_keys From 306775b07e095fa8242e948d2e0e184fa4fb2fb9 Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Sun, 5 May 2024 15:45:20 +0530 Subject: [PATCH 13/17] cleaning & udpated generate keys.sh --- install/scripts/generate_keys.sh | 4 ++-- onix-gui/GUI/app/api/install-bpp/route.js | 1 - onix-gui/GUI/app/yaml-gen/install-yaml/page.js | 2 +- onix-gui/GUI/app/yaml-gen/page.js | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/install/scripts/generate_keys.sh b/install/scripts/generate_keys.sh index fef5952..4f00306 100755 --- a/install/scripts/generate_keys.sh +++ b/install/scripts/generate_keys.sh @@ -5,8 +5,8 @@ source $SCRIPT_DIR/variables.sh # Run the script that generates keys and capture the output get_keys() { docker pull fidedocker/protocol-server > /dev/null 2>&1 - docker run --name temp -i fidedocker/protocol-server > /dev/null 2>&1 - output=$(docker exec -it temp node /usr/src/app/scripts/generate-keys 2>&1) + docker run --name temp -itd fidedocker/protocol-server > /dev/null 2>&1 + output=$(docker exec -i temp node /usr/src/app/scripts/generate-keys 2>&1) docker stop temp > /dev/null 2>&1 docker rm temp > /dev/null 2>&1 # Check if the script executed successfully diff --git a/onix-gui/GUI/app/api/install-bpp/route.js b/onix-gui/GUI/app/api/install-bpp/route.js index 49c2e80..533aa62 100644 --- a/onix-gui/GUI/app/api/install-bpp/route.js +++ b/onix-gui/GUI/app/api/install-bpp/route.js @@ -97,7 +97,6 @@ export async function POST(req, res) { // generating unqiuekey for bpp subscriberId const uniqueKeyId = bppSubscriberId + "-key"; let updateBppConfigCommand = `bash ${pathDir}/install/scripts/update_bpp_config.sh ${registryUrl} ${bppSubscriberId} ${uniqueKeyId} ${bppSubscriberUrl} ${webhookUrl}`; - console.log("Update BPP Config Command:", updateBppConfigCommand); const result1 = await executeCommand(updateBppConfigCommand); console.log("Result 1:", result1); diff --git a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js index 22ad80c..fa97491 100644 --- a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js +++ b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js @@ -50,7 +50,7 @@ export default function InstallYaml() { }); } else { toast.update(toastId, { - render: "Yaml File Present 👌", + render: "Yaml File Downloaded 👌", type: "success", isLoading: false, autoClose: 5000, diff --git a/onix-gui/GUI/app/yaml-gen/page.js b/onix-gui/GUI/app/yaml-gen/page.js index 937fa35..6015abe 100644 --- a/onix-gui/GUI/app/yaml-gen/page.js +++ b/onix-gui/GUI/app/yaml-gen/page.js @@ -125,7 +125,7 @@ export default function CheckYaml() { label={"Version Number"} value={versionNumber} onChange={handleVersionChange} - placeholder="1.0.0" + placeholder="1.1.0" />
From f73eadacbb6192707974d2a838ac84958db2315c Mon Sep 17 00:00:00 2001 From: MishalAbdullah <85678545+Mishalabdullah@users.noreply.github.com> Date: Sun, 5 May 2024 19:39:56 +0530 Subject: [PATCH 14/17] Added GUI to main readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4cb4838..7bf1c54 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Refer to the following documents for more information: - [Step by step walkthrough of a setup](./docs/setup_walkthrough.md) - [Frequently asked questions (FAQ)](./docs/faq.md) - [release notes](./install/RELEASE.md) +- [GUI Installation Guide](./onix-gui/GUI/README.md) Experience the convenience and efficiency of Beckn-ONIX as you embark on your journey with Beckn protocols and open networks. From 2222aade5d3d26b1434b9a83df603537965109ff Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Sun, 5 May 2024 23:11:53 +0530 Subject: [PATCH 15/17] updated yaml script --- onix-gui/GUI/app/api/install-layer2/route.js | 16 ++++++++++++++-- onix-gui/GUI/app/yaml-gen/install-yaml/page.js | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/onix-gui/GUI/app/api/install-layer2/route.js b/onix-gui/GUI/app/api/install-layer2/route.js index c795226..bf7d47a 100644 --- a/onix-gui/GUI/app/api/install-layer2/route.js +++ b/onix-gui/GUI/app/api/install-layer2/route.js @@ -28,11 +28,23 @@ export async function POST(req) { try { await executeShellCommand( - `docker exec ${containerName} wget -P /usr/src/app/schemas/ ${fileURL}` + `docker exec ${ + containerName + "-client" + } wget -P /usr/src/app/schemas/ ${fileURL}` + ); + } catch (error) { + console.error(`exec error: ${error}`); + } + + try { + await executeShellCommand( + `docker exec ${ + containerName + "-network" + } wget -P /usr/src/app/schemas/ ${fileURL}` ); return NextResponse.json({ status: 200 }); } catch (error) { console.error(`exec error: ${error}`); return NextResponse.json({ status: 500 }); } -} +} \ No newline at end of file diff --git a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js index fa97491..b6b1129 100644 --- a/onix-gui/GUI/app/yaml-gen/install-yaml/page.js +++ b/onix-gui/GUI/app/yaml-gen/install-yaml/page.js @@ -18,7 +18,7 @@ export default function InstallYaml() { const [yamlUrl, setYamlUrl] = useState(""); const [checked, setChecked] = useState(false); - const container = checked ? "bpp-network" : "bap-network"; + const container = checked ? "bpp" : "bap"; const handleRegistryUrlChange = (event) => { setYamlUrl(event.target.value); From 8cd871be024dd67b2a397fcf91948b588ff05a46 Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Sun, 5 May 2024 23:12:36 +0530 Subject: [PATCH 16/17] spell check --- onix-gui/README.md | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 onix-gui/README.md diff --git a/onix-gui/README.md b/onix-gui/README.md new file mode 100644 index 0000000..339f6dc --- /dev/null +++ b/onix-gui/README.md @@ -0,0 +1,77 @@ +# Beckn-Onix Installation Wizard + + + +The below provides an overview of the installation wizard and layer 2 tester & downloader features of Beckn-Onix. Follow the steps outlined below to successfully utilize these features. + + + +### Home Page + +- Visit the home page of the Beckn-Onix installation wizard. + + + +![Home Page](https://github.com/beckn/beckn-onix/assets/85678545/e8674a29-b6e2-4fb2-a5ad-c76166bf1174) + + + +### Installation Wizard + +- Navigate to the installation wizard section. + +- Fill in the required details as prompted. + + + +![Installation Wizard](https://github.com/beckn/beckn-onix/assets/85678545/e9cec587-299f-4793-9045-c7c01551ad51) + + + +### Continue Installation + +- Click on the "Continue" button to proceed with the installation. + +- Repeat the same process for all components. + + + +## Layer 2 + + + +![Layer 2](https://github.com/beckn/beckn-onix/assets/85678545/32978858-5303-43b2-b0b5-517ee98ec6c3) + + + +### Setup Configuration File + +- Select whether you want to set up the layer 2 config file in BAP or BPP. + +- Fill in the Domain and version number of the layer 2 config file. + + + +### Check File Presence + +- If the file is present, a success toast will be displayed. + +- If the file is not present, a link for downloading the layer 2 file to the protocol server will be provided. + + + +![Check File Presence](https://github.com/beckn/beckn-onix/assets/85678545/31aaf210-9fef-4c33-b651-7231cd900f0a) + + + +### Download File + +- Click on the download link to be redirected to another page for downloading. + +- Paste the YAML file URL and click "Continue". + +- If successful, a success toast will be displayed. If unsuccessful, an error toast will be shown. + + + +![Download File](https://github.com/beckn/beckn-onix/assets/85678545/0dd9d456-66ca-4e2a-abc1-ba8dd98719c1) From e66b98ebf7988d312cf9ef8026f12677683ca042 Mon Sep 17 00:00:00 2001 From: Mishalabdullah Date: Sun, 5 May 2024 23:13:09 +0530 Subject: [PATCH 17/17] renamming --- onix-gui/REAME.md | 77 ----------------------------------------------- 1 file changed, 77 deletions(-) delete mode 100644 onix-gui/REAME.md diff --git a/onix-gui/REAME.md b/onix-gui/REAME.md deleted file mode 100644 index 339f6dc..0000000 --- a/onix-gui/REAME.md +++ /dev/null @@ -1,77 +0,0 @@ -# Beckn-Onix Installation Wizard - - - -The below provides an overview of the installation wizard and layer 2 tester & downloader features of Beckn-Onix. Follow the steps outlined below to successfully utilize these features. - - - -### Home Page - -- Visit the home page of the Beckn-Onix installation wizard. - - - -![Home Page](https://github.com/beckn/beckn-onix/assets/85678545/e8674a29-b6e2-4fb2-a5ad-c76166bf1174) - - - -### Installation Wizard - -- Navigate to the installation wizard section. - -- Fill in the required details as prompted. - - - -![Installation Wizard](https://github.com/beckn/beckn-onix/assets/85678545/e9cec587-299f-4793-9045-c7c01551ad51) - - - -### Continue Installation - -- Click on the "Continue" button to proceed with the installation. - -- Repeat the same process for all components. - - - -## Layer 2 - - - -![Layer 2](https://github.com/beckn/beckn-onix/assets/85678545/32978858-5303-43b2-b0b5-517ee98ec6c3) - - - -### Setup Configuration File - -- Select whether you want to set up the layer 2 config file in BAP or BPP. - -- Fill in the Domain and version number of the layer 2 config file. - - - -### Check File Presence - -- If the file is present, a success toast will be displayed. - -- If the file is not present, a link for downloading the layer 2 file to the protocol server will be provided. - - - -![Check File Presence](https://github.com/beckn/beckn-onix/assets/85678545/31aaf210-9fef-4c33-b651-7231cd900f0a) - - - -### Download File - -- Click on the download link to be redirected to another page for downloading. - -- Paste the YAML file URL and click "Continue". - -- If successful, a success toast will be displayed. If unsuccessful, an error toast will be shown. - - - -![Download File](https://github.com/beckn/beckn-onix/assets/85678545/0dd9d456-66ca-4e2a-abc1-ba8dd98719c1)