Compare commits

..

22 Commits

Author SHA1 Message Date
f6a75d08c3 Remove compose version 2023-11-25 03:05:58 +08:00
766e751522 Close terminal if there is no clients (#60)
* Close terminal if there is no clients connecting

* Only enable

* Join the terminal only if it is managed by Dockge

* Done
2023-11-25 02:04:16 +08:00
45ab36db98 Fix: dockge cannot be self-managed (#171) 2023-11-25 01:02:04 +08:00
47435d41cd Added Swedish (#167) 2023-11-24 13:27:55 +08:00
ee8f39699a Add Italian translation (#166)
* Create it-IT.json

* Add Italian translation to i18n.ts
2023-11-24 02:33:22 +08:00
204c776b0d feat : Added Thai language (#164) 2023-11-23 21:27:38 +08:00
724b5d6d7e Update README.md 2023-11-23 11:03:20 +08:00
766ecb070d Arabic translation (#162)
* Create ar.json

Added Arabic translation

* Update i18n.ts

Add Arabic translation

* Update i18n.ts

---------

Co-authored-by: Louis Lam <louislam@users.noreply.github.com>
2023-11-23 10:19:58 +08:00
d1d3a54377 Add step to build the app aswell (#158) 2023-11-23 08:49:34 +08:00
d17a63fcab Created Brazilian-Portuguese lang (#159) 2023-11-23 08:46:20 +08:00
5454b44a1c Fix cs-CZ language (#160)
* fix cs-CZ

* fix admin acc translation
2023-11-23 08:45:14 +08:00
9e8bccbf2f Update ask-for-help.yml 2023-11-22 23:13:34 +08:00
866fa380dd Merge pull request #157 from louislam/rebase-discussion-form
[Rebase to master] Add Discussion Forms for Feature Request and Help (#156)
2023-11-22 23:10:56 +08:00
49b28d0e36 Add Discussion Forms for Feature Request and Help (#156)
* created DISCUSSIONS folder and added feature request form

* Added ask-for-help discussion form

* Updated file formats to GH approved

* Updated naming for feature request. Fixed  to

* Updated ISSUE_TEMPLATE to point to the discussion forms

* Removed description from checkbox

* Removed description from checkboxes

---------

Co-authored-by: Justin Masse <justin@Justins-MacBook-Pro.local>
2023-11-22 23:08:33 +08:00
1e7dd0504b Čeština language file [cs-CZ] (#154) 2023-11-22 18:53:42 +08:00
05191b14de Readme reference compose file contents (#117)
* Reference compose.yaml directly

* fixup! Reference compose.yaml directly
2023-11-22 04:36:09 +08:00
81cacbdddd Fix the port issue 2023-11-22 02:22:38 +08:00
0279d431e0 Add @actions/github 2023-11-22 01:12:54 +08:00
0e768abfb4 Try to fix "close-incorrect-issue.yml" 2023-11-22 01:07:51 +08:00
62e952f1e6 Try to fix "close-incorrect-issue.yml" 2023-11-22 01:04:28 +08:00
f044c2e328 Try to fix issue template 2023-11-22 00:59:11 +08:00
dc8787d204 Add workflows, templates and docs (#134)
* Copy workflows, templates and docs from Uptime Kuma

* Update bug report template

* Add exclude.txt

* Fix tsconfig.json

* Update CONTRIBUTING.md

* Update

* Update
2023-11-22 00:55:34 +08:00
21 changed files with 837 additions and 37 deletions

View File

@ -1,5 +1,5 @@
title: "❓ Ask for help"
labels:
labels: [help]
body:
- type: checkboxes
id: no-duplicate-issues
@ -69,4 +69,4 @@ body:
description: "If running with Node.js? which version are you running?"
placeholder: "Ex. 14.18.0"
validations:
required: false
required: false

View File

@ -56,5 +56,8 @@ jobs:
- name: Check Typescript
run: pnpm run check-ts
- name: Build
run: pnpm run build:frontend
# more things can be add later like tests etc..

View File

@ -16,10 +16,27 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
- uses: pnpm/action-setup@v2
name: Install pnpm
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: node extra/close-incorrect-issue.js ${{ secrets.GITHUB_TOKEN }} ${{ github.event.issue.number }} ${{ github.event.issue.user.login }}
version: 8
run_install: false
- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install
- name: Close Incorrect Issue
run: node extra/close-incorrect-issue.js ${{ secrets.GITHUB_TOKEN }} ${{ github.event.issue.number }} ${{ github.event.issue.user.login }}

View File

@ -75,19 +75,19 @@ services:
image: louislam/dockge:1
restart: unless-stopped
ports:
# Host Port:Container Port
# Host Port : Container Port
- 5001:5001
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
# If you want to use private registries, you need to share the auth file with Dockge:
# - /root/.docker/:/root/.docker
# Your stacks directory in the host (The paths inside container must be the same as the host)
# ⚠️⚠️ If you did it wrong, your data could end up be written into a wrong path.
# ✔️✔️✔️✔️ CORRECT EXAMPLE: - /my-stacks:/my-stacks (Both paths match)
# ❌❌❌❌ WRONG EXAMPLE: - /docker:/my-stacks (Both paths do not match)
# ✔️✔️✔️✔️ CORRECT: - /my-stacks:/my-stacks (Both paths match)
# ❌❌❌❌ WRONG: - /docker:/my-stacks (Both paths do not match)
- /opt/stacks:/opt/stacks
environment:
# Tell Dockge where is your stacks directory

View File

@ -30,6 +30,7 @@ import { Cron } from "croner";
import gracefulShutdown from "http-graceful-shutdown";
import User from "./models/user";
import childProcess from "child_process";
import { Terminal } from "./terminal";
export class DockgeServer {
app : Express;
@ -230,6 +231,11 @@ export class DockgeServer {
});
if (isDev) {
setInterval(() => {
log.debug("terminal", "Terminal count: " + Terminal.getTerminalCount());
}, 5000);
}
}
async afterLogin(socket : DockgeSocket, user : User) {
@ -285,18 +291,18 @@ export class DockgeServer {
}
// Listen
this.httpServer.listen(5001, this.config.hostname, () => {
this.httpServer.listen(this.config.port, this.config.hostname, () => {
if (this.config.hostname) {
log.info( "server", `Listening on ${this.config.hostname}:${this.config.port}`);
} else {
log.info("server", `Listening on ${this.config.port}`);
}
// Run every 5 seconds
Cron("*/2 * * * * *", {
// Run every 10 seconds
Cron("*/10 * * * * *", {
protect: true, // Enabled over-run protection.
}, () => {
log.debug("server", "Cron job running");
//log.debug("server", "Cron job running");
this.sendStackList(true);
});

View File

@ -75,7 +75,9 @@ export class DockerSocketHandler extends SocketHandler {
const stack = Stack.getStack(server, stackName);
stack.joinCombinedTerminal(socket);
if (stack.isManagedByDockge) {
stack.joinCombinedTerminal(socket);
}
callback({
ok: true,

View File

@ -140,9 +140,26 @@ export class TerminalSocketHandler extends SocketHandler {
}
});
// Close Terminal
socket.on("terminalClose", async (terminalName : unknown, callback : unknown) => {
// Leave Combined Terminal
socket.on("leaveCombinedTerminal", async (stackName : unknown, callback) => {
try {
checkLogin(socket);
log.debug("leaveCombinedTerminal", "Stack name: " + stackName);
if (typeof(stackName) !== "string") {
throw new ValidationError("Stack name must be a string.");
}
const stack = Stack.getStack(server, stackName);
await stack.leaveCombinedTerminal(socket);
callback({
ok: true,
});
} catch (e) {
callbackError(e, callback);
}
});
// TODO: Resize Terminal

View File

@ -191,6 +191,7 @@ export class Stack {
let stacksDir = server.stacksDir;
let stackList : Map<string, Stack>;
// Use cached stack list?
if (useCacheForManaged && this.managedStackList.size > 0) {
stackList = this.managedStackList;
} else {
@ -220,22 +221,19 @@ export class Stack {
this.managedStackList = new Map(stackList);
}
// Also get the list from `docker compose ls --all --format json`
// Get status from docker compose ls
let res = childProcess.execSync("docker compose ls --all --format json");
let composeList = JSON.parse(res.toString());
for (let composeStack of composeList) {
// Skip the dockge stack
// TODO: Could be self managed?
if (composeStack.Name === "dockge") {
continue;
}
let stack = stackList.get(composeStack.Name);
// This stack probably is not managed by Dockge, but we still want to show it
if (!stack) {
// Skip the dockge stack if it is not managed by Dockge
if (composeStack.Name === "dockge") {
continue;
}
stack = new Stack(server, composeStack.Name);
stackList.set(composeStack.Name, stack);
}
@ -300,7 +298,7 @@ export class Stack {
}
}
} else {
log.debug("getStack", "Skip FS operations");
//log.debug("getStack", "Skip FS operations");
}
let stack : Stack;
@ -376,12 +374,21 @@ export class Stack {
async joinCombinedTerminal(socket: DockgeSocket) {
const terminalName = getCombinedTerminalName(this.name);
const terminal = Terminal.getOrCreateTerminal(this.server, terminalName, "docker", [ "compose", "logs", "-f", "--tail", "100" ], this.path);
terminal.enableKeepAlive = true;
terminal.rows = COMBINED_TERMINAL_ROWS;
terminal.cols = COMBINED_TERMINAL_COLS;
terminal.join(socket);
terminal.start();
}
async leaveCombinedTerminal(socket: DockgeSocket) {
const terminalName = getCombinedTerminalName(this.name);
const terminal = Terminal.getTerminal(terminalName);
if (terminal) {
terminal.leave(socket);
}
}
async joinContainerTerminal(socket: DockgeSocket, serviceName: string, shell : string = "sh", index: number = 0) {
const terminalName = getContainerExecTerminalName(this.name, serviceName, index);
let terminal = Terminal.getTerminal(terminalName);

View File

@ -34,6 +34,9 @@ export class Terminal {
protected _rows : number = TERMINAL_ROWS;
protected _cols : number = TERMINAL_COLS;
public enableKeepAlive : boolean = false;
protected keepAliveInterval? : NodeJS.Timeout;
constructor(server : DockgeServer, name : string, file : string, args : string | string[], cwd : string) {
this.server = server;
this._name = name;
@ -80,6 +83,25 @@ export class Terminal {
return;
}
if (this.enableKeepAlive) {
log.debug("Terminal", "Keep alive enabled for terminal " + this.name);
// Close if there is no clients
this.keepAliveInterval = setInterval(() => {
const clients = this.server.io.sockets.adapter.rooms.get(this.name);
const numClients = clients ? clients.size : 0;
if (numClients === 0) {
log.debug("Terminal", "Terminal " + this.name + " has no client, closing...");
this.close();
} else {
log.debug("Terminal", "Terminal " + this.name + " has " + numClients + " client(s)");
}
}, 60 * 1000);
} else {
log.debug("Terminal", "Keep alive disabled for terminal " + this.name);
}
try {
this._ptyProcess = pty.spawn(this.file, this.args, {
name: this.name,
@ -100,6 +122,8 @@ export class Terminal {
this._ptyProcess.onExit(this.exit);
} catch (error) {
if (error instanceof Error) {
clearInterval(this.keepAliveInterval);
log.error("Terminal", "Failed to start terminal: " + error.message);
const exitCode = Number(error.message.split(" ").pop());
this.exit({
@ -122,6 +146,8 @@ export class Terminal {
Terminal.terminalMap.delete(this.name);
log.debug("Terminal", "Terminal " + this.name + " exited with code " + res.exitCode);
clearInterval(this.keepAliveInterval);
if (this.callback) {
this.callback(res.exitCode);
}
@ -158,7 +184,9 @@ export class Terminal {
}
close() {
this._ptyProcess?.kill();
clearInterval(this.keepAliveInterval);
// Send Ctrl+C to the terminal
this.ptyProcess?.write("\x03");
}
/**
@ -193,6 +221,10 @@ export class Terminal {
terminal.start();
});
}
public static getTerminalCount() {
return Terminal.terminalMap.size;
}
}
/**

View File

@ -1,4 +1,4 @@
const github = require("@actions/github");
import github from "@actions/github";
(async () => {
try {

View File

@ -12,7 +12,6 @@ declare module 'vue' {
ArrayInput: typeof import('./src/components/ArrayInput.vue')['default']
ArraySelect: typeof import('./src/components/ArraySelect.vue')['default']
BDropdown: typeof import('bootstrap-vue-next')['BDropdown']
BDropdownDivider: typeof import('bootstrap-vue-next')['BDropdownDivider']
BDropdownItem: typeof import('bootstrap-vue-next')['BDropdownItem']
BModal: typeof import('bootstrap-vue-next')['BModal']
Confirm: typeof import('./src/components/Confirm.vue')['default']

View File

@ -9,12 +9,18 @@ const languageList = {
"fr": "Français",
"pl-PL": "Polski",
"pt": "Português",
"pt-BR": "Português-Brasil",
"sl": "Slovenščina",
"tr": "Türkçe",
"zh-CN": "简体中文",
"ur": "Urdu",
"ko-KR": "한국어",
"ru": "Русский"
"ru": "Русский",
"cs-CZ": "Čeština",
"ar": "العربية",
"th":"ไทย",
"it-IT":"Italiano",
"sv-SE":"Svenska"
};
let messages = {

95
frontend/src/lang/ar.json Normal file
View File

@ -0,0 +1,95 @@
{
"languageName": "العربية",
"Create your admin account": "إنشاء حساب المشرف",
"authIncorrectCreds": "اسم المستخدم أو كلمة المرور غير صحيحة.",
"PasswordsDoNotMatch": "كلمة المرور غير مطابقة.",
"Repeat Password": "أعد كتابة كلمة السر",
"Create": "إنشاء",
"signedInDisp": "تم تسجيل الدخول باسم {0}",
"signedInDispDisabled": "تم تعطيل المصادقة.",
"home": "الرئيسية",
"console": "سطر الأوامر",
"registry": "السجل",
"compose": "أنشاء كمبوز",
"addFirstStackMsg": "أنشيء أول كمبوز!",
"stackName" : "اسم المكدسة",
"deployStack": "شنر",
"deleteStack": "حذف",
"stopStack": "إيقاف",
"restartStack": "إعادة تشغيل",
"updateStack": "تحديث",
"startStack": "تشغيل",
"downStack": "أيقاف",
"editStack": "تعديل",
"discardStack": "إهمال",
"saveStackDraft": "حفظ",
"notAvailableShort" : "غير متوفر",
"deleteStackMsg": "هل أنت متأكد أنك تريد حذف هذه المكدسة؟",
"stackNotManagedByDockgeMsg": "لا يتم إدارة هذه المكدس بواسطة Dockge.",
"primaryHostname": "اسم المضيف الرئيسي",
"general": "عام",
"container": "حاوية | حاويات",
"scanFolder": "مسح مجلد المكدسات",
"dockerImage": "صورة",
"restartPolicyUnlessStopped": "ما لم يوقف",
"restartPolicyAlways": "دائماً",
"restartPolicyOnFailure": "عند الفشل",
"restartPolicyNo": "لا",
"environmentVariable": "متغير البيئة | متغيرات البيئة",
"restartPolicy": "سياسة إعادة التشغيل",
"containerName": "اسم الحاوية",
"port": "منفذ | منافذ",
"volume": "مجلد | مجلدات",
"network": "شبكة | شبكات",
"dependsOn": "تبعية الحاوية | تبعية الحاويات",
"addListItem": "إضافة {0}",
"deleteContainer": "حذف",
"addContainer": "أضافة حاوية",
"addNetwork": "أضافة شبكة",
"disableauth.message1": "هل أنت متأكد أنك تريد <strong>تعطيل المصادقة</strong>?",
"disableauth.message2": "إنه مصمم للحالات <strong>التي تنوي فيها مصادقة الطرف الثالث</strong> أمام Dockge مثل Cloudflare Access, Authelia أو أي من آليات المصادقة الأخرى.",
"passwordNotMatchMsg": "كلمة المرور المكررة غير متطابقة.",
"autoGet": "الجلب التلقائي",
"add": "إضافة",
"Edit": "تعديل",
"applyToYAML": "تطبيق على YAML",
"createExternalNetwork": "إنشاء",
"addInternalNetwork": "إضافة",
"Save": "حفظ",
"Language": "اللغة",
"Current User": "المستخدم الحالي",
"Change Password": "تعديل كلمة المرور",
"Current Password": "كلمة المرور الحالية",
"New Password": "كلمة مرور جديدة",
"Repeat New Password": "أعد تكرار كلمة المرور",
"Update Password": "تحديث كلمة المرور",
"Advanced": "متقدم",
"Please use this option carefully!": "من فضلك استخدم هذا الخيار بعناية!",
"Enable Auth": "تفعيل المصادقة",
"Disable Auth": "تعطيل المصادقة",
"I understand, please disable": "أتفهم, أرجو التعطيل",
"Leave": "مغادرة",
"Frontend Version": "لإصدار الواجهة الأمامية",
"Check Update On GitHub": "تحق من التحديث على GitHub",
"Show update if available": "اعرض التحديث إذا كان متاحًا",
"Also check beta release": "تحقق أيضًا من إصدار النسخة التجريبية",
"Remember me": "تذكرني",
"Login": "تسجيل الدخول",
"Username": "اسم المستخدم",
"Password": "كلمة المرور",
"Settings": "الاعدادات",
"Logout": "تسجيل الخروج",
"Lowercase only": "أحرف صغيرة فقط",
"Convert to Compose": "تحويل إلى كومبوز",
"Docker Run": "تشغيل Docker",
"active": "نشيط",
"exited": "تم الخروج",
"inactive": "غير نشيط",
"Appearance": "المظهر",
"Security": "الأمان",
"About": "حول",
"Allowed commands:": "الأوامر المسموح بها:",
"Internal Networks": "الشبكات الداخلية",
"External Networks": "الشبكات الخارجية",
"No External Networks": "لا توجد شبكات خارجية"
}

View File

@ -0,0 +1,95 @@
{
"languageName": "Čeština",
"Create your admin account": "Vytvořit účet administrátora",
"authIncorrectCreds": "Nesprávné uživatelské jméno nebo heslo.",
"PasswordsDoNotMatch": "Hesla se neshodují.",
"Repeat Password": "Opakujte heslo",
"Create": "Vytvořit",
"signedInDisp": "Přihlášen jako {0}",
"signedInDispDisabled": "Ověření zakázáno.",
"home": "Domů",
"console": "Konzole",
"registry": "Registry",
"compose": "Compose",
"addFirstStackMsg": "Vytvořte svůj první stack!",
"stackName": "Název stacku",
"deployStack": "Nainstalovat",
"deleteStack": "Smazat",
"stopStack": "Zastavit",
"restartStack": "Restartovat",
"updateStack": "Aktualizovat",
"startStack": "Spustit",
"downStack": "Zastavit a vypnout",
"editStack": "Upravit",
"discardStack": "Zahodit",
"saveStackDraft": "Uložit",
"notAvailableShort": "N/A",
"deleteStackMsg": "Opravdu chcete smazat tento stack?",
"stackNotManagedByDockgeMsg": "Tento stack není spravován systémem Dockge.",
"primaryHostname": "Primární název hostitele",
"general": "Obecné",
"container": "Kontejner | Kontejnery",
"scanFolder": "Prohledat složku se stacky",
"dockerImage": "Obrázek",
"restartPolicyUnlessStopped": "Pokud není zastaveno",
"restartPolicyAlways": "Vždy",
"restartPolicyOnFailure": "Při selhání",
"restartPolicyNo": "Ne",
"environmentVariable": "Proměnná prostředí | Proměnné prostředí",
"restartPolicy": "Politika restartu",
"containerName": "Název kontejneru",
"port": "Port | Porty",
"volume": "Svazek | Svazky",
"network": "Síť | Sítě",
"dependsOn": "Závisí na kontejneru | Závislosti na kontejneru",
"addListItem": "Přidat {0}",
"deleteContainer": "Smazat",
"addContainer": "Přidat kontejner",
"addNetwork": "Přidat síť",
"disableauth.message1": "Opravdu chcete <strong>zakázat ověřování</strong>?",
"disableauth.message2": "Je navrženo pro scénáře, kde <strong>plánujete implementovat ověřování třetí strany</strong> před Dockge, například Cloudflare Access, Authelia nebo jiné ověřovací mechanismy.",
"passwordNotMatchMsg": "Hesla se neshodují.",
"autoGet": "Automaticky získat",
"add": "Přidat",
"Edit": "Upravit",
"applyToYAML": "Použít na YAML",
"createExternalNetwork": "Vytvořit",
"addInternalNetwork": "Přidat",
"Save": "Uložit",
"Language": "Jazyk",
"Current User": "Aktuální uživatel",
"Change Password": "Změnit heslo",
"Current Password": "Aktuální heslo",
"New Password": "Nové heslo",
"Repeat New Password": "Opakujte nové heslo",
"Update Password": "Aktualizovat heslo",
"Advanced": "Pokročilé",
"Please use this option carefully!": "Používejte tuto možnost opatrně!",
"Enable Auth": "Povolit ověřování",
"Disable Auth": "Zakázat ověřování",
"I understand, please disable": "Rozumím, prosím zakážte",
"Leave": "Opustit",
"Frontend Version": "Verze rozhraní",
"Check Update On GitHub": "Zkontrolovat aktualizaci na GitHubu",
"Show update if available": "Zobrazit aktualizaci, pokud je k dispozici",
"Also check beta release": "Zkontrolovat také beta verzi",
"Remember me": "Zapamatovat údaje",
"Login": "Přihlásit se",
"Username": "Uživatelské jméno",
"Password": "Heslo",
"Settings": "Nastavení",
"Logout": "Odhlásit se",
"Lowercase only": "Pouze malá písmena",
"Convert to Compose": "Převést na Compose",
"Docker Run": "Docker Run",
"active": "Aktivní",
"exited": "Ukončený",
"inactive": "Neaktivní",
"Appearance": "Vzhled",
"Security": "Zabezpečení",
"About": "O aplikaci",
"Allowed commands:": "Povolené příkazy:",
"Internal Networks": "Interní sítě",
"External Networks": "Externí sítě",
"No External Networks": "Žádné externí sítě"
}

View File

@ -0,0 +1,95 @@
{
"languageName": "Italiano",
"Create your admin account": "Crea il tuo account amministratore",
"authIncorrectCreds": "Username e/o password errati.",
"PasswordsDoNotMatch": "Le password non corrispondono.",
"Repeat Password": "Ripetere la password",
"Create": "Crea",
"signedInDisp": "Autenticato come {0}",
"signedInDispDisabled": "Autenticazione disabilitata.",
"home": "Home",
"console": "Console",
"registry": "Registro",
"compose": "Compose",
"addFirstStackMsg": "Componi il tuo primo stack!",
"stackName" : "Nome dello stack",
"deployStack": "Deploy",
"deleteStack": "Cancella",
"stopStack": "Stop",
"restartStack": "Riavvia",
"updateStack": "Aggiorna",
"startStack": "Avvia",
"downStack": "Stop & Down",
"editStack": "Modifica",
"discardStack": "Annulla",
"saveStackDraft": "Salva",
"notAvailableShort" : "N/D",
"deleteStackMsg": "Sei sicuro di voler eliminare questo stack?",
"stackNotManagedByDockgeMsg": "Questo stack non è gestito da Dockge.",
"primaryHostname": "Hostname primario",
"general": "Generale",
"container": "Container | Container",
"scanFolder": "Scansiona la cartella degli stack",
"dockerImage": "Immagine",
"restartPolicyUnlessStopped": "A meno che non venga fermato",
"restartPolicyAlways": "Sempre",
"restartPolicyOnFailure": "Quando fallisce",
"restartPolicyNo": "No",
"environmentVariable": "Variabile d'ambiente | Variabili d'ambiente",
"restartPolicy": "Politica di riavvio",
"containerName": "Nome del container",
"port": "Porta | Porte",
"volume": "Volume | Volumi",
"network": "Rete | Reti",
"dependsOn": "Dipendenza del container | Dipendenze del container",
"addListItem": "Aggiungi {0}",
"deleteContainer": "Elimina",
"addContainer": "Aggiungi container",
"addNetwork": "Aggiungi rete",
"disableauth.message1": "Sei sicuro di voler <strong>disabilitare l'autenticazione</strong>?",
"disableauth.message2": "È stato progettato per scenari <strong>in cui intendi implementare un'autenticazione di terze parti</strong> davanti a Dockge come ad esempio Cloudflare Access, Authelia o altri meccanismi di autenticazione.",
"passwordNotMatchMsg": "La password ripetuta non corrisponde.",
"autoGet": "Ottieni automaticamente",
"add": "Aggiungi",
"Edit": "Modifica",
"applyToYAML": "Applica al file YAML",
"createExternalNetwork": "Crea",
"addInternalNetwork": "Aggiungi",
"Save": "Salva",
"Language": "Lingua",
"Current User": "Utente corrente",
"Change Password": "Cambia la password",
"Current Password": "Password corrente",
"New Password": "Nuova password",
"Repeat New Password": "Ripeti la nuova password",
"Update Password": "Aggiornamento password",
"Advanced": "Avanzato",
"Please use this option carefully!": "Per favore usa questa opzione con cautela!",
"Enable Auth": "Abilita l'autenticazione",
"Disable Auth": "Disabilita l'autenticazione",
"I understand, please disable": "Lo capisco, disabilita",
"Leave": "Lascia",
"Frontend Version": "Versione del frontend",
"Check Update On GitHub": "Controlla la presenza di aggiornamenti su GitHub",
"Show update if available": "Mostra l'aggiornamento se è disponibile",
"Also check beta release": "Controlla anche le release in beta",
"Remember me": "Ricordami",
"Login": "Login",
"Username": "Username",
"Password": "Password",
"Settings": "Impostazioni",
"Logout": "Logout",
"Lowercase only": "Solo lettere minuscole",
"Convert to Compose": "Converti a Compose",
"Docker Run": "Docker Run",
"active": "attivo",
"exited": "uscito",
"inactive": "inattivo",
"Appearance": "Aspetto",
"Security": "Sicurezza",
"About": "Informazioni su",
"Allowed commands:": "Comandi permessi:",
"Internal Networks": "Reti interne",
"External Networks": "Reti esterne",
"No External Networks": "Nessuna rete esterna"
}

View File

@ -0,0 +1,94 @@
{
"languageName": "Português-Brasil",
"Create your admin account": "Crie sua conta de administrador",
"authIncorrectCreds": "Nome de usuário ou senha incorretos.",
"PasswordsDoNotMatch": "As senhas não correspondem.",
"Repeat Password": "Repetir a senha",
"Create": "Criar",
"signedInDisp": "Logado como {0}",
"signedInDispDisabled": "Autenticação desativada.",
"home": "Início",
"console": "Console",
"registry": "Registro",
"compose": "Compose",
"addFirstStackMsg": "Crie sua primeira stack!",
"stackName" : "Nome da stack",
"deployStack": "Deploy",
"deleteStack": "Excluir",
"stopStack": "Parar",
"restartStack": "Reiniciar",
"updateStack": "Atualizar",
"startStack": "Iniciar",
"editStack": "Editar",
"discardStack": "Descartar",
"saveStackDraft": "Salvar",
"notAvailableShort" : "N/D",
"deleteStackMsg": "Tem certeza que deseja excluir esta stack?",
"stackNotManagedByDockgeMsg": "Esta stack não é gerenciada pelo Dockge.",
"primaryHostname": "Nome do Host Primário",
"general": "Geral",
"container": "Contêiner | Contêineres",
"scanFolder": "Pesquisar na pasta de stacks",
"dockerImage": "Imagem",
"restartPolicyUnlessStopped": "A menos que seja parado",
"restartPolicyAlways": "Sempre",
"restartPolicyOnFailure": "Em caso de falha",
"restartPolicyNo": "Não",
"environmentVariable": "Variável de ambiente | Variáveis de ambiente",
"restartPolicy": "Política de reinicialização",
"containerName": "Nome do contêiner",
"port": "Porta | Portas",
"volume": "Volume | Volumes",
"network": "Rede | Redes",
"dependsOn": "Dependência do contêiner | Dependências do contêiner",
"addListItem": "Adicionar {0}",
"deleteContainer": "Excluir",
"addContainer": "Adicionar contêiner",
"addNetwork": "Adicionar rede",
"disableauth.message1": "Tem certeza que deseja <strong>desativar a autenticação</strong>?",
"disableauth.message2": "Isso foi projetado para ambientes <strong>onde você pretende implementar autenticação de terceiros</strong> no Dockge, como Cloudflare Access, Authelia entre outros mecanismos de autenticação.",
"passwordNotMatchMsg": "A senha repetida não corresponde.",
"autoGet": "Obter automaticamente",
"add": "Adicionar",
"Edit": "Editar",
"applyToYAML": "Aplicar ao YAML",
"createExternalNetwork": "Criar",
"addInternalNetwork": "Adicionar",
"Save": "Salvar",
"Language": "Idioma",
"Current User": "Usuário atual",
"Change Password": "Alterar senha",
"Current Password": "Senha atual",
"New Password": "Nova senha",
"Repeat New Password": "Repetir nova senha",
"Update Password": "Atualizar senha",
"Advanced": "Avançado",
"Please use this option carefully!": "Por favor, use esta opção com atenção!",
"Enable Auth": "Habilitar autenticação",
"Disable Auth": "Desabilitar autenticação",
"I understand, please disable": "Entendido, por favor desabilitar",
"Leave": "Sair",
"Frontend Version": "Versão da interface",
"Check Update On GitHub": "Verificar atualização no GitHub",
"Show update if available": "Mostrar atualização se disponível",
"Also check beta release": "Também verificar versão beta",
"Remember me": "Lembrar-me",
"Login": "Entrar",
"Username": "Nome de usuário",
"Password": "Senha",
"Settings": "Configurações",
"Logout": "Sair",
"Lowercase only": "Somente minúsculas",
"Convert to Compose": "Converter para compose",
"Docker Run": "Executar Docker",
"active": "ativo",
"exited": "encerrado",
"inactive": "inativo",
"Appearance": "Aparência",
"Security": "Segurança",
"About": "Sobre",
"Allowed commands:": "Comandos permitidos:",
"Internal Networks": "Redes internas",
"External Networks": "Redes externas",
"No External Networks": "Sem redes externas"
}

View File

@ -0,0 +1,95 @@
{
"languageName": "Svenska",
"Create your admin account": "Skapa ditt Admin-konto.",
"authIncorrectCreds": "Fel användarnamn eller lösenord.",
"PasswordsDoNotMatch": "Lösenorden matchar inte.",
"Repeat Password": "Repetera lösenord",
"Create": "Skapa",
"signedInDisp": "Inloggad som {0}",
"signedInDispDisabled": "Auth inaktiverad.",
"home": "Hem",
"console": "Konsol",
"registry": "Register",
"compose": "Komponera",
"addFirstStackMsg": "Komponera din första stack!",
"stackName" : "Stacknamn",
"deployStack": "Distribuera",
"deleteStack": "Radera",
"stopStack": "Stop",
"restartStack": "Starta om",
"updateStack": "Uppdatera",
"startStack": "Starta",
"downStack": "Stop & Ner",
"editStack": "Redigera",
"discardStack": "Kasta",
"saveStackDraft": "Spara",
"notAvailableShort" : "N/A",
"deleteStackMsg": "Är du säker på att du vill radera stacken?",
"stackNotManagedByDockgeMsg": "Denna stacken hanteras inte av Dockge.",
"primaryHostname": "Primärt värdnamn",
"general": "Allmän",
"container": "Container | Containrar",
"scanFolder": "Scanna Stackfolder",
"dockerImage": "Bild",
"restartPolicyUnlessStopped": "Om inte stoppas",
"restartPolicyAlways": "Alltid",
"restartPolicyOnFailure": "Vid Misslyckande",
"restartPolicyNo": "Nej",
"environmentVariable": "Miljövariabel | Miljövariabler",
"restartPolicy": "Omstartspolicy",
"containerName": "Containernamn",
"port": "Port | Portar",
"volume": "Volym | Volymer",
"network": "Nätverk | Nätverk",
"dependsOn": "Containerberoende | Containerberoenden",
"addListItem": "Lägg till {0}",
"deleteContainer": "Radera",
"addContainer": "Lägg till Container",
"addNetwork": "Lägg till Nätverk",
"disableauth.message1": "Är du säker på att du vill <strong>inaktivera autentisering</strong>?",
"disableauth.message2": "Det är designat för senarion <stong>när du ska implementera tredjeparts autentisering</strong> framör Dockge som Cloudflare Access, Authelia eller andra autentiseringsmekanismer.",
"passwordNotMatchMsg": "Det upprepade lösenordet matchar inte",
"autoGet": "Auto Hämta",
"add": "Lägg till",
"Edit": "Redigera",
"applyToYAML": "Lägg till i YAML",
"createExternalNetwork": "Skapa",
"addInternalNetwork": "Lägg till",
"Save": "Spara",
"Language": "Språk",
"Current User": "Nuvarande användaren",
"Change Password": "Byt lösenord",
"Current Password": "Nuvarande lösenord",
"New Password": "Nytt lösenord",
"Repeat New Password": "Upprepa nytt lösenord",
"Update Password": "Uppdatera lösenord",
"Advanced": "Avancerat",
"Please use this option carefully!": "Använd detta alternativ försiktigt!",
"Enable Auth": "Aktivera Auth",
"Disable Auth": "Avaktivera Auth",
"I understand, please disable": "Jag förstår, vänligen inaktivera",
"Leave": "Lämna",
"Frontend Version": "Frontendversion",
"Check Update On GitHub": "Kontrollera Uppdatering på GitHub",
"Show update if available": "Visa uppdatering om tillgänglig",
"Also check beta release": "Kontrollera även betaversionen",
"Remember me": "Kom ihåg mig",
"Login": "Logga in",
"Username": "Användarnamn",
"Password": "Lösenord",
"Settings": "Inställningar",
"Logout": "Logga ut",
"Lowercase only": "Endast små tecken",
"Convert to Compose": "Omvandla till Compose",
"Docker Run": "Docker Run",
"active": "aktiv",
"exited": "avslutad",
"inactive": "inaktiv",
"Appearance": "Utseende",
"Security": "Säkerhet",
"About": "Om",
"Allowed commands:": "Tillåtna kommandon:",
"Internal Networks": "Interna Nätverk",
"External Networks": "Externa Nätverk",
"No External Networks": "Inga Externa Nätverk"
}

95
frontend/src/lang/th.json Normal file
View File

@ -0,0 +1,95 @@
{
"languageName": "ไทย",
"Create your admin account": "สร้างบัญชีผู้ดูแลระบบของคุณ",
"authIncorrectCreds": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง",
"PasswordsDoNotMatch": "รหัสผ่านไม่ตรงกัน",
"Repeat Password": "ยืนยันรหัสผ่าน",
"Create": "สร้าง",
"signedInDisp": "ลงชื่อเข้าใช้ในชื่อ {0}",
"signedInDispDisabled": "ปิดใช้งาน Auth",
"home": "หน้าหลักe",
"console": "คอนโซล",
"registry": "Registry",
"compose": "Compose",
"addFirstStackMsg": "Compose stack แรกของคุณ",
"stackName": "ชื่อ Stack",
"deployStack": "ปรับใช้",
"deleteStack": "ลบ",
"stopStack": "หยุด",
"restartStack": "เริ่มใหม่",
"updateStack": "อัปเดต",
"startStack": "เริ่มต้น",
"downStack": "หยุดและปิด",
"editStack": "แก้ไข",
"discardStack": "ยกเลิก",
"saveStackDraft": "บันทึก",
"notAvailableShort": "N/A",
"deleteStackMsg": "คุณแน่ใจหรือไม่ว่าต้องการลบ stack นี้",
"stackNotManagedByDockgeMsg": "stack นี้ไม่ได้รับการจัดการโดย Dockge",
"primaryHostname": "ชื่อโฮสต์หลัก",
"general": "ทั่วไป",
"container": "Container | Containers",
"scanFolder": "สแกนโฟลเดอร์ Stacks",
"dockerImage": "Image",
"restartPolicyUnlessStopped": "Unless Stopped",
"restartPolicyAlways": "Always",
"restartPolicyOnFailure": "On Failure",
"restartPolicyNo": "No",
"environmentVariable": "Environment Variable | Environment Variables",
"restartPolicy": "เริ่มต้น Policy ใหม่",
"containerName": "ชื่อ Container",
"port": "พอร์ต | พอร์ต",
"volume": "ปริมาณ | ปริมาณ",
"network": "เครือข่าย | เครือข่าย",
"dependsOn": "Container Dependency | Container Dependencies",
"addListItem": "เพิ่ม {0}",
"deleteContainer": "ลบ",
"addContainer": "เพิ่ม Container",
"addNetwork": "เพิ่ม เครือข่าย",
"disableauth.message1": "คุณแน่ใจหรือไม่ว่าต้องการ <strong>ปิดใช้งานการตรวจสอบสิทธิ์</strong>?",
"disableauth.message2": "ได้รับการออกแบบมาสำหรับสถานการณ์ <strong>ที่คุณตั้งใจจะใช้การตรวจสอบสิทธิ์ของบุคคลที่สาม</strong> หน้า Dockge เช่น Cloudflare Access, Authelia หรือกลไกการตรวจสอบสิทธิ์อื่นๆ",
"passwordNotMatchMsg": "รหัสผ่านซ้ำไม่ตรงกัน",
"autoGet": "รับอัตโนมัติ",
"add": "เพิ่ม",
"Edit": "แก้ไข",
"applyToYAML": "นำไปใช้เป็น YAML",
"createExternalNetwork": "สร้าง",
"addInternalNetwork": "เพิ่ม",
"Save": "บันทึก",
"Language": "ภาษา",
"Current User": "ผู้ใช้งานปัจจุบัน",
"Change Password": "เปลี่ยนรหัสผ่าน",
"Current Password": "รหัสผ่านปัจจุบัน",
"New Password": "รหัสผ่านใหม่",
"Repeat New Password": "รหัสผ่านใหม่ซ้ำ",
"Update Password": "อัปเดตรหัสผ่าน",
"Advanced": "ขั้นสูง",
"Please use this option carefully!": "โปรดใช้ตัวเลือกนี้อย่างระมัดระวัง!",
"Enable Auth": "เปิดใช้งาน Auth",
"Disable Auth": "ปิดใช้งาน Auth",
"I understand, please disable": "ฉันเข้าใจ กรุณาปิดการใช้งาน",
"Leave": "ออก",
"Frontend Version": "เวอร์ชัน Frontend",
"Check Update On GitHub": "ตรวจสอบการอัปเดตบน GitHub",
"Show update if available": "แสดงการอัปเดตหากมี",
"Also check beta release": "สามารถตรวจสอบรุ่นเบต้าได้",
"Remember me": "จดจำฉัน",
"Login": "เข้าสู่ระบบ",
"Username": "ชื่อผู้ใช้",
"Password": "รหัสผ่าน",
"Settings": "การตั้งค่า",
"Logout": "ออกจากระบบ",
"Lowercase only": "ตัวเล็กทั้งหมด",
"Convert to Compose": "แปลงเป็น Compose",
"Docker Run": "เรียกใช้ Docker",
"active": "ใช้งานอยู่",
"exited": "ปิดลงแล้ว",
"inactive": "ไม่ได้ใช้งาน",
"Appearance": "รูปลักษณ์",
"Security": "ความปลอดภัย",
"About": "เกี่ยวกับ",
"Allowed commands:": "คำสั่งที่อนุญาต:",
"Internal Networks": "เครือข่ายภายใน",
"External Networks": "เครือข่ายภายนอก",
"No External Networks": "ไม่มีเครือข่ายภายนอก"
}

View File

@ -319,6 +319,12 @@ export default {
},
deep: true,
},
$route(to, from) {
// Leave Combined Terminal
console.debug("leaveCombinedTerminal", from.params.stackName);
this.$root.getSocket().emit("leaveCombinedTerminal", this.stack.name, () => {});
}
},
mounted() {
if (this.isAdd) {
@ -361,7 +367,7 @@ export default {
clearTimeout(serviceStatusTimeout);
serviceStatusTimeout = setTimeout(async () => {
this.requestServiceStatus();
}, 2000);
}, 5000);
},
requestServiceStatus() {
@ -544,10 +550,6 @@ export default {
throw new Error("Services must be an object");
}
if (!config.version) {
config.version = "3.8";
}
this.yamlDoc = doc;
this.jsonConfig = config;

View File

@ -46,6 +46,7 @@
"yaml": "~2.3.4"
},
"devDependencies": {
"@actions/github": "^6.0.0",
"@fontsource/jetbrains-mono": "^5.0.17",
"@fortawesome/fontawesome-svg-core": "6.4.2",
"@fortawesome/free-regular-svg-icons": "6.4.2",

139
pnpm-lock.yaml generated
View File

@ -82,6 +82,9 @@ dependencies:
version: 2.3.4
devDependencies:
'@actions/github':
specifier: ^6.0.0
version: 6.0.0
'@fontsource/jetbrains-mono':
specifier: ^5.0.17
version: 5.0.17
@ -192,6 +195,22 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/@actions/github@6.0.0:
resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==}
dependencies:
'@actions/http-client': 2.2.0
'@octokit/core': 5.0.1
'@octokit/plugin-paginate-rest': 9.1.4(@octokit/core@5.0.1)
'@octokit/plugin-rest-endpoint-methods': 10.1.5(@octokit/core@5.0.1)
dev: true
/@actions/http-client@2.2.0:
resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==}
dependencies:
tunnel: 0.0.6
undici: 5.27.2
dev: true
/@antfu/utils@0.7.6:
resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==}
dev: true
@ -665,6 +684,11 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/@fastify/busboy@2.1.0:
resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==}
engines: {node: '>=14'}
dev: true
/@floating-ui/core@1.5.0:
resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==}
dependencies:
@ -884,6 +908,92 @@ packages:
dev: false
optional: true
/@octokit/auth-token@4.0.0:
resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==}
engines: {node: '>= 18'}
dev: true
/@octokit/core@5.0.1:
resolution: {integrity: sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw==}
engines: {node: '>= 18'}
dependencies:
'@octokit/auth-token': 4.0.0
'@octokit/graphql': 7.0.2
'@octokit/request': 8.1.5
'@octokit/request-error': 5.0.1
'@octokit/types': 12.3.0
before-after-hook: 2.2.3
universal-user-agent: 6.0.1
dev: true
/@octokit/endpoint@9.0.2:
resolution: {integrity: sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==}
engines: {node: '>= 18'}
dependencies:
'@octokit/types': 12.3.0
is-plain-object: 5.0.0
universal-user-agent: 6.0.1
dev: true
/@octokit/graphql@7.0.2:
resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==}
engines: {node: '>= 18'}
dependencies:
'@octokit/request': 8.1.5
'@octokit/types': 12.3.0
universal-user-agent: 6.0.1
dev: true
/@octokit/openapi-types@19.0.2:
resolution: {integrity: sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==}
dev: true
/@octokit/plugin-paginate-rest@9.1.4(@octokit/core@5.0.1):
resolution: {integrity: sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ==}
engines: {node: '>= 18'}
peerDependencies:
'@octokit/core': '>=5'
dependencies:
'@octokit/core': 5.0.1
'@octokit/types': 12.3.0
dev: true
/@octokit/plugin-rest-endpoint-methods@10.1.5(@octokit/core@5.0.1):
resolution: {integrity: sha512-LMEdsMV8TTMjMTqVoqMzV95XTbv0ZsWxCxQtjAunQOCdwoDH4BVF/Ke5JMSZEVCWGI2kzxnUNbFnK/MxwV7NjA==}
engines: {node: '>= 18'}
peerDependencies:
'@octokit/core': '>=5'
dependencies:
'@octokit/core': 5.0.1
'@octokit/types': 12.3.0
dev: true
/@octokit/request-error@5.0.1:
resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==}
engines: {node: '>= 18'}
dependencies:
'@octokit/types': 12.3.0
deprecation: 2.3.1
once: 1.4.0
dev: true
/@octokit/request@8.1.5:
resolution: {integrity: sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==}
engines: {node: '>= 18'}
dependencies:
'@octokit/endpoint': 9.0.2
'@octokit/request-error': 5.0.1
'@octokit/types': 12.3.0
is-plain-object: 5.0.0
universal-user-agent: 6.0.1
dev: true
/@octokit/types@12.3.0:
resolution: {integrity: sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==}
dependencies:
'@octokit/openapi-types': 19.0.2
dev: true
/@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@ -1567,6 +1677,10 @@ packages:
resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
dev: false
/before-after-hook@2.2.3:
resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
dev: true
/binary-extensions@2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
engines: {node: '>=8'}
@ -2005,6 +2119,10 @@ packages:
engines: {node: '>= 0.8'}
dev: false
/deprecation@2.3.1:
resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
dev: true
/destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@ -2924,6 +3042,11 @@ packages:
engines: {node: '>=8'}
dev: true
/is-plain-object@5.0.0:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
dev: true
/is-property@1.0.2:
resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
dev: false
@ -4408,6 +4531,11 @@ packages:
safe-buffer: 5.2.1
dev: false
/tunnel@0.0.6:
resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
dev: true
/type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@ -4452,6 +4580,13 @@ packages:
/undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
/undici@5.27.2:
resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==}
engines: {node: '>=14.0'}
dependencies:
'@fastify/busboy': 2.1.0
dev: true
/unique-filename@1.1.1:
resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==}
requiresBuild: true
@ -4468,6 +4603,10 @@ packages:
dev: false
optional: true
/universal-user-agent@6.0.1:
resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
dev: true
/universalify@2.0.1:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}