From d0a08790128bf6c0785b13bd36e6d05a3bfd8ada Mon Sep 17 00:00:00 2001 From: Retro <70205403+retrouser955@users.noreply.github.com> Date: Wed, 14 Jan 2026 17:46:27 +0800 Subject: [PATCH 1/2] initial commit --- .gitignore | 5 +- apps/server/.env.example | 10 + apps/server/package.json | 23 + apps/server/src/Schemas/DiscordUser.ts | 27 + apps/server/src/encryption/encryption.ts | 42 + apps/server/src/index.ts | 104 ++ apps/server/src/routers/Crypto.ts | 24 + apps/server/src/routers/Discord.ts | 250 ++++ apps/server/tsconfig.json | 4 + apps/server/tsup.config.ts | 6 + apps/web-application/package.json | 3 + .../Dashboard/Projects/ProjectBanner.svelte | 23 + .../Dashboard/Sidebar/Sidebar.svelte | 21 + .../Dashboard/Sidebar/SidebarTab.svelte | 19 + .../src/lib/Components/Navbar.svelte | 49 +- apps/web-application/src/lib/Gun/Constants.ts | 1 + .../src/lib/Gun/MainGun.svelte.ts | 76 ++ .../src/lib/Gun/Utils/index.ts | 32 + apps/web-application/src/lib/Gun/index.ts | 3 + .../src/lib/Gun/structs/GunNode.ts | 9 + .../src/lib/Gun/structs/Project.ts | 80 ++ .../src/lib/Gun/structs/index.ts | 2 + apps/web-application/src/lib/index.ts | 2 +- .../src/routes/dashboard/+layout.svelte | 27 + .../src/routes/dashboard/+page.svelte | 10 + .../src/routes/dashboard/account/+page.svelte | 1 + .../routes/dashboard/projects/+page.svelte | 158 +++ .../dashboard/projects/[id]/+page.svelte | 9 + .../projects/[id]/general/+page.svelte | 55 + yarn.lock | 1200 ++++++++++++++++- 30 files changed, 2245 insertions(+), 30 deletions(-) create mode 100644 apps/server/.env.example create mode 100644 apps/server/package.json create mode 100644 apps/server/src/Schemas/DiscordUser.ts create mode 100644 apps/server/src/encryption/encryption.ts create mode 100644 apps/server/src/index.ts create mode 100644 apps/server/src/routers/Crypto.ts create mode 100644 apps/server/src/routers/Discord.ts create mode 100644 apps/server/tsconfig.json create mode 100644 apps/server/tsup.config.ts create mode 100644 apps/web-application/src/lib/Components/Dashboard/Projects/ProjectBanner.svelte create mode 100644 apps/web-application/src/lib/Components/Dashboard/Sidebar/Sidebar.svelte create mode 100644 apps/web-application/src/lib/Components/Dashboard/Sidebar/SidebarTab.svelte create mode 100644 apps/web-application/src/lib/Gun/Constants.ts create mode 100644 apps/web-application/src/lib/Gun/MainGun.svelte.ts create mode 100644 apps/web-application/src/lib/Gun/Utils/index.ts create mode 100644 apps/web-application/src/lib/Gun/index.ts create mode 100644 apps/web-application/src/lib/Gun/structs/GunNode.ts create mode 100644 apps/web-application/src/lib/Gun/structs/Project.ts create mode 100644 apps/web-application/src/lib/Gun/structs/index.ts create mode 100644 apps/web-application/src/routes/dashboard/+layout.svelte create mode 100644 apps/web-application/src/routes/dashboard/+page.svelte create mode 100644 apps/web-application/src/routes/dashboard/account/+page.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/+page.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/[id]/+page.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte diff --git a/.gitignore b/.gitignore index 09123aa..c0462b6 100644 --- a/.gitignore +++ b/.gitignore @@ -137,4 +137,7 @@ dist .yarn/build-state.yml .yarn/install-state.gz .yarn/releases -.pnp.* \ No newline at end of file +.pnp.* + +# Gun +radata \ No newline at end of file diff --git a/apps/server/.env.example b/apps/server/.env.example new file mode 100644 index 0000000..502d093 --- /dev/null +++ b/apps/server/.env.example @@ -0,0 +1,10 @@ +MASTER_KEY= +SESSION_KEY= +CLIENT_SECRET= +CLIENT_ID= +REDIS_URL= +MONGO_URL= +ALLOW_ORIGIN= +NODE_ENV=development +DOMAIN= +BOT_TOKEN= \ No newline at end of file diff --git a/apps/server/package.json b/apps/server/package.json new file mode 100644 index 0000000..a657c80 --- /dev/null +++ b/apps/server/package.json @@ -0,0 +1,23 @@ +{ + "name": "@disflow-team/server", + "description": "A simple express server for oauth2 flow.", + "dependencies": { + "connect-redis": "^9.0.0", + "cors": "^2.8.5", + "express": "^5.2.1", + "express-session": "^1.18.2", + "gun": "^0.2020.1241", + "mongoose": "^9.1.3", + "redis": "^5.10.0" + }, + "devDependencies": { + "@disflow-team/tsconfig": "workspace:^", + "@types/cors": "^2.8.19", + "@types/express-session": "^1", + "tsup": "^8.5.1" + }, + "scripts": { + "build": "tsup", + "dev": "tsup && node --env-file=.env dist/index.js" + } +} diff --git a/apps/server/src/Schemas/DiscordUser.ts b/apps/server/src/Schemas/DiscordUser.ts new file mode 100644 index 0000000..52d46d9 --- /dev/null +++ b/apps/server/src/Schemas/DiscordUser.ts @@ -0,0 +1,27 @@ +import mongoose from "mongoose"; + +export const userSchema = new mongoose.Schema({ + userId: { + type: String, + required: true, + unique: true + }, + access_token: { + type: String, + required: true + }, + expires_in: { + type: Number, + required: true + }, + refresh_token: { + type: String, + required: true + }, + token_type: { + type: String, + required: true + } +}) + +export const DiscordUser = mongoose.model("user", userSchema) \ No newline at end of file diff --git a/apps/server/src/encryption/encryption.ts b/apps/server/src/encryption/encryption.ts new file mode 100644 index 0000000..4b90626 --- /dev/null +++ b/apps/server/src/encryption/encryption.ts @@ -0,0 +1,42 @@ +import crypto from "node:crypto"; + +const MASTER_KEY = Buffer.from(process.env.MASTER_KEY!, "hex"); + +export function createSeed(discordId: string) { + return crypto.createHmac("sha256", MASTER_KEY) + .update(discordId) + .digest() + .toString("hex"); +} + +// For Discord's Oauth2 +export function generateRandomCode() { + return crypto.randomBytes(32).toString("hex"); +} + +export function encryptToken(token: string) { + const iv = crypto.randomBytes(12); + const cipher = crypto.createCipheriv("aes-256-gcm", MASTER_KEY, iv); + + let encrypted = cipher.update(token, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + + const authTag = cipher.getAuthTag().toString('hex'); + + return `${iv.toString('hex')}:${authTag}:${encrypted}`; +} + +export function decryptToken(encryptedData: string) { + const [ivHex, authTagHex, encryptedText] = encryptedData.split(':'); + + const iv = Buffer.from(ivHex, 'hex'); + const authTag = Buffer.from(authTagHex, 'hex'); + const decipher = crypto.createDecipheriv("aes-256-gcm", MASTER_KEY, iv); + + decipher.setAuthTag(authTag); + + let decrypted = decipher.update(encryptedText, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + + return decrypted; +} \ No newline at end of file diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts new file mode 100644 index 0000000..43c8288 --- /dev/null +++ b/apps/server/src/index.ts @@ -0,0 +1,104 @@ +import express from "express"; +import Gun from "gun"; +import cors from "cors"; +import { RedisStore } from "connect-redis"; +import session from "express-session"; +import { createClient } from "redis"; +import discordRouter, { type DiscordUserInfo } from "./routers/Discord"; +import cryptoRouter from "./routers/Crypto"; +import mongoose from "mongoose"; + +async function getBotInfo(botId: string) { + const response = await fetch("https://discord.com/api/v10/users/" + botId, { + headers: { + "Authorization": `Bot ${process.env.BOT_TOKEN}` + } + }) + + if (!response.ok) return undefined; + + let userData = await response.json() as DiscordUserInfo & { + bot: boolean + }; + + return userData; +} + +const app = express(); + +const redisClient = createClient({ + url: process.env.REDIS_URL! +}); + +const origin = process.env.NODE_ENV === "production" ? process.env.ALLOW_ORIGIN! : "http://localhost:5173"; + +console.log("ALLOWING ORIGIN " + origin) + +app.use(cors({ + origin: origin, // default vite URL for development purposes + credentials: true +})); +app.use(session({ + store: new RedisStore({ + client: redisClient + }), + secret: process.env.SESSION_KEY!, + resave: false, + saveUninitialized: false, + cookie: { + maxAge: 1000 * 60 * 60 * 24 * 7, // keep the user logged in for 7 days only + httpOnly: true, + secure: process.env.NODE_ENV === "production", + sameSite: "lax" + } +})); + +app.use("/auth", discordRouter); +app.use("/crypto", cryptoRouter); + +app.use((Gun as any).serve); + +app.get("/applications/:id", async (req, res) => { + const appId = req.params.id; + const user = req.session.user; + + if (req.headers.origin === origin) { + res.setHeader('Access-Control-Allow-Origin', req.headers.origin); + } + + res.setHeader('Access-Control-Allow-Credentials', 'true'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + if(!user) return res.status(401).json({ + message: "Unauthenticated" + }) + + const botInfo = await getBotInfo(appId); + + if(!botInfo) return res.status(500).json({ + message: "Unable to fetch bot" + }) + + if(!botInfo.bot) return res.status(422).json({ + message: "The ID is not a bot" + }) + + return res.json({ + username: botInfo.username, + avatar: botInfo.avatar, + id: botInfo.id + }) +}) + +const server = app.listen(process.env.PORT || 3000, () => { + console.log("Server started on " + (process.env.PORT || 3000)) +}); + +mongoose.connect(process.env.MONGO_URL!).then(() => console.log("Connected to MongoDB!")) +redisClient.connect().then(() => console.log("Connected to Redis!")); + +// set up gun relay server +Gun({ + web: server +}); diff --git a/apps/server/src/routers/Crypto.ts b/apps/server/src/routers/Crypto.ts new file mode 100644 index 0000000..c571049 --- /dev/null +++ b/apps/server/src/routers/Crypto.ts @@ -0,0 +1,24 @@ +import { Router } from "express"; +import { createSeed } from "../encryption/encryption"; + +const router = Router(); + +// Bridge OAUTH2 and GUN's SEA +router.get("/seed", (req, res) => { + if(!req.session.user) { + res.status(401).json({ + message: "Login with Discord first", + status: 401 + }) + return; + } + + const seed = createSeed(req.session.user.id); + + res.json({ + seed, + userId: req.session.user.id + }) +}); + +export default router; \ No newline at end of file diff --git a/apps/server/src/routers/Discord.ts b/apps/server/src/routers/Discord.ts new file mode 100644 index 0000000..f9bf41b --- /dev/null +++ b/apps/server/src/routers/Discord.ts @@ -0,0 +1,250 @@ +import { Router } from "express"; +import { encryptToken, decryptToken, generateRandomCode } from "../encryption/encryption"; +import { DiscordUser } from "../Schemas/DiscordUser"; + +declare module "express-session" { + interface SessionData { + oauthState?: string; + user?: { + avatar?: string, + username: string, + id: string + } + } +} + +export interface TokenReturnData { + access_token: string, + token_type: string, + expires_in: number, + refresh_token: string, + scope: string +} + +export interface TokenDataSelfIdentify { + access_token: string; + token_type: string; +} + +const CALLBACK_DOMAIN = (process.env.DOMAIN || "http://localhost:3000") + "/auth/discord/callback"; + +const DISCORD_API_ENDPOINT = 'https://discord.com/api/v10'; + +const router = Router(); + +async function exchangeCode(code: string) { + const response = await fetch(DISCORD_API_ENDPOINT + "/oauth2/token", { + method: "POST", + body: new URLSearchParams({ + client_id: process.env.CLIENT_ID!, + client_secret: process.env.CLIENT_SECRET!, + code, + grant_type: 'authorization_code', + redirect_uri: CALLBACK_DOMAIN, + scope: 'identify', + }).toString(), + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }); + + if (!response.ok) return undefined; + + return response.json() as Promise; +} + +export interface DiscordUserInfo { + id: string, + username: string, + avatar?: string +} + +async function getSelfInfo(tokens: TokenDataSelfIdentify) { + const response = await fetch(DISCORD_API_ENDPOINT + "/users/@me", { + headers: { + "Authorization": `${tokens.token_type} ${tokens.access_token}` + } + }) + + if (!response.ok) return undefined; + + let userData = await response.json() as DiscordUserInfo; + + return userData; +} + +const handleFetchError = (e: unknown) => { + console.log("Error while fetching"); + console.log(e); + return undefined; +} + +function generateOauthUrl(code: string) { + return `https://discord.com/oauth2/authorize?client_id=${process.env.CLIENT_ID}&response_type=code&redirect_uri=${encodeURIComponent(CALLBACK_DOMAIN)}&scope=identify+email&state=${code}`; +} + +router.get("/discord", (req, res) => { + const code = generateRandomCode(); + const oauthUrl = generateOauthUrl(code); + + req.session.oauthState = code; + + req.session.save((e) => { + if (e) { + console.log(e); + return; + } + + res.redirect(oauthUrl); + }); +}) + +router.get('/discord/callback', async (req, res) => { + const savedState = req.session.oauthState; + const { code, state } = req.query; + + if (!state || state !== savedState) { + res.status(403).json({ + message: "Your provided state does not match the saved state or it wasn't provided", + status: 403 + }) + return; + } + + delete req.session.oauthState; + + if (!code || typeof code !== "string") { + res.status(422).json({ + status: 422, + message: "No code provided from Discord" + }); + return; + } + + const tokenData = await exchangeCode(code).catch(handleFetchError); + + if (!tokenData) { + res.status(500).json({ + message: "Internal server error", + status: 500 + }); + return; + } + + const userData = await getSelfInfo(tokenData).catch(handleFetchError); + + if (!userData) { + res.status(500).json({ + message: "Internal server error", + status: 500 + }); + return; + } + + const saveObject = { + userId: userData.id, + access_token: encryptToken(tokenData.access_token), + refresh_token: encryptToken(tokenData.refresh_token), + expires_in: Math.floor(Date.now() / 1000) + tokenData.expires_in, + token_type: tokenData.token_type + } + + await DiscordUser.findOneAndUpdate( + { userId: userData.id }, + saveObject, + { upsert: true } + ); + + req.session.user = { + avatar: userData.avatar, + username: userData.username, + id: userData.id + } + + req.session.save((err) => { + if (err) { + console.log(err); + return; + } + + res.redirect(process.env.ALLOW_ORIGIN || "http://localhost:5173/dashboard"); + }); +}) + +router.get("/me", async (req, res) => { + if (req.session.user) { + const isRefetch = Boolean(req.query.refetch || false); + const user = req.session.user; + + if(!isRefetch) return res.json(req.session.user); + + const userData = await DiscordUser.findOne({ userId: user.id }); + + if (!userData) return res.status(404).json({ + message: "User was not found in the database" + }) + + const { access_token, refresh_token, expires_in, token_type } = userData; + + let accessToken = decryptToken(access_token); + let tokenType = token_type; + let refreshToken = decryptToken(refresh_token); + + if (Date.now() > expires_in) { + const response = await fetch("https://discord.com/api/v10/oauth2/token", { + method: "POST", + body: new URLSearchParams({ + client_id: process.env.CLIENT_ID!, + client_secret: process.env.CLIENT_SECRET!, + grant_type: "refresh_token", + refresh_token: refreshToken + }).toString(), + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }) + + if (!response.ok) { + res.status(500).json({ + message: "Unable to refresh token" + }); + return; + } + + let tokenData = await response.json() as TokenReturnData; + + tokenData.expires_in = tokenData.expires_in + Math.floor(Date.now() / 1000); + + accessToken = structuredClone(tokenData.access_token); + tokenType = tokenData.token_type; + + tokenData.access_token = encryptToken(tokenData.access_token); + tokenData.refresh_token = encryptToken(tokenData.refresh_token); + + await DiscordUser.findOneAndUpdate( + { userId: user.id }, + tokenData, + { upsert: true } + ); + } + + const ud = await getSelfInfo({ + access_token: accessToken, + token_type: tokenType + }); + + if(ud) req.session.user = { + id: ud.id, + username: ud.username, + avatar: ud.avatar + } + + return res.json(req.session.user); + }; + + res.status(401).json({ + message: "Unauthorized" + }) +}) + +export default router; \ No newline at end of file diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json new file mode 100644 index 0000000..b18ba90 --- /dev/null +++ b/apps/server/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@disflow-team/tsconfig/tsconfig.json", + "include": ["./src/**/*.ts"] +} diff --git a/apps/server/tsup.config.ts b/apps/server/tsup.config.ts new file mode 100644 index 0000000..1bb7e59 --- /dev/null +++ b/apps/server/tsup.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from "../../tsup.config"; + +export default defineConfig({ + dts: false, + format: "cjs" +}); diff --git a/apps/web-application/package.json b/apps/web-application/package.json index 6731078..7e0bd96 100644 --- a/apps/web-application/package.json +++ b/apps/web-application/package.json @@ -34,9 +34,12 @@ "dependencies": { "@disflow-team/code-gen": "workspace:^", "@disflow-team/utils": "workspace:^", + "@lucide/svelte": "^0.562.0", "@tailwindcss/vite": "^4.1.18", + "gun": "^0.2020.1241", "highlight.js": "^11.11.1", "litegraph.js": "^0.7.18", + "sweetalert2": "^11.26.17", "tailwindcss": "^4.1.18" } } diff --git a/apps/web-application/src/lib/Components/Dashboard/Projects/ProjectBanner.svelte b/apps/web-application/src/lib/Components/Dashboard/Projects/ProjectBanner.svelte new file mode 100644 index 0000000..8cc399c --- /dev/null +++ b/apps/web-application/src/lib/Components/Dashboard/Projects/ProjectBanner.svelte @@ -0,0 +1,23 @@ + + +
+ {`${name}'s +
+ {name} +
+ v{version || "0.0.1"} +
+
+
\ No newline at end of file diff --git a/apps/web-application/src/lib/Components/Dashboard/Sidebar/Sidebar.svelte b/apps/web-application/src/lib/Components/Dashboard/Sidebar/Sidebar.svelte new file mode 100644 index 0000000..d9801cc --- /dev/null +++ b/apps/web-application/src/lib/Components/Dashboard/Sidebar/Sidebar.svelte @@ -0,0 +1,21 @@ + + +
+
+ {#if page.params.id} + + + {:else} + + + {/if} +
+
diff --git a/apps/web-application/src/lib/Components/Dashboard/Sidebar/SidebarTab.svelte b/apps/web-application/src/lib/Components/Dashboard/Sidebar/SidebarTab.svelte new file mode 100644 index 0000000..e4e04ca --- /dev/null +++ b/apps/web-application/src/lib/Components/Dashboard/Sidebar/SidebarTab.svelte @@ -0,0 +1,19 @@ + + +
+ + {text} +
+
\ No newline at end of file diff --git a/apps/web-application/src/lib/Components/Navbar.svelte b/apps/web-application/src/lib/Components/Navbar.svelte index 622a0d1..be71b9b 100644 --- a/apps/web-application/src/lib/Components/Navbar.svelte +++ b/apps/web-application/src/lib/Components/Navbar.svelte @@ -1,8 +1,41 @@ - \ No newline at end of file + + + diff --git a/apps/web-application/src/lib/Gun/Constants.ts b/apps/web-application/src/lib/Gun/Constants.ts new file mode 100644 index 0000000..d4cf911 --- /dev/null +++ b/apps/web-application/src/lib/Gun/Constants.ts @@ -0,0 +1 @@ +export const BACKEND_URL = "http://localhost:3000"; \ No newline at end of file diff --git a/apps/web-application/src/lib/Gun/MainGun.svelte.ts b/apps/web-application/src/lib/Gun/MainGun.svelte.ts new file mode 100644 index 0000000..b3facbf --- /dev/null +++ b/apps/web-application/src/lib/Gun/MainGun.svelte.ts @@ -0,0 +1,76 @@ +// 🔫 +import Gun from "gun"; +import "gun/sea"; +import 'gun/nts'; +import 'gun/lib/radix'; +import 'gun/lib/radisk'; +import 'gun/lib/store'; +import 'gun/lib/rindexed'; + +import { BACKEND_URL } from "./Constants"; +import { fetchUserSeed, identify } from "./Utils"; + +export const gun = Gun({ + peers: [BACKEND_URL + "/gun"], + localStorage: false +}); + +export let logged = $state<{ + isLogged: boolean +}>({ + isLogged: false +}) + +export const user = gun.user().recall({ sessionStorage: false }) as ReturnType; + +gun.on("auth", async () => { + const userId = await identify().catch(() => undefined); + console.log(`[GUN AUTH]: Logged In as ${userId?.id || "UNKNOWN"}`); + + logged.isLogged = true; +}) + +export function hasUser(userId: string) { + return new Promise((res) => { + gun.get(`~@${userId}`).once((data) => { + res(!!data); + }) + }) +} + +export async function login(userId: string, seed?: string) { + if (!seed) { + const userSeed = await fetchUserSeed().catch(e => console.log(e)); + if (!userSeed) throw new Error("Login with discord first"); + + seed = userSeed.seed; + } + + return new Promise((resolve, reject) => { + user.auth(userId, seed, (ack) => { + if ((ack as { err?: string }).err) { + reject((ack as { err: string }).err); + } + + resolve(); + }) + }) +} + +export async function signUp() { + const userSeed = await fetchUserSeed().catch(e => console.log(e)); + + if (!userSeed) throw new Error("Login with discord first"); + + const { userId, seed } = userSeed; + + return new Promise((resolve, reject) => { + user.create(userId, seed, (ack) => { + if ((ack as any).err) reject((ack as any).err); + + login(userId, seed) + .then(resolve) + .catch(reject); + }); + }) +} \ No newline at end of file diff --git a/apps/web-application/src/lib/Gun/Utils/index.ts b/apps/web-application/src/lib/Gun/Utils/index.ts new file mode 100644 index 0000000..27bba45 --- /dev/null +++ b/apps/web-application/src/lib/Gun/Utils/index.ts @@ -0,0 +1,32 @@ +import { BACKEND_URL } from "../Constants"; + +export interface UserData { + avatar?: string, + username: string, + id: string +} + +let userData: UserData|undefined; + +export async function makeRequestJson(url: string) { + const response = await fetch(url, { + credentials: "include" + }); + + if (!response.ok) return undefined; + + return response.json(); +} + +export async function fetchUserSeed() { + return makeRequestJson(BACKEND_URL + "/crypto/seed") as Promise; +} + +export async function identify(force = false) { + if(userData && !force) return userData + const data = await makeRequestJson(BACKEND_URL + "/auth/me") as undefined | UserData; + + if(data) userData = data; + + return data; +} \ No newline at end of file diff --git a/apps/web-application/src/lib/Gun/index.ts b/apps/web-application/src/lib/Gun/index.ts new file mode 100644 index 0000000..ae30736 --- /dev/null +++ b/apps/web-application/src/lib/Gun/index.ts @@ -0,0 +1,3 @@ +export * from "./Constants"; +export * from "./MainGun.svelte"; +export * from "./structs"; \ No newline at end of file diff --git a/apps/web-application/src/lib/Gun/structs/GunNode.ts b/apps/web-application/src/lib/Gun/structs/GunNode.ts new file mode 100644 index 0000000..481765e --- /dev/null +++ b/apps/web-application/src/lib/Gun/structs/GunNode.ts @@ -0,0 +1,9 @@ +import Gun from "gun"; +export type GunChain = ReturnType['get']> | ReturnType['user']>['get']>; +export class GunNode { + chain: GunChain; + + constructor(chain: GunChain) { + this.chain = chain; + } +} \ No newline at end of file diff --git a/apps/web-application/src/lib/Gun/structs/Project.ts b/apps/web-application/src/lib/Gun/structs/Project.ts new file mode 100644 index 0000000..da4903e --- /dev/null +++ b/apps/web-application/src/lib/Gun/structs/Project.ts @@ -0,0 +1,80 @@ +import { user } from "../MainGun.svelte"; +import { GunNode } from "./GunNode"; + +export interface Project { + id: string; + icon: string; + name: string; + version: string; +} + +// Follow a flatted graph structure +export class CommandNode extends GunNode { + projectId: string; + commandId: string; + + constructor(projectId: string, commandId: string) { + super(user.get(CommandNode.createNamespace(projectId, commandId))); + + this.projectId = projectId; + this.commandId = commandId; + } + + static createNamespace(projectId: string, commandId: string) { + return `${projectId}_${commandId}`; + } + + static async createCommand(projectId: string, commandId: string) { + const projectNode = new ProjectNode(projectId); + + return await projectNode.createCommand(commandId); + } +} + +export class ProjectNode extends GunNode { + static async createProject(param: Project) { + // @ts-expect-error + await user.get("projects").get(param.id as never).put(param) + } + + static async getProject(projectId: string) { + return new ProjectNode(projectId); + } + + static watchProjects(callback: (p: Project) => unknown) { + // @ts-expect-error + const ev = user.get("projects").map().on((v: Project | null) => { + if(!v) return; + callback(v); + }) + + return () => ev?.off(); + } + + id: string; + + constructor(projectId: string) { + const chain = user.get("projects").get(projectId as never); + + super(chain); + + this.id = projectId + this.chain = chain + } + + command(id: string) { + return new CommandNode(this.id, id) + } + + async createCommand(id: string) { + (this.chain.get("commands" as never) as any).get(id).put(1); + + return new CommandNode(this.id, id); + } + + metadata() { + return new Promise((resolve) => { + this.chain.once((v) => resolve(v as unknown as Project)); + }); + } +} \ No newline at end of file diff --git a/apps/web-application/src/lib/Gun/structs/index.ts b/apps/web-application/src/lib/Gun/structs/index.ts new file mode 100644 index 0000000..91f1f69 --- /dev/null +++ b/apps/web-application/src/lib/Gun/structs/index.ts @@ -0,0 +1,2 @@ +export * from "./Project"; +export * from "./GunNode"; \ No newline at end of file diff --git a/apps/web-application/src/lib/index.ts b/apps/web-application/src/lib/index.ts index 04a057c..64c9c10 100644 --- a/apps/web-application/src/lib/index.ts +++ b/apps/web-application/src/lib/index.ts @@ -1,2 +1,2 @@ // place files you want to import through the `$lib` alias in this folder. -export * from "./Nodes"; \ No newline at end of file +export * from "./Gun"; \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/+layout.svelte b/apps/web-application/src/routes/dashboard/+layout.svelte new file mode 100644 index 0000000..bd6a284 --- /dev/null +++ b/apps/web-application/src/routes/dashboard/+layout.svelte @@ -0,0 +1,27 @@ + +
+ +
+ {@render children()} +
+
\ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/+page.svelte b/apps/web-application/src/routes/dashboard/+page.svelte new file mode 100644 index 0000000..53b9917 --- /dev/null +++ b/apps/web-application/src/routes/dashboard/+page.svelte @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/account/+page.svelte b/apps/web-application/src/routes/dashboard/account/+page.svelte new file mode 100644 index 0000000..310fb61 --- /dev/null +++ b/apps/web-application/src/routes/dashboard/account/+page.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/projects/+page.svelte b/apps/web-application/src/routes/dashboard/projects/+page.svelte new file mode 100644 index 0000000..101ed2d --- /dev/null +++ b/apps/web-application/src/routes/dashboard/projects/+page.svelte @@ -0,0 +1,158 @@ + + +
+ +
+
+ {#each projects as { icon, id, name, version }} + + {/each} +
+
+
diff --git a/apps/web-application/src/routes/dashboard/projects/[id]/+page.svelte b/apps/web-application/src/routes/dashboard/projects/[id]/+page.svelte new file mode 100644 index 0000000..9d9d007 --- /dev/null +++ b/apps/web-application/src/routes/dashboard/projects/[id]/+page.svelte @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte b/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte new file mode 100644 index 0000000..aa5a4ee --- /dev/null +++ b/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte @@ -0,0 +1,55 @@ + + +
+ {#if project} +
+ {`${project.name}'s +
+ {project.name} +
+ {project.id} +
+
+ + + Edit Logic + +
+
+ {/if} +
diff --git a/yarn.lock b/yarn.lock index 2dc9d7c..9af6172 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,15 +20,21 @@ __metadata: languageName: unknown linkType: soft -"@disflow-team/data@workspace:packages/data": +"@disflow-team/server@workspace:apps/server": version: 0.0.0-use.local - resolution: "@disflow-team/data@workspace:packages/data" + resolution: "@disflow-team/server@workspace:apps/server" dependencies: - "@eslint/js": "npm:^9.39.2" - eslint: "npm:^9.39.2" + "@disflow-team/tsconfig": "workspace:^" + "@types/cors": "npm:^2.8.19" + "@types/express-session": "npm:^1" + connect-redis: "npm:^9.0.0" + cors: "npm:^2.8.5" + express: "npm:^5.2.1" + express-session: "npm:^1.18.2" + gun: "npm:^0.2020.1241" + mongoose: "npm:^9.1.3" + redis: "npm:^5.10.0" tsup: "npm:^8.5.1" - typescript: "npm:^5.9.3" - typescript-eslint: "npm:^8.50.0" languageName: unknown linkType: soft @@ -501,6 +507,24 @@ __metadata: languageName: node linkType: hard +"@lucide/svelte@npm:^0.562.0": + version: 0.562.0 + resolution: "@lucide/svelte@npm:0.562.0" + peerDependencies: + svelte: ^5 + checksum: 10c0/4886cbae7bf575daf5ee66b26be55a49f6e361672db6eb85f39779c202cd7d4e0d1431f6af710a7045ce9e36e720aef589d78da5807a2f2612c24e54198290bd + languageName: node + linkType: hard + +"@mongodb-js/saslprep@npm:^1.3.0": + version: 1.4.4 + resolution: "@mongodb-js/saslprep@npm:1.4.4" + dependencies: + sparse-bitfield: "npm:^3.0.3" + checksum: 10c0/04a42b50129ec9c43dfeb01ebfc64883eddad925ac90190fbf928c1b5fb7a9320762c3647295fc1066b100ac6e98941fa09f9ca35467f7d828e90e878bd86d3c + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:^1.1.0": version: 1.1.0 resolution: "@napi-rs/wasm-runtime@npm:1.1.0" @@ -534,6 +558,39 @@ __metadata: languageName: node linkType: hard +"@peculiar/asn1-schema@npm:^2.3.13, @peculiar/asn1-schema@npm:^2.3.8": + version: 2.6.0 + resolution: "@peculiar/asn1-schema@npm:2.6.0" + dependencies: + asn1js: "npm:^3.0.6" + pvtsutils: "npm:^1.3.6" + tslib: "npm:^2.8.1" + checksum: 10c0/8c283b10a2e4aca4cb20d242cde773c9a798ea15a6c221d1474ef483e182d48195aeb5dde3f7b518f236eceb7808ae4438539d41a3aa9ed6d20aa4d36a21a0c2 + languageName: node + linkType: hard + +"@peculiar/json-schema@npm:^1.1.12": + version: 1.1.12 + resolution: "@peculiar/json-schema@npm:1.1.12" + dependencies: + tslib: "npm:^2.0.0" + checksum: 10c0/202132c66dcc6b6aca5d0af971c015be2e163da2f7f992910783c5d39c8a7db59b6ec4f4ce419459a1f954b7e1d17b6b253f0e60072c1b3d254079f4eaebc311 + languageName: node + linkType: hard + +"@peculiar/webcrypto@npm:^1.1.1": + version: 1.5.0 + resolution: "@peculiar/webcrypto@npm:1.5.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.3.8" + "@peculiar/json-schema": "npm:^1.1.12" + pvtsutils: "npm:^1.3.5" + tslib: "npm:^2.6.2" + webcrypto-core: "npm:^1.8.0" + checksum: 10c0/4f6f24b2c52c2155b9c569b6eb1d57954cb5f7bd2764a50cdaed7aea17a6dcf304b75b87b57ba318756ffec8179a07d9a76534aaf77855912b838543e5ff8983 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -548,6 +605,51 @@ __metadata: languageName: node linkType: hard +"@redis/bloom@npm:5.10.0": + version: 5.10.0 + resolution: "@redis/bloom@npm:5.10.0" + peerDependencies: + "@redis/client": ^5.10.0 + checksum: 10c0/ef66eda591b1df2d6187fad95c07f3a36a2e0d61acdc983a1a4e87c72a45ba7aa5850316bf6f87980b6dbfc269fe8dcd8ba5ee37c91d03d69cec120acaa45cc0 + languageName: node + linkType: hard + +"@redis/client@npm:5.10.0": + version: 5.10.0 + resolution: "@redis/client@npm:5.10.0" + dependencies: + cluster-key-slot: "npm:1.1.2" + checksum: 10c0/f4409d64968d59a803eb40ccc6ab0e0a21aa5dd68837b079e7dadf31648efc62615298b9b71e85f1122596ae08c135f24f20bb0b35313c9066c1c63856be5cc7 + languageName: node + linkType: hard + +"@redis/json@npm:5.10.0": + version: 5.10.0 + resolution: "@redis/json@npm:5.10.0" + peerDependencies: + "@redis/client": ^5.10.0 + checksum: 10c0/9afa26c365a72d0542db5916e570b00c845b4e860b0d21c14c9921220a450e28ac965eabfb1ad1fca1f4910850dc9fba630c8f0751d69a2c2eab426047b39a9e + languageName: node + linkType: hard + +"@redis/search@npm:5.10.0": + version: 5.10.0 + resolution: "@redis/search@npm:5.10.0" + peerDependencies: + "@redis/client": ^5.10.0 + checksum: 10c0/5123eba639e4d815e2da9c695de3fb9fdfa13211466d2672f602c3cf7b1dbe5493ded842233bfa154828abeb42434b0979b8a82e1f29dd577ed254671991577b + languageName: node + linkType: hard + +"@redis/time-series@npm:5.10.0": + version: 5.10.0 + resolution: "@redis/time-series@npm:5.10.0" + peerDependencies: + "@redis/client": ^5.10.0 + checksum: 10c0/2128a4e47418938ae515761475cda3e4ff67f85dfbdcd1f8dace72c5ea71d0f3f7359b1d74881e59ac4499e9d1956d38b0974d65dd677669c41731b41d9c737e + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.41.0": version: 4.41.0 resolution: "@rollup/rollup-android-arm-eabi@npm:4.41.0" @@ -1100,6 +1202,25 @@ __metadata: languageName: node linkType: hard +"@types/body-parser@npm:*": + version: 1.19.6 + resolution: "@types/body-parser@npm:1.19.6" + dependencies: + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/542da05c924dce58ee23f50a8b981fee36921850c82222e384931fda3e106f750f7880c47be665217d72dbe445129049db6eb1f44e7a06b09d62af8f3cca8ea7 + languageName: node + linkType: hard + +"@types/connect@npm:*": + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c + languageName: node + linkType: hard + "@types/cookie@npm:^0.6.0": version: 0.6.0 resolution: "@types/cookie@npm:0.6.0" @@ -1107,6 +1228,15 @@ __metadata: languageName: node linkType: hard +"@types/cors@npm:^2.8.19": + version: 2.8.19 + resolution: "@types/cors@npm:2.8.19" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/b5dd407040db7d8aa1bd36e79e5f3f32292f6b075abc287529e9f48df1a25fda3e3799ba30b4656667ffb931d3b75690c1d6ca71e39f7337ea6dfda8581916d0 + languageName: node + linkType: hard + "@types/estree@npm:1.0.7, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6": version: 1.0.7 resolution: "@types/estree@npm:1.0.7" @@ -1121,6 +1251,45 @@ __metadata: languageName: node linkType: hard +"@types/express-serve-static-core@npm:^5.0.0": + version: 5.1.1 + resolution: "@types/express-serve-static-core@npm:5.1.1" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 10c0/ee88216e114368ef06bcafeceb74a7e8671b90900fb0ab1d49ff41542c3a344231ef0d922bf63daa79f0585f3eebe2ce5ec7f83facc581eff8bcdb136a225ef3 + languageName: node + linkType: hard + +"@types/express-session@npm:^1": + version: 1.18.2 + resolution: "@types/express-session@npm:1.18.2" + dependencies: + "@types/express": "npm:*" + checksum: 10c0/5d5aa134ce8990920b35f2dd0aa55168af44faaf14789b6921d361ce016c43bdc66feba287753981a2fee33fd95b8a829c4418c3ca480b03961724b8bc13e453 + languageName: node + linkType: hard + +"@types/express@npm:*": + version: 5.0.6 + resolution: "@types/express@npm:5.0.6" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/serve-static": "npm:^2" + checksum: 10c0/f1071e3389a955d4f9a38aae38634121c7cd9b3171ba4201ec9b56bd534aba07866839d278adc0dda05b942b05a901a02fd174201c3b1f70ce22b10b6c68f24b + languageName: node + linkType: hard + +"@types/http-errors@npm:*": + version: 2.0.5 + resolution: "@types/http-errors@npm:2.0.5" + checksum: 10c0/00f8140fbc504f47356512bd88e1910c2f07e04233d99c88c854b3600ce0523c8cd0ba7d1897667243282eb44c59abb9245959e2428b9de004f93937f52f7c15 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -1128,6 +1297,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:*": + version: 25.0.6 + resolution: "@types/node@npm:25.0.6" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10c0/4ee3b6b606bc28f6840c04d58769e1e75dd8085149908956c874c85f8f8c890990701bcbe783fc2d14017817861dc07fcf23de6fc2805fe491f84eae717b5705 + languageName: node + linkType: hard + "@types/node@npm:^25.0.3": version: 25.0.3 resolution: "@types/node@npm:25.0.3" @@ -1137,6 +1315,55 @@ __metadata: languageName: node linkType: hard +"@types/qs@npm:*": + version: 6.14.0 + resolution: "@types/qs@npm:6.14.0" + checksum: 10c0/5b3036df6e507483869cdb3858201b2e0b64b4793dc4974f188caa5b5732f2333ab9db45c08157975054d3b070788b35088b4bc60257ae263885016ee2131310 + languageName: node + linkType: hard + +"@types/range-parser@npm:*": + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c + languageName: node + linkType: hard + +"@types/send@npm:*": + version: 1.2.1 + resolution: "@types/send@npm:1.2.1" + dependencies: + "@types/node": "npm:*" + checksum: 10c0/7673747f8c2d8e67f3b1b3b57e9d4d681801a4f7b526ecf09987bb9a84a61cf94aa411c736183884dc762c1c402a61681eb1ef200d8d45d7e5ec0ab67ea5f6c1 + languageName: node + linkType: hard + +"@types/serve-static@npm:^2": + version: 2.2.0 + resolution: "@types/serve-static@npm:2.2.0" + dependencies: + "@types/http-errors": "npm:*" + "@types/node": "npm:*" + checksum: 10c0/a3c6126bdbf9685e6c7dc03ad34639666eff32754e912adeed9643bf3dd3aa0ff043002a7f69039306e310d233eb8e160c59308f95b0a619f32366bbc48ee094 + languageName: node + linkType: hard + +"@types/webidl-conversions@npm:*": + version: 7.0.3 + resolution: "@types/webidl-conversions@npm:7.0.3" + checksum: 10c0/ac2ccff93b95ac7c8ca73dc6064403181691bba7ea144296f462dc9108a07be16cbad7b9c704b3df706dcc5a117e1f7bf7fb27aeb75b09c0f3148de8aee11aff + languageName: node + linkType: hard + +"@types/whatwg-url@npm:^13.0.0": + version: 13.0.0 + resolution: "@types/whatwg-url@npm:13.0.0" + dependencies: + "@types/webidl-conversions": "npm:*" + checksum: 10c0/b7b53ae7b5290a0c26e2a5c6a2353af925fe9fc7ab0bbf642e8b76f65b39f638b471dadfda8da441aed3ca32cafd33b1a03459117c9ec85fd91b1e6c0e93044e + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:8.50.0, @typescript-eslint/eslint-plugin@npm:^8.50.0": version: 8.50.0 resolution: "@typescript-eslint/eslint-plugin@npm:8.50.0" @@ -1279,6 +1506,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -1376,6 +1613,31 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.5, asn1js@npm:^3.0.6": + version: 3.0.7 + resolution: "asn1js@npm:3.0.7" + dependencies: + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.3" + tslib: "npm:^2.8.1" + checksum: 10c0/7e79795edf1bcc86532c4084aa7c8c0ebc57f7dd6f964ad6de956abf617329722f6964b7af3a5d1c4554dd61b4b148ae1580e63e3ec2e70e7fba34f6df072b29 + languageName: node + linkType: hard + +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186 + languageName: node + linkType: hard + "axobject-query@npm:^4.1.0": version: 4.1.0 resolution: "axobject-query@npm:4.1.0" @@ -1390,6 +1652,23 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^2.2.1": + version: 2.2.2 + resolution: "body-parser@npm:2.2.2" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.3" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.7.0" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.1" + raw-body: "npm:^3.0.1" + type-is: "npm:^2.0.1" + checksum: 10c0/95a830a003b38654b75166ca765358aa92ee3d561bf0e41d6ccdde0e1a0c9783cab6b90b20eb635d23172c010b59d3563a137a738e74da4ba714463510d05137 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1409,6 +1688,13 @@ __metadata: languageName: node linkType: hard +"bson@npm:^7.0.0": + version: 7.0.0 + resolution: "bson@npm:7.0.0" + checksum: 10c0/6b12fb0411f4e6f4473da878c0aa615f03439040a349f4115beae336e3922265b25d833c6cc93fcb299017904b32e4ef86e284996f1103addc5918c576b57d9d + languageName: node + linkType: hard + "bundle-require@npm:^5.1.0": version: 5.1.0 resolution: "bundle-require@npm:5.1.0" @@ -1420,6 +1706,13 @@ __metadata: languageName: node linkType: hard +"bytes@npm:^3.1.2, bytes@npm:~3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -1447,6 +1740,26 @@ __metadata: languageName: node linkType: hard +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -1487,6 +1800,13 @@ __metadata: languageName: node linkType: hard +"cluster-key-slot@npm:1.1.2": + version: 1.1.2 + resolution: "cluster-key-slot@npm:1.1.2" + checksum: 10c0/d7d39ca28a8786e9e801eeb8c770e3c3236a566625d7299a47bb71113fb2298ce1039596acb82590e598c52dbc9b1f088c8f587803e697cb58e1867a95ff94d3 + languageName: node + linkType: hard + "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -1524,6 +1844,16 @@ __metadata: languageName: node linkType: hard +"connect-redis@npm:^9.0.0": + version: 9.0.0 + resolution: "connect-redis@npm:9.0.0" + peerDependencies: + express-session: ">=1" + redis: ">=5" + checksum: 10c0/85616db0760f7974ed14f0676488dab168c111ae2068fae645a8b1acd0acf72d3c57d2252deb50eff662c22db72a6028e1635d9ff8450f3cac853278aa64051a + languageName: node + linkType: hard + "consola@npm:^3.4.0": version: 3.4.2 resolution: "consola@npm:3.4.2" @@ -1531,6 +1861,41 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:^1.0.0": + version: 1.0.1 + resolution: "content-disposition@npm:1.0.1" + checksum: 10c0/bd7ff1fe8d2542d3a2b9a29428cc3591f6ac27bb5595bba2c69664408a68f9538b14cbd92479796ea835b317a09a527c8c7209c4200381dedb0c34d3b658849e + languageName: node + linkType: hard + +"content-type@npm:^1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.7": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 10c0/e7731ad2995ae2efeed6435ec1e22cdd21afef29d300c27281438b1eab2bae04ef0d1a203928c0afec2cee72aa36540b8747406ebe308ad23c8e8cc3c26c9c51 + languageName: node + linkType: hard + +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6 + languageName: node + linkType: hard + +"cookie@npm:0.7.2, cookie@npm:^0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + "cookie@npm:^0.6.0": version: 0.6.0 resolution: "cookie@npm:0.6.0" @@ -1538,6 +1903,16 @@ __metadata: languageName: node linkType: hard +"cors@npm:^2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: "npm:^4" + vary: "npm:^1" + checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -1558,6 +1933,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: "npm:2.0.0" + checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1": version: 4.4.1 resolution: "debug@npm:4.4.1" @@ -1570,6 +1954,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -1584,6 +1980,13 @@ __metadata: languageName: node linkType: hard +"depd@npm:^2.0.0, depd@npm:~2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c + languageName: node + linkType: hard + "detect-libc@npm:^2.0.3": version: 2.0.4 resolution: "detect-libc@npm:2.0.4" @@ -1613,6 +2016,17 @@ __metadata: languageName: unknown linkType: soft +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -1620,6 +2034,13 @@ __metadata: languageName: node linkType: hard +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -1634,6 +2055,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:^2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -1667,6 +2095,29 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c + languageName: node + linkType: hard + "esbuild@npm:^0.27.0": version: 0.27.2 resolution: "esbuild@npm:0.27.2" @@ -1756,6 +2207,13 @@ __metadata: languageName: node linkType: hard +"escape-html@npm:^1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 + languageName: node + linkType: hard + "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -1958,6 +2416,13 @@ __metadata: languageName: node linkType: hard +"etag@npm:^1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.2 resolution: "exponential-backoff@npm:3.1.2" @@ -1965,6 +2430,58 @@ __metadata: languageName: node linkType: hard +"express-session@npm:^1.18.2": + version: 1.18.2 + resolution: "express-session@npm:1.18.2" + dependencies: + cookie: "npm:0.7.2" + cookie-signature: "npm:1.0.7" + debug: "npm:2.6.9" + depd: "npm:~2.0.0" + on-headers: "npm:~1.1.0" + parseurl: "npm:~1.3.3" + safe-buffer: "npm:5.2.1" + uid-safe: "npm:~2.1.5" + checksum: 10c0/27e17c3d365e3543ba7c1315ff14916b8347a2fd28f94817c6d2e2425923e61fa97fc23e0933015981c3358ba6f11964666249f046c4f93d22015fe2a95140ac + languageName: node + linkType: hard + +"express@npm:^5.2.1": + version: 5.2.1 + resolution: "express@npm:5.2.1" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.1" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10c0/45e8c841ad188a41402ddcd1294901e861ee0819f632fb494f2ed344ef9c43315d294d443fb48d594e6586a3b779785120f43321417adaef8567316a55072949 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -2019,6 +2536,20 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:^2.1.0": + version: 2.1.1 + resolution: "finalhandler@npm:2.1.1" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10c0/6bd664e21b7b2e79efcaace7d1a427169f61cce048fae68eb56290e6934e676b78e55d89f5998c5508871345bc59a61f47002dc505dc7288be68cceac1b701e2 + languageName: node + linkType: hard + "find-up@npm:^5.0.0": version: 5.0.0 resolution: "find-up@npm:5.0.0" @@ -2067,6 +2598,20 @@ __metadata: languageName: node linkType: hard +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc + languageName: node + linkType: hard + "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -2095,19 +2640,64 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" + function-bind: "npm:^1.1.2" + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d + languageName: node + linkType: hard + +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" minimatch: "npm:^9.0.4" @@ -2141,6 +2731,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead + languageName: node + linkType: hard + "graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -2148,6 +2745,19 @@ __metadata: languageName: node linkType: hard +"gun@npm:^0.2020.1241": + version: 0.2020.1241 + resolution: "gun@npm:0.2020.1241" + dependencies: + "@peculiar/webcrypto": "npm:^1.1.1" + ws: "npm:^7.2.1" + dependenciesMeta: + "@peculiar/webcrypto": + optional: true + checksum: 10c0/6772a5acb21e908022844a54f3bb4f31ad126a33a5fc34c137d0f5d6babcc0da76f832c9ab9b8fac88188ef2403011311766b01b346e4f393c7df6dbeb0d23d4 + languageName: node + linkType: hard + "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -2155,6 +2765,22 @@ __metadata: languageName: node linkType: hard +"has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + languageName: node + linkType: hard + "highlight.js@npm:^11.11.1": version: 11.11.1 resolution: "highlight.js@npm:11.11.1" @@ -2169,6 +2795,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:^2.0.0, http-errors@npm:^2.0.1, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" + dependencies: + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10c0/fb38906cef4f5c83952d97661fe14dc156cb59fe54812a42cd448fa57b5c5dfcb38a40a916957737bd6b87aab257c0648d63eb5b6a9ca9f548e105b6072712d4 + languageName: node + linkType: hard + "http-proxy-agent@npm:^7.0.0": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" @@ -2198,6 +2837,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.7.0, iconv-lite@npm:~0.7.0": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/3c228920f3bd307f56bf8363706a776f4a060eb042f131cd23855ceca962951b264d0997ab38a1ad340e1c5df8499ed26e1f4f0db6b2a2ad9befaff22f14b722 + languageName: node + linkType: hard + "ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -2229,6 +2877,13 @@ __metadata: languageName: node linkType: hard +"inherits@npm:~2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -2239,6 +2894,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -2262,6 +2924,13 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + "is-reference@npm:^3.0.3": version: 3.0.3 resolution: "is-reference@npm:3.0.3" @@ -2353,6 +3022,13 @@ __metadata: languageName: node linkType: hard +"kareem@npm:3.0.0": + version: 3.0.0 + resolution: "kareem@npm:3.0.0" + checksum: 10c0/64a131c65153b67ff0a7a912243e5fe46e37c833cd539b9b72792c9422ca577dd5d846fa734b8db93acb767990620c12aefdebfebf28e744d53664bdb8f89bac + languageName: node + linkType: hard + "keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" @@ -2608,6 +3284,50 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f + languageName: node + linkType: hard + +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9 + languageName: node + linkType: hard + +"memory-pager@npm:^1.0.2": + version: 1.5.0 + resolution: "memory-pager@npm:1.5.0" + checksum: 10c0/2596e80c99fee24f05bd8a20cde2ee899012c996f4ec361ac76ed6f009f34149d733ac6f76880106ccd6a66d062ad439357578d383d429df66ba1278f68806e9 + languageName: node + linkType: hard + +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3 + languageName: node + linkType: hard + +"mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.2": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/35a0dd1035d14d185664f346efcdb72e93ef7a9b6e9ae808bd1f6358227010267fab52657b37562c80fc888ff76becb2b2938deb5e730818b7983bf8bd359767 + languageName: node + linkType: hard + "minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -2723,6 +3443,78 @@ __metadata: languageName: node linkType: hard +"mongodb-connection-string-url@npm:^7.0.0": + version: 7.0.0 + resolution: "mongodb-connection-string-url@npm:7.0.0" + dependencies: + "@types/whatwg-url": "npm:^13.0.0" + whatwg-url: "npm:^14.1.0" + checksum: 10c0/33fe304a0f8e59bf541b2ddef073ddb2ae66d6cb3175c6297c8f844004b1608573e2e61892aa8486f8273634c9cb8a90202d21c289aa1b1f8b8e5cd92711be09 + languageName: node + linkType: hard + +"mongodb@npm:~7.0": + version: 7.0.0 + resolution: "mongodb@npm:7.0.0" + dependencies: + "@mongodb-js/saslprep": "npm:^1.3.0" + bson: "npm:^7.0.0" + mongodb-connection-string-url: "npm:^7.0.0" + peerDependencies: + "@aws-sdk/credential-providers": ^3.806.0 + "@mongodb-js/zstd": ^7.0.0 + gcp-metadata: ^7.0.1 + kerberos: ^7.0.0 + mongodb-client-encryption: ">=7.0.0 <7.1.0" + snappy: ^7.3.2 + socks: ^2.8.6 + peerDependenciesMeta: + "@aws-sdk/credential-providers": + optional: true + "@mongodb-js/zstd": + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + checksum: 10c0/425258188fd6d0d73c58ce2f16177d53d4280804b52de0e6dfd4ce0bec2c2965625c1765111f800ce8e6f2a28187657e8f42bf7dd6cc9675844e619b0dec18b9 + languageName: node + linkType: hard + +"mongoose@npm:^9.1.3": + version: 9.1.3 + resolution: "mongoose@npm:9.1.3" + dependencies: + kareem: "npm:3.0.0" + mongodb: "npm:~7.0" + mpath: "npm:0.9.0" + mquery: "npm:6.0.0" + ms: "npm:2.1.3" + sift: "npm:17.1.3" + checksum: 10c0/94049f1fd40dfeb2153a4b0171d83552f169fcb41f50b1301055de86859c14f752303f0817b3d99a85ae1534f5295906827ad73d7cd1db6831ac4708428e9119 + languageName: node + linkType: hard + +"mpath@npm:0.9.0": + version: 0.9.0 + resolution: "mpath@npm:0.9.0" + checksum: 10c0/ac1a77ebbd44567f122fb3026c9647836215d5bb75b54064d1f3d998125644fe7a775b89441b94d4d60f43ad9638a12d830a9e29f36116e93b8cdfd111816e8f + languageName: node + linkType: hard + +"mquery@npm:6.0.0": + version: 6.0.0 + resolution: "mquery@npm:6.0.0" + checksum: 10c0/5b566ad66d5de1d9213827e21ef87905c7e67ac07780a7f09ad3adf76e7537d5810138d3270633d06430e3ee7886205fbc174f3389e730e23ee8530993354b6b + languageName: node + linkType: hard + "mri@npm:^1.1.0": version: 1.2.0 resolution: "mri@npm:1.2.0" @@ -2737,7 +3529,14 @@ __metadata: languageName: node linkType: hard -"ms@npm:^2.1.3": +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d + languageName: node + linkType: hard + +"ms@npm:2.1.3, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 @@ -2809,13 +3608,45 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1": +"object-assign@npm:^4, object-assign@npm:^4.0.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 languageName: node linkType: hard +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 + languageName: node + linkType: hard + +"on-finished@npm:^2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: "npm:1.1.1" + checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 + languageName: node + linkType: hard + +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10c0/2c3b6b0d68ec9adbd561dc2d61c9b14da8ac03d8a2f0fd9e97bdf0600c887d5d97f664ff3be6876cf40cda6e3c587d73a4745e10b426ac50c7664fc5a0dfc0a1 + languageName: node + linkType: hard + +"once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -2871,6 +3702,13 @@ __metadata: languageName: node linkType: hard +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -2895,6 +3733,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^8.0.0": + version: 8.3.0 + resolution: "path-to-regexp@npm:8.3.0" + checksum: 10c0/ee1544a73a3f294a97a4c663b0ce71bbf1621d732d80c9c9ed201b3e911a86cb628ebad691b9d40f40a3742fe22011e5a059d8eed2cf63ec2cb94f6fb4efe67c + languageName: node + linkType: hard + "pathe@npm:^2.0.1": version: 2.0.3 resolution: "pathe@npm:2.0.3" @@ -3075,13 +3920,74 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard +"pvtsutils@npm:^1.3.5, pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: "npm:^2.8.1" + checksum: 10c0/b1b42646370505ccae536dcffa662303b2c553995211330c8e39dec9ab8c197585d7751c2c5b9ab2f186feda0219d9bb23c34ee1e565573be96450f79d89a13c + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.5 + resolution: "pvutils@npm:1.1.5" + checksum: 10c0/e968b07b78a58fec9377fe7aa6342c8cfa21c8fb4afc4e51e1489bd42bec6dc71b8a52541d0aede0aea17adec7ca3f89f29f56efdc31d0083cc02e9bb5721bcf + languageName: node + linkType: hard + +"qs@npm:^6.14.0, qs@npm:^6.14.1": + version: 6.14.1 + resolution: "qs@npm:6.14.1" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10c0/0e3b22dc451f48ce5940cbbc7c7d9068d895074f8c969c0801ac15c1313d1859c4d738e46dc4da2f498f41a9ffd8c201bd9fb12df67799b827db94cc373d2613 + languageName: node + linkType: hard + +"random-bytes@npm:~1.0.0": + version: 1.0.0 + resolution: "random-bytes@npm:1.0.0" + checksum: 10c0/71e7a600e0976e9ebc269793a0577d47b965fa678fcc9e9623e427f909d1b3669db5b3a178dbf61229f0724ea23dba64db389f0be0ba675c6a6b837c02f29b8f + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + +"raw-body@npm:^3.0.1": + version: 3.0.2 + resolution: "raw-body@npm:3.0.2" + dependencies: + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.7.0" + unpipe: "npm:~1.0.0" + checksum: 10c0/d266678d08e1e7abea62c0ce5864344e980fa81c64f6b481e9842c5beaed2cdcf975f658a3ccd67ad35fc919c1f6664ccc106067801850286a6cbe101de89f29 + languageName: node + linkType: hard + "readdirp@npm:^4.0.1": version: 4.1.2 resolution: "readdirp@npm:4.1.2" @@ -3089,6 +3995,19 @@ __metadata: languageName: node linkType: hard +"redis@npm:^5.10.0": + version: 5.10.0 + resolution: "redis@npm:5.10.0" + dependencies: + "@redis/bloom": "npm:5.10.0" + "@redis/client": "npm:5.10.0" + "@redis/json": "npm:5.10.0" + "@redis/search": "npm:5.10.0" + "@redis/time-series": "npm:5.10.0" + checksum: 10c0/7103db47deb7ee3915e3c6015fc5dbe4cb956e7fa94365f981416e015d1e6e64ec3513235ea0e4150d733481ea7c92439e5489f0cfff0781598912e5fd045f90 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -3266,6 +4185,19 @@ __metadata: languageName: node linkType: hard +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867 + languageName: node + linkType: hard + "sade@npm:^1.7.4, sade@npm:^1.8.1": version: 1.8.1 resolution: "sade@npm:1.8.1" @@ -3275,6 +4207,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:5.2.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -3291,6 +4230,37 @@ __metadata: languageName: node linkType: hard +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.1 + resolution: "send@npm:1.2.1" + dependencies: + debug: "npm:^4.4.3" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.1" + mime-types: "npm:^3.0.2" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.2" + checksum: 10c0/fbbbbdc902a913d65605274be23f3d604065cfc3ee3d78bf9fc8af1dc9fc82667c50d3d657f5e601ac657bac9b396b50ee97bd29cd55436320cf1cddebdcec72 + languageName: node + linkType: hard + +"serve-static@npm:^2.2.0": + version: 2.2.1 + resolution: "serve-static@npm:2.2.1" + dependencies: + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10c0/37986096e8572e2dfaad35a3925fa8da0c0969f8814fd7788e84d4d388bc068cf0c06d1658509788e55bed942a6b6d040a8a267fa92bb9ffb1179f8bacde5fd7 + languageName: node + linkType: hard + "set-cookie-parser@npm:^2.6.0": version: 2.7.1 resolution: "set-cookie-parser@npm:2.7.1" @@ -3298,6 +4268,13 @@ __metadata: languageName: node linkType: hard +"setprototypeof@npm:~1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -3314,6 +4291,61 @@ __metadata: languageName: node linkType: hard +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 + languageName: node + linkType: hard + +"sift@npm:17.1.3": + version: 17.1.3 + resolution: "sift@npm:17.1.3" + checksum: 10c0/bb05d1d65cc9b549b402c1366ba1fcf685311808b6d5c2f4fa2f477d7b524218bbf6c99587562d5613d407820a6b5a7cad809f89c3f75c513ff5d8c0e0a0cead + languageName: node + linkType: hard + "signal-exit@npm:^4.0.1": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" @@ -3374,6 +4406,15 @@ __metadata: languageName: node linkType: hard +"sparse-bitfield@npm:^3.0.3": + version: 3.0.3 + resolution: "sparse-bitfield@npm:3.0.3" + dependencies: + memory-pager: "npm:^1.0.2" + checksum: 10c0/248c6ff7b5e354735e1daac4059222a29c9d291dfcf265daf675d13515eeaac454cfcccd687c8d134f86698b39abd7ad4d7434f7272dd6f8e41a00f21aae4194 + languageName: node + linkType: hard + "sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" @@ -3390,6 +4431,13 @@ __metadata: languageName: node linkType: hard +"statuses@npm:^2.0.1, statuses@npm:^2.0.2, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10c0/a9947d98ad60d01f6b26727570f3bcceb6c8fa789da64fe6889908fe2e294d57503b14bf2b5af7605c2d36647259e856635cd4c49eab41667658ec9d0080ec3f + languageName: node + linkType: hard + "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -3524,6 +4572,13 @@ __metadata: languageName: node linkType: hard +"sweetalert2@npm:^11.26.17": + version: 11.26.17 + resolution: "sweetalert2@npm:11.26.17" + checksum: 10c0/00cbc4c394895f5ea2c9766ced2bb11bc73405c66a850e2981673aac27b55c98ba4e968cd3db25bd52087d3c6243ca4f3bf3b4e3269b8705c1a5c6e5405fb18d + languageName: node + linkType: hard + "tailwindcss@npm:4.1.18, tailwindcss@npm:^4.1.18": version: 4.1.18 resolution: "tailwindcss@npm:4.1.18" @@ -3597,6 +4652,13 @@ __metadata: languageName: node linkType: hard +"toidentifier@npm:~1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 + languageName: node + linkType: hard + "totalist@npm:^3.0.0": version: 3.0.1 resolution: "totalist@npm:3.0.1" @@ -3604,6 +4666,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^5.1.0": + version: 5.1.1 + resolution: "tr46@npm:5.1.1" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/ae270e194d52ec67ebd695c1a42876e0f19b96e4aca2ab464ab1d9d17dc3acd3e18764f5034c93897db73421563be27c70c98359c4501136a497e46deda5d5ec + languageName: node + linkType: hard + "tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" @@ -3629,7 +4700,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.4.0": +"tslib@npm:^2.0.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.7.0, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -3758,6 +4829,17 @@ __metadata: languageName: node linkType: hard +"type-is@npm:^2.0.1": + version: 2.0.1 + resolution: "type-is@npm:2.0.1" + dependencies: + content-type: "npm:^1.0.5" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10c0/7f7ec0a060b16880bdad36824ab37c26019454b67d73e8a465ed5a3587440fbe158bc765f0da68344498235c877e7dbbb1600beccc94628ed05599d667951b99 + languageName: node + linkType: hard + "typescript-eslint@npm:^8.50.0": version: 8.50.0 resolution: "typescript-eslint@npm:8.50.0" @@ -3800,6 +4882,15 @@ __metadata: languageName: node linkType: hard +"uid-safe@npm:~2.1.5": + version: 2.1.5 + resolution: "uid-safe@npm:2.1.5" + dependencies: + random-bytes: "npm:~1.0.0" + checksum: 10c0/ec96862e859fd12175f3da7fda9d1359a2cf412fd521e10837cbdc6d554774079ce252f366981df9401283841c8924782f6dbee8f82a3a81f805ed8a8584595d + languageName: node + linkType: hard + "undici-types@npm:~7.16.0": version: 7.16.0 resolution: "undici-types@npm:7.16.0" @@ -3825,6 +4916,13 @@ __metadata: languageName: node linkType: hard +"unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -3841,6 +4939,13 @@ __metadata: languageName: node linkType: hard +"vary@npm:^1, vary@npm:^1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f + languageName: node + linkType: hard + "vite@npm:^7.3.0": version: 7.3.0 resolution: "vite@npm:7.3.0" @@ -3916,6 +5021,7 @@ __metadata: "@disflow-team/utils": "workspace:^" "@eslint/compat": "npm:^2.0.0" "@eslint/js": "npm:^9.39.2" + "@lucide/svelte": "npm:^0.562.0" "@sveltejs/adapter-auto": "npm:^7.0.0" "@sveltejs/kit": "npm:^2.49.2" "@sveltejs/vite-plugin-svelte": "npm:^6.2.1" @@ -3924,12 +5030,14 @@ __metadata: eslint-config-prettier: "npm:^10.1.8" eslint-plugin-svelte: "npm:^3.13.1" globals: "npm:^16.5.0" + gun: "npm:^0.2020.1241" highlight.js: "npm:^11.11.1" litegraph.js: "npm:^0.7.18" prettier: "npm:^3.7.4" prettier-plugin-svelte: "npm:^3.4.1" svelte: "npm:^5.46.0" svelte-check: "npm:^4.3.4" + sweetalert2: "npm:^11.26.17" tailwindcss: "npm:^4.1.18" typescript: "npm:^5.9.3" typescript-eslint: "npm:^8.50.0" @@ -3937,6 +5045,36 @@ __metadata: languageName: unknown linkType: soft +"webcrypto-core@npm:^1.8.0": + version: 1.8.1 + resolution: "webcrypto-core@npm:1.8.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.3.13" + "@peculiar/json-schema": "npm:^1.1.12" + asn1js: "npm:^3.0.5" + pvtsutils: "npm:^1.3.5" + tslib: "npm:^2.7.0" + checksum: 10c0/b85a986b4f73e8505ec5eaafe8e4f1ff02574a3b655793aca91f913d02822c8b79168ad6961eaab86ae00fec00bf780ec4cef7535f64879fb866649bc2a723fa + languageName: node + linkType: hard + +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + +"whatwg-url@npm:^14.1.0": + version: 14.2.0 + resolution: "whatwg-url@npm:14.2.0" + dependencies: + tr46: "npm:^5.1.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/f746fc2f4c906607d09537de1227b13f9494c171141e5427ed7d2c0dd0b6a48b43d8e71abaae57d368d0c06b673fd8ec63550b32ad5ed64990c7b0266c2b4272 + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -3988,6 +5126,28 @@ __metadata: languageName: node linkType: hard +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"ws@npm:^7.2.1": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/bd7d5f4aaf04fae7960c23dcb6c6375d525e00f795dd20b9385902bd008c40a94d3db3ce97d878acc7573df852056ca546328b27b39f47609f80fb22a0a9b61d + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" From cb9b1839f94094209978ee9d5e7734ac82455675 Mon Sep 17 00:00:00 2001 From: Retro <70205403+retrouser955@users.noreply.github.com> Date: Thu, 15 Jan 2026 01:33:12 +0800 Subject: [PATCH 2/2] implement commands --- .../Dashboard/Projects/CommandBanner.svelte | 27 ++++ .../src/lib/Components/Editor/Editor.svelte | 118 ++++++++++++------ .../Components/Editor/Nodes/Console/Print.ts | 5 +- .../src/lib/Gun/MainGun.svelte.ts | 46 ++++--- .../src/lib/Gun/structs/Project.ts | 53 ++++++-- .../web-application/src/routes/+layout.svelte | 25 ++-- apps/web-application/src/routes/+page.svelte | 3 - .../src/routes/dashboard/+layout.svelte | 50 ++++---- .../routes/dashboard/projects/+page.svelte | 6 +- .../projects/[id]/commands/+page.svelte | 81 ++++++++++++ .../projects/[id]/editor/+layout.svelte | 19 +++ .../projects/[id]/editor/+page.svelte | 9 ++ .../[id]/editor/[command]/+page.svelte | 9 ++ .../projects/[id]/general/+page.svelte | 5 +- 14 files changed, 354 insertions(+), 102 deletions(-) create mode 100644 apps/web-application/src/lib/Components/Dashboard/Projects/CommandBanner.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/[id]/commands/+page.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/[id]/editor/+layout.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/[id]/editor/+page.svelte create mode 100644 apps/web-application/src/routes/dashboard/projects/[id]/editor/[command]/+page.svelte diff --git a/apps/web-application/src/lib/Components/Dashboard/Projects/CommandBanner.svelte b/apps/web-application/src/lib/Components/Dashboard/Projects/CommandBanner.svelte new file mode 100644 index 0000000..cce1dfb --- /dev/null +++ b/apps/web-application/src/lib/Components/Dashboard/Projects/CommandBanner.svelte @@ -0,0 +1,27 @@ + + +
+ {`${name}'s +
+ {name} +
+ {new Intl.DateTimeFormat("en-GB", { + year: "numeric", + month: "2-digit", + day: "2-digit" + }).format(new Date(updatedAt))} +
+
+
\ No newline at end of file diff --git a/apps/web-application/src/lib/Components/Editor/Editor.svelte b/apps/web-application/src/lib/Components/Editor/Editor.svelte index e918020..dfa202d 100644 --- a/apps/web-application/src/lib/Components/Editor/Editor.svelte +++ b/apps/web-application/src/lib/Components/Editor/Editor.svelte @@ -1,10 +1,7 @@ +
+ + + +
-
- -
-
{@html code}
-
-
-
{@html pkg}
-
-
- -
-
+ diff --git a/apps/web-application/src/lib/Components/Editor/Nodes/Console/Print.ts b/apps/web-application/src/lib/Components/Editor/Nodes/Console/Print.ts index fbd14e1..e2039a4 100644 --- a/apps/web-application/src/lib/Components/Editor/Nodes/Console/Print.ts +++ b/apps/web-application/src/lib/Components/Editor/Nodes/Console/Print.ts @@ -7,7 +7,6 @@ export class Print extends BaseNode { protected onBuild(): void { this.setNodeColor(NodeCategoryColor.Console); - this.addInput("Content", FlowIOTypes.Any); this.addProperty("content", "", FlowIOTypes.String); this.addWidget("text", "Content", "", (v: string) => { @@ -18,6 +17,10 @@ export class Print extends BaseNode { }, { property: "content" }) + + setTimeout(() => { + if(!this.properties.content) this.addInput("Content", FlowIOTypes.Any); + }, 100) } nodeToCode(generator: BaseGenerator): string { diff --git a/apps/web-application/src/lib/Gun/MainGun.svelte.ts b/apps/web-application/src/lib/Gun/MainGun.svelte.ts index b3facbf..191dae7 100644 --- a/apps/web-application/src/lib/Gun/MainGun.svelte.ts +++ b/apps/web-application/src/lib/Gun/MainGun.svelte.ts @@ -1,19 +1,44 @@ // 🔫 import Gun from "gun"; -import "gun/sea"; -import 'gun/nts'; import 'gun/lib/radix'; import 'gun/lib/radisk'; import 'gun/lib/store'; import 'gun/lib/rindexed'; +import 'gun/lib/yson'; +import "gun/sea"; import { BACKEND_URL } from "./Constants"; import { fetchUserSeed, identify } from "./Utils"; -export const gun = Gun({ - peers: [BACKEND_URL + "/gun"], - localStorage: false -}); +let gun: ReturnType; +let user: ReturnType['user']>; + +export function createGun() { + if (gun) return gun; + if (!window) throw new Error("Unable to create Gun in a SSR env") + + gun = Gun({ + peers: [BACKEND_URL + "/gun"], + localStorage: false + }); + + user = gun.user().recall({ sessionStorage: false }) as ReturnType; + + gun.on("auth", async () => { + const userId = await identify().catch(() => undefined); + console.log(`[GUN AUTH]: Logged In as ${userId?.id || "UNKNOWN"}`); + + logged.isLogged = true; + }) +} + +export function getGunUser() { + if(!window) throw new Error("Unable to get the user in a none-browser environment.") + console.log(user) + return user; +} + +export { gun, user }; export let logged = $state<{ isLogged: boolean @@ -21,15 +46,6 @@ export let logged = $state<{ isLogged: false }) -export const user = gun.user().recall({ sessionStorage: false }) as ReturnType; - -gun.on("auth", async () => { - const userId = await identify().catch(() => undefined); - console.log(`[GUN AUTH]: Logged In as ${userId?.id || "UNKNOWN"}`); - - logged.isLogged = true; -}) - export function hasUser(userId: string) { return new Promise((res) => { gun.get(`~@${userId}`).once((data) => { diff --git a/apps/web-application/src/lib/Gun/structs/Project.ts b/apps/web-application/src/lib/Gun/structs/Project.ts index da4903e..f02125e 100644 --- a/apps/web-application/src/lib/Gun/structs/Project.ts +++ b/apps/web-application/src/lib/Gun/structs/Project.ts @@ -1,4 +1,4 @@ -import { user } from "../MainGun.svelte"; +import { getGunUser } from "../MainGun.svelte"; import { GunNode } from "./GunNode"; export interface Project { @@ -14,12 +14,17 @@ export class CommandNode extends GunNode { commandId: string; constructor(projectId: string, commandId: string) { - super(user.get(CommandNode.createNamespace(projectId, commandId))); + super(getGunUser().get(CommandNode.createNamespace(projectId, commandId))); this.projectId = projectId; this.commandId = commandId; } + async graph(): Promise { + // @ts-expect-error + return structuredClone(await this.chain.get("graph").get("main").then() as string | undefined); + } + static createNamespace(projectId: string, commandId: string) { return `${projectId}_${commandId}`; } @@ -29,12 +34,19 @@ export class CommandNode extends GunNode { return await projectNode.createCommand(commandId); } + + async saveGraph(graphData: object) { + // @ts-expect-error + await this.chain.get("graph").put({ + main: JSON.stringify(graphData) + }); + } } export class ProjectNode extends GunNode { static async createProject(param: Project) { // @ts-expect-error - await user.get("projects").get(param.id as never).put(param) + await getGunUser().get("projects").get(param.id as never).put(param) } static async getProject(projectId: string) { @@ -43,7 +55,7 @@ export class ProjectNode extends GunNode { static watchProjects(callback: (p: Project) => unknown) { // @ts-expect-error - const ev = user.get("projects").map().on((v: Project | null) => { + const ev = getGunUser().get("projects").map().on((v: Project | null) => { if(!v) return; callback(v); }) @@ -54,7 +66,7 @@ export class ProjectNode extends GunNode { id: string; constructor(projectId: string) { - const chain = user.get("projects").get(projectId as never); + const chain = getGunUser().get("projects").get(projectId as never); super(chain); @@ -67,14 +79,37 @@ export class ProjectNode extends GunNode { } async createCommand(id: string) { - (this.chain.get("commands" as never) as any).get(id).put(1); + (this.chain.get("commands" as never) as any).get(id).put(Date.now()); return new CommandNode(this.id, id); } - metadata() { - return new Promise((resolve) => { - this.chain.once((v) => resolve(v as unknown as Project)); + async metadata(): Promise { + // @ts-expect-error + return await this.chain.then(); + } + + async saveGraph(graphData: object) { + // @ts-expect-error + await this.chain.get("graph").put({ + // Lazy load the graph data + main: JSON.stringify(graphData) }); } + + async graph(): Promise { + // @ts-expect-error + return structuredClone(await this.chain.get("graph").get("main").then() as string | void); + } + + watchCommands(fn: (cmd: { updatedAt: number, name: string }) => unknown) { + // @ts-expect-error + const ev = this.chain.get("commands" as never).map().on((val: number, key: string) => { + fn({ updatedAt: val, name: key }); + }) + + return () => { + ev?.off(); + } + } } \ No newline at end of file diff --git a/apps/web-application/src/routes/+layout.svelte b/apps/web-application/src/routes/+layout.svelte index b4633de..a2d1293 100644 --- a/apps/web-application/src/routes/+layout.svelte +++ b/apps/web-application/src/routes/+layout.svelte @@ -1,12 +1,21 @@
- -
- {@render children()} -
-
\ No newline at end of file + +
+ {@render children()} +
+ diff --git a/apps/web-application/src/routes/+page.svelte b/apps/web-application/src/routes/+page.svelte index 02966b7..7442ed1 100644 --- a/apps/web-application/src/routes/+page.svelte +++ b/apps/web-application/src/routes/+page.svelte @@ -1,6 +1,3 @@ - - diff --git a/apps/web-application/src/routes/dashboard/+layout.svelte b/apps/web-application/src/routes/dashboard/+layout.svelte index bd6a284..5ba4ca3 100644 --- a/apps/web-application/src/routes/dashboard/+layout.svelte +++ b/apps/web-application/src/routes/dashboard/+layout.svelte @@ -1,27 +1,35 @@ -
- -
- {@render children()} -
-
\ No newline at end of file + +{#if page.url.pathname.includes('/editor')} + {@render children?.()} +{:else} +
+ +
+ {@render children()} +
+
+{/if} diff --git a/apps/web-application/src/routes/dashboard/projects/+page.svelte b/apps/web-application/src/routes/dashboard/projects/+page.svelte index 101ed2d..1495b7b 100644 --- a/apps/web-application/src/routes/dashboard/projects/+page.svelte +++ b/apps/web-application/src/routes/dashboard/projects/+page.svelte @@ -1,6 +1,6 @@ + +
+ +
+
+ {#each commands as cmd} + + {/each} +
+
+
diff --git a/apps/web-application/src/routes/dashboard/projects/[id]/editor/+layout.svelte b/apps/web-application/src/routes/dashboard/projects/[id]/editor/+layout.svelte new file mode 100644 index 0000000..da71bd0 --- /dev/null +++ b/apps/web-application/src/routes/dashboard/projects/[id]/editor/+layout.svelte @@ -0,0 +1,19 @@ + + +{@render children?.()} \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/projects/[id]/editor/+page.svelte b/apps/web-application/src/routes/dashboard/projects/[id]/editor/+page.svelte new file mode 100644 index 0000000..a81a88d --- /dev/null +++ b/apps/web-application/src/routes/dashboard/projects/[id]/editor/+page.svelte @@ -0,0 +1,9 @@ + + +{#if logged.isLogged} + +{/if} \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/projects/[id]/editor/[command]/+page.svelte b/apps/web-application/src/routes/dashboard/projects/[id]/editor/[command]/+page.svelte new file mode 100644 index 0000000..edd3ebf --- /dev/null +++ b/apps/web-application/src/routes/dashboard/projects/[id]/editor/[command]/+page.svelte @@ -0,0 +1,9 @@ + + +{#if logged.isLogged} + +{/if} \ No newline at end of file diff --git a/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte b/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte index aa5a4ee..c9f2adf 100644 --- a/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte +++ b/apps/web-application/src/routes/dashboard/projects/[id]/general/+page.svelte @@ -17,9 +17,10 @@ .metadata() .then((p) => { infoFetched = true; - project = structuredClone(p); + const pro = structuredClone(p); + project = pro; - console.log('[GUN] RECIEVED PROJECT OBJECT: ', project); + console.log('[GUN] RECIEVED PROJECT OBJECT: ', pro); }) .catch(() => { goto('/');