Compare commits

..

3 Commits

46 changed files with 361 additions and 1700 deletions

View File

@ -1,3 +1,4 @@
title: "❓ Ask for help"
labels: [help] labels: [help]
body: body:
- type: checkboxes - type: checkboxes

View File

@ -1,3 +1,4 @@
title: 🚀 Feature Request
labels: [feature-request] labels: [feature-request]
body: body:
- type: checkboxes - type: checkboxes

View File

@ -1,14 +1,14 @@
name: "⚠️ Ask for help (Please go to the \"Discussions\" tab to submit a Help Request)" name: " Ask for help"
description: "⚠️ Please go to the \"Discussions\" tab to submit a Help Request" description: "Please go to the Discussions tab to submit a Help Request"
body: body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ Please go to https://github.com/louislam/dockge/discussions/new?category=ask-for-help Please go to https://github.com/louislam/dockge/discussions/new?category=ask-for-help
- type: checkboxes - type: checkboxes
id: no-duplicate-issues id: no-duplicate-issues
attributes: attributes:
label: "Issues are for bug reports only, please go to the \"Discussions\" tab to submit a Feature Request" label: "Issues are for bug reports only"
options: options:
- label: "I understand" - label: "I understand"
required: true required: true

View File

@ -1,14 +1,14 @@
name: 🚀 Feature Request (Please go to the "Discussions" tab to submit a Feature Request) name: 🚀 Feature Request
description: "⚠️ Please go to the \"Discussions\" tab to submit a Feature Request" description: "Please go to the Discussions tab to submit a Feature Request"
body: body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ Please go to https://github.com/louislam/dockge/discussions/new?category=ask-for-help Please go to https://github.com/louislam/dockge/discussions/new?category=feature-request
- type: checkboxes - type: checkboxes
id: no-duplicate-issues id: no-duplicate-issues
attributes: attributes:
label: "Issues are for bug reports only, please go to the \"Discussions\" tab to submit a Feature Request" label: "Issues are for bug reports only"
options: options:
- label: "I understand" - label: "I understand"
required: true required: true

View File

@ -14,8 +14,8 @@ jobs:
ci: ci:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, windows-latest, macos-latest, ARM64] os: [ubuntu-latest, windows-latest, macos-latest]
node: [18.17.1] # Can be changed node: [20.x] # Can be changed
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- name: Checkout Code - name: Checkout Code

View File

@ -1,16 +0,0 @@
name: Prevent File Change
on:
pull_request:
jobs:
check-file-changes:
runs-on: ubuntu-latest
steps:
- name: Prevent file change
uses: xalvarez/prevent-file-change-action@v1
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
# Regex, /src/lang/*.json is not allowed to be changed, except for /src/lang/en.json
pattern: '^(?!frontend/src/lang/en\.json$)frontend/src/lang/.*\.json$'
trustedAuthors: UptimeKumaBot

View File

@ -7,15 +7,13 @@ Here are some references:
### ✅ Usually accepted: ### ✅ Usually accepted:
- Bug fix - Bug fix
- Security fix - Security fix
- Adding new language files (see [these instructions](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md)) - Translation
- Adding new language keys: `$t("...")`
### ⚠️ Discussion required: ### ⚠️ Discussion required:
- Large pull requests - Large pull requests
- New features - New features
### ❌ Won't be merged: ### ❌ Won't be merged:
- A dedicated PR for translating existing languages (see [these instructions](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md))
- Do not pass the auto-test - Do not pass the auto-test
- Any breaking changes - Any breaking changes
- Duplicated pull requests - Duplicated pull requests

View File

@ -34,18 +34,12 @@ View Video: https://youtu.be/AWAlOQeNpgU?t=48
## 🔧 How to Install ## 🔧 How to Install
Requirements: Requirements:
- [Docker](https://docs.docker.com/engine/install/) 20+ / Podman - [Docker CE](https://docs.docker.com/engine/install/) 20+ is recommended / Podman
- (Docker only) [Docker Compose Plugin](https://docs.docker.com/compose/install/linux/)
- (Podman only) podman-docker (Debian: `apt install podman-docker`) - (Podman only) podman-docker (Debian: `apt install podman-docker`)
- OS: - OS:
- Major Linux distros that can run Docker/Podman such as: - As long as you can run Docker CE / Podman, it should be fine, but:
- ✅ Ubuntu - Debian/Raspbian Buster or lower is not supported, please upgrade to Bullseye or higher
- ✅ Debian (Bullseye or newer)
- ✅ Raspbian (Bullseye or newer)
- ✅ CentOS
- ✅ Fedora
- ✅ ArchLinux
- ❌ Debian/Raspbian Buster or lower is not supported
- ❌ Windows (Will be supported later)
- Arch: armv7, arm64, amd64 (a.k.a x86_64) - Arch: armv7, arm64, amd64 (a.k.a x86_64)
### Basic ### Basic
@ -54,14 +48,14 @@ Requirements:
- Default Port: 5001 - Default Port: 5001
``` ```
# Create directories that store your stacks and stores Dockge's stack # Create a directory that stores your stacks and stores dockge's compose.yaml
mkdir -p /opt/stacks /opt/dockge mkdir -p /opt/stacks /opt/dockge
cd /opt/dockge cd /opt/dockge
# Download the compose.yaml # Download the compose.yaml
curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml curl https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml --output compose.yaml
# Start the server # Start the Server
docker compose up -d docker compose up -d
# If you are using docker-compose V1 or Podman # If you are using docker-compose V1 or Podman
@ -72,24 +66,40 @@ Dockge is now running on http://localhost:5001
### Advanced ### Advanced
If you want to store your stacks in another directory, you can generate your compose.yaml file by using the following URL with custom query strings. If you want to store your stacks in another directory, you can change the `DOCKGE_STACKS_DIR` environment variable and volumes.
```yaml
version: "3.8"
services:
dockge:
image: louislam/dockge:1
restart: unless-stopped
ports:
# 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: - /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
- DOCKGE_STACKS_DIR=/opt/stacks
``` ```
# Download your compose.yaml
curl "https://dockge.kuma.pet/compose.yaml?port=5001&stacksPath=/opt/stacks" --output compose.yaml
```
- port=`5001`
- stacksPath=`/opt/stacks`
Interactive compose.yaml generator is available on:
https://dockge.kuma.pet
## How to Update ## How to Update
```bash ```bash
cd /opt/dockge cd /opt/dockge
docker compose pull && docker compose up -d docker compose pull
docker compose up -d
``` ```
## Screenshots ## Screenshots
@ -112,7 +122,7 @@ docker compose pull && docker compose up -d
If you love this project, please consider giving it a ⭐. If you love this project, please consider giving it a ⭐.
## 🗣️ Community and Contribution ## 🗣️
### Bug Report ### Bug Report
https://github.com/louislam/dockge/issues https://github.com/louislam/dockge/issues
@ -120,18 +130,15 @@ https://github.com/louislam/dockge/issues
### Ask for Help / Discussions ### Ask for Help / Discussions
https://github.com/louislam/dockge/discussions https://github.com/louislam/dockge/discussions
### Translation ## Translation
If you want to translate Dockge into your language, please read [Translation Guide](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md) If you want to translate Dockge into your language, please read [Translation Guide](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md)
### Create a Pull Request
Be sure to read the [guide](https://github.com/louislam/dockge/blob/master/CONTRIBUTING.md), as we don't accept all types of pull requests and don't want to waste your time.
## FAQ ## FAQ
#### "Dockge"? #### "Dockge"?
"Dockge" is a coinage word which is created by myself. I originally hoped it sounds like `Dodge`, but apparently many people called it `Dockage`, it is also acceptable. "Dockge" is a coinage word which is created by myself. I hope it sounds like `Dodge`.
The naming idea came from Twitch emotes like `sadge`, `bedge` or `wokege`. They all end in `-ge`. The naming idea came from Twitch emotes like `sadge`, `bedge` or `wokege`. They all end in `-ge`.
@ -148,18 +155,17 @@ Yes, you can. However, you need to move your compose file into the stacks direct
3. In Dockge, click the " Scan Stacks Folder" button in the top-right corner's dropdown menu 3. In Dockge, click the " Scan Stacks Folder" button in the top-right corner's dropdown menu
4. Now you should see your stack in the list 4. Now you should see your stack in the list
#### Is Dockge a Portainer replacement? ## More Ideas?
Yes or no. Portainer provides a lot of Docker features. While Dockge is currently only focusing on docker-compose with a better user interface and better user experience. - Stats
- File manager
- App store for yaml templates
- Get app icons
- Switch Docker context
- Support Dockerfile and build
- Support Docker swarm
If you want to manage your container with docker-compose only, the answer may be yes.
If you still need to manage something like docker networks, single containers, the answer may be no. # Others
#### Can I install both Dockge and Portainer?
Yes, you can.
## Others
Dockge is built on top of [Compose V2](https://docs.docker.com/compose/migrate/). `compose.yaml` also known as `docker-compose.yml`. Dockge is built on top of [Compose V2](https://docs.docker.com/compose/migrate/). `compose.yaml` also known as `docker-compose.yml`.

View File

@ -3,16 +3,19 @@ import compareVersions from "compare-versions";
import packageJSON from "../package.json"; import packageJSON from "../package.json";
import { Settings } from "./settings"; import { Settings } from "./settings";
export const obj = {
version: packageJSON.version,
latestVersion: null,
};
export default obj;
// How much time in ms to wait between update checks // How much time in ms to wait between update checks
const UPDATE_CHECKER_INTERVAL_MS = 1000 * 60 * 60 * 48; const UPDATE_CHECKER_INTERVAL_MS = 1000 * 60 * 60 * 48;
const CHECK_URL = "https://dockge.kuma.pet/version"; const CHECK_URL = "https://dockge.kuma.pet/version";
class CheckVersion { let interval : NodeJS.Timeout;
version = packageJSON.version;
latestVersion? : string;
interval? : NodeJS.Timeout;
async startInterval() { export function startInterval() {
const check = async () => { const check = async () => {
if (await Settings.get("checkUpdate") === false) { if (await Settings.get("checkUpdate") === false) {
return; return;
@ -33,13 +36,13 @@ class CheckVersion {
if (checkBeta && data.beta) { if (checkBeta && data.beta) {
if (compareVersions.compare(data.beta, data.slow, ">")) { if (compareVersions.compare(data.beta, data.slow, ">")) {
this.latestVersion = data.beta; obj.latestVersion = data.beta;
return; return;
} }
} }
if (data.slow) { if (data.slow) {
this.latestVersion = data.slow; obj.latestVersion = data.slow;
} }
} catch (_) { } catch (_) {
@ -48,10 +51,21 @@ class CheckVersion {
}; };
await check(); check();
this.interval = setInterval(check, UPDATE_CHECKER_INTERVAL_MS); interval = setInterval(check, UPDATE_CHECKER_INTERVAL_MS);
}
} }
const checkVersion = new CheckVersion(); /**
export default checkVersion; * Enable the check update feature
* @param value Should the check update feature be enabled?
* @returns
*/
export async function enableCheckUpdate(value : boolean) {
await Settings.set("checkUpdate", value);
clearInterval(interval);
if (value) {
startInterval();
}
}

3
backend/docker.ts Normal file
View File

@ -0,0 +1,3 @@
export class Docker {
}

View File

@ -29,11 +29,9 @@ import { Stack } from "./stack";
import { Cron } from "croner"; import { Cron } from "croner";
import gracefulShutdown from "http-graceful-shutdown"; import gracefulShutdown from "http-graceful-shutdown";
import User from "./models/user"; import User from "./models/user";
import childProcessAsync from "promisify-child-process"; import childProcess from "child_process";
import { Terminal } from "./terminal"; import { Terminal } from "./terminal";
import "dotenv/config";
export class DockgeServer { export class DockgeServer {
app : Express; app : Express;
httpServer : http.Server; httpServer : http.Server;
@ -152,6 +150,9 @@ export class DockgeServer {
} }
} }
// Create all the necessary directories
this.initDataDir();
// Create express // Create express
this.app = express(); this.app = express();
@ -254,9 +255,6 @@ export class DockgeServer {
* *
*/ */
async serve() { async serve() {
// Create all the necessary directories
this.initDataDir();
// Connect to database // Connect to database
try { try {
await Database.init(this); await Database.init(this);
@ -308,7 +306,6 @@ export class DockgeServer {
this.sendStackList(true); this.sendStackList(true);
}); });
checkVersion.startInterval();
}); });
gracefulShutdown(this.httpServer, { gracefulShutdown(this.httpServer, {
@ -486,7 +483,7 @@ export class DockgeServer {
return jwtSecretBean; return jwtSecretBean;
} }
async sendStackList(useCache = false) { sendStackList(useCache = false) {
let roomList = this.io.sockets.adapter.rooms.keys(); let roomList = this.io.sockets.adapter.rooms.keys();
let map : Map<string, object> | undefined; let map : Map<string, object> | undefined;
@ -497,7 +494,7 @@ export class DockgeServer {
// Get the list only if there is a room // Get the list only if there is a room
if (!map) { if (!map) {
map = new Map(); map = new Map();
let stackList = await Stack.getStackList(this, useCache); let stackList = Stack.getStackList(this, useCache);
for (let [ stackName, stack ] of stackList) { for (let [ stackName, stack ] of stackList) {
map.set(stackName, stack.toSimpleJSON()); map.set(stackName, stack.toSimpleJSON());
@ -513,8 +510,8 @@ export class DockgeServer {
} }
} }
async sendStackStatusList() { sendStackStatusList() {
let statusList = await Stack.getStatusList(); let statusList = Stack.getStatusList();
let roomList = this.io.sockets.adapter.rooms.keys(); let roomList = this.io.sockets.adapter.rooms.keys();
@ -532,15 +529,8 @@ export class DockgeServer {
} }
} }
async getDockerNetworkList() : Promise<string[]> { getDockerNetworkList() : string[] {
let res = await childProcessAsync.spawn("docker", [ "network", "ls", "--format", "{{.Name}}" ], { let res = childProcess.spawnSync("docker", [ "network", "ls", "--format", "{{.Name}}" ]);
encoding: "utf-8",
});
if (!res.stdout) {
return [];
}
let list = res.stdout.toString().split("\n"); let list = res.stdout.toString().split("\n");
// Remove empty string item // Remove empty string item

View File

@ -9,10 +9,10 @@ import composerize from "composerize";
export class DockerSocketHandler extends SocketHandler { export class DockerSocketHandler extends SocketHandler {
create(socket : DockgeSocket, server : DockgeServer) { create(socket : DockgeSocket, server : DockgeServer) {
socket.on("deployStack", async (name : unknown, composeYAML : unknown, composeENV : unknown, isAdd : unknown, callback) => { socket.on("deployStack", async (name : unknown, composeYAML : unknown, isAdd : unknown, callback) => {
try { try {
checkLogin(socket); checkLogin(socket);
const stack = await this.saveStack(socket, server, name, composeYAML, composeENV, isAdd); const stack = this.saveStack(socket, server, name, composeYAML, isAdd);
await stack.deploy(socket); await stack.deploy(socket);
server.sendStackList(); server.sendStackList();
callback({ callback({
@ -25,10 +25,10 @@ export class DockerSocketHandler extends SocketHandler {
} }
}); });
socket.on("saveStack", async (name : unknown, composeYAML : unknown, composeENV : unknown, isAdd : unknown, callback) => { socket.on("saveStack", async (name : unknown, composeYAML : unknown, isAdd : unknown, callback) => {
try { try {
checkLogin(socket); checkLogin(socket);
this.saveStack(socket, server, name, composeYAML, composeENV, isAdd); this.saveStack(socket, server, name, composeYAML, isAdd);
callback({ callback({
ok: true, ok: true,
"msg": "Saved" "msg": "Saved"
@ -45,7 +45,7 @@ export class DockerSocketHandler extends SocketHandler {
if (typeof(name) !== "string") { if (typeof(name) !== "string") {
throw new ValidationError("Name must be a string"); throw new ValidationError("Name must be a string");
} }
const stack = await Stack.getStack(server, name); const stack = Stack.getStack(server, name);
try { try {
await stack.delete(socket); await stack.delete(socket);
@ -65,7 +65,7 @@ export class DockerSocketHandler extends SocketHandler {
} }
}); });
socket.on("getStack", async (stackName : unknown, callback) => { socket.on("getStack", (stackName : unknown, callback) => {
try { try {
checkLogin(socket); checkLogin(socket);
@ -73,7 +73,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
if (stack.isManagedByDockge) { if (stack.isManagedByDockge) {
stack.joinCombinedTerminal(socket); stack.joinCombinedTerminal(socket);
@ -111,7 +111,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
await stack.start(socket); await stack.start(socket);
callback({ callback({
ok: true, ok: true,
@ -135,7 +135,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
await stack.stop(socket); await stack.stop(socket);
callback({ callback({
ok: true, ok: true,
@ -156,7 +156,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
await stack.restart(socket); await stack.restart(socket);
callback({ callback({
ok: true, ok: true,
@ -177,7 +177,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
await stack.update(socket); await stack.update(socket);
callback({ callback({
ok: true, ok: true,
@ -198,7 +198,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
await stack.down(socket); await stack.down(socket);
callback({ callback({
ok: true, ok: true,
@ -219,7 +219,7 @@ export class DockerSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string"); throw new ValidationError("Stack name must be a string");
} }
const stack = await Stack.getStack(server, stackName, true); const stack = Stack.getStack(server, stackName, true);
const serviceStatusList = Object.fromEntries(await stack.getServiceStatusList()); const serviceStatusList = Object.fromEntries(await stack.getServiceStatusList());
callback({ callback({
ok: true, ok: true,
@ -234,7 +234,7 @@ export class DockerSocketHandler extends SocketHandler {
socket.on("getDockerNetworkList", async (callback) => { socket.on("getDockerNetworkList", async (callback) => {
try { try {
checkLogin(socket); checkLogin(socket);
const dockerNetworkList = await server.getDockerNetworkList(); const dockerNetworkList = server.getDockerNetworkList();
callback({ callback({
ok: true, ok: true,
dockerNetworkList, dockerNetworkList,
@ -264,7 +264,7 @@ export class DockerSocketHandler extends SocketHandler {
}); });
} }
async saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, composeENV : unknown, isAdd : unknown) : Promise<Stack> { saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, isAdd : unknown) : Stack {
// Check types // Check types
if (typeof(name) !== "string") { if (typeof(name) !== "string") {
throw new ValidationError("Name must be a string"); throw new ValidationError("Name must be a string");
@ -272,15 +272,12 @@ export class DockerSocketHandler extends SocketHandler {
if (typeof(composeYAML) !== "string") { if (typeof(composeYAML) !== "string") {
throw new ValidationError("Compose YAML must be a string"); throw new ValidationError("Compose YAML must be a string");
} }
if (typeof(composeENV) !== "string") {
throw new ValidationError("Compose ENV must be a string");
}
if (typeof(isAdd) !== "boolean") { if (typeof(isAdd) !== "boolean") {
throw new ValidationError("isAdd must be a boolean"); throw new ValidationError("isAdd must be a boolean");
} }
const stack = new Stack(server, name, composeYAML, composeENV, false); const stack = new Stack(server, name, composeYAML);
await stack.save(isAdd); stack.save(isAdd);
return stack; return stack;
} }

View File

@ -101,7 +101,7 @@ export class TerminalSocketHandler extends SocketHandler {
log.debug("interactiveTerminal", "Service name: " + serviceName); log.debug("interactiveTerminal", "Service name: " + serviceName);
// Get stack // Get stack
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
stack.joinContainerTerminal(socket, serviceName, shell); stack.joinContainerTerminal(socket, serviceName, shell);
callback({ callback({
@ -151,7 +151,7 @@ export class TerminalSocketHandler extends SocketHandler {
throw new ValidationError("Stack name must be a string."); throw new ValidationError("Stack name must be a string.");
} }
const stack = await Stack.getStack(server, stackName); const stack = Stack.getStack(server, stackName);
await stack.leaveCombinedTerminal(socket); await stack.leaveCombinedTerminal(socket);
callback({ callback({

View File

@ -1,8 +1,8 @@
import { DockgeServer } from "./dockge-server"; import { DockgeServer } from "./dockge-server";
import fs, { promises as fsAsync } from "fs"; import fs from "fs";
import { log } from "./log"; import { log } from "./log";
import yaml from "yaml"; import yaml from "yaml";
import { DockgeSocket, fileExists, ValidationError } from "./util-server"; import { DockgeSocket, ValidationError } from "./util-server";
import path from "path"; import path from "path";
import { import {
COMBINED_TERMINAL_COLS, COMBINED_TERMINAL_COLS,
@ -16,14 +16,13 @@ import {
UNKNOWN UNKNOWN
} from "./util-common"; } from "./util-common";
import { InteractiveTerminal, Terminal } from "./terminal"; import { InteractiveTerminal, Terminal } from "./terminal";
import childProcessAsync from "promisify-child-process"; import childProcess from "child_process";
export class Stack { export class Stack {
name: string; name: string;
protected _status: number = UNKNOWN; protected _status: number = UNKNOWN;
protected _composeYAML?: string; protected _composeYAML?: string;
protected _composeENV?: string;
protected _configFilePath?: string; protected _configFilePath?: string;
protected _composeFileName: string = "compose.yaml"; protected _composeFileName: string = "compose.yaml";
protected server: DockgeServer; protected server: DockgeServer;
@ -32,11 +31,10 @@ export class Stack {
protected static managedStackList: Map<string, Stack> = new Map(); protected static managedStackList: Map<string, Stack> = new Map();
constructor(server : DockgeServer, name : string, composeYAML? : string, composeENV? : string, skipFSOperations = false) { constructor(server : DockgeServer, name : string, composeYAML? : string, skipFSOperations = false) {
this.name = name; this.name = name;
this.server = server; this.server = server;
this._composeYAML = composeYAML; this._composeYAML = composeYAML;
this._composeENV = composeENV;
if (!skipFSOperations) { if (!skipFSOperations) {
// Check if compose file name is different from compose.yaml // Check if compose file name is different from compose.yaml
@ -55,7 +53,6 @@ export class Stack {
return { return {
...obj, ...obj,
composeYAML: this.composeYAML, composeYAML: this.composeYAML,
composeENV: this.composeENV,
}; };
} }
@ -72,15 +69,11 @@ export class Stack {
/** /**
* Get the status of the stack from `docker compose ps --format json` * Get the status of the stack from `docker compose ps --format json`
*/ */
async ps() : Promise<object> { ps() : object {
let res = await childProcessAsync.spawn("docker", [ "compose", "ps", "--format", "json" ], { let res = childProcess.execSync("docker compose ps --format json", {
cwd: this.path, cwd: this.path
encoding: "utf-8",
}); });
if (!res.stdout) { return JSON.parse(res.toString());
return {};
}
return JSON.parse(res.stdout.toString());
} }
get isManagedByDockge() : boolean { get isManagedByDockge() : boolean {
@ -99,15 +92,6 @@ export class Stack {
// Check YAML format // Check YAML format
yaml.parse(this.composeYAML); yaml.parse(this.composeYAML);
let lines = this.composeENV.split("\n");
// Check if the .env is able to pass docker-compose
// Prevent "setenv: The parameter is incorrect"
// It only happens when there is one line and it doesn't contain "="
if (lines.length === 1 && !lines[0].includes("=") && lines[0].length > 0) {
throw new ValidationError("Invalid .env format");
}
} }
get composeYAML() : string { get composeYAML() : string {
@ -121,17 +105,6 @@ export class Stack {
return this._composeYAML; return this._composeYAML;
} }
get composeENV() : string {
if (this._composeENV === undefined) {
try {
this._composeENV = fs.readFileSync(path.join(this.path, ".env"), "utf-8");
} catch (e) {
this._composeENV = "";
}
}
return this._composeENV;
}
get path() : string { get path() : string {
return path.join(this.server.stacksDir, this.name); return path.join(this.server.stacksDir, this.name);
} }
@ -155,35 +128,27 @@ export class Stack {
* Save the stack to the disk * Save the stack to the disk
* @param isAdd * @param isAdd
*/ */
async save(isAdd : boolean) { save(isAdd : boolean) {
this.validate(); this.validate();
let dir = this.path; let dir = this.path;
// Check if the name is used if isAdd // Check if the name is used if isAdd
if (isAdd) { if (isAdd) {
if (await fileExists(dir)) { if (fs.existsSync(dir)) {
throw new ValidationError("Stack name already exists"); throw new ValidationError("Stack name already exists");
} }
// Create the stack folder // Create the stack folder
await fsAsync.mkdir(dir); fs.mkdirSync(dir);
} else { } else {
if (!await fileExists(dir)) { if (!fs.existsSync(dir)) {
throw new ValidationError("Stack not found"); throw new ValidationError("Stack not found");
} }
} }
// Write or overwrite the compose.yaml // Write or overwrite the compose.yaml
await fsAsync.writeFile(path.join(dir, this._composeFileName), this.composeYAML); fs.writeFileSync(path.join(dir, this._composeFileName), this.composeYAML);
const envPath = path.join(dir, ".env");
// Write or overwrite the .env
// If .env is not existing and the composeENV is empty, we don't need to write it
if (await fileExists(envPath) || this.composeENV.trim() !== "") {
await fsAsync.writeFile(envPath, this.composeENV);
}
} }
async deploy(socket? : DockgeSocket) : Promise<number> { async deploy(socket? : DockgeSocket) : Promise<number> {
@ -203,7 +168,7 @@ export class Stack {
} }
// Remove the stack folder // Remove the stack folder
await fsAsync.rm(this.path, { fs.rmSync(this.path, {
recursive: true, recursive: true,
force: true force: true
}); });
@ -211,8 +176,8 @@ export class Stack {
return exitCode; return exitCode;
} }
async updateStatus() { updateStatus() {
let statusList = await Stack.getStatusList(); let statusList = Stack.getStatusList();
let status = statusList.get(this.name); let status = statusList.get(this.name);
if (status) { if (status) {
@ -222,7 +187,7 @@ export class Stack {
} }
} }
static async getStackList(server : DockgeServer, useCacheForManaged = false) : Promise<Map<string, Stack>> { static getStackList(server : DockgeServer, useCacheForManaged = false) : Map<string, Stack> {
let stacksDir = server.stacksDir; let stacksDir = server.stacksDir;
let stackList : Map<string, Stack>; let stackList : Map<string, Stack>;
@ -233,16 +198,16 @@ export class Stack {
stackList = new Map<string, Stack>(); stackList = new Map<string, Stack>();
// Scan the stacks directory, and get the stack list // Scan the stacks directory, and get the stack list
let filenameList = await fsAsync.readdir(stacksDir); let filenameList = fs.readdirSync(stacksDir);
for (let filename of filenameList) { for (let filename of filenameList) {
try { try {
// Check if it is a directory // Check if it is a directory
let stat = await fsAsync.stat(path.join(stacksDir, filename)); let stat = fs.statSync(path.join(stacksDir, filename));
if (!stat.isDirectory()) { if (!stat.isDirectory()) {
continue; continue;
} }
let stack = await this.getStack(server, filename); let stack = this.getStack(server, filename);
stack._status = CREATED_FILE; stack._status = CREATED_FILE;
stackList.set(filename, stack); stackList.set(filename, stack);
} catch (e) { } catch (e) {
@ -257,15 +222,8 @@ export class Stack {
} }
// Get status from docker compose ls // Get status from docker compose ls
let res = await childProcessAsync.spawn("docker", [ "compose", "ls", "--all", "--format", "json" ], { let res = childProcess.execSync("docker compose ls --all --format json");
encoding: "utf-8", let composeList = JSON.parse(res.toString());
});
if (!res.stdout) {
return stackList;
}
let composeList = JSON.parse(res.stdout.toString());
for (let composeStack of composeList) { for (let composeStack of composeList) {
let stack = stackList.get(composeStack.Name); let stack = stackList.get(composeStack.Name);
@ -291,18 +249,11 @@ export class Stack {
* Get the status list, it will be used to update the status of the stacks * Get the status list, it will be used to update the status of the stacks
* Not all status will be returned, only the stack that is deployed or created to `docker compose` will be returned * Not all status will be returned, only the stack that is deployed or created to `docker compose` will be returned
*/ */
static async getStatusList() : Promise<Map<string, number>> { static getStatusList() : Map<string, number> {
let statusList = new Map<string, number>(); let statusList = new Map<string, number>();
let res = await childProcessAsync.spawn("docker", [ "compose", "ls", "--all", "--format", "json" ], { let res = childProcess.execSync("docker compose ls --all --format json");
encoding: "utf-8", let composeList = JSON.parse(res.toString());
});
if (!res.stdout) {
return statusList;
}
let composeList = JSON.parse(res.stdout.toString());
for (let composeStack of composeList) { for (let composeStack of composeList) {
statusList.set(composeStack.Name, this.statusConvert(composeStack.Status)); statusList.set(composeStack.Name, this.statusConvert(composeStack.Status));
@ -330,13 +281,13 @@ export class Stack {
} }
} }
static async getStack(server: DockgeServer, stackName: string, skipFSOperations = false) : Promise<Stack> { static getStack(server: DockgeServer, stackName: string, skipFSOperations = false) : Stack {
let dir = path.join(server.stacksDir, stackName); let dir = path.join(server.stacksDir, stackName);
if (!skipFSOperations) { if (!skipFSOperations) {
if (!await fileExists(dir) || !(await fsAsync.stat(dir)).isDirectory()) { if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
// Maybe it is a stack managed by docker compose directly // Maybe it is a stack managed by docker compose directly
let stackList = await this.getStackList(server, true); let stackList = this.getStackList(server, true);
let stack = stackList.get(stackName); let stack = stackList.get(stackName);
if (stack) { if (stack) {
@ -355,7 +306,7 @@ export class Stack {
if (!skipFSOperations) { if (!skipFSOperations) {
stack = new Stack(server, stackName); stack = new Stack(server, stackName);
} else { } else {
stack = new Stack(server, stackName, undefined, undefined, true); stack = new Stack(server, stackName, undefined, true);
} }
stack._status = UNKNOWN; stack._status = UNKNOWN;
@ -407,7 +358,7 @@ export class Stack {
} }
// If the stack is not running, we don't need to restart it // If the stack is not running, we don't need to restart it
await this.updateStatus(); this.updateStatus();
log.debug("update", "Status: " + this.status); log.debug("update", "Status: " + this.status);
if (this.status !== RUNNING) { if (this.status !== RUNNING) {
return exitCode; return exitCode;
@ -455,17 +406,11 @@ export class Stack {
async getServiceStatusList() { async getServiceStatusList() {
let statusList = new Map<string, number>(); let statusList = new Map<string, number>();
try { let res = childProcess.spawnSync("docker", [ "compose", "ps", "--format", "json" ], {
let res = await childProcessAsync.spawn("docker", [ "compose", "ps", "--format", "json" ], {
cwd: this.path, cwd: this.path,
encoding: "utf-8",
}); });
if (!res.stdout) { let lines = res.stdout.toString().split("\n");
return statusList;
}
let lines = res.stdout?.toString().split("\n");
for (let line of lines) { for (let line of lines) {
try { try {
@ -480,10 +425,5 @@ export class Stack {
} }
return statusList; return statusList;
} catch (e) {
log.error("getServiceStatusList", e);
return statusList;
}
} }
} }

View File

@ -1,17 +1,13 @@
/* /*
* Common utilities for backend and frontend * Common utilities for backend and frontend
*/ */
import yaml, { Document, Pair, Scalar } from "yaml"; import { Document } from "yaml";
import { DotenvParseOutput } from "dotenv";
// Init dayjs // Init dayjs
import dayjs from "dayjs"; import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone"; import timezone from "dayjs/plugin/timezone";
import utc from "dayjs/plugin/utc"; import utc from "dayjs/plugin/utc";
import relativeTime from "dayjs/plugin/relativeTime"; import relativeTime from "dayjs/plugin/relativeTime";
// @ts-ignore
import { replaceVariablesSync } from "@inventage/envsubst";
dayjs.extend(utc); dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
@ -207,7 +203,7 @@ export function getContainerTerminalName(container : string) {
} }
export function getContainerExecTerminalName(stackName : string, container : string, index : number) { export function getContainerExecTerminalName(stackName : string, container : string, index : number) {
return "container-exec-" + stackName + "-" + container + "-" + index; return "container-exec-" + container + "-" + index;
} }
export function copyYAMLComments(doc : Document, src : Document) { export function copyYAMLComments(doc : Document, src : Document) {
@ -344,48 +340,3 @@ export function parseDockerPort(input : string, defaultHostname : string = "loca
display: display, display: display,
}; };
} }
export function envsubst(string : string, variables : LooseObject) : string {
return replaceVariablesSync(string, variables)[0];
}
/**
* Traverse all values in the yaml and for each value, if there are template variables, replace it environment variables
* Emulates the behavior of how docker-compose handles environment variables in yaml files
* @param content Yaml string
* @param env Environment variables
* @returns string Yaml string with environment variables replaced
*/
export function envsubstYAML(content : string, env : DotenvParseOutput) : string {
const doc = yaml.parseDocument(content);
if (doc.contents) {
// @ts-ignore
for (const item of doc.contents.items) {
traverseYAML(item, env);
}
}
return doc.toString();
}
/**
* Used for envsubstYAML(...)
* @param pair
* @param env
*/
function traverseYAML(pair : Pair, env : DotenvParseOutput) : void {
// @ts-ignore
if (pair.value && pair.value.items) {
// @ts-ignore
for (const item of pair.value.items) {
if (item instanceof Pair) {
traverseYAML(item, env);
} else if (item instanceof Scalar) {
item.value = envsubst(item.value, env);
}
}
// @ts-ignore
} else if (pair.value && typeof(pair.value.value) === "string") {
// @ts-ignore
pair.value.value = envsubst(pair.value.value, env);
}
}

View File

@ -5,7 +5,6 @@ import { log } from "./log";
import { ERROR_TYPE_VALIDATION } from "./util-common"; import { ERROR_TYPE_VALIDATION } from "./util-common";
import { R } from "redbean-node"; import { R } from "redbean-node";
import { verifyPassword } from "./password-hash"; import { verifyPassword } from "./password-hash";
import fs from "fs";
export interface JWTDecoded { export interface JWTDecoded {
username : string; username : string;
@ -83,9 +82,3 @@ export async function doubleCheckPassword(socket : DockgeSocket, currentPassword
return user; return user;
} }
export function fileExists(file : string) {
return fs.promises.access(file, fs.constants.F_OK)
.then(() => true)
.catch(() => false);
}

View File

@ -13,10 +13,10 @@ services:
# If you want to use private registries, you need to share the auth file with Dockge: # If you want to use private registries, you need to share the auth file with Dockge:
# - /root/.docker/:/root/.docker # - /root/.docker/:/root/.docker
# Stacks Directory # Your stacks directory in the host (The paths inside container must be the same as the host)
# ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH. # ⚠️⚠️ If you did it wrong, your data could end up be written into a wrong path.
# ⚠️ 1. FULL path only. No relative path (MUST) # ✔️✔️✔️✔️ CORRECT: - /my-stacks:/my-stacks (Both paths match)
# ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST) # ❌❌❌❌ WRONG: - /docker:/my-stacks (Both paths do not match)
- /opt/stacks:/opt/stacks - /opt/stacks:/opt/stacks
environment: environment:
# Tell Dockge where is your stacks directory # Tell Dockge where is your stacks directory

View File

@ -1,7 +1,9 @@
# Due to the bug of #145, Node.js's version cannot be changed, unless upstream is fixed.
FROM node:18.17.1-bookworm-slim FROM node:18.17.1-bookworm-slim
ENV PNPM_HOME="/pnpm" ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH" ENV PATH="$PNPM_HOME:$PATH"
# COPY --from=docker:dind /usr/local/bin/docker /usr/local/bin/
RUN apt update && apt install --yes --no-install-recommends \ RUN apt update && apt install --yes --no-install-recommends \
curl \ curl \
ca-certificates \ ca-certificates \

View File

@ -1,10 +0,0 @@
############################################
# Build in Golang
############################################
FROM golang:1.21.4-bookworm
WORKDIR /app
ARG TARGETPLATFORM
COPY ./extra/healthcheck.go ./extra/healthcheck.go
# Compile healthcheck.go
RUN go build -x -o ./extra/healthcheck ./extra/healthcheck.go

View File

@ -1,8 +1,3 @@
############################################
# Healthcheck Binary
############################################
FROM louislam/dockge:build-healthcheck AS build_healthcheck
############################################ ############################################
# Build # Build
############################################ ############################################
@ -17,17 +12,16 @@ RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-l
############################################ ############################################
FROM louislam/dockge:base AS release FROM louislam/dockge:base AS release
WORKDIR /app WORKDIR /app
COPY --chown=node:node --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
COPY --from=build /app/node_modules /app/node_modules
COPY --chown=node:node . . COPY --chown=node:node . .
COPY --from=build /app/node_modules /app/node_modules
RUN mkdir ./data RUN mkdir ./data
VOLUME /app/data VOLUME /app/data
EXPOSE 5001 EXPOSE 5001
HEALTHCHECK --interval=60s --timeout=30s --start-period=60s --retries=5 CMD extra/healthcheck
ENTRYPOINT ["/usr/bin/dumb-init", "--"] ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["tsx", "./backend/index.ts"] CMD ["tsx", "./backend/index.ts"]
############################################ ############################################
# Mark as Nightly # Mark as Nightly
############################################ ############################################

View File

@ -1,74 +0,0 @@
/*
* If changed, have to run `npm run build-docker-builder-go`.
* This script should be run after a period of time (180s), because the server may need some time to prepare.
*/
package main
import (
"crypto/tls"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
"time"
)
func main() {
// Is K8S + "dockge" as the container name
// See https://github.com/louislam/uptime-kuma/pull/2083
isK8s := strings.HasPrefix(os.Getenv("DOCKGE_PORT"), "tcp://")
// process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{
InsecureSkipVerify: true,
}
client := http.Client{
Timeout: 28 * time.Second,
}
sslKey := os.Getenv("DOCKGE_SSL_KEY")
sslCert := os.Getenv("DOCKGE_SSL_CERT")
hostname := os.Getenv("DOCKGE_HOST")
if len(hostname) == 0 {
hostname = "127.0.0.1"
}
port := ""
// DOCKGE_PORT is override by K8S unexpectedly,
if !isK8s {
port = os.Getenv("DOCKGE_PORT")
}
if len(port) == 0 {
port = "5001"
}
protocol := ""
if len(sslKey) != 0 && len(sslCert) != 0 {
protocol = "https"
} else {
protocol = "http"
}
url := protocol + "://" + hostname + ":" + port
log.Println("Checking " + url)
resp, err := client.Get(url)
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
log.Printf("Health Check OK [Res Code: %d]\n", resp.StatusCode)
}

View File

@ -1,84 +0,0 @@
import { Database } from "../backend/database";
import { R } from "redbean-node";
import readline from "readline";
import { User } from "../backend/models/user";
import { DockgeServer } from "../backend/dockge-server";
import { log } from "../backend/log";
console.log("== Dockge Reset Password Tool ==");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
export const main = async () => {
const server = new DockgeServer();
// Check if
console.log("Connecting the database");
try {
await Database.init(server);
} catch (e) {
if (e instanceof Error) {
log.error("server", "Failed to connect to your database: " + e.message);
}
process.exit(1);
}
try {
// No need to actually reset the password for testing, just make sure no connection problem. It is ok for now.
if (!process.env.TEST_BACKEND) {
const user = await R.findOne("user");
if (! user) {
throw new Error("user not found, have you installed?");
}
console.log("Found user: " + user.username);
while (true) {
let password = await question("New Password: ");
let confirmPassword = await question("Confirm New Password: ");
if (password === confirmPassword) {
await User.resetPassword(user.id, password);
// Reset all sessions by reset jwt secret
await server.initJWTSecret();
break;
} else {
console.log("Passwords do not match, please try again.");
}
}
console.log("Password reset successfully.");
}
} catch (e) {
if (e instanceof Error) {
console.error("Error: " + e.message);
}
}
await Database.close();
rl.close();
console.log("Finished.");
};
/**
* Ask question of user
* @param question Question to ask
* @returns Users response
*/
function question(question : string) : Promise<string> {
return new Promise((resolve) => {
rl.question(question, (answer) => {
resolve(answer);
});
});
}
if (!process.env.TEST_BACKEND) {
main();
}

View File

@ -9,7 +9,7 @@
<div v-if="!isEditMode"> <div v-if="!isEditMode">
<span class="badge me-1" :class="bgStyle">{{ status }}</span> <span class="badge me-1" :class="bgStyle">{{ status }}</span>
<a v-for="port in envsubstService.ports" :key="port" :href="parsePort(port).url" target="_blank"> <a v-for="port in service.ports" :key="port" :href="parsePort(port).url" target="_blank">
<span class="badge me-1 bg-secondary">{{ parsePort(port).display }}</span> <span class="badge me-1 bg-secondary">{{ parsePort(port).display }}</span>
</a> </a>
</div> </div>
@ -213,29 +213,16 @@ export default defineComponent({
jsonObject() { jsonObject() {
return this.$parent.$parent.jsonConfig; return this.$parent.$parent.jsonConfig;
}, },
envsubstJSONConfig() {
return this.$parent.$parent.envsubstJSONConfig;
},
envsubstService() {
if (!this.envsubstJSONConfig.services[this.name]) {
return {};
}
return this.envsubstJSONConfig.services[this.name];
},
imageName() { imageName() {
if (this.envsubstService.image) { if (this.service.image) {
return this.envsubstService.image.split(":")[0]; return this.service.image.split(":")[0];
} else { } else {
return ""; return "";
} }
}, },
imageTag() { imageTag() {
if (this.envsubstService.image) { if (this.service.image) {
let tag = this.envsubstService.image.split(":")[1]; let tag = this.service.image.split(":")[1];
if (tag) { if (tag) {
return tag; return tag;

View File

@ -152,14 +152,6 @@ export default {
}); });
result.sort((m1, m2) => { result.sort((m1, m2) => {
// sort by managed by dockge
if (m1.isManagedByDockge && !m2.isManagedByDockge) {
return -1;
} else if (!m1.isManagedByDockge && m2.isManagedByDockge) {
return 1;
}
if (m1.status !== m2.status) { if (m1.status !== m2.status) {
if (m2.status === RUNNING) { if (m2.status === RUNNING) {
return 1; return 1;

View File

@ -19,14 +19,10 @@ const languageList = {
"ru": "Русский", "ru": "Русский",
"cs-CZ": "Čeština", "cs-CZ": "Čeština",
"ar": "العربية", "ar": "العربية",
"th": "ไทย", "th":"ไทย",
"it-IT": "Italiano", "it-IT":"Italiano",
"sv-SE": "Svenska", "sv-SE":"Svenska",
"uk-UA": "Українська", "uk-UA":"Українська"
"da": "Dansk",
"ja": "日本語",
"nl": "Nederlands",
"ro": "Română",
}; };
let messages = { let messages = {
@ -39,7 +35,7 @@ for (let lang in languageList) {
}; };
} }
const rtlLangs = [ "fa", "ar-SY", "ur", "ar" ]; const rtlLangs = [ "fa", "ar-SY", "ur" ];
export const currentLocale = () => localStorage.locale export const currentLocale = () => localStorage.locale
|| languageList[navigator.language] && navigator.language || languageList[navigator.language] && navigator.language

View File

@ -2,18 +2,13 @@
A simple guide on how to translate `Dockge` in your native language. A simple guide on how to translate `Dockge` in your native language.
## How to Translate
(11-26-2023) Updated
1. Go to <https://weblate.kuma.pet>
2. Register an account on Weblate
3. Make sure your GitHub email is matched with Weblate's account, so that it could show you as a contributor on GitHub
4. Choose your language on Weblate and start translating.
## How to add a new language in the dropdown ## How to add a new language in the dropdown
1. Add your Language at <https://weblate.kuma.pet/projects/dockge/dockge/>. (11-21-2023) Updated
2. Find the language code (You can find it at the end of the URL)
1. Add your Language at `frontend/src/lang/` by creating a new file with your language Code, format: `zh-TW.json` .
2. Copy the content from `en.json` and make translations from that.
3. Add your language at the end of `languageList` in `frontend/src/i18n.ts`, format: `"zh-TW": "繁體中文 (台灣)"`, 3. Add your language at the end of `languageList` in `frontend/src/i18n.ts`, format: `"zh-TW": "繁體中文 (台灣)"`,
4. Commit to new branch and make a new Pull Request for me to approve. 4. Commit to new branch and make a new Pull Request for me to approve.
*Note:* Currently we are only accepting one Pull Request per Language Translate.

View File

@ -12,8 +12,8 @@
"registry": "السجل", "registry": "السجل",
"compose": "أنشاء كمبوز", "compose": "أنشاء كمبوز",
"addFirstStackMsg": "أنشيء أول كمبوز!", "addFirstStackMsg": "أنشيء أول كمبوز!",
"stackName": "اسم المكدسة", "stackName" : "اسم المكدسة",
"deployStack": "نشر", "deployStack": نر",
"deleteStack": "حذف", "deleteStack": "حذف",
"stopStack": "إيقاف", "stopStack": "إيقاف",
"restartStack": "إعادة تشغيل", "restartStack": "إعادة تشغيل",
@ -23,7 +23,7 @@
"editStack": "تعديل", "editStack": "تعديل",
"discardStack": "إهمال", "discardStack": "إهمال",
"saveStackDraft": "حفظ", "saveStackDraft": "حفظ",
"notAvailableShort": "غير متوفر", "notAvailableShort" : "غير متوفر",
"deleteStackMsg": "هل أنت متأكد أنك تريد حذف هذه المكدسة؟", "deleteStackMsg": "هل أنت متأكد أنك تريد حذف هذه المكدسة؟",
"stackNotManagedByDockgeMsg": "لا يتم إدارة هذه المكدس بواسطة Dockge.", "stackNotManagedByDockgeMsg": "لا يتم إدارة هذه المكدس بواسطة Dockge.",
"primaryHostname": "اسم المضيف الرئيسي", "primaryHostname": "اسم المضيف الرئيسي",
@ -46,7 +46,7 @@
"deleteContainer": "حذف", "deleteContainer": "حذف",
"addContainer": "أضافة حاوية", "addContainer": "أضافة حاوية",
"addNetwork": "أضافة شبكة", "addNetwork": "أضافة شبكة",
"disableauth.message1": "هل أنت متأكد أنك تريد <strong>تعطيل المصادقة</strong>؟", "disableauth.message1": "هل أنت متأكد أنك تريد <strong>تعطيل المصادقة</strong>?",
"disableauth.message2": "إنه مصمم للحالات <strong>التي تنوي فيها مصادقة الطرف الثالث</strong> أمام Dockge مثل Cloudflare Access, Authelia أو أي من آليات المصادقة الأخرى.", "disableauth.message2": "إنه مصمم للحالات <strong>التي تنوي فيها مصادقة الطرف الثالث</strong> أمام Dockge مثل Cloudflare Access, Authelia أو أي من آليات المصادقة الأخرى.",
"passwordNotMatchMsg": "كلمة المرور المكررة غير متطابقة.", "passwordNotMatchMsg": "كلمة المرور المكررة غير متطابقة.",
"autoGet": "الجلب التلقائي", "autoGet": "الجلب التلقائي",
@ -91,12 +91,5 @@
"Allowed commands:": "الأوامر المسموح بها:", "Allowed commands:": "الأوامر المسموح بها:",
"Internal Networks": "الشبكات الداخلية", "Internal Networks": "الشبكات الداخلية",
"External Networks": "الشبكات الخارجية", "External Networks": "الشبكات الخارجية",
"No External Networks": "لا توجد شبكات خارجية", "No External Networks": "لا توجد شبكات خارجية"
"reverseProxyMsg2": "تحقق كيف يتم إعداده لمقبس ويب",
"Cannot connect to the socket server.": "تعذر الاتصال بخادم المقبس.",
"reconnecting...": "إعادة الاتصال…",
"url": "رابط | روابط",
"extra": "إضافات",
"reverseProxyMsg1": "هل تستدخم خادم عكسي؟",
"connecting...": "جاري الاتصال بخادم المقبس…"
} }

View File

@ -1,102 +0,0 @@
{
"languageName": "Dansk",
"authIncorrectCreds": "Forkert brugernavn eller adgangskode.",
"PasswordsDoNotMatch": "Adgangskode stemmer ikke overens.",
"Repeat Password": "Gentag adgangskode",
"Create": "Opret",
"signedInDisp": "Logget ind som {0}",
"signedInDispDisabled": "Auth Deaktiveret.",
"home": "Hjem",
"console": "Konsol",
"registry": "Registry",
"compose": "Compose",
"stackName": "Stack-navn",
"deployStack": "Udrulle",
"deleteStack": "Slet",
"stopStack": "Stop",
"restartStack": "Genstart",
"updateStack": "Opdatere",
"startStack": "Start",
"downStack": "Stop & Sluk",
"editStack": "Editere",
"discardStack": "Annuller",
"saveStackDraft": "Gem",
"notAvailableShort": "Ugyldig",
"stackNotManagedByDockgeMsg": "Denne stack administreres ikke af Dockge.",
"primaryHostname": "Primært værtsnavn",
"general": "Generelt",
"container": "Container | Containere",
"scanFolder": "Scan Stack-mappe",
"dockerImage": "Billede",
"restartPolicyUnlessStopped": "Medmindre stoppet",
"restartPolicyAlways": "Altid",
"restartPolicyOnFailure": "Ved fejl",
"restartPolicyNo": "Nej",
"restartPolicy": "Genstart politik",
"containerName": "Container navn",
"port": "Port | Porte",
"volume": "Volumen | Voluminer",
"network": "Netværk | Netværker",
"dependsOn": "Container Dependency | Container Dependencies",
"addListItem": "Tilføj {0}",
"deleteContainer": "Slet",
"addNetwork": "Tilføj Netværk",
"passwordNotMatchMsg": "Koden du gentog stemmer ikke overens.",
"autoGet": "Auto Get",
"add": "Tilføj",
"Edit": "Redigere",
"applyToYAML": "Anvend til YAML",
"createExternalNetwork": "Skabe",
"addInternalNetwork": "Tilføj",
"Save": "Gem",
"Language": "Sprog",
"Current User": "Nuværende bruger",
"Change Password": "Ændre adgangskode",
"Current Password": "Nuværende adgangskode",
"New Password": "Ny adgangskode",
"Repeat New Password": "Gentag ny adgangskode",
"Update Password": "Opdater adgangskode",
"Advanced": "Avanceret",
"Please use this option carefully!": "Brug venligst denne indstilling forsigtigt!",
"Enable Auth": "Aktiver Auth",
"Disable Auth": "Deaktiver Auth",
"I understand, please disable": "Jeg forstår, venligst deaktiver",
"Leave": "Forlad",
"Frontend Version": "Frontend Version",
"Check Update On GitHub": "Tjek opdatering på GitHub",
"Also check beta release": "Tjek også betaversionen",
"Remember me": "Husk mig",
"Login": "Login",
"Username": "Brugernavn",
"Password": "Adgangskode",
"Settings": "Indstillinger",
"Logout": "Log ud",
"Convert to Compose": "Konverter til Compose",
"active": "aktive",
"exited": "forladt",
"inactive": "inaktive",
"Appearance": "Udseende",
"Security": "Sikkerhed",
"Docker Run": "Docker Kør",
"About": "Om",
"Allowed commands:": "Tilladte kommandoer:",
"Internal Networks": "Interne netværk",
"External Networks": "Eksterne netværk",
"No External Networks": "Ingen eksterne netværk",
"reverseProxyMsg1": "Bruger du en Reverse-Proxy?",
"reverseProxyMsg2": "Tjek, hvordan du konfigurerer det til WebSocket",
"Cannot connect to the socket server.": "Kan ikke oprette forbindelse til socket-serveren.",
"reconnecting...": "Genopretter forbindelse…",
"connecting...": "Opretter forbindelse til socket-serveren…",
"url": "URL | URL'er",
"extra": "Ekstra",
"Create your admin account": "Opret din administratorkonto",
"addFirstStackMsg": "Compose din første stack!",
"deleteStackMsg": "Er du sikker på, at du vil slette denne stack?",
"environmentVariable": "Miljøvariabel | miljøvariabler",
"addContainer": "Tilføj Container",
"disableauth.message1": "Er du sikker på, at du vil <strong>deaktivere godkendelse</strong>?",
"disableauth.message2": "Det er designet til scenarier <strong>hvor du har til hensigt at implementere tredjepartsgodkendelse</strong> foran Dockge såsom Cloudflare Access, Authelia eller andre godkendelsesmekanismer.",
"Show update if available": "Vis opdatering, hvis tilgængelig",
"Lowercase only": "Kun små bogstaver"
}

View File

@ -6,14 +6,14 @@
"Repeat Password": "Passwort wiederholen", "Repeat Password": "Passwort wiederholen",
"Create": "Erstellen", "Create": "Erstellen",
"signedInDisp": "Angemeldet als {0}", "signedInDisp": "Angemeldet als {0}",
"signedInDispDisabled": "Anmeldung deaktiviert.", "signedInDispDisabled": "Authentifizierung deaktiviert.",
"home": "Startseite", "home": "Startseite",
"console": "Konsole", "console": "Konsole",
"registry": "Container Registry", "registry": "Register",
"compose": "", "compose": "Zusammenstellen",
"addFirstStackMsg": "Stelle deinen ersten Stack zusammen!", "addFirstStackMsg": "Stelle deinen ersten Stack zusammen!",
"stackName": "Stack-Name", "stackName" : "Stack-Name",
"deployStack": "Deployen", "deployStack": "Bereitstellen",
"deleteStack": "Löschen", "deleteStack": "Löschen",
"stopStack": "Anhalten", "stopStack": "Anhalten",
"restartStack": "Neustarten", "restartStack": "Neustarten",
@ -22,33 +22,33 @@
"editStack": "Bearbeiten", "editStack": "Bearbeiten",
"discardStack": "Verwerfen", "discardStack": "Verwerfen",
"saveStackDraft": "Speichern", "saveStackDraft": "Speichern",
"notAvailableShort": "N/V", "notAvailableShort" : "N/A",
"deleteStackMsg": "Möchtest du diesen Stack wirklich löschen?", "deleteStackMsg": "Möchtest du diesen Stack wirklich löschen?",
"stackNotManagedByDockgeMsg": "Dieser Stack wird nicht von Dockge verwaltet.", "stackNotManagedByDockgeMsg": "Dieser Stack wird nicht von Dockge verwaltet.",
"primaryHostname": "Primärer Hostname", "primaryHostname": "Primärer Hostname",
"general": "Allgemein", "general": "Allgemein",
"container": "Container", "container": "Container | Container",
"scanFolder": "Stacks-Ordner durchsuchen", "scanFolder": "Stacks-Ordner durchsuchen",
"dockerImage": "Image", "dockerImage": "Image",
"restartPolicyUnlessStopped": "Falls nicht gestoppt", "restartPolicyUnlessStopped": "Falls nicht gestoppt",
"restartPolicyAlways": "Immer", "restartPolicyAlways": "Immer",
"restartPolicyOnFailure": "Bei Fehler", "restartPolicyOnFailure": "Bei Fehler",
"restartPolicyNo": "Kein Neustart", "restartPolicyNo": "Kein Neustart",
"environmentVariable": "Umgebungsvariable/n", "environmentVariable": "Umgebungsvariable | Umgebungsvariablen",
"restartPolicy": "Neustart Richtlinie", "restartPolicy": "Neustart Richtlinie",
"containerName": "Container-Name", "containerName": "Container-Name",
"port": "Port / Ports", "port": "Port | Ports",
"volume": "Volume / Volumes", "volume": "Volume | Volumes",
"network": "Netzwerk | Netzwerke", "network": "Netzwerk | Netzwerke",
"dependsOn": "Container-Abhängigkeit/en", "dependsOn": "Container-Abhängigkeit | Container-Abhängigkeiten",
"addListItem": "{0} hinzufügen", "addListItem": "{0} hinzufügen",
"deleteContainer": "Löschen", "deleteContainer": "Löschen",
"addContainer": "Container hinzufügen", "addContainer": "Container hinzufügen",
"addNetwork": "Netzwerk hinzufügen", "addNetwork": "Netzwerk hinzufügen",
"disableauth.message1": "Bist du sicher, dass du die <strong>Anmeldung deaktivieren</strong> möchtest?", "disableauth.message1": "Bist du sicher, dass du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
"disableauth.message2": "Es ist für Szenarien vorgesehen, <strong>in denen du beabsichtigst, eine Drittanbieter-Authentifizierung</strong> vor Dockge zu implementieren, wie zum Beispiel Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.", "disableauth.message2": "Es ist für Szenarien vorgesehen, <strong>in denen du beabsichtigst, eine Drittanbieter-Authentifizierung</strong> vor Dockge zu implementieren, wie zum Beispiel Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
"passwordNotMatchMsg": "Das wiederholte Passwort stimmt nicht überein.", "passwordNotMatchMsg": "Das wiederholte Passwort stimmt nicht überein.",
"autoGet": "Automatisch laden", "autoGet": "Automatisch holen",
"add": "Hinzufügen", "add": "Hinzufügen",
"Edit": "Bearbeiten", "Edit": "Bearbeiten",
"applyToYAML": "Auf YAML anwenden", "applyToYAML": "Auf YAML anwenden",
@ -64,8 +64,8 @@
"Update Password": "Passwort aktualisieren", "Update Password": "Passwort aktualisieren",
"Advanced": "Erweitert", "Advanced": "Erweitert",
"Please use this option carefully!": "Bitte verwende diese Option sorgfältig!", "Please use this option carefully!": "Bitte verwende diese Option sorgfältig!",
"Enable Auth": "Anmeldung aktivieren", "Enable Auth": "Authentifizierung aktivieren",
"Disable Auth": "Anmeldung deaktivieren", "Disable Auth": "Authentifizierung deaktivieren",
"I understand, please disable": "Ich verstehe, bitte deaktivieren", "I understand, please disable": "Ich verstehe, bitte deaktivieren",
"Leave": "Verlassen", "Leave": "Verlassen",
"Frontend Version": "Frontend Version", "Frontend Version": "Frontend Version",
@ -90,13 +90,5 @@
"Allowed commands:": "Zugelassene Befehle:", "Allowed commands:": "Zugelassene Befehle:",
"Internal Networks": "Interne Netzwerke", "Internal Networks": "Interne Netzwerke",
"External Networks": "Externe Netzwerke", "External Networks": "Externe Netzwerke",
"No External Networks": "Keine externen Netzwerke", "No External Networks": "Keine externen Netzwerke"
"Cannot connect to the socket server.": "Keine Verbindung zum Socket Server.",
"reverseProxyMsg1": "Wird ein Reverse Proxy genutzt?",
"reconnecting...": "Erneuter Verbindungsaufbau…",
"downStack": "Stoppen & Aus",
"extra": "Extra",
"url": "URL / URLs",
"reverseProxyMsg2": "Lerne wie dieser für WebSockets zu konfigurieren ist.",
"connecting...": "Verbindungsaufbau zum Socket Server…"
} }

View File

@ -12,7 +12,7 @@
"registry": "Registry", "registry": "Registry",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "Compose your first stack!", "addFirstStackMsg": "Compose your first stack!",
"stackName": "Stack Name", "stackName" : "Stack Name",
"deployStack": "Deploy", "deployStack": "Deploy",
"deleteStack": "Delete", "deleteStack": "Delete",
"stopStack": "Stop", "stopStack": "Stop",
@ -23,7 +23,7 @@
"editStack": "Edit", "editStack": "Edit",
"discardStack": "Discard", "discardStack": "Discard",
"saveStackDraft": "Save", "saveStackDraft": "Save",
"notAvailableShort": "N/A", "notAvailableShort" : "N/A",
"deleteStackMsg": "Are you sure you want to delete this stack?", "deleteStackMsg": "Are you sure you want to delete this stack?",
"stackNotManagedByDockgeMsg": "This stack is not managed by Dockge.", "stackNotManagedByDockgeMsg": "This stack is not managed by Dockge.",
"primaryHostname": "Primary Hostname", "primaryHostname": "Primary Hostname",
@ -95,9 +95,8 @@
"reverseProxyMsg1": "Using a Reverse Proxy?", "reverseProxyMsg1": "Using a Reverse Proxy?",
"reverseProxyMsg2": "Check how to config it for WebSocket", "reverseProxyMsg2": "Check how to config it for WebSocket",
"Cannot connect to the socket server.": "Cannot connect to the socket server.", "Cannot connect to the socket server.": "Cannot connect to the socket server.",
"reconnecting...": "Reconnecting", "reconnecting...": "Reconnecting...",
"connecting...": "Connecting to the socket server", "connecting...": "Connecting to the socket server...",
"url": "URL | URLs", "url": "URL | URLs",
"extra": "Extra", "extra": "Extra"
"newUpdate": "New Update"
} }

View File

@ -1,5 +1,5 @@
{ {
"languageName": "Français", "languageName": "Francais",
"Create your admin account": "Créez votre compte administrateur", "Create your admin account": "Créez votre compte administrateur",
"authIncorrectCreds": "identifiant ou mot de passe incorrect.", "authIncorrectCreds": "identifiant ou mot de passe incorrect.",
"Repeat Password": "Répéter le mot de passe", "Repeat Password": "Répéter le mot de passe",
@ -11,8 +11,8 @@
"console": "Console", "console": "Console",
"registry": "Registre", "registry": "Registre",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "Créez votre première pile !", "addFirstStackMsg": "Créez votre première pile!",
"stackName": "Nom de la pile", "stackName" : "Nom de la pile",
"deployStack": "Déployer", "deployStack": "Déployer",
"deleteStack": "Supprimer", "deleteStack": "Supprimer",
"stopStack": "Arrêter", "stopStack": "Arrêter",
@ -22,11 +22,11 @@
"editStack": "Modifier", "editStack": "Modifier",
"discardStack": "Ignorer", "discardStack": "Ignorer",
"saveStackDraft": "Sauvegarder", "saveStackDraft": "Sauvegarder",
"notAvailableShort": "N/A", "notAvailableShort" : "N/A",
"deleteStackMsg": "Êtes-vous sûr de vouloir supprimer cette pile ?", "deleteStackMsg": "Êtes-vous sûr de vouloir supprimer cette pile ?",
"stackNotManagedByDockgeMsg": "Cette pile n'est pas gérée par Dockge.", "stackNotManagedByDockgeMsg": "Cette pile n'est pas gérée par Dockge.",
"primaryHostname": "Nom d'hôte principal", "primaryHostname": "Nom d'hôte principal",
"general": "Général", "general": "Générale",
"container": "Conteneur | Conteneurs", "container": "Conteneur | Conteneurs",
"scanFolder": "Analyser le dossier des piles", "scanFolder": "Analyser le dossier des piles",
"dockerImage": "Image", "dockerImage": "Image",
@ -51,7 +51,7 @@
"autoGet": "Obtention automatique", "autoGet": "Obtention automatique",
"add": "Ajouter", "add": "Ajouter",
"Edit": "Modifier", "Edit": "Modifier",
"applyToYAML": "Appliquer au YAML", "applyToYAML": "Appliquer à YAML",
"createExternalNetwork": "Créer", "createExternalNetwork": "Créer",
"addInternalNetwork": "Ajouter", "addInternalNetwork": "Ajouter",
"Save": "Enregistrer", "Save": "Enregistrer",
@ -87,16 +87,8 @@
"Appearance": "Apparence", "Appearance": "Apparence",
"Security": "Sécurité", "Security": "Sécurité",
"About": "À propos", "About": "À propos",
"Allowed commands:": "Commandes autorisées :", "Allowed commands:": "Commandes autorisées:",
"Internal Networks": "Réseaux Internes", "Internal Networks": "Réseaux Internes",
"External Networks": "Réseaux Externes", "External Networks": "Réseaux Externes",
"No External Networks": "Aucun Réseau Externe", "No External Networks": "Aucun Réseau Externe"
"reverseProxyMsg2": "Vérifier comment le configurer pour WebSocket",
"connecting...": "Connexion au serveur socket…",
"url": "URL | URLs",
"extra": "Supplémentaire",
"downStack": "Arrêter et désactiver",
"reverseProxyMsg1": "Utilisez vous un proxy inverse ?",
"Cannot connect to the socket server.": "Impossible de se connecter au serveur socket.",
"reconnecting...": "Reconnexion…"
} }

View File

@ -12,7 +12,7 @@
"registry": "Registro", "registry": "Registro",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "Componi il tuo primo stack!", "addFirstStackMsg": "Componi il tuo primo stack!",
"stackName": "Nome dello stack", "stackName" : "Nome dello stack",
"deployStack": "Deploy", "deployStack": "Deploy",
"deleteStack": "Cancella", "deleteStack": "Cancella",
"stopStack": "Stop", "stopStack": "Stop",
@ -23,7 +23,7 @@
"editStack": "Modifica", "editStack": "Modifica",
"discardStack": "Annulla", "discardStack": "Annulla",
"saveStackDraft": "Salva", "saveStackDraft": "Salva",
"notAvailableShort": "N/D", "notAvailableShort" : "N/D",
"deleteStackMsg": "Sei sicuro di voler eliminare questo stack?", "deleteStackMsg": "Sei sicuro di voler eliminare questo stack?",
"stackNotManagedByDockgeMsg": "Questo stack non è gestito da Dockge.", "stackNotManagedByDockgeMsg": "Questo stack non è gestito da Dockge.",
"primaryHostname": "Hostname primario", "primaryHostname": "Hostname primario",
@ -91,11 +91,5 @@
"Allowed commands:": "Comandi permessi:", "Allowed commands:": "Comandi permessi:",
"Internal Networks": "Reti interne", "Internal Networks": "Reti interne",
"External Networks": "Reti esterne", "External Networks": "Reti esterne",
"No External Networks": "Nessuna rete esterna", "No External Networks": "Nessuna rete esterna"
"reverseProxyMsg1": "Utilizzando un proxy inverso?",
"reverseProxyMsg2": "Controlla come configurarlo per WebSocket",
"Cannot connect to the socket server.": "Impossibile connettersi al server socket.",
"connecting...": "Connessione al server socket…",
"extra": "Extra",
"reconnecting...": "Riconnessione…"
} }

View File

@ -1,98 +0,0 @@
{
"authIncorrectCreds": "ユーザーネームまたはパスワードが正しくありません。",
"PasswordsDoNotMatch": "パスワードが一致しません。",
"Repeat Password": "パスワードを再度入力してください",
"Create": "作成",
"signedInDispDisabled": "認証が無効化されています。",
"home": "ホーム",
"console": "コンソール",
"registry": "レジストリ",
"stackName": "スタック名",
"deployStack": "デプロイ",
"deleteStack": "削除",
"stopStack": "停止",
"restartStack": "再起動",
"updateStack": "更新",
"startStack": "起動",
"editStack": "編集",
"discardStack": "破棄",
"saveStackDraft": "保存",
"stackNotManagedByDockgeMsg": "このスタックはDockgeによって管理されていません。",
"general": "一般",
"scanFolder": "スタックフォルダをスキャン",
"dockerImage": "イメージ",
"environmentVariable": "環境変数",
"restartPolicy": "再起動ポリシー",
"containerName": "コンテナ名",
"port": "ポート",
"volume": "ボリューム",
"network": "ネットワーク",
"addListItem": "{0} を追加",
"addContainer": "コンテナを追加",
"addNetwork": "ネットワークを追加",
"compose": "Compose",
"primaryHostname": "主ホスト名",
"container": "コンテナ",
"dependsOn": "コンテナ依存関係",
"downStack": "停止して削除",
"notAvailableShort": "N/A",
"restartPolicyUnlessStopped": "手動で停止されるまで",
"restartPolicyAlways": "常時",
"restartPolicyOnFailure": "失敗時",
"restartPolicyNo": "しない",
"passwordNotMatchMsg": "繰り返しのパスワードが一致しません。",
"autoGet": "自動取得",
"add": "追加",
"Edit": "編集",
"applyToYAML": "YAMLに適用",
"createExternalNetwork": "作成",
"addInternalNetwork": "追加",
"Save": "保存",
"Language": "言語",
"Change Password": "パスワードを変更する",
"Current Password": "現在のパスワード",
"New Password": "新しいパスワード",
"Update Password": "パスワードを更新",
"Advanced": "高度",
"Please use this option carefully!": "このオプションは注意して使用してください!",
"Enable Auth": "認証を有効化",
"Disable Auth": "認証を無効化",
"Check Update On GitHub": "GitHubで更新を確認",
"Show update if available": "アップデートがある場合表示",
"Also check beta release": "ベータ版のリリースも確認する",
"Login": "ログイン",
"Username": "ユーザー名",
"Password": "パスワード",
"Settings": "設定",
"Logout": "ログアウト",
"Convert to Compose": "Composeに変換",
"Appearance": "外観",
"Security": "セキュリティ",
"Allowed commands:": "許可されたコマンド:",
"Internal Networks": "内部ネットワーク",
"External Networks": "外部ネットワーク",
"reverseProxyMsg2": "WebSocketの設定方法を確認",
"Cannot connect to the socket server.": "ソケットサーバーに接続できません。",
"reconnecting...": "再接続中…",
"Leave": "やめる",
"Frontend Version": "フロントエンドバージョン",
"Remember me": "覚えておく",
"No External Networks": "外部ネットワークなし",
"exited": "終了済み",
"inactive": "非アクティブ",
"active": "アクティブ",
"languageName": "日本語",
"Create your admin account": "管理者アカウントを作成してください",
"signedInDisp": "{0} としてログイン中",
"addFirstStackMsg": "最初のスタックを組み立てましょう!",
"deleteStackMsg": "本当にこのスタックを削除しますか?",
"deleteContainer": "削除",
"disableauth.message1": "本当に<strong>認証を無効化</strong>しますか?",
"disableauth.message2": "これはCloudflare AccessやAutheliaなどの認証手段をDockgeの前段に置いて<strong>サードパーティー認証を実装することをあなたが意図している</strong>場合のために設計されています。",
"Current User": "現在のユーザー",
"Repeat New Password": "新しいパスワードを繰り返してください",
"I understand, please disable": "理解しました。無効化してください",
"Lowercase only": "小文字のみ",
"reverseProxyMsg1": "リバースプロキシを使用していますか?",
"connecting...": "ソケットサーバーに接続中…"
}

View File

@ -90,13 +90,5 @@
"Allowed commands:": "허용된 명령어:", "Allowed commands:": "허용된 명령어:",
"Internal Networks": "내부 네트워크", "Internal Networks": "내부 네트워크",
"External Networks": "외부 네트워크", "External Networks": "외부 네트워크",
"No External Networks": "외부 네트워크 없음", "No External Networks": "외부 네트워크 없음"
"reverseProxyMsg2": "여기서 WebSocket을 위한 설정을 확인해 보세요",
"downStack": "정지 & Down",
"reverseProxyMsg1": "리버스 프록시를 사용하고 계신가요?",
"Cannot connect to the socket server.": "소켓 서버에 연결하지 못했습니다.",
"connecting...": "소켓 서버에 연결하는 중…",
"extra": "기타",
"url": "URL | URL",
"reconnecting...": "재연결 중…"
} }

View File

@ -1,102 +0,0 @@
{
"languageName": "Nederlands",
"authIncorrectCreds": "Onjuiste gebruikersnaam of wachtwoord.",
"PasswordsDoNotMatch": "Paswoorden komen niet overeen.",
"Repeat Password": "Herhaal wachtwoord",
"Create": "Aanmaken",
"signedInDisp": "Ingelogd als {0}",
"home": "Startpagina",
"console": "Console",
"registry": "Register",
"compose": "Samenstellen",
"stackName": "Stack naam",
"deployStack": "Opzetten",
"deleteStack": "Verwijder",
"stopStack": "Stop",
"restartStack": "Herstart",
"updateStack": "Update",
"startStack": "Start",
"downStack": "Stop & Down",
"editStack": "Bewerken",
"discardStack": "Verwijderen",
"saveStackDraft": "Opslaan",
"notAvailableShort": "NVT",
"stackNotManagedByDockgeMsg": "Deze stack wordt niet beheerd door Dockge.",
"primaryHostname": "Primaire hostnaam",
"general": "Algemeen",
"scanFolder": "Scan stacks folder",
"dockerImage": "Image",
"restartPolicyUnlessStopped": "Tenzij gestopt",
"restartPolicyAlways": "Altijd",
"restartPolicyOnFailure": "Bij fout",
"restartPolicyNo": "Neen",
"environmentVariable": "Omgevings variabele(n)",
"restartPolicy": "Herstart policy",
"containerName": "Containernaam",
"port": "Poort(en)",
"volume": "Volume(s)",
"network": "Netwerk(en)",
"addListItem": "Voeg {0} toe",
"deleteContainer": "Verwijder",
"addContainer": "Container toevoegen",
"addNetwork": "Netwerk toevoegen",
"signedInDispDisabled": "Aanmelden uitgeschakeld.",
"container": "Container(s)",
"autoGet": "Auto ophalen",
"add": "Toevoegen",
"Edit": "Bewerken",
"applyToYAML": "Toevoegen aan YAML",
"createExternalNetwork": "Aanmaken",
"addInternalNetwork": "Toevoegen",
"Save": "Opslaan",
"Language": "Taal",
"Change Password": "Verander wachtwoord",
"Current Password": "Huidig wachtwoord",
"New Password": "Nieuw wachtwoord",
"Repeat New Password": "Herhaal nieuw wachtwoord",
"Update Password": "Update wachtwoord",
"Advanced": "Geavanceerd",
"I understand, please disable": "Begrepen, dit uitschakelen",
"Disable Auth": "Aanmelden uitschakelen",
"Enable Auth": "Aanmelden inschakelen",
"Leave": "Afmelden",
"Frontend Version": "Frontend versie",
"Check Update On GitHub": "Controleer via GitHub op updates",
"Show update if available": "Toon update indien beschikbaar",
"Remember me": "Onthoud mij",
"Login": "Inloggen",
"Username": "Gebruikersnaam",
"Password": "Wachtwoord",
"Settings": "Instellingen",
"Logout": "Uitloggen",
"Lowercase only": "Geen hoofdletters",
"Docker Run": "Docker run",
"active": "actief",
"exited": "gestopt",
"inactive": "inactief",
"Appearance": "Uiterlijk",
"Security": "Beveiliging",
"About": "Over",
"Allowed commands:": "Toegelaten commando's:",
"Internal Networks": "Interne netwerken",
"No External Networks": "Geen externe netwerken",
"reverseProxyMsg1": "Reverse proxy in gebruik?",
"reverseProxyMsg2": "Controleer hoe te configureren voor WebSocket",
"Cannot connect to the socket server.": "Kan geen verbinding maken met de socket server.",
"reconnecting...": "Herverbinden...",
"connecting...": "Verbinden met de socket server...",
"url": "Url(s)",
"extra": "Extra",
"Create your admin account": "Creëer je beheerders-account",
"addFirstStackMsg": "Maak je eerste stack!",
"deleteStackMsg": "Zeker dat je deze stack wilt verwijderen?",
"dependsOn": "Container afhankelijkheid | afhankelijkheden",
"disableauth.message1": "Zeker dat u <strong>aanmelden</strong> wilt uitschakelen?",
"disableauth.message2": "Dit is enkel bedoeld om te gebruiken wanneer je<strong> third-party autorisatie wilt gebruiken voor Dockge</strong>, zoals Cloudflare Acces, Authelia, ...",
"passwordNotMatchMsg": "De wachtwoorden komen niet overeen.",
"Current User": "Huidige gebruiker",
"Please use this option carefully!": "Wees voorzichtig met deze optie!",
"Also check beta release": "Controleer ook op beta releases",
"Convert to Compose": "Converteer naar compose",
"External Networks": "Externe netwerken"
}

View File

@ -1,102 +0,0 @@
{
"Create your admin account": "Creați-vă contul de administrator",
"PasswordsDoNotMatch": "Parolele nu se potrivesc.",
"Repeat Password": "Repetați parola",
"signedInDisp": "Conectat ca {0}",
"signedInDispDisabled": "Autentificare dezactivată.",
"Create": "Creează",
"home": "Acasă",
"console": "Consolă",
"registry": "Registru",
"compose": "Compune",
"addFirstStackMsg": "Compune prima ta stivă!",
"stackName": "Nume stivă",
"deployStack": "Lansează",
"deleteStack": "Șterge",
"stopStack": "Oprește",
"restartStack": "Repornire",
"updateStack": "Actualizare",
"languageName": "Română",
"authIncorrectCreds": "Numele de utilizator sau parola incorectă.",
"startStack": "Pornește",
"editStack": "Editați",
"discardStack": "Renunţa",
"notAvailableShort": "N/A",
"deleteStackMsg": "Sigur doriți să ștergeți această stivă?",
"stackNotManagedByDockgeMsg": "Această stivă nu este gestionată de Dockge.",
"primaryHostname": "Numele gazdei principale",
"general": "General",
"container": "Container | Containere",
"scanFolder": "Scanează folderul cu stive",
"dockerImage": "Imagine",
"restartPolicyOnFailure": "La Defecţiune",
"restartPolicyNo": "Nu",
"restartPolicy": "Politica de repornire",
"restartPolicyAlways": "Mereu",
"containerName": "Numele Containerului",
"port": "Port | Porturi",
"volume": "Volum | Volume",
"network": "Reţea | Reţele",
"dependsOn": "Dependența containerului | Dependențele containerelor",
"addListItem": "Adaugă {0}",
"deleteContainer": "Șterge",
"addContainer": "Adaugă Container",
"addNetwork": "Adaugă Rețea",
"addInternalNetwork": "Adaugă",
"Save": "Salvează",
"Current User": "Utilizator Curent",
"Change Password": "Schimbă Parola",
"Current Password": "Parolă Curenta",
"New Password": "Parolă Nouă",
"Repeat New Password": "Repetă Parola Nouă",
"Update Password": "Actualizează Parola",
"Advanced": "Avansat",
"Enable Auth": "Activați Autentificarea",
"Disable Auth": "Dezactivați Autentificarea",
"I understand, please disable": "Am înțeles, vă rog dezactivați",
"Leave": "Părăsiți",
"Frontend Version": "Versiunea Frontend",
"Check Update On GitHub": "Verificați actualizarea pe GitHub",
"Also check beta release": "Verificați și versiunea beta",
"Remember me": "Ține-mă minte",
"Login": "Autentificare",
"Username": "Nume de utilizator",
"Password": "Parolă",
"passwordNotMatchMsg": "Parola repetată nu se potrivește.",
"autoGet": "Obținere automată",
"add": "Adăuga",
"Edit": "Editați",
"applyToYAML": "Aplicați la YAML",
"createExternalNetwork": "Creează",
"Settings": "Setări",
"Logout": "Deconectare",
"Lowercase only": "Doar litere mici",
"Convert to Compose": "Convertiți în Compose",
"Docker Run": "Docker Run",
"active": "activ",
"exited": "ieșit",
"inactive": "inactiv",
"Appearance": "Aspect",
"Security": "Securitate",
"About": "Despre",
"Allowed commands:": "Comenzi permise:",
"Internal Networks": "Rețele interne",
"External Networks": "Rețele externe",
"No External Networks": "Fără rețele externe",
"reverseProxyMsg1": "Folosești un proxy invers?",
"reverseProxyMsg2": "Verificați cum să-l configurați pentru WebSocket",
"Cannot connect to the socket server.": "Nu se poate conecta la serverul socket.",
"reconnecting...": "Reconectare...",
"connecting...": "Se conectează la serverul socket...",
"url": "URL | URLs",
"extra": "Suplimentar",
"downStack": "Opriți & Coborâți",
"saveStackDraft": "Salvați",
"restartPolicyUnlessStopped": "Dacă nu este oprit",
"environmentVariable": "Variabila de mediu | Variabile de mediu",
"Language": "Limbă",
"Please use this option carefully!": "Vă rugăm să utilizați această opțiune cu atenție!",
"Show update if available": "Afișează actualizarea dacă este disponibilă",
"disableauth.message1": "Sigur doriți să <strong>dezactivați autentificarea</strong>?",
"disableauth.message2": "Este conceput pentru scenarii <strong>în care intenționați să implementați autentificarea terță</strong> în fața Dockge-lui, cum ar fi Cloudflare Access, Authelia sau alte mecanisme de autentificare."
}

View File

@ -5,14 +5,14 @@
"PasswordsDoNotMatch": "Пароль не совпадает.", "PasswordsDoNotMatch": "Пароль не совпадает.",
"Repeat Password": "Повторите пароль", "Repeat Password": "Повторите пароль",
"Create": "Создать", "Create": "Создать",
"signedInDisp": "Авторизован как", "signedInDisp": "Авторизлван как {0}",
"signedInDispDisabled": "Авторизация выключена.", "signedInDispDisabled": "Авторизация выключена.",
"home": "Главная", "home": "Главная",
"console": "Консоль", "console": "Консоль",
"registry": "Registry", "registry": "Registry",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "Создайте свой первый стек!", "addFirstStackMsg": "Создайте свой первый стек!",
"stackName": "Имя стека", "stackName" : "Имя стека",
"deployStack": "Развернуть", "deployStack": "Развернуть",
"deleteStack": "Удалить", "deleteStack": "Удалить",
"stopStack": "Остановить", "stopStack": "Остановить",
@ -22,7 +22,7 @@
"editStack": "Изменить", "editStack": "Изменить",
"discardStack": "Отменить", "discardStack": "Отменить",
"saveStackDraft": "Сохранить", "saveStackDraft": "Сохранить",
"notAvailableShort": "Н/Д", "notAvailableShort" : "Н/Д",
"deleteStackMsg": "Вы уверены что хотите удалить этот стек?", "deleteStackMsg": "Вы уверены что хотите удалить этот стек?",
"stackNotManagedByDockgeMsg": "Данный стек не обслуживается Dockge.", "stackNotManagedByDockgeMsg": "Данный стек не обслуживается Dockge.",
"primaryHostname": "Имя хоста", "primaryHostname": "Имя хоста",
@ -79,7 +79,7 @@
"Settings": "Настройки", "Settings": "Настройки",
"Logout": "Выйти", "Logout": "Выйти",
"Lowercase only": "Только нижний регистр", "Lowercase only": "Только нижний регистр",
"Convert to Compose": "Преобразовать в Compose", "Convert to Compose": "Преобразовать вCompose",
"Docker Run": "Запустить Docker", "Docker Run": "Запустить Docker",
"active": "активный", "active": "активный",
"exited": "завершенный", "exited": "завершенный",

View File

@ -12,7 +12,7 @@
"registry": "Kayıt Defteri", "registry": "Kayıt Defteri",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "İlk yığınınızı oluşturun!", "addFirstStackMsg": "İlk yığınınızı oluşturun!",
"stackName": "Yığın Adı", "stackName" : "Yığın Adı",
"deployStack": "Dağıtmak", "deployStack": "Dağıtmak",
"deleteStack": "Sil", "deleteStack": "Sil",
"stopStack": "Dudur", "stopStack": "Dudur",
@ -22,7 +22,7 @@
"editStack": "Düzenle", "editStack": "Düzenle",
"discardStack": ıkar", "discardStack": ıkar",
"saveStackDraft": "Kaydet", "saveStackDraft": "Kaydet",
"notAvailableShort": "N/A", "notAvailableShort" : "N/A",
"deleteStackMsg": "Bu yığını silmek istediğinizden emin misiniz?", "deleteStackMsg": "Bu yığını silmek istediğinizden emin misiniz?",
"stackNotManagedByDockgeMsg": "Bu yığın Dockge tarafından yönetilmemektedir.", "stackNotManagedByDockgeMsg": "Bu yığın Dockge tarafından yönetilmemektedir.",
"primaryHostname": "Birincil Ana Bilgisayar Adı", "primaryHostname": "Birincil Ana Bilgisayar Adı",
@ -90,13 +90,5 @@
"Allowed commands:": "İzin verilen komutlar:", "Allowed commands:": "İzin verilen komutlar:",
"Internal Networks": "İç Ağlar", "Internal Networks": "İç Ağlar",
"External Networks": "Dış Ağlar", "External Networks": "Dış Ağlar",
"No External Networks": "Dış Ağ Yok", "No External Networks": "Dış Ağ Yok"
"extra": "Ekstra",
"reverseProxyMsg1": "Ters Proxy mi kullanıyorsunuz?",
"reverseProxyMsg2": "WebSocket için nasıl yapılandırma yapılacağını kontrol edin",
"reconnecting...": "Yeniden bağlanıyor…",
"connecting...": "Soket sunucusuna bağlanıyor…",
"url": "URL | URLler",
"Cannot connect to the socket server.": "Soket sunucusuna bağlanılamıyor.",
"downStack": "Durdur & Kapat"
} }

View File

@ -1,8 +1,8 @@
{ {
"languageName": "Українська", "languageName": "Українська",
"Create your admin account": "Створити акаунт адміністратора", "Create your admin account": "Створити акаунт адміністратора",
"authIncorrectCreds": "Неправильне ім'я користувача або пароль.", "authIncorrectCreds": "Невірний логін чи пароль",
"PasswordsDoNotMatch": "Паролі не збігаються.", "PasswordsDoNotMatch": "Паролі не співпадають.",
"Repeat Password": "Повторіть пароль", "Repeat Password": "Повторіть пароль",
"Create": "Створити", "Create": "Створити",
"signedInDisp": "Авторизовано як {0}", "signedInDisp": "Авторизовано як {0}",
@ -12,8 +12,8 @@
"registry": "Registry", "registry": "Registry",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "Додайте свій перший стек!", "addFirstStackMsg": "Додайте свій перший стек!",
"stackName": "Назва стеку", "stackName" : "Назва стеку",
"deployStack": "Розгорнути", "deployStack": "Розрознути",
"deleteStack": "Видалити", "deleteStack": "Видалити",
"stopStack": "Зупинити", "stopStack": "Зупинити",
"restartStack": "Перезапустити", "restartStack": "Перезапустити",
@ -22,7 +22,7 @@
"editStack": "Редагувати", "editStack": "Редагувати",
"discardStack": "Відмінити", "discardStack": "Відмінити",
"saveStackDraft": "Зберегти", "saveStackDraft": "Зберегти",
"notAvailableShort": "Н/Д", "notAvailableShort" : "Н/Д",
"deleteStackMsg": "Ви впевнені що хочете видалити цей стек?", "deleteStackMsg": "Ви впевнені що хочете видалити цей стек?",
"stackNotManagedByDockgeMsg": "Даний стек не управляється Dockge.", "stackNotManagedByDockgeMsg": "Даний стек не управляється Dockge.",
"primaryHostname": "Назва хосту", "primaryHostname": "Назва хосту",
@ -47,7 +47,7 @@
"addNetwork": "Додати Мережу", "addNetwork": "Додати Мережу",
"disableauth.message1": "Ви впевнені що хочете <strong>вимкнути авторизацію</strong>?", "disableauth.message1": "Ви впевнені що хочете <strong>вимкнути авторизацію</strong>?",
"disableauth.message2": "Це призначено для сценаріїв, <strong>де ви збираєтесь використати сторонню авторизацію</strong> перед Dockge, наприклад Cloudflare Access, Authelia чи інші.", "disableauth.message2": "Це призначено для сценаріїв, <strong>де ви збираєтесь використати сторонню авторизацію</strong> перед Dockge, наприклад Cloudflare Access, Authelia чи інші.",
"passwordNotMatchMsg": овторення паролю не збігається.", "passwordNotMatchMsg": "Паролі не співпадають.",
"autoGet": "Отримати", "autoGet": "Отримати",
"add": "Додати", "add": "Додати",
"Edit": "Змінити", "Edit": "Змінити",
@ -63,10 +63,10 @@
"Repeat New Password": "Повторіть новий пароль", "Repeat New Password": "Повторіть новий пароль",
"Update Password": "Оновити пароль", "Update Password": "Оновити пароль",
"Advanced": "Розширені опції", "Advanced": "Розширені опції",
"Please use this option carefully!": "Будь ласка, використовуйте цю опцію з обережністю!", "Please use this option carefully!": "Будь-ласка, використовуйте цю опцію з обережністю!",
"Enable Auth": "Увімкнути автентифікацію", "Enable Auth": "Увімкнути автентифікацію",
"Disable Auth": "Вимкнути автентифікацію", "Disable Auth": "Вимкнути автентифікацію",
"I understand, please disable": "Зрозуміло, все одно вимкнути", "I understand, please disable": "Зрозуміло, все-одно вимкнути",
"Leave": "Покинути", "Leave": "Покинути",
"Frontend Version": "Версія інтерфейсу", "Frontend Version": "Версія інтерфейсу",
"Check Update On GitHub": "Перевірити оновлення на GitHub", "Check Update On GitHub": "Перевірити оновлення на GitHub",
@ -90,13 +90,5 @@
"Allowed commands:": "Дозволені команди:", "Allowed commands:": "Дозволені команди:",
"Internal Networks": "Внутрішні мережі", "Internal Networks": "Внутрішні мережі",
"External Networks": "Зовнішні мережі", "External Networks": "Зовнішні мережі",
"No External Networks": "Немає зовнішніх мереж", "No External Networks": "Немає зовнішніх мереж"
"downStack": "Зупинити і вимкнути",
"reverseProxyMsg1": "Використовувати зворотній проксі?",
"Cannot connect to the socket server.": "Не вдається підключитися до сервера сокетів.",
"reconnecting...": "Повторне підключення…",
"connecting...": "Підключення до сервера сокетів…",
"url": "URL-адреса | URL-адреси",
"reverseProxyMsg2": "Перевірте, як налаштувати його для WebSocket",
"extra": "Додатково"
} }

View File

@ -12,23 +12,23 @@
"registry": "رجسٹری", "registry": "رجسٹری",
"compose": "تحریر", "compose": "تحریر",
"addFirstStackMsg": "اپنا پہلا اسٹیک کمپوز کریں!", "addFirstStackMsg": "اپنا پہلا اسٹیک کمپوز کریں!",
"stackName": "اسٹیک کا نام", "stackName" : "اسٹیک کا نام",
"deployStack": "تعینات", "deployStack": "تعینات",
"deleteStack": "حذف کریں", "deleteStack": "حذف کریں",
"stopStack": "روکو", "stopStack": "روکو",
"restartStack": "دوبارہ شروع کریں", "restartStack": "دوبارہ شروع کریں",
"updateStack": "اپ ڈیٹ", "updateStack": "اپ ڈیٹ",
"startStack": "شروع کریں", "startStack": "شروع کریں۔",
"editStack": "ترمیم", "editStack": "ترمیم",
"discardStack": "رد کر دیں", "discardStack": "رد کر دیں۔",
"saveStackDraft": "محفوظ کریں۔", "saveStackDraft": "محفوظ کریں۔",
"notAvailableShort": "N / A", "notAvailableShort" : "N / A",
"deleteStackMsg": "کیا آپ واقعی اس اسٹیک کو حذف کرنا چاہتے ہیں؟", "deleteStackMsg": "کیا آپ واقعی اس اسٹیک کو حذف کرنا چاہتے ہیں؟",
"stackNotManagedByDockgeMsg": "یہ اسٹیک Dockge کے زیر انتظام نہیں ہے۔", "stackNotManagedByDockgeMsg": "یہ اسٹیک Dockge کے زیر انتظام نہیں ہے۔",
"primaryHostname": "بنیادی میزبان نام", "primaryHostname": "بنیادی میزبان نام",
"general": "جنرل", "general": "جنرل",
"container": "کنٹینر | کنٹینرز", "container": "کنٹینر | کنٹینرز",
"scanFolder": "اسٹیک فولڈر کو اسکین کریں", "scanFolder": "اسٹیک فولڈر کو اسکین کریں۔",
"dockerImage": "تصویر", "dockerImage": "تصویر",
"restartPolicyUnlessStopped": "جب تک روکا نہیں جاتا", "restartPolicyUnlessStopped": "جب تک روکا نہیں جاتا",
"restartPolicyAlways": "ہمیشہ", "restartPolicyAlways": "ہمیشہ",
@ -51,7 +51,7 @@
"autoGet": "آٹو حاصل کریں", "autoGet": "آٹو حاصل کریں",
"add": "شامل کریں", "add": "شامل کریں",
"Edit": "ترمیم", "Edit": "ترمیم",
"applyToYAML": "YAML پر درخواست دیں", "applyToYAML": "YAML پر درخواست دیں۔",
"createExternalNetwork": "بنانا", "createExternalNetwork": "بنانا",
"addInternalNetwork": "شامل کریں", "addInternalNetwork": "شامل کریں",
"Save": "محفوظ کریں", "Save": "محفوظ کریں",
@ -64,12 +64,12 @@
"Update Password": "پاس ورڈ اپ ڈیٹ کریں", "Update Password": "پاس ورڈ اپ ڈیٹ کریں",
"Advanced": "ترقی یافتہ", "Advanced": "ترقی یافتہ",
"Please use this option carefully!": "براہ کرم اس اختیار کو احتیاط سے استعمال کریں!", "Please use this option carefully!": "براہ کرم اس اختیار کو احتیاط سے استعمال کریں!",
"Enable Auth": "تصدیق کو فعال کریں", "Enable Auth": "تصدیق کو فعال کریں۔",
"Disable Auth": "توثیق کو غیر فعال کریں", "Disable Auth": "توثیق کو غیر فعال کریں۔",
"I understand, please disable": "میں سمجھتا ہوں، براہ کرم غیر فعال کریں", "I understand, please disable": "میں سمجھتا ہوں، براہ کرم غیر فعال کریں۔",
"Leave": "چھوڑ دو", "Leave": "چھوڑ دو",
"Frontend Version": "فرنٹ اینڈ ورژن", "Frontend Version": "فرنٹ اینڈ ورژن",
"Check Update On GitHub": "گیتوب پر اپ ڈیٹ چیک کریں", "Check Update On GitHub": "گیتوب پر اپ ڈیٹ چیک کریں۔",
"Show update if available": "اگر دستیاب ہو تو اپ ڈیٹ دکھائیں", "Show update if available": "اگر دستیاب ہو تو اپ ڈیٹ دکھائیں",
"Also check beta release": "بیٹا ریلیز بھی چیک کریں", "Also check beta release": "بیٹا ریلیز بھی چیک کریں",
"Remember me": "مجھے پہچانتے ہو", "Remember me": "مجھے پہچانتے ہو",
@ -90,13 +90,5 @@
"Allowed commands:": "اجازت شدہ احکامات:", "Allowed commands:": "اجازت شدہ احکامات:",
"Internal Networks": "اندرونی نیٹ ورکس", "Internal Networks": "اندرونی نیٹ ورکس",
"External Networks": "بیرونی نیٹ ورکس", "External Networks": "بیرونی نیٹ ورکس",
"No External Networks": "کوئی بیرونی نیٹ ورک نہیں", "No External Networks": "کوئی بیرونی نیٹ ورک نہیں"
"reverseProxyMsg1": "ایک ریورس پراکسی کا استعمال کرتے ہوئے؟",
"Cannot connect to the socket server.": "ساکٹ سرور سے منسلک نہیں ہو سکتا۔",
"reconnecting...": "دوبارہ منسلک ہو رہا ہے…",
"connecting...": "ساکٹ سرور سے منسلک ہو رہا ہے…",
"url": "یو آر ایل | یو آر ایل",
"extra": "اضافی",
"downStack": "اسٹاپ اینڈ ڈاؤن",
"reverseProxyMsg2": "اسے WebSocket کے لیے ترتیب دینے کا طریقہ چیک کریں"
} }

View File

@ -1,18 +1,18 @@
{ {
"languageName": "简体中文", "languageName": "简体中文",
"Create your admin account": "创建你的管理员账号", "Create your admin account": "创建你的管理员账号",
"authIncorrectCreds": "用户名或密码错误", "authIncorrectCreds": "用户名或密码错误",
"PasswordsDoNotMatch": "两次输入的密码不一致。", "PasswordsDoNotMatch": "两次输入的密码不一致。",
"Repeat Password": "重复以确认密码", "Repeat Password": "重复以确认密码",
"Create": "创建", "Create": "创建",
"signedInDisp": "当前用户: {0}", "signedInDisp": "当前用户: {0}",
"signedInDispDisabled": "已禁用身份验证", "signedInDispDisabled": "已禁用身份验证",
"home": "主页", "home": "主页",
"console": "终端", "console": "终端",
"registry": "镜像仓库", "registry": "镜像仓库",
"compose": "Compose", "compose": "Compose",
"addFirstStackMsg": "组合你的第一个堆栈!", "addFirstStackMsg": "组合你的第一个堆栈!",
"stackName": "堆栈名称", "stackName" : "堆栈名称",
"deployStack": "部署", "deployStack": "部署",
"deleteStack": "删除", "deleteStack": "删除",
"stopStack": "停止", "stopStack": "停止",
@ -22,9 +22,9 @@
"editStack": "编辑", "editStack": "编辑",
"discardStack": "放弃", "discardStack": "放弃",
"saveStackDraft": "保存", "saveStackDraft": "保存",
"notAvailableShort": "不可用", "notAvailableShort" : "不可用",
"deleteStackMsg": "你确定要删除这个堆栈吗?", "deleteStackMsg": "你确定要删除这个堆栈吗?",
"stackNotManagedByDockgeMsg": "这个堆栈不由Dockge管理", "stackNotManagedByDockgeMsg": "这个堆栈不由Dockge管理",
"primaryHostname": "主机名", "primaryHostname": "主机名",
"general": "常规", "general": "常规",
"container": "容器 | 容器组", "container": "容器 | 容器组",
@ -90,13 +90,5 @@
"Allowed commands:": "允许使用的指令:", "Allowed commands:": "允许使用的指令:",
"Internal Networks": "内部网络", "Internal Networks": "内部网络",
"External Networks": "外部网络", "External Networks": "外部网络",
"No External Networks": "无外部网络", "No External Networks": "无外部网络"
"reconnecting...": "重连中…",
"reverseProxyMsg2": "检查如何配置WebSocket",
"reverseProxyMsg1": "正在使用反向代理?",
"connecting...": "正在连接到socket服务器…",
"Cannot connect to the socket server.": "无法连接到socket服务器。",
"url": "网址 | 网址",
"extra": "额外",
"downStack": "停止并删除"
} }

View File

@ -1,12 +1,12 @@
{ {
"languageName": "繁體中文(台灣)", "languageName": "繁體中文(台灣)",
"Create your admin account": "建立您的管理員帳號", "Create your admin account": "建立您的管理員帳號",
"authIncorrectCreds": "使用者名稱或密碼錯誤", "authIncorrectCreds": "使用者名稱或密碼錯誤",
"PasswordsDoNotMatch": "兩次輸入的密碼不一致。", "PasswordsDoNotMatch": "兩次輸入的密碼不一致。",
"Repeat Password": "重複以確認密碼", "Repeat Password": "重複以確認密碼",
"Create": "建立", "Create": "建立",
"signedInDisp": "目前使用者:{0}", "signedInDisp": "目前使用者:{0}",
"signedInDispDisabled": "已停用身份驗證", "signedInDispDisabled": "已停用身份驗證",
"home": "首頁", "home": "首頁",
"console": "主控台", "console": "主控台",
"registry": "映像倉庫", "registry": "映像倉庫",
@ -24,7 +24,7 @@
"saveStackDraft": "儲存", "saveStackDraft": "儲存",
"notAvailableShort": "不可用", "notAvailableShort": "不可用",
"deleteStackMsg": "您確定要刪除這個堆疊嗎?", "deleteStackMsg": "您確定要刪除這個堆疊嗎?",
"stackNotManagedByDockgeMsg": "這個堆疊不由 Dockge 管理", "stackNotManagedByDockgeMsg": "這個堆疊不由 Dockge 管理",
"primaryHostname": "主機名稱", "primaryHostname": "主機名稱",
"general": "一般", "general": "一般",
"container": "容器 | 容器群組", "container": "容器 | 容器群組",
@ -90,13 +90,5 @@
"Allowed commands:": "允許使用的指令:", "Allowed commands:": "允許使用的指令:",
"Internal Networks": "內部網路", "Internal Networks": "內部網路",
"External Networks": "外部網路", "External Networks": "外部網路",
"No External Networks": "無外部網路", "No External Networks": "無外部網路"
"downStack": "停止",
"reverseProxyMsg1": "在使用反向代理吗?",
"reverseProxyMsg2": "點擊這裡了解如何為 WebSocket 配置反向代理",
"Cannot connect to the socket server.": "無法連接到 Socket 伺服器。",
"reconnecting...": "重新連線中…",
"connecting...": "連線至 Socket 伺服器中…",
"url": "網址 | 網址",
"extra": "額外"
} }

View File

@ -16,8 +16,8 @@
<span class="fs-4 title">Dockge</span> <span class="fs-4 title">Dockge</span>
</router-link> </router-link>
<a v-if="hasNewVersion" target="_blank" href="https://github.com/louislam/dockge/releases" class="btn btn-warning me-3"> <a v-if="hasNewVersion" target="_blank" href="https://github.com/louislam/dockge/releases" class="btn btn-info me-3">
<font-awesome-icon icon="arrow-alt-circle-up" /> {{ $t("newUpdate") }} <font-awesome-icon icon="arrow-alt-circle-up" /> {{ $t("New Update") }}
</a> </a>
<ul class="nav nav-pills"> <ul class="nav nav-pills">

View File

@ -154,7 +154,7 @@
ref="editor" ref="editor"
v-model="stack.composeYAML" v-model="stack.composeYAML"
class="yaml-editor" class="yaml-editor"
:highlight="highlighterYAML" :highlight="highlighter"
line-numbers :readonly="!isEditMode" line-numbers :readonly="!isEditMode"
@input="yamlCodeChange" @input="yamlCodeChange"
@focus="editorFocus = true" @focus="editorFocus = true"
@ -165,22 +165,6 @@
{{ yamlError }} {{ yamlError }}
</div> </div>
<!-- ENV editor -->
<div v-if="isEditMode">
<h4 class="mb-3">.env</h4>
<div class="shadow-box mb-3 editor-box" :class="{'edit-mode' : isEditMode}">
<prism-editor
ref="editor"
v-model="stack.composeENV"
class="env-editor"
:highlight="highlighterENV"
line-numbers :readonly="!isEditMode"
@focus="editorFocus = true"
@blur="editorFocus = false"
></prism-editor>
</div>
</div>
<div v-if="isEditMode"> <div v-if="isEditMode">
<!-- Volumes --> <!-- Volumes -->
<div v-if="false"> <div v-if="false">
@ -231,7 +215,7 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import { import {
COMBINED_TERMINAL_COLS, COMBINED_TERMINAL_COLS,
COMBINED_TERMINAL_ROWS, COMBINED_TERMINAL_ROWS,
copyYAMLComments, envsubstYAML, copyYAMLComments,
getCombinedTerminalName, getCombinedTerminalName,
getComposeTerminalName, getComposeTerminalName,
PROGRESS_TERMINAL_ROWS, PROGRESS_TERMINAL_ROWS,
@ -239,7 +223,6 @@ import {
} from "../../../backend/util-common"; } from "../../../backend/util-common";
import { BModal } from "bootstrap-vue-next"; import { BModal } from "bootstrap-vue-next";
import NetworkInput from "../components/NetworkInput.vue"; import NetworkInput from "../components/NetworkInput.vue";
import dotenv from "dotenv";
const template = `version: "3.8" const template = `version: "3.8"
services: services:
@ -249,16 +232,10 @@ services:
ports: ports:
- "8080:80" - "8080:80"
`; `;
const envDefault = "# VARIABLE=value #comment";
let yamlErrorTimeout = null; let yamlErrorTimeout = null;
let serviceStatusTimeout = null; let serviceStatusTimeout = null;
let prismjsSymbolDefinition = {
"symbol": {
pattern: /(?<!\$)\$(\{[^{}]*\}|\w+)/,
}
};
export default { export default {
components: { components: {
@ -278,7 +255,6 @@ export default {
return { return {
editorFocus: false, editorFocus: false,
jsonConfig: {}, jsonConfig: {},
envsubstJSONConfig: {},
yamlError: "", yamlError: "",
processing: true, processing: true,
showProgressTerminal: false, showProgressTerminal: false,
@ -374,17 +350,6 @@ export default {
}, },
deep: true, deep: true,
}, },
"stack.composeENV": {
handler() {
if (this.editorFocus) {
console.debug("env code changed");
this.yamlCodeChange();
}
},
deep: true,
},
jsonConfig: { jsonConfig: {
handler() { handler() {
if (!this.editorFocus) { if (!this.editorFocus) {
@ -416,26 +381,19 @@ export default {
this.isEditMode = true; this.isEditMode = true;
let composeYAML; let composeYAML;
let composeENV;
if (this.$root.composeTemplate) { if (this.$root.composeTemplate) {
composeYAML = this.$root.composeTemplate; composeYAML = this.$root.composeTemplate;
this.$root.composeTemplate = ""; this.$root.composeTemplate = "";
} else { } else {
composeYAML = template; composeYAML = template;
} }
if (this.$root.envTemplate) {
composeENV = this.$root.envTemplate;
this.$root.envTemplate = "";
} else {
composeENV = envDefault;
}
// Default Values // Default Values
this.stack = { this.stack = {
name: "", name: "",
composeYAML, composeYAML,
composeENV,
isManagedByDockge: true, isManagedByDockge: true,
}; };
@ -534,7 +492,7 @@ export default {
this.bindTerminal(this.terminalName); this.bindTerminal(this.terminalName);
this.$root.getSocket().emit("deployStack", this.stack.name, this.stack.composeYAML, this.stack.composeENV, this.isAdd, (res) => { this.$root.getSocket().emit("deployStack", this.stack.name, this.stack.composeYAML, this.isAdd, (res) => {
this.processing = false; this.processing = false;
this.$root.toastRes(res); this.$root.toastRes(res);
@ -548,7 +506,7 @@ export default {
saveStack() { saveStack() {
this.processing = true; this.processing = true;
this.$root.getSocket().emit("saveStack", this.stack.name, this.stack.composeYAML, this.stack.composeENV, this.isAdd, (res) => { this.$root.getSocket().emit("saveStack", this.stack.name, this.stack.composeYAML, this.isAdd, (res) => {
this.processing = false; this.processing = false;
this.$root.toastRes(res); this.$root.toastRes(res);
@ -618,48 +576,13 @@ export default {
this.isEditMode = false; this.isEditMode = false;
}, },
highlighterYAML(code) { highlighter(code) {
if (!languages.yaml_with_symbols) { return highlight(code, languages.yaml);
languages.yaml_with_symbols = languages.insertBefore("yaml", "punctuation", {
"symbol": prismjsSymbolDefinition["symbol"]
});
}
return highlight(code, languages.yaml_with_symbols);
}, },
highlighterENV(code) { yamlCodeChange() {
if (!languages.docker_env) { try {
languages.docker_env = { let doc = parseDocument(this.stack.composeYAML);
"comment": {
pattern: /(^#| #).*$/m,
greedy: true
},
"keyword": {
pattern: /^\w*(?=[:=])/m,
greedy: true
},
"value": {
pattern: /(?<=[:=]).*?((?= #)|$)/m,
greedy: true,
inside: {
"string": [
{
pattern: /^ *'.*?(?<!\\)'/m,
},
{
pattern: /^ *".*?(?<!\\)"|^.*$/m,
inside: prismjsSymbolDefinition
},
],
},
},
};
}
return highlight(code, languages.docker_env);
},
yamlToJSON(yaml) {
let doc = parseDocument(yaml);
if (doc.errors.length > 0) { if (doc.errors.length > 0) {
throw doc.errors[0]; throw doc.errors[0];
} }
@ -676,23 +599,9 @@ export default {
throw new Error("Services must be an object"); throw new Error("Services must be an object");
} }
return {
config,
doc,
};
},
yamlCodeChange() {
try {
let { config, doc } = this.yamlToJSON(this.stack.composeYAML);
this.yamlDoc = doc; this.yamlDoc = doc;
this.jsonConfig = config; this.jsonConfig = config;
let env = dotenv.parse(this.stack.composeENV);
let envYAML = envsubstYAML(this.stack.composeYAML, env);
this.envsubstJSONConfig = this.yamlToJSON(envYAML).config;
clearTimeout(yamlErrorTimeout); clearTimeout(yamlErrorTimeout);
this.yamlError = ""; this.yamlError = "";
} catch (e) { } catch (e) {

View File

@ -1,6 +1,6 @@
{ {
"name": "dockge", "name": "dockge",
"version": "1.3.2", "version": "1.1.1",
"type": "module", "type": "module",
"engines": { "engines": {
"node": ">= 18.0.0 && <= 18.17.1" "node": ">= 18.0.0 && <= 18.17.1"
@ -17,15 +17,12 @@
"build:docker-base": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:base -f ./docker/Base.Dockerfile . --push", "build:docker-base": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:base -f ./docker/Base.Dockerfile . --push",
"build:docker": "node ./extra/env2arg.js docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:latest -t louislam/dockge:1 -t louislam/dockge:$VERSION --target release -f ./docker/Dockerfile . --push", "build:docker": "node ./extra/env2arg.js docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:latest -t louislam/dockge:1 -t louislam/dockge:$VERSION --target release -f ./docker/Dockerfile . --push",
"build:docker-nightly": "pnpm run build:frontend && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:nightly --target nightly -f ./docker/Dockerfile . --push", "build:docker-nightly": "pnpm run build:frontend && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:nightly --target nightly -f ./docker/Dockerfile . --push",
"build:healthcheck": "docker buildx build -f docker/BuildHealthCheck.Dockerfile --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/dockge:build-healthcheck . --push",
"start-docker": "docker run --rm -p 5001:5001 --name dockge louislam/dockge:latest", "start-docker": "docker run --rm -p 5001:5001 --name dockge louislam/dockge:latest",
"mark-as-nightly": "tsx ./extra/mark-as-nightly.ts", "mark-as-nightly": "tsx ./extra/mark-as-nightly.ts",
"reformat-changelog": "tsx ./extra/reformat-changelog.ts", "reformat-changelog": "tsx ./extra/reformat-changelog.ts"
"reset-password": "tsx ./extra/reset-password.ts"
}, },
"dependencies": { "dependencies": {
"@homebridge/node-pty-prebuilt-multiarch": "~0.11.11", "@homebridge/node-pty-prebuilt-multiarch": "~0.11.11",
"@inventage/envsubst": "^0.16.0",
"@louislam/sqlite3": "~15.1.6", "@louislam/sqlite3": "~15.1.6",
"bcryptjs": "~2.4.3", "bcryptjs": "~2.4.3",
"check-password-strength": "~2.0.7", "check-password-strength": "~2.0.7",
@ -34,7 +31,6 @@
"composerize": "~1.4.1", "composerize": "~1.4.1",
"croner": "~7.0.5", "croner": "~7.0.5",
"dayjs": "~1.11.10", "dayjs": "~1.11.10",
"dotenv": "~16.3.1",
"express": "~4.18.2", "express": "~4.18.2",
"express-static-gzip": "~2.1.7", "express-static-gzip": "~2.1.7",
"http-graceful-shutdown": "~3.1.13", "http-graceful-shutdown": "~3.1.13",
@ -43,13 +39,12 @@
"knex": "~2.5.1", "knex": "~2.5.1",
"limiter-es6-compat": "~2.1.2", "limiter-es6-compat": "~2.1.2",
"mysql2": "~3.6.3", "mysql2": "~3.6.3",
"promisify-child-process": "~4.1.2",
"redbean-node": "~0.3.3", "redbean-node": "~0.3.3",
"socket.io": "~4.7.2", "socket.io": "~4.7.2",
"socket.io-client": "~4.7.2", "socket.io-client": "~4.7.2",
"timezones-list": "~3.0.2", "timezones-list": "~3.0.2",
"ts-command-line-args": "~2.5.1", "ts-command-line-args": "~2.5.1",
"tsx": "~4.6.2", "tsx": "~3.14.0",
"type-fest": "~4.3.3", "type-fest": "~4.3.3",
"yaml": "~2.3.4" "yaml": "~2.3.4"
}, },

521
pnpm-lock.yaml generated
View File

@ -8,9 +8,6 @@ dependencies:
'@homebridge/node-pty-prebuilt-multiarch': '@homebridge/node-pty-prebuilt-multiarch':
specifier: ~0.11.11 specifier: ~0.11.11
version: 0.11.11 version: 0.11.11
'@inventage/envsubst':
specifier: ^0.16.0
version: 0.16.0
'@louislam/sqlite3': '@louislam/sqlite3':
specifier: ~15.1.6 specifier: ~15.1.6
version: 15.1.6 version: 15.1.6
@ -35,9 +32,6 @@ dependencies:
dayjs: dayjs:
specifier: ~1.11.10 specifier: ~1.11.10
version: 1.11.10 version: 1.11.10
dotenv:
specifier: ~16.3.1
version: 16.3.1
express: express:
specifier: ~4.18.2 specifier: ~4.18.2
version: 4.18.2 version: 4.18.2
@ -62,9 +56,6 @@ dependencies:
mysql2: mysql2:
specifier: ~3.6.3 specifier: ~3.6.3
version: 3.6.3 version: 3.6.3
promisify-child-process:
specifier: ~4.1.2
version: 4.1.2
redbean-node: redbean-node:
specifier: ~0.3.3 specifier: ~0.3.3
version: 0.3.3(mysql2@3.6.3) version: 0.3.3(mysql2@3.6.3)
@ -81,8 +72,8 @@ dependencies:
specifier: ~2.5.1 specifier: ~2.5.1
version: 2.5.1 version: 2.5.1
tsx: tsx:
specifier: ~4.6.2 specifier: ~3.14.0
version: 4.6.2 version: 3.14.0
type-fest: type-fest:
specifier: ~4.3.3 specifier: ~4.3.3
version: 4.3.3 version: 4.3.3
@ -251,13 +242,6 @@ packages:
to-fast-properties: 2.0.0 to-fast-properties: 2.0.0
dev: true dev: true
/@colors/colors@1.5.0:
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
requiresBuild: true
dev: false
optional: true
/@es-joy/jsdoccomment@0.40.1: /@es-joy/jsdoccomment@0.40.1:
resolution: {integrity: sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==} resolution: {integrity: sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==}
engines: {node: '>=16'} engines: {node: '>=16'}
@ -831,18 +815,6 @@ packages:
engines: {node: '>= 16'} engines: {node: '>= 16'}
dev: true dev: true
/@inventage/envsubst@0.16.0:
resolution: {integrity: sha512-l3hc0nzMpREpcjDqxGjeGNH+N7wD45BQGg2CvLDdTvuEUxhacmRnlqRtRlIyfyW3XQjrlkcDXhWJlgImmLK+CA==}
engines: {node: '>=16.17.0'}
hasBin: true
dependencies:
cli-table3: 0.6.3
escape-string-regexp: 5.0.0
globby: 13.2.2
meow: 12.1.1
string.prototype.matchall: 4.0.10
dev: false
/@isaacs/cliui@8.0.2: /@isaacs/cliui@8.0.2:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -901,10 +873,12 @@ packages:
dependencies: dependencies:
'@nodelib/fs.stat': 2.0.5 '@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0 run-parallel: 1.2.0
dev: true
/@nodelib/fs.stat@2.0.5: /@nodelib/fs.stat@2.0.5:
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
dev: true
/@nodelib/fs.walk@1.2.8: /@nodelib/fs.walk@1.2.8:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
@ -912,6 +886,7 @@ packages:
dependencies: dependencies:
'@nodelib/fs.scandir': 2.1.5 '@nodelib/fs.scandir': 2.1.5
fastq: 1.15.0 fastq: 1.15.0
dev: true
/@npmcli/fs@1.1.1: /@npmcli/fs@1.1.1:
resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==}
@ -1673,13 +1648,6 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: false dev: false
/array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
dependencies:
call-bind: 1.0.5
is-array-buffer: 3.0.2
dev: false
/array-flatten@1.1.1: /array-flatten@1.1.1:
resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=}
dev: false dev: false
@ -1689,24 +1657,6 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/arraybuffer.prototype.slice@1.0.2:
resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==}
engines: {node: '>= 0.4'}
dependencies:
array-buffer-byte-length: 1.0.0
call-bind: 1.0.5
define-properties: 1.2.1
es-abstract: 1.22.3
get-intrinsic: 1.2.2
is-array-buffer: 3.0.2
is-shared-array-buffer: 1.0.2
dev: false
/available-typed-arrays@1.0.5:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
engines: {node: '>= 0.4'}
dev: false
/await-lock@2.2.2: /await-lock@2.2.2:
resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==}
dev: false dev: false
@ -1804,11 +1754,16 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dependencies: dependencies:
fill-range: 7.0.1 fill-range: 7.0.1
dev: true
/buffer-equal-constant-time@1.0.1: /buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=}
dev: false dev: false
/buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
dev: false
/buffer@5.7.1: /buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
dependencies: dependencies:
@ -1922,15 +1877,6 @@ packages:
dev: false dev: false
optional: true optional: true
/cli-table3@0.6.3:
resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==}
engines: {node: 10.* || >= 12.*}
dependencies:
string-width: 4.2.3
optionalDependencies:
'@colors/colors': 1.5.0
dev: false
/cliui@6.0.0: /cliui@6.0.0:
resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
dependencies: dependencies:
@ -2159,15 +2105,6 @@ packages:
has-property-descriptors: 1.0.1 has-property-descriptors: 1.0.1
dev: false dev: false
/define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
dependencies:
define-data-property: 1.1.1
has-property-descriptors: 1.0.1
object-keys: 1.1.1
dev: false
/delegates@1.0.0: /delegates@1.0.0:
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
dev: false dev: false
@ -2205,6 +2142,7 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dependencies: dependencies:
path-type: 4.0.0 path-type: 4.0.0
dev: true
/doctrine@3.0.0: /doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
@ -2213,11 +2151,6 @@ packages:
esutils: 2.0.3 esutils: 2.0.3
dev: true dev: true
/dotenv@16.3.1:
resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==}
engines: {node: '>=12'}
dev: false
/eastasianwidth@0.2.0: /eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: false dev: false
@ -2315,69 +2248,6 @@ packages:
dev: false dev: false
optional: true optional: true
/es-abstract@1.22.3:
resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==}
engines: {node: '>= 0.4'}
dependencies:
array-buffer-byte-length: 1.0.0
arraybuffer.prototype.slice: 1.0.2
available-typed-arrays: 1.0.5
call-bind: 1.0.5
es-set-tostringtag: 2.0.2
es-to-primitive: 1.2.1
function.prototype.name: 1.1.6
get-intrinsic: 1.2.2
get-symbol-description: 1.0.0
globalthis: 1.0.3
gopd: 1.0.1
has-property-descriptors: 1.0.1
has-proto: 1.0.1
has-symbols: 1.0.3
hasown: 2.0.0
internal-slot: 1.0.6
is-array-buffer: 3.0.2
is-callable: 1.2.7
is-negative-zero: 2.0.2
is-regex: 1.1.4
is-shared-array-buffer: 1.0.2
is-string: 1.0.7
is-typed-array: 1.1.12
is-weakref: 1.0.2
object-inspect: 1.13.1
object-keys: 1.1.1
object.assign: 4.1.5
regexp.prototype.flags: 1.5.1
safe-array-concat: 1.0.1
safe-regex-test: 1.0.0
string.prototype.trim: 1.2.8
string.prototype.trimend: 1.0.7
string.prototype.trimstart: 1.0.7
typed-array-buffer: 1.0.0
typed-array-byte-length: 1.0.0
typed-array-byte-offset: 1.0.0
typed-array-length: 1.0.4
unbox-primitive: 1.0.2
which-typed-array: 1.1.13
dev: false
/es-set-tostringtag@2.0.2:
resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
engines: {node: '>= 0.4'}
dependencies:
get-intrinsic: 1.2.2
has-tostringtag: 1.0.0
hasown: 2.0.0
dev: false
/es-to-primitive@1.2.1:
resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
engines: {node: '>= 0.4'}
dependencies:
is-callable: 1.2.7
is-date-object: 1.0.5
is-symbol: 1.0.4
dev: false
/esbuild@0.18.20: /esbuild@0.18.20:
resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -2457,11 +2327,6 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
dev: false
/eslint-plugin-jsdoc@46.8.2(eslint@8.50.0): /eslint-plugin-jsdoc@46.8.2(eslint@8.50.0):
resolution: {integrity: sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==} resolution: {integrity: sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==}
engines: {node: '>=16'} engines: {node: '>=16'}
@ -2671,6 +2536,7 @@ packages:
glob-parent: 5.1.2 glob-parent: 5.1.2
merge2: 1.4.1 merge2: 1.4.1
micromatch: 4.0.5 micromatch: 4.0.5
dev: true
/fast-json-stable-stringify@2.1.0: /fast-json-stable-stringify@2.1.0:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
@ -2684,6 +2550,7 @@ packages:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
dependencies: dependencies:
reusify: 1.0.4 reusify: 1.0.4
dev: true
/file-entry-cache@6.0.1: /file-entry-cache@6.0.1:
resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
@ -2697,6 +2564,7 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dependencies: dependencies:
to-regex-range: 5.0.1 to-regex-range: 5.0.1
dev: true
/finalhandler@1.2.0: /finalhandler@1.2.0:
resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
@ -2749,12 +2617,6 @@ packages:
resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==}
dev: true dev: true
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
is-callable: 1.2.7
dev: false
/foreground-child@3.1.1: /foreground-child@3.1.1:
resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
engines: {node: '>=14'} engines: {node: '>=14'}
@ -2807,20 +2669,6 @@ packages:
/function-bind@1.1.2: /function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
/function.prototype.name@1.1.6:
resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
es-abstract: 1.22.3
functions-have-names: 1.2.3
dev: false
/functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
dev: false
/gauge@3.0.2: /gauge@3.0.2:
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -2877,14 +2725,6 @@ packages:
engines: {node: '>=8.0.0'} engines: {node: '>=8.0.0'}
dev: false dev: false
/get-symbol-description@1.0.0:
resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
get-intrinsic: 1.2.2
dev: false
/get-tsconfig@4.7.2: /get-tsconfig@4.7.2:
resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==}
dependencies: dependencies:
@ -2904,6 +2744,7 @@ packages:
engines: {node: '>= 6'} engines: {node: '>= 6'}
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
dev: true
/glob-parent@6.0.2: /glob-parent@6.0.2:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
@ -2942,13 +2783,6 @@ packages:
type-fest: 0.20.2 type-fest: 0.20.2
dev: true dev: true
/globalthis@1.0.3:
resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
engines: {node: '>= 0.4'}
dependencies:
define-properties: 1.2.1
dev: false
/globby@11.1.0: /globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -2961,17 +2795,6 @@ packages:
slash: 3.0.0 slash: 3.0.0
dev: true dev: true
/globby@13.2.2:
resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
dir-glob: 3.0.1
fast-glob: 3.3.2
ignore: 5.3.0
merge2: 1.4.1
slash: 4.0.0
dev: false
/gopd@1.0.1: /gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies: dependencies:
@ -2985,10 +2808,6 @@ packages:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
dev: true dev: true
/has-bigints@1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
dev: false
/has-flag@3.0.0: /has-flag@3.0.0:
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3014,13 +2833,6 @@ packages:
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dev: false dev: false
/has-tostringtag@1.0.0:
resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
dev: false
/has-unicode@2.0.1: /has-unicode@2.0.1:
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
dev: false dev: false
@ -3110,6 +2922,7 @@ packages:
/ignore@5.3.0: /ignore@5.3.0:
resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
dev: true
/immutable@4.3.4: /immutable@4.3.4:
resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==}
@ -3155,15 +2968,6 @@ packages:
requiresBuild: true requiresBuild: true
dev: false dev: false
/internal-slot@1.0.6:
resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==}
engines: {node: '>= 0.4'}
dependencies:
get-intrinsic: 1.2.2
hasown: 2.0.0
side-channel: 1.0.4
dev: false
/interpret@2.2.0: /interpret@2.2.0:
resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
@ -3186,20 +2990,6 @@ packages:
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
dev: false dev: false
/is-array-buffer@3.0.2:
resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
dependencies:
call-bind: 1.0.5
get-intrinsic: 1.2.2
is-typed-array: 1.1.12
dev: false
/is-bigint@1.0.4:
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
dependencies:
has-bigints: 1.0.2
dev: false
/is-binary-path@2.1.0: /is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -3207,14 +2997,6 @@ packages:
binary-extensions: 2.2.0 binary-extensions: 2.2.0
dev: true dev: true
/is-boolean-object@1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
has-tostringtag: 1.0.0
dev: false
/is-builtin-module@3.2.1: /is-builtin-module@3.2.1:
resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3222,26 +3004,15 @@ packages:
builtin-modules: 3.3.0 builtin-modules: 3.3.0
dev: true dev: true
/is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
dev: false
/is-core-module@2.13.1: /is-core-module@2.13.1:
resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
dependencies: dependencies:
hasown: 2.0.0 hasown: 2.0.0
/is-date-object@1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.0
dev: false
/is-extglob@2.1.1: /is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true
/is-fullwidth-code-point@3.0.0: /is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
@ -3253,6 +3024,7 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dependencies: dependencies:
is-extglob: 2.1.1 is-extglob: 2.1.1
dev: true
/is-lambda@1.0.1: /is-lambda@1.0.1:
resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==}
@ -3260,21 +3032,10 @@ packages:
dev: false dev: false
optional: true optional: true
/is-negative-zero@2.0.2:
resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
engines: {node: '>= 0.4'}
dev: false
/is-number-object@1.0.7:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.0
dev: false
/is-number@7.0.0: /is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'} engines: {node: '>=0.12.0'}
dev: true
/is-path-inside@3.0.3: /is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
@ -3290,51 +3051,6 @@ packages:
resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
dev: false dev: false
/is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
has-tostringtag: 1.0.0
dev: false
/is-shared-array-buffer@1.0.2:
resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
dependencies:
call-bind: 1.0.5
dev: false
/is-string@1.0.7:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.0
dev: false
/is-symbol@1.0.4:
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
dev: false
/is-typed-array@1.1.12:
resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
engines: {node: '>= 0.4'}
dependencies:
which-typed-array: 1.1.13
dev: false
/is-weakref@1.0.2:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
dependencies:
call-bind: 1.0.5
dev: false
/isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: false
/isexe@2.0.0: /isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
requiresBuild: true requiresBuild: true
@ -3675,11 +3391,6 @@ packages:
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
dev: false dev: false
/meow@12.1.1:
resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
engines: {node: '>=16.10'}
dev: false
/merge-descriptors@1.0.1: /merge-descriptors@1.0.1:
resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=}
dev: false dev: false
@ -3687,6 +3398,7 @@ packages:
/merge2@1.4.1: /merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
dev: true
/methods@1.1.2: /methods@1.1.2:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
@ -3699,6 +3411,7 @@ packages:
dependencies: dependencies:
braces: 3.0.2 braces: 3.0.2
picomatch: 2.3.1 picomatch: 2.3.1
dev: true
/mime-db@1.52.0: /mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
@ -3972,21 +3685,6 @@ packages:
resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
dev: false dev: false
/object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
dev: false
/object.assign@4.1.5:
resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
has-symbols: 1.0.3
object-keys: 1.1.1
dev: false
/on-finished@2.4.1: /on-finished@2.4.1:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@ -4098,6 +3796,7 @@ packages:
/path-type@4.0.0: /path-type@4.0.0:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true
/pg-connection-string@2.5.0: /pg-connection-string@2.5.0:
resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==} resolution: {integrity: sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==}
@ -4114,6 +3813,7 @@ packages:
/picomatch@2.3.1: /picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
dev: true
/pngjs@5.0.0: /pngjs@5.0.0:
resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
@ -4187,11 +3887,6 @@ packages:
dev: false dev: false
optional: true optional: true
/promisify-child-process@4.1.2:
resolution: {integrity: sha512-APnkIgmaHNJpkAn7k+CrJSi9WMuff5ctYFbD0CO2XIPkM8yO7d/ShouU2clywbpHV/DUsyc4bpJCsNgddNtx4g==}
engines: {node: '>=8'}
dev: false
/proxy-addr@2.0.7: /proxy-addr@2.0.7:
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
engines: {node: '>= 0.10'} engines: {node: '>= 0.10'}
@ -4232,6 +3927,7 @@ packages:
/queue-microtask@1.2.3: /queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
/range-parser@1.2.1: /range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
@ -4306,15 +4002,6 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: false dev: false
/regexp.prototype.flags@1.5.1:
resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
set-function-name: 2.0.1
dev: false
/require-directory@2.1.1: /require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -4356,6 +4043,7 @@ packages:
/reusify@1.0.4: /reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'} engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: true
/rimraf@3.0.2: /rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
@ -4387,29 +4075,12 @@ packages:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies: dependencies:
queue-microtask: 1.2.3 queue-microtask: 1.2.3
dev: true
/safe-array-concat@1.0.1:
resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
engines: {node: '>=0.4'}
dependencies:
call-bind: 1.0.5
get-intrinsic: 1.2.2
has-symbols: 1.0.3
isarray: 2.0.5
dev: false
/safe-buffer@5.2.1: /safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: false dev: false
/safe-regex-test@1.0.0:
resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
dependencies:
call-bind: 1.0.5
get-intrinsic: 1.2.2
is-regex: 1.1.4
dev: false
/safer-buffer@2.1.2: /safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: false dev: false
@ -4486,15 +4157,6 @@ packages:
has-property-descriptors: 1.0.1 has-property-descriptors: 1.0.1
dev: false dev: false
/set-function-name@2.0.1:
resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
engines: {node: '>= 0.4'}
dependencies:
define-data-property: 1.1.1
functions-have-names: 1.2.3
has-property-descriptors: 1.0.1
dev: false
/setprototypeof@1.2.0: /setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
dev: false dev: false
@ -4543,11 +4205,6 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/slash@4.0.0:
resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
engines: {node: '>=12'}
dev: false
/smart-buffer@4.2.0: /smart-buffer@4.2.0:
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
@ -4633,6 +4290,18 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
dev: false
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
dev: false
/spdx-exceptions@2.3.0: /spdx-exceptions@2.3.0:
resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
dev: true dev: true
@ -4693,45 +4362,6 @@ packages:
strip-ansi: 7.1.0 strip-ansi: 7.1.0
dev: false dev: false
/string.prototype.matchall@4.0.10:
resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
es-abstract: 1.22.3
get-intrinsic: 1.2.2
has-symbols: 1.0.3
internal-slot: 1.0.6
regexp.prototype.flags: 1.5.1
set-function-name: 2.0.1
side-channel: 1.0.4
dev: false
/string.prototype.trim@1.2.8:
resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
es-abstract: 1.22.3
dev: false
/string.prototype.trimend@1.0.7:
resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
es-abstract: 1.22.3
dev: false
/string.prototype.trimstart@1.0.7:
resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
dependencies:
call-bind: 1.0.5
define-properties: 1.2.1
es-abstract: 1.22.3
dev: false
/string_decoder@1.3.0: /string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
requiresBuild: true requiresBuild: true
@ -4849,6 +4479,7 @@ packages:
engines: {node: '>=8.0'} engines: {node: '>=8.0'}
dependencies: dependencies:
is-number: 7.0.0 is-number: 7.0.0
dev: true
/toidentifier@1.0.1: /toidentifier@1.0.1:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
@ -4883,13 +4514,13 @@ packages:
requiresBuild: true requiresBuild: true
dev: true dev: true
/tsx@4.6.2: /tsx@3.14.0:
resolution: {integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==} resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==}
engines: {node: '>=18.0.0'}
hasBin: true hasBin: true
dependencies: dependencies:
esbuild: 0.18.20 esbuild: 0.18.20
get-tsconfig: 4.7.2 get-tsconfig: 4.7.2
source-map-support: 0.5.21
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
dev: false dev: false
@ -4930,44 +4561,6 @@ packages:
mime-types: 2.1.35 mime-types: 2.1.35
dev: false dev: false
/typed-array-buffer@1.0.0:
resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
get-intrinsic: 1.2.2
is-typed-array: 1.1.12
dev: false
/typed-array-byte-length@1.0.0:
resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.5
for-each: 0.3.3
has-proto: 1.0.1
is-typed-array: 1.1.12
dev: false
/typed-array-byte-offset@1.0.0:
resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.5
call-bind: 1.0.5
for-each: 0.3.3
has-proto: 1.0.1
is-typed-array: 1.1.12
dev: false
/typed-array-length@1.0.4:
resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
dependencies:
call-bind: 1.0.5
for-each: 0.3.3
is-typed-array: 1.1.12
dev: false
/typescript@5.2.2: /typescript@5.2.2:
resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
@ -4984,15 +4577,6 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: false dev: false
/unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
dependencies:
call-bind: 1.0.5
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
dev: false
/undici-types@5.26.5: /undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
@ -5257,31 +4841,10 @@ packages:
webidl-conversions: 3.0.1 webidl-conversions: 3.0.1
dev: false dev: false
/which-boxed-primitive@1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:
is-bigint: 1.0.4
is-boolean-object: 1.1.2
is-number-object: 1.0.7
is-string: 1.0.7
is-symbol: 1.0.4
dev: false
/which-module@2.0.1: /which-module@2.0.1:
resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
dev: true dev: true
/which-typed-array@1.1.13:
resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.5
call-bind: 1.0.5
for-each: 0.3.3
gopd: 1.0.1
has-tostringtag: 1.0.0
dev: false
/which@2.0.2: /which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}