From c71f330b4907a1e00b013cd07f18c5c8be10a18d Mon Sep 17 00:00:00 2001 From: lllllllillllllillll Date: Sun, 12 May 2024 01:30:37 -0700 Subject: [PATCH] added compose file import --- CHANGELOG.md | 8 +- docker-compose.yaml => compose.yaml | 54 +-- controllers/apps.js | 153 +++++--- controllers/dashboard.js | 15 +- controllers/login.js | 26 +- package-lock.json | 576 ++++++++++++++++++++++++---- package.json | 5 +- public/img/add to zip.jpg | Bin 0 -> 37854 bytes server.js | 13 +- views/apps.html | 6 +- views/modals/import.html | 5 +- 11 files changed, 655 insertions(+), 206 deletions(-) rename docker-compose.yaml => compose.yaml (78%) create mode 100644 public/img/add to zip.jpg diff --git a/CHANGELOG.md b/CHANGELOG.md index 08b435b..c46bb04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,13 @@ * Container cards display pending actions (starting, stopping, pausing, restarting). * Dynamically generated avatars. * Updated database models. -* Persistent Database. -* Install cards displayed on dashboard. +* Multi-user permission system. +* Refactored dashboard to support multiple users. +* New alert banner for installs and file uploads. * Updated docker compose to include HTTPS Env. +* Updated Apps page to view or upload compose files. +* Improved app search. +* Updated dependencies. ## v0.40 (Feb 26th 2024) - HTMX rewrite * Pages rewritten to use HTMX. diff --git a/docker-compose.yaml b/compose.yaml similarity index 78% rename from docker-compose.yaml rename to compose.yaml index 48a0d67..ad83d09 100644 --- a/docker-compose.yaml +++ b/compose.yaml @@ -1,28 +1,28 @@ -version: "3.9" -services: - dweebui: - container_name: dweebui - image: lllllllillllllillll/dweebui:v0.50 - environment: - PORT: 8000 - SECRET: MrWiskers - HTTPS: false - restart: unless-stopped - ports: - - 8000:8000 - volumes: - - dweebui:/app/database/ - # Docker socket - - /var/run/docker.sock:/var/run/docker.sock - # Podman socket - #- /run/podman/podman.sock:/var/run/docker.sock - - networks: - - dweebui_net - -volumes: - dweebui: - -networks: - dweebui_net: +version: "3.9" +services: + dweebui: + container_name: dweebui + image: lllllllillllllillll/dweebui:v0.60-dev + environment: + PORT: 8000 + SECRET: MrWiskers + HTTPS: false + restart: unless-stopped + ports: + - 8000:8000 + volumes: + - dweebui:/app + # Docker socket + - /var/run/docker.sock:/var/run/docker.sock + # Podman socket + #- /run/podman/podman.sock:/var/run/docker.sock + + networks: + - dweebui_net + +volumes: + dweebui: + +networks: + dweebui_net: driver: bridge \ No newline at end of file diff --git a/controllers/apps.js b/controllers/apps.js index f29b917..0863211 100644 --- a/controllers/apps.js +++ b/controllers/apps.js @@ -1,5 +1,7 @@ -import { readFileSync, readdirSync, renameSync, mkdirSync, unlinkSync } from 'fs'; +import { readFileSync, readdirSync, renameSync, mkdirSync, unlinkSync, read } from 'fs'; +import { parse } from 'yaml'; import multer from 'multer'; +import AdmZip from 'adm-zip'; const upload = multer({storage: multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'templates/tmp/') }, @@ -7,55 +9,85 @@ const upload = multer({storage: multer.diskStorage({ })}); let alert = ''; +let templates_global = ''; -export const Apps = (req, res) => { +export const Apps = async (req, res) => { let page = Number(req.params.page) || 1; let template_param = req.params.template || 'default'; - let template_file = readFileSync(`./templates/json/${template_param}.json`); - - let templates = JSON.parse(template_file).templates; - - templates = templates.sort((a, b) => { - if (a.name < b.name) { return -1; } - }); - - - - let list_start = (page-1)*28; - let list_end = (page*28); - let last_page = Math.ceil(templates.length/28); - let prev = '/apps/' + (page-1); - let next = '/apps/' + (page+1); - if (page == 1) { prev = '/apps/' + (page); } - if (page == last_page) { next = '/apps/' + (page); } - let apps_list = ''; - for (let i = list_start; i < list_end && i < templates.length; i++) { + let app_count = ''; + + let list_start = (page - 1) * 28; + let list_end = (page * 28); + let last_page = ''; + + let prev = '/apps/' + (page - 1) + '/' + template_param; + let next = '/apps/' + (page + 1) + '/' + template_param; + if (page == 1) { prev = '/apps/' + (page) + '/' + template_param; } + if (page == last_page) { next = '/apps/' + (page) + '/' + template_param;} + + + if (template_param == 'compose') { + let compose_files = readdirSync('templates/compose/'); + + app_count = compose_files.length; + last_page = Math.ceil(compose_files.length/28); + + compose_files.forEach(file => { + let compose = readFileSync(`templates/compose/${file}/compose.yaml`, 'utf8'); + let compose_data = parse(compose); + let service_name = Object.keys(compose_data.services) + let container = compose_data.services[service_name].container_name; + let image = compose_data.services[service_name].image; + let appCard = readFileSync('./views/partials/appCard.html', 'utf8'); - let name = templates[i].name || templates[i].title.toLowerCase(); - let desc = templates[i].description.slice(0, 60) + "..."; - let description = templates[i].description.replaceAll(". ", ".\n") || "no description available"; - let note = templates[i].note ? templates[i].note.replaceAll(". ", ".\n") : "no notes available"; - let image = templates[i].image; - let logo = templates[i].logo; - let categories = ''; - // set data.catagories to 'other' if data.catagories is empty or undefined - if (templates[i].categories == null || templates[i].categories == undefined || templates[i].categories == '') { - templates[i].categories = ['Other']; - } - // loop through the categories and add the badge to the card - for (let j = 0; j < templates[i].categories.length; j++) { - categories += CatagoryColor(templates[i].categories[j]); - } - appCard = appCard.replace(/AppName/g, name); - appCard = appCard.replace(/AppShortName/g, name); - appCard = appCard.replace(/AppDesc/g, desc); - appCard = appCard.replace(/AppLogo/g, logo); - appCard = appCard.replace(/AppCategories/g, categories); + appCard = appCard.replace(/AppName/g, service_name); + appCard = appCard.replace(/AppShortName/g, service_name); + appCard = appCard.replace(/AppDesc/g, 'Compose File'); + appCard = appCard.replace(/AppLogo/g, `https://raw.githubusercontent.com/lllllllillllllillll/DweebUI-Icons/main/${service_name}.png`); + appCard = appCard.replace(/AppCategories/g, 'Compose '); apps_list += appCard; - } + }); + } else { + + let template_file = readFileSync(`./templates/json/default.json`); + let templates = JSON.parse(template_file).templates; + templates = templates.sort((a, b) => { if (a.name < b.name) { return -1; } }); + app_count = templates.length; + + templates_global = templates; + + apps_list = ''; + for (let i = list_start; i < list_end && i < templates.length; i++) { + let appCard = readFileSync('./views/partials/appCard.html', 'utf8'); + let name = templates[i].name || templates[i].title.toLowerCase(); + let desc = templates[i].description.slice(0, 60) + "..."; + let description = templates[i].description.replaceAll(". ", ".\n") || "no description available"; + let note = templates[i].note ? templates[i].note.replaceAll(". ", ".\n") : "no notes available"; + let image = templates[i].image; + let logo = templates[i].logo; + let categories = ''; + // set data.catagories to 'other' if data.catagories is empty or undefined + if (templates[i].categories == null || templates[i].categories == undefined || templates[i].categories == '') { + templates[i].categories = ['Other']; + } + // loop through the categories and add the badge to the card + for (let j = 0; j < templates[i].categories.length; j++) { + categories += CatagoryColor(templates[i].categories[j]); + } + appCard = appCard.replace(/AppName/g, name); + appCard = appCard.replace(/AppShortName/g, name); + appCard = appCard.replace(/AppDesc/g, desc); + appCard = appCard.replace(/AppLogo/g, logo); + appCard = appCard.replace(/AppCategories/g, categories); + apps_list += appCard; + } + } + + + res.render("apps", { @@ -64,7 +96,7 @@ export const Apps = (req, res) => { avatar: req.session.user.charAt(0).toUpperCase(), list_start: list_start + 1, list_end: list_end, - app_count: templates.length, + app_count: app_count, prev: prev, next: next, apps_list: apps_list, @@ -212,7 +244,7 @@ function CatagoryColor(category) { export const InstallModal = async (req, res) => { let input = req.header('hx-trigger-name'); - let result = templates.find(t => t.name == input); + let result = templates_global.find(t => t.name == input); let name = result.name || result.title.toLowerCase(); let short_name = name.slice(0, 25) + "..."; @@ -416,12 +448,8 @@ export const Upload = (req, res) => { alert = ``; @@ -429,16 +457,29 @@ export const Upload = (req, res) => { let files = readdirSync('templates/tmp/'); for (let i = 0; i < files.length; i++) { - if (files[i].endsWith('.json')) { + if (files[i].endsWith('.zip')) { + let zip = new AdmZip(`templates/tmp/${files[i]}`); + zip.extractAllTo('templates/compose', true); + unlinkSync(`templates/tmp/${files[i]}`); + } else if (files[i].endsWith('.json')) { renameSync(`templates/tmp/${files[i]}`, `templates/json/${files[i]}`); - } else if (files[i].endsWith('.yml') || files[i].endsWith('.yaml')) { - mkdirSync(`templates/compose/${files[i].slice(0, -4)}`); - renameSync(`templates/tmp/${files[i]}`, `templates/compose/${files[i].slice(0, -4)}/${files[i]}`); + } else if (files[i].endsWith('.yml')) { + let compose = readFileSync(`templates/tmp/${files[i]}`, 'utf8'); + let compose_data = parse(compose); + let service_name = Object.keys(compose_data.services) + mkdirSync(`templates/compose/${service_name}`); + renameSync(`templates/tmp/${files[i]}`, `templates/compose/${service_name}/compose.yaml`); + } else if (files[i].endsWith('.yaml')) { + let compose = readFileSync(`templates/tmp/${files[i]}`, 'utf8'); + let compose_data = parse(compose); + let service_name = Object.keys(compose_data.services) + mkdirSync(`templates/compose/${service_name}`); + renameSync(`templates/tmp/${files[i]}`, `templates/compose/${service_name}/compose.yaml`); } else { + console.log('Unsupported file type'); unlinkSync(`templates/tmp/${files[i]}`); } - } - + } res.redirect('/apps'); }); }; \ No newline at end of file diff --git a/controllers/dashboard.js b/controllers/dashboard.js index 5c00bd8..e4dbd86 100644 --- a/controllers/dashboard.js +++ b/controllers/dashboard.js @@ -12,6 +12,7 @@ let [ cardList, newCards, stats ] = [ '', '', {}]; // The page export const Dashboard = (req, res) => { + let name = req.session.user; let role = req.session.role; alert = req.session.alert; @@ -338,15 +339,15 @@ export const Stats = async (req, res) => { export async function addAlert (session, type, message) { session.alert = ``; + `; } export const UpdatePermissions = async (req, res) => { diff --git a/controllers/login.js b/controllers/login.js index 69c619c..35d40c8 100644 --- a/controllers/login.js +++ b/controllers/login.js @@ -2,31 +2,22 @@ import { User, Syslog } from '../database/models.js'; import bcrypt from 'bcrypt'; - export const Login = function(req,res){ - if(req.session.user){ - res.redirect("/logout"); - }else{ - res.render("login",{ - "error":"", - }); - } + if (req.session.user) { res.redirect("/logout"); } + else { res.render("login",{ "error":"", }); } } export const submitLogin = async function(req,res){ - let { email, password } = req.body; email = email.toLowerCase(); - if(email && password){ - + if (email && password) { let existingUser = await User.findOne({ where: {email:email}}); - if(existingUser){ + if (existingUser) { let match = await bcrypt.compare(password,existingUser.password); - if(match){ - + if (match) { let currentDate = new Date(); let newLogin = currentDate.toLocaleString(); await User.update({lastLogin: newLogin}, {where: {UUID:existingUser.UUID}}); @@ -43,8 +34,9 @@ export const submitLogin = async function(req,res){ message: "User logged in successfully", ip: req.socket.remoteAddress }); + res.redirect("/dashboard"); - }else{ + } else { const syslog = await Syslog.create({ user: null, @@ -58,12 +50,12 @@ export const submitLogin = async function(req,res){ "error":"Invalid password", }); } - }else{ + } else { res.render("login",{ "error":"User with that email does not exist.", }); } - }else{ + } else { res.status(400); res.render("login",{ "error":"Please fill in all the fields.", diff --git a/package-lock.json b/package-lock.json index e59556e..0ff4231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,18 +9,19 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "adm-zip": "^0.5.12", "bcrypt": "^5.1.1", "dockerode": "^4.0.2", "dockerode-compose": "^1.4.0", "ejs": "^3.1.10", "express": "^4.19.2", "express-session": "^1.18.0", - "js-yaml": "^4.1.0", "memorystore": "^1.6.7", "multer": "^1.4.5-lts.1", "sequelize": "^6.37.3", "sqlite3": "^5.1.7", - "systeminformation": "^5.22.7" + "systeminformation": "^5.22.7", + "yaml": "^2.4.2" } }, "node_modules/@balena/dockerignore": { @@ -34,6 +35,68 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -77,6 +140,27 @@ "node": ">=10" } }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -100,9 +184,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dependencies": { "undici-types": "~5.26.4" } @@ -129,6 +213,14 @@ "node": ">= 0.6" } }, + "node_modules/adm-zip": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", + "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", + "engines": { + "node": ">=6.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -368,15 +460,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/buildcheck": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", - "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", - "optional": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -425,6 +508,26 @@ "node": ">= 10" } }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/cacache/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -437,6 +540,18 @@ "node": ">=10" } }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cacache/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -605,18 +720,17 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/cpu-features": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.9.tgz", - "integrity": "sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ==", - "hasInstallScript": true, - "optional": true, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { - "buildcheck": "~0.0.6", - "nan": "^2.17.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">= 8" } }, "node_modules/debug": { @@ -696,9 +810,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", - "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "engines": { "node": ">=8" } @@ -761,6 +875,11 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1029,6 +1148,32 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1117,24 +1262,56 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minipass": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -1389,13 +1566,29 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "optional": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -1699,14 +1892,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/mkdirp-classic": { @@ -1755,23 +1948,6 @@ "node": ">= 6.0.0" } }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", - "optional": true - }, "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", @@ -1786,9 +1962,9 @@ } }, "node_modules/node-abi": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.55.0.tgz", - "integrity": "sha512-uPEjtyh2tFEvWYt4Jw7McOD5FPcHkcxm/tHZc5PWaDB3JYq0rGFUbgaAK+CT5pYpQddBfsZVWI08OwoRfdfbcQ==", + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", + "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", "dependencies": { "semver": "^7.3.5" }, @@ -1876,6 +2052,26 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", @@ -1990,20 +2186,59 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -2174,6 +2409,25 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2378,6 +2632,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", @@ -2454,9 +2727,9 @@ } }, "node_modules/socks": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", - "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "optional": true, "dependencies": { "ip-address": "^9.0.5", @@ -2589,6 +2862,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2600,6 +2887,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -2620,9 +2919,9 @@ } }, "node_modules/systeminformation": { - "version": "5.22.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.7.tgz", - "integrity": "sha512-AWxlP05KeHbpGdgvZkcudJpsmChc2Y5Eo/GvxG/iUA/Aws5LZKHAMSeAo+V+nD+nxWZaxrwpWcnx4SH3oxNL3A==", + "version": "5.22.8", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.22.8.tgz", + "integrity": "sha512-F1iWQ+PSfOzvLMGh2UXASaWLDq5o+1h1db13Kddl6ojcQ47rsJhpMtRrmBXfTA5QJgutC4KV67YRmXLuroIxrA==", "os": [ "darwin", "linux", @@ -2645,9 +2944,9 @@ } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -2699,6 +2998,17 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -2852,7 +3162,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "optional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2879,6 +3188,96 @@ "@types/node": "*" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2896,6 +3295,17 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } } } } diff --git a/package.json b/package.json index 3af5255..29b4237 100644 --- a/package.json +++ b/package.json @@ -12,17 +12,18 @@ "author": "", "license": "ISC", "dependencies": { + "adm-zip": "^0.5.12", "bcrypt": "^5.1.1", "dockerode": "^4.0.2", "dockerode-compose": "^1.4.0", "ejs": "^3.1.10", "express": "^4.19.2", "express-session": "^1.18.0", - "js-yaml": "^4.1.0", "memorystore": "^1.6.7", "multer": "^1.4.5-lts.1", "sequelize": "^6.37.3", "sqlite3": "^5.1.7", - "systeminformation": "^5.22.7" + "systeminformation": "^5.22.7", + "yaml": "^2.4.2" } } diff --git a/public/img/add to zip.jpg b/public/img/add to zip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d8809841706567f61cec6855f47f974d79be4dc GIT binary patch literal 37854 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 F|JgK5U?Bhi literal 0 HcmV?d00001 diff --git a/server.js b/server.js index 6a4b966..46cbac1 100644 --- a/server.js +++ b/server.js @@ -9,8 +9,7 @@ export const docker = new Docker(); const app = express(); const MemoryStore = memorystore(session); -const port = process.env.PORT || 8000; -const connection = process.env.HTTPS || false; +const PORT = process.env.PORT || 8000; // Session middleware const sessionMiddleware = session({ @@ -19,9 +18,9 @@ const sessionMiddleware = session({ resave: false, saveUninitialized: false, cookie:{ - secure: connection, - httpOnly: connection, - maxAge:3600000 * 8 // Session max age in milliseconds. 3600000 = 1 hour. + secure: false, + httpOnly: false, + maxAge: 3600000 * 8 // Session max age in milliseconds. 3600000 = 1 hour. } }); @@ -36,7 +35,7 @@ app.use([ ]); // Initialize server -app.listen(port, async () => { +app.listen(PORT, async () => { async function init() {// I made sure the console.logs and emojis lined up try { await sequelize.authenticate().then( () => { console.log('DB Connection: ✔️') }); } @@ -45,6 +44,6 @@ app.listen(port, async () => { () => { console.log('Synced Models: ✔️') }); } catch { console.log('Synced Models: ❌'); } } await init().then(() => { - console.log(`Listening on http://localhost:${port}`); + console.log(`Listening on http://localhost:${PORT}`); }); }); \ No newline at end of file diff --git a/views/apps.html b/views/apps.html index 5acee02..c60fa77 100644 --- a/views/apps.html +++ b/views/apps.html @@ -79,10 +79,10 @@
- + diff --git a/views/modals/import.html b/views/modals/import.html index d1fca78..744e8cf 100644 --- a/views/modals/import.html +++ b/views/modals/import.html @@ -3,9 +3,10 @@