forked from extern/dockge
Compare commits
71 Commits
fix-cpu
...
update-dep
Author | SHA1 | Date | |
---|---|---|---|
1ce74d1801 | |||
007eac7b58 | |||
b945ddea55 | |||
bd58de535e | |||
8c6bcef987 | |||
bec5460395 | |||
4e899dcf21 | |||
8296c7b18f | |||
607c908f2d | |||
bd5dd3c3ad | |||
6eca6dc59f | |||
54fb2c1ef4 | |||
562abb485d | |||
86bed768ea | |||
b79db2375f | |||
b586cca711 | |||
793a9de50d | |||
0df3fee3f4 | |||
05b79ba50e | |||
a3c4082800 | |||
027d9e9b59 | |||
80876a463d | |||
beefe41264 | |||
e4f9b9c9fe | |||
a85813ab95 | |||
47debeddc9 | |||
9ce68f67fa | |||
c3b9db8549 | |||
39279cc7df | |||
f4eeb38d18 | |||
49187577ca | |||
7ffb36ec54 | |||
cd596b2d37 | |||
1711e4f47c | |||
2c0fb7f7e0 | |||
ef7f26b142 | |||
80b907577f | |||
e54211de1b | |||
fc42639cb5 | |||
fde2ef4869 | |||
d554adb0c7 | |||
c1e788d22a | |||
972179b4a8 | |||
d5e1ce51ed | |||
9155cf14a5 | |||
17eb6583df | |||
b717fc6655 | |||
da50860211 | |||
340ea0abe9 | |||
d53cb7ca71 | |||
e29eed4602 | |||
8e9f2209c2 | |||
a8d95d06b9 | |||
e2c81bd3e0 | |||
bf2d4c95f9 | |||
b4aa1b83a2 | |||
157a74aafc | |||
b7a2bab808 | |||
71446b9eb9 | |||
06dbc3fa28 | |||
a0fca4df4d | |||
694923cd42 | |||
bfaa8fd795 | |||
d5721dd8ca | |||
5c35b09e93 | |||
9a5d403219 | |||
9ca65ec94d | |||
5b02b63c95 | |||
88d33aace8 | |||
b5f6919bab | |||
0546f6a24e |
1
.github/DISCUSSION_TEMPLATE/ask-for-help.yml
vendored
1
.github/DISCUSSION_TEMPLATE/ask-for-help.yml
vendored
@ -1,4 +1,3 @@
|
|||||||
title: "❓ Ask for help"
|
|
||||||
labels: [help]
|
labels: [help]
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
title: 🚀 Feature Request
|
|
||||||
labels: [feature-request]
|
labels: [feature-request]
|
||||||
body:
|
body:
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
|
8
.github/ISSUE_TEMPLATE/ask-for-help.yaml
vendored
8
.github/ISSUE_TEMPLATE/ask-for-help.yaml
vendored
@ -1,14 +1,14 @@
|
|||||||
name: "❓ Ask for help"
|
name: "⚠️ Ask for help (Please go to the \"Discussions\" tab to submit a Help Request)"
|
||||||
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"
|
label: "Issues are for bug reports only, please go to the \"Discussions\" tab to submit a Feature Request"
|
||||||
options:
|
options:
|
||||||
- label: "I understand"
|
- label: "I understand"
|
||||||
required: true
|
required: true
|
||||||
|
8
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
8
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
@ -1,14 +1,14 @@
|
|||||||
name: 🚀 Feature Request
|
name: 🚀 Feature Request (Please go to the "Discussions" tab to submit a 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=feature-request
|
⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ 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"
|
label: "Issues are for bug reports only, please go to the \"Discussions\" tab to submit a Feature Request"
|
||||||
options:
|
options:
|
||||||
- label: "I understand"
|
- label: "I understand"
|
||||||
required: true
|
required: true
|
||||||
|
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@ -14,8 +14,8 @@ jobs:
|
|||||||
ci:
|
ci:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
os: [ubuntu-latest, windows-latest, macos-latest, ARM64]
|
||||||
node: [20.x] # Can be changed
|
node: [18.17.1] # Can be changed
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
|
16
.github/workflows/prevent-file-change.yml
vendored
Normal file
16
.github/workflows/prevent-file-change.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
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
|
@ -7,13 +7,15 @@ Here are some references:
|
|||||||
### ✅ Usually accepted:
|
### ✅ Usually accepted:
|
||||||
- Bug fix
|
- Bug fix
|
||||||
- Security fix
|
- Security fix
|
||||||
- Translation
|
- Adding new language files (see [these instructions](https://github.com/louislam/dockge/blob/master/frontend/src/lang/README.md))
|
||||||
|
- 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
|
||||||
|
86
README.md
86
README.md
@ -34,12 +34,18 @@ View Video: https://youtu.be/AWAlOQeNpgU?t=48
|
|||||||
## 🔧 How to Install
|
## 🔧 How to Install
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
- [Docker CE](https://docs.docker.com/engine/install/) 20+ is recommended / Podman
|
- [Docker](https://docs.docker.com/engine/install/) 20+ / 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:
|
||||||
- As long as you can run Docker CE / Podman, it should be fine, but:
|
- Major Linux distros that can run Docker/Podman such as:
|
||||||
- Debian/Raspbian Buster or lower is not supported, please upgrade to Bullseye or higher
|
- ✅ Ubuntu
|
||||||
|
- ✅ 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
|
||||||
@ -48,14 +54,14 @@ Requirements:
|
|||||||
- Default Port: 5001
|
- Default Port: 5001
|
||||||
|
|
||||||
```
|
```
|
||||||
# Create a directory that stores your stacks and stores dockge's compose.yaml
|
# Create directories that store your stacks and stores Dockge's stack
|
||||||
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
|
||||||
@ -66,40 +72,24 @@ Dockge is now running on http://localhost:5001
|
|||||||
|
|
||||||
### Advanced
|
### Advanced
|
||||||
|
|
||||||
If you want to store your stacks in another directory, you can change the `DOCKGE_STACKS_DIR` environment variable and volumes.
|
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.
|
||||||
|
|
||||||
```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 pull && docker compose up -d
|
||||||
docker compose up -d
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
@ -122,7 +112,7 @@ 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
|
||||||
@ -130,15 +120,18 @@ 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 hope it sounds like `Dodge`.
|
"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.
|
||||||
|
|
||||||
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`.
|
||||||
|
|
||||||
@ -155,17 +148,18 @@ 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
|
||||||
|
|
||||||
## More Ideas?
|
#### Is Dockge a Portainer replacement?
|
||||||
|
|
||||||
- Stats
|
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.
|
||||||
- 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.
|
||||||
|
|
||||||
# Others
|
If you still need to manage something like docker networks, single containers, the answer may be no.
|
||||||
|
|
||||||
|
#### 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`.
|
||||||
|
@ -3,19 +3,16 @@ 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";
|
||||||
|
|
||||||
let interval : NodeJS.Timeout;
|
class CheckVersion {
|
||||||
|
version = packageJSON.version;
|
||||||
|
latestVersion? : string;
|
||||||
|
interval? : NodeJS.Timeout;
|
||||||
|
|
||||||
export function startInterval() {
|
async startInterval() {
|
||||||
const check = async () => {
|
const check = async () => {
|
||||||
if (await Settings.get("checkUpdate") === false) {
|
if (await Settings.get("checkUpdate") === false) {
|
||||||
return;
|
return;
|
||||||
@ -36,13 +33,13 @@ export function startInterval() {
|
|||||||
|
|
||||||
if (checkBeta && data.beta) {
|
if (checkBeta && data.beta) {
|
||||||
if (compareVersions.compare(data.beta, data.slow, ">")) {
|
if (compareVersions.compare(data.beta, data.slow, ">")) {
|
||||||
obj.latestVersion = data.beta;
|
this.latestVersion = data.beta;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.slow) {
|
if (data.slow) {
|
||||||
obj.latestVersion = data.slow;
|
this.latestVersion = data.slow;
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
@ -51,21 +48,10 @@ export function startInterval() {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
check();
|
await check();
|
||||||
interval = setInterval(check, UPDATE_CHECKER_INTERVAL_MS);
|
this.interval = setInterval(check, UPDATE_CHECKER_INTERVAL_MS);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const checkVersion = new CheckVersion();
|
||||||
|
export default checkVersion;
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
export class Docker {
|
|
||||||
|
|
||||||
}
|
|
@ -29,9 +29,11 @@ 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 childProcess from "child_process";
|
import childProcessAsync from "promisify-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;
|
||||||
@ -150,9 +152,6 @@ export class DockgeServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create all the necessary directories
|
|
||||||
this.initDataDir();
|
|
||||||
|
|
||||||
// Create express
|
// Create express
|
||||||
this.app = express();
|
this.app = express();
|
||||||
|
|
||||||
@ -195,7 +194,6 @@ export class DockgeServer {
|
|||||||
// Create Socket.io
|
// Create Socket.io
|
||||||
this.io = new socketIO.Server(this.httpServer, {
|
this.io = new socketIO.Server(this.httpServer, {
|
||||||
cors,
|
cors,
|
||||||
transports: [ "websocket" ],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.io.on("connection", async (socket: Socket) => {
|
this.io.on("connection", async (socket: Socket) => {
|
||||||
@ -256,6 +254,9 @@ 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);
|
||||||
@ -307,6 +308,7 @@ export class DockgeServer {
|
|||||||
this.sendStackList(true);
|
this.sendStackList(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
checkVersion.startInterval();
|
||||||
});
|
});
|
||||||
|
|
||||||
gracefulShutdown(this.httpServer, {
|
gracefulShutdown(this.httpServer, {
|
||||||
@ -484,7 +486,7 @@ export class DockgeServer {
|
|||||||
return jwtSecretBean;
|
return jwtSecretBean;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendStackList(useCache = false) {
|
async 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;
|
||||||
|
|
||||||
@ -495,7 +497,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 = Stack.getStackList(this, useCache);
|
let stackList = await 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());
|
||||||
@ -511,8 +513,8 @@ export class DockgeServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sendStackStatusList() {
|
async sendStackStatusList() {
|
||||||
let statusList = Stack.getStatusList();
|
let statusList = await Stack.getStatusList();
|
||||||
|
|
||||||
let roomList = this.io.sockets.adapter.rooms.keys();
|
let roomList = this.io.sockets.adapter.rooms.keys();
|
||||||
|
|
||||||
@ -530,8 +532,15 @@ export class DockgeServer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getDockerNetworkList() : string[] {
|
async getDockerNetworkList() : Promise<string[]> {
|
||||||
let res = childProcess.spawnSync("docker", [ "network", "ls", "--format", "{{.Name}}" ]);
|
let res = await childProcessAsync.spawn("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
|
||||||
|
@ -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, isAdd : unknown, callback) => {
|
socket.on("deployStack", async (name : unknown, composeYAML : unknown, composeENV : unknown, isAdd : unknown, callback) => {
|
||||||
try {
|
try {
|
||||||
checkLogin(socket);
|
checkLogin(socket);
|
||||||
const stack = this.saveStack(socket, server, name, composeYAML, isAdd);
|
const stack = await this.saveStack(socket, server, name, composeYAML, composeENV, 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, isAdd : unknown, callback) => {
|
socket.on("saveStack", async (name : unknown, composeYAML : unknown, composeENV : unknown, isAdd : unknown, callback) => {
|
||||||
try {
|
try {
|
||||||
checkLogin(socket);
|
checkLogin(socket);
|
||||||
this.saveStack(socket, server, name, composeYAML, isAdd);
|
this.saveStack(socket, server, name, composeYAML, composeENV, 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 = Stack.getStack(server, name);
|
const stack = await 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", (stackName : unknown, callback) => {
|
socket.on("getStack", async (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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName, true);
|
const stack = await 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 = server.getDockerNetworkList();
|
const dockerNetworkList = await server.getDockerNetworkList();
|
||||||
callback({
|
callback({
|
||||||
ok: true,
|
ok: true,
|
||||||
dockerNetworkList,
|
dockerNetworkList,
|
||||||
@ -264,7 +264,7 @@ export class DockerSocketHandler extends SocketHandler {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, isAdd : unknown) : Stack {
|
async saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, composeENV : unknown, isAdd : unknown) : Promise<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,12 +272,15 @@ 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);
|
const stack = new Stack(server, name, composeYAML, composeENV, false);
|
||||||
stack.save(isAdd);
|
await stack.save(isAdd);
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 = Stack.getStack(server, stackName);
|
const stack = await 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 = Stack.getStack(server, stackName);
|
const stack = await Stack.getStack(server, stackName);
|
||||||
await stack.leaveCombinedTerminal(socket);
|
await stack.leaveCombinedTerminal(socket);
|
||||||
|
|
||||||
callback({
|
callback({
|
||||||
|
124
backend/stack.ts
124
backend/stack.ts
@ -1,8 +1,8 @@
|
|||||||
import { DockgeServer } from "./dockge-server";
|
import { DockgeServer } from "./dockge-server";
|
||||||
import fs from "fs";
|
import fs, { promises as fsAsync } from "fs";
|
||||||
import { log } from "./log";
|
import { log } from "./log";
|
||||||
import yaml from "yaml";
|
import yaml from "yaml";
|
||||||
import { DockgeSocket, ValidationError } from "./util-server";
|
import { DockgeSocket, fileExists, ValidationError } from "./util-server";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import {
|
import {
|
||||||
COMBINED_TERMINAL_COLS,
|
COMBINED_TERMINAL_COLS,
|
||||||
@ -16,13 +16,14 @@ import {
|
|||||||
UNKNOWN
|
UNKNOWN
|
||||||
} from "./util-common";
|
} from "./util-common";
|
||||||
import { InteractiveTerminal, Terminal } from "./terminal";
|
import { InteractiveTerminal, Terminal } from "./terminal";
|
||||||
import childProcess from "child_process";
|
import childProcessAsync from "promisify-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;
|
||||||
@ -31,10 +32,11 @@ 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, skipFSOperations = false) {
|
constructor(server : DockgeServer, name : string, composeYAML? : string, composeENV? : 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
|
||||||
@ -53,6 +55,7 @@ export class Stack {
|
|||||||
return {
|
return {
|
||||||
...obj,
|
...obj,
|
||||||
composeYAML: this.composeYAML,
|
composeYAML: this.composeYAML,
|
||||||
|
composeENV: this.composeENV,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,11 +72,15 @@ 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`
|
||||||
*/
|
*/
|
||||||
ps() : object {
|
async ps() : Promise<object> {
|
||||||
let res = childProcess.execSync("docker compose ps --format json", {
|
let res = await childProcessAsync.spawn("docker", [ "compose", "ps", "--format", "json" ], {
|
||||||
cwd: this.path
|
cwd: this.path,
|
||||||
|
encoding: "utf-8",
|
||||||
});
|
});
|
||||||
return JSON.parse(res.toString());
|
if (!res.stdout) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
return JSON.parse(res.stdout.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
get isManagedByDockge() : boolean {
|
get isManagedByDockge() : boolean {
|
||||||
@ -92,6 +99,15 @@ 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 {
|
||||||
@ -105,6 +121,17 @@ 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);
|
||||||
}
|
}
|
||||||
@ -128,27 +155,35 @@ export class Stack {
|
|||||||
* Save the stack to the disk
|
* Save the stack to the disk
|
||||||
* @param isAdd
|
* @param isAdd
|
||||||
*/
|
*/
|
||||||
save(isAdd : boolean) {
|
async 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 (fs.existsSync(dir)) {
|
if (await fileExists(dir)) {
|
||||||
throw new ValidationError("Stack name already exists");
|
throw new ValidationError("Stack name already exists");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the stack folder
|
// Create the stack folder
|
||||||
fs.mkdirSync(dir);
|
await fsAsync.mkdir(dir);
|
||||||
} else {
|
} else {
|
||||||
if (!fs.existsSync(dir)) {
|
if (!await fileExists(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
|
||||||
fs.writeFileSync(path.join(dir, this._composeFileName), this.composeYAML);
|
await fsAsync.writeFile(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> {
|
||||||
@ -168,7 +203,7 @@ export class Stack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove the stack folder
|
// Remove the stack folder
|
||||||
fs.rmSync(this.path, {
|
await fsAsync.rm(this.path, {
|
||||||
recursive: true,
|
recursive: true,
|
||||||
force: true
|
force: true
|
||||||
});
|
});
|
||||||
@ -176,8 +211,8 @@ export class Stack {
|
|||||||
return exitCode;
|
return exitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateStatus() {
|
async updateStatus() {
|
||||||
let statusList = Stack.getStatusList();
|
let statusList = await Stack.getStatusList();
|
||||||
let status = statusList.get(this.name);
|
let status = statusList.get(this.name);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
@ -187,7 +222,7 @@ export class Stack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static getStackList(server : DockgeServer, useCacheForManaged = false) : Map<string, Stack> {
|
static async getStackList(server : DockgeServer, useCacheForManaged = false) : Promise<Map<string, Stack>> {
|
||||||
let stacksDir = server.stacksDir;
|
let stacksDir = server.stacksDir;
|
||||||
let stackList : Map<string, Stack>;
|
let stackList : Map<string, Stack>;
|
||||||
|
|
||||||
@ -198,16 +233,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 = fs.readdirSync(stacksDir);
|
let filenameList = await fsAsync.readdir(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 = fs.statSync(path.join(stacksDir, filename));
|
let stat = await fsAsync.stat(path.join(stacksDir, filename));
|
||||||
if (!stat.isDirectory()) {
|
if (!stat.isDirectory()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let stack = this.getStack(server, filename);
|
let stack = await this.getStack(server, filename);
|
||||||
stack._status = CREATED_FILE;
|
stack._status = CREATED_FILE;
|
||||||
stackList.set(filename, stack);
|
stackList.set(filename, stack);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -222,8 +257,15 @@ export class Stack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get status from docker compose ls
|
// Get status from docker compose ls
|
||||||
let res = childProcess.execSync("docker compose ls --all --format json");
|
let res = await childProcessAsync.spawn("docker", [ "compose", "ls", "--all", "--format", "json" ], {
|
||||||
let composeList = JSON.parse(res.toString());
|
encoding: "utf-8",
|
||||||
|
});
|
||||||
|
|
||||||
|
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);
|
||||||
@ -249,11 +291,18 @@ 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 getStatusList() : Map<string, number> {
|
static async getStatusList() : Promise<Map<string, number>> {
|
||||||
let statusList = new Map<string, number>();
|
let statusList = new Map<string, number>();
|
||||||
|
|
||||||
let res = childProcess.execSync("docker compose ls --all --format json");
|
let res = await childProcessAsync.spawn("docker", [ "compose", "ls", "--all", "--format", "json" ], {
|
||||||
let composeList = JSON.parse(res.toString());
|
encoding: "utf-8",
|
||||||
|
});
|
||||||
|
|
||||||
|
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));
|
||||||
@ -281,13 +330,13 @@ export class Stack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static getStack(server: DockgeServer, stackName: string, skipFSOperations = false) : Stack {
|
static async getStack(server: DockgeServer, stackName: string, skipFSOperations = false) : Promise<Stack> {
|
||||||
let dir = path.join(server.stacksDir, stackName);
|
let dir = path.join(server.stacksDir, stackName);
|
||||||
|
|
||||||
if (!skipFSOperations) {
|
if (!skipFSOperations) {
|
||||||
if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
|
if (!await fileExists(dir) || !(await fsAsync.stat(dir)).isDirectory()) {
|
||||||
// Maybe it is a stack managed by docker compose directly
|
// Maybe it is a stack managed by docker compose directly
|
||||||
let stackList = this.getStackList(server, true);
|
let stackList = await this.getStackList(server, true);
|
||||||
let stack = stackList.get(stackName);
|
let stack = stackList.get(stackName);
|
||||||
|
|
||||||
if (stack) {
|
if (stack) {
|
||||||
@ -306,7 +355,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, true);
|
stack = new Stack(server, stackName, undefined, undefined, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
stack._status = UNKNOWN;
|
stack._status = UNKNOWN;
|
||||||
@ -358,7 +407,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
|
||||||
this.updateStatus();
|
await 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;
|
||||||
@ -406,11 +455,17 @@ export class Stack {
|
|||||||
async getServiceStatusList() {
|
async getServiceStatusList() {
|
||||||
let statusList = new Map<string, number>();
|
let statusList = new Map<string, number>();
|
||||||
|
|
||||||
let res = childProcess.spawnSync("docker", [ "compose", "ps", "--format", "json" ], {
|
try {
|
||||||
|
let res = await childProcessAsync.spawn("docker", [ "compose", "ps", "--format", "json" ], {
|
||||||
cwd: this.path,
|
cwd: this.path,
|
||||||
|
encoding: "utf-8",
|
||||||
});
|
});
|
||||||
|
|
||||||
let lines = res.stdout.toString().split("\n");
|
if (!res.stdout) {
|
||||||
|
return statusList;
|
||||||
|
}
|
||||||
|
|
||||||
|
let lines = res.stdout?.toString().split("\n");
|
||||||
|
|
||||||
for (let line of lines) {
|
for (let line of lines) {
|
||||||
try {
|
try {
|
||||||
@ -425,5 +480,10 @@ export class Stack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return statusList;
|
return statusList;
|
||||||
|
} catch (e) {
|
||||||
|
log.error("getServiceStatusList", e);
|
||||||
|
return statusList;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,6 @@ import { LimitQueue } from "./utils/limit-queue";
|
|||||||
import { DockgeSocket } from "./util-server";
|
import { DockgeSocket } from "./util-server";
|
||||||
import {
|
import {
|
||||||
allowedCommandList, allowedRawKeys,
|
allowedCommandList, allowedRawKeys,
|
||||||
getComposeTerminalName,
|
|
||||||
getCryptoRandomInt,
|
|
||||||
PROGRESS_TERMINAL_ROWS,
|
PROGRESS_TERMINAL_ROWS,
|
||||||
TERMINAL_COLS,
|
TERMINAL_COLS,
|
||||||
TERMINAL_ROWS
|
TERMINAL_ROWS
|
||||||
@ -207,14 +205,20 @@ export class Terminal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static exec(server : DockgeServer, socket : DockgeSocket | undefined, terminalName : string, file : string, args : string | string[], cwd : string) : Promise<number> {
|
public static exec(server : DockgeServer, socket : DockgeSocket | undefined, terminalName : string, file : string, args : string | string[], cwd : string) : Promise<number> {
|
||||||
const terminal = new Terminal(server, terminalName, file, args, cwd);
|
return new Promise((resolve, reject) => {
|
||||||
|
// check if terminal exists
|
||||||
|
if (Terminal.terminalMap.has(terminalName)) {
|
||||||
|
reject("Another operation is already running, please try again later.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let terminal = new Terminal(server, terminalName, file, args, cwd);
|
||||||
terminal.rows = PROGRESS_TERMINAL_ROWS;
|
terminal.rows = PROGRESS_TERMINAL_ROWS;
|
||||||
|
|
||||||
if (socket) {
|
if (socket) {
|
||||||
terminal.join(socket);
|
terminal.join(socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
terminal.onExit((exitCode : number) => {
|
terminal.onExit((exitCode : number) => {
|
||||||
resolve(exitCode);
|
resolve(exitCode);
|
||||||
});
|
});
|
||||||
|
@ -1,13 +1,17 @@
|
|||||||
/*
|
/*
|
||||||
* Common utilities for backend and frontend
|
* Common utilities for backend and frontend
|
||||||
*/
|
*/
|
||||||
import { Document } from "yaml";
|
import yaml, { Document, Pair, Scalar } 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);
|
||||||
@ -203,7 +207,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-" + container + "-" + index;
|
return "container-exec-" + stackName + "-" + container + "-" + index;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function copyYAMLComments(doc : Document, src : Document) {
|
export function copyYAMLComments(doc : Document, src : Document) {
|
||||||
@ -340,3 +344,48 @@ 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -5,6 +5,7 @@ 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;
|
||||||
@ -82,3 +83,9 @@ 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);
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
# Your stacks directory in the host (The paths inside container must be the same as the host)
|
# Stacks Directory
|
||||||
# ⚠️⚠️ If you did it wrong, your data could end up be written into a wrong path.
|
# ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH.
|
||||||
# ✔️✔️✔️✔️ CORRECT: - /my-stacks:/my-stacks (Both paths match)
|
# ⚠️ 1. FULL path only. No relative path (MUST)
|
||||||
# ❌❌❌❌ WRONG: - /docker:/my-stacks (Both paths do not match)
|
# ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST)
|
||||||
- /opt/stacks:/opt/stacks
|
- /opt/stacks:/opt/stacks
|
||||||
environment:
|
environment:
|
||||||
# Tell Dockge where is your stacks directory
|
# Tell Dockge where is your stacks directory
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
FROM node:20-bookworm-slim
|
# Due to the bug of #145, Node.js's version cannot be changed, unless upstream is fixed.
|
||||||
|
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 \
|
||||||
@ -24,16 +22,3 @@ RUN apt update && apt install --yes --no-install-recommends \
|
|||||||
&& rm -rf /var/lib/apt/lists/* \
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
&& npm install pnpm -g \
|
&& npm install pnpm -g \
|
||||||
&& pnpm install -g tsx
|
&& pnpm install -g tsx
|
||||||
|
|
||||||
# ensures that /var/run/docker.sock exists
|
|
||||||
# changes the ownership of /var/run/docker.sock
|
|
||||||
RUN touch /var/run/docker.sock && chown node:node /var/run/docker.sock
|
|
||||||
|
|
||||||
# Full Base Image
|
|
||||||
# MariaDB, Chromium and fonts
|
|
||||||
#FROM base-slim AS base
|
|
||||||
#ENV DOCKGE_ENABLE_EMBEDDED_MARIADB=1
|
|
||||||
#RUN apt update && \
|
|
||||||
# apt --yes --no-install-recommends install mariadb-server && \
|
|
||||||
# rm -rf /var/lib/apt/lists/* && \
|
|
||||||
# apt --yes autoremove
|
|
||||||
|
10
docker/BuildHealthCheck.Dockerfile
Normal file
10
docker/BuildHealthCheck.Dockerfile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
############################################
|
||||||
|
# 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
|
@ -1,3 +1,8 @@
|
|||||||
|
############################################
|
||||||
|
# Healthcheck Binary
|
||||||
|
############################################
|
||||||
|
FROM louislam/dockge:build-healthcheck AS build_healthcheck
|
||||||
|
|
||||||
############################################
|
############################################
|
||||||
# Build
|
# Build
|
||||||
############################################
|
############################################
|
||||||
@ -12,16 +17,17 @@ 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 . .
|
COPY --chown=node:node --from=build_healthcheck /app/extra/healthcheck /app/extra/healthcheck
|
||||||
COPY --from=build /app/node_modules /app/node_modules
|
COPY --from=build /app/node_modules /app/node_modules
|
||||||
|
COPY --chown=node:node . .
|
||||||
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
|
||||||
############################################
|
############################################
|
||||||
|
74
extra/healthcheck.go
Normal file
74
extra/healthcheck.go
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
|
||||||
|
}
|
84
extra/reset-password.ts
Normal file
84
extra/reset-password.ts
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
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();
|
||||||
|
}
|
@ -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 service.ports" :key="port" :href="parsePort(port).url" target="_blank">
|
<a v-for="port in envsubstService.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,16 +213,29 @@ 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.service.image) {
|
if (this.envsubstService.image) {
|
||||||
return this.service.image.split(":")[0];
|
return this.envsubstService.image.split(":")[0];
|
||||||
} else {
|
} else {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
imageTag() {
|
imageTag() {
|
||||||
if (this.service.image) {
|
if (this.envsubstService.image) {
|
||||||
let tag = this.service.image.split(":")[1];
|
let tag = this.envsubstService.image.split(":")[1];
|
||||||
|
|
||||||
if (tag) {
|
if (tag) {
|
||||||
return tag;
|
return tag;
|
||||||
|
@ -152,6 +152,14 @@ 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;
|
||||||
|
@ -22,7 +22,11 @@ const languageList = {
|
|||||||
"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 = {
|
||||||
@ -35,7 +39,7 @@ for (let lang in languageList) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const rtlLangs = [ "fa", "ar-SY", "ur" ];
|
const rtlLangs = [ "fa", "ar-SY", "ur", "ar" ];
|
||||||
|
|
||||||
export const currentLocale = () => localStorage.locale
|
export const currentLocale = () => localStorage.locale
|
||||||
|| languageList[navigator.language] && navigator.language
|
|| languageList[navigator.language] && navigator.language
|
||||||
|
@ -2,13 +2,18 @@
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
(11-21-2023) Updated
|
1. Add your Language at <https://weblate.kuma.pet/projects/dockge/dockge/>.
|
||||||
|
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.
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
"compose": "أنشاء كمبوز",
|
"compose": "أنشاء كمبوز",
|
||||||
"addFirstStackMsg": "أنشيء أول كمبوز!",
|
"addFirstStackMsg": "أنشيء أول كمبوز!",
|
||||||
"stackName": "اسم المكدسة",
|
"stackName": "اسم المكدسة",
|
||||||
"deployStack": "شنر",
|
"deployStack": "نشر",
|
||||||
"deleteStack": "حذف",
|
"deleteStack": "حذف",
|
||||||
"stopStack": "إيقاف",
|
"stopStack": "إيقاف",
|
||||||
"restartStack": "إعادة تشغيل",
|
"restartStack": "إعادة تشغيل",
|
||||||
@ -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,5 +91,12 @@
|
|||||||
"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...": "جاري الاتصال بخادم المقبس…"
|
||||||
}
|
}
|
||||||
|
102
frontend/src/lang/da.json
Normal file
102
frontend/src/lang/da.json
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
@ -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": "Authentifizierung deaktiviert.",
|
"signedInDispDisabled": "Anmeldung deaktiviert.",
|
||||||
"home": "Startseite",
|
"home": "Startseite",
|
||||||
"console": "Konsole",
|
"console": "Konsole",
|
||||||
"registry": "Register",
|
"registry": "Container Registry",
|
||||||
"compose": "Zusammenstellen",
|
"compose": "",
|
||||||
"addFirstStackMsg": "Stelle deinen ersten Stack zusammen!",
|
"addFirstStackMsg": "Stelle deinen ersten Stack zusammen!",
|
||||||
"stackName": "Stack-Name",
|
"stackName": "Stack-Name",
|
||||||
"deployStack": "Bereitstellen",
|
"deployStack": "Deployen",
|
||||||
"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/A",
|
"notAvailableShort": "N/V",
|
||||||
"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 | Umgebungsvariablen",
|
"environmentVariable": "Umgebungsvariable/n",
|
||||||
"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 | Container-Abhängigkeiten",
|
"dependsOn": "Container-Abhängigkeit/en",
|
||||||
"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>Authentifizierung deaktivieren</strong> möchtest?",
|
"disableauth.message1": "Bist du sicher, dass du die <strong>Anmeldung 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 holen",
|
"autoGet": "Automatisch laden",
|
||||||
"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": "Authentifizierung aktivieren",
|
"Enable Auth": "Anmeldung aktivieren",
|
||||||
"Disable Auth": "Authentifizierung deaktivieren",
|
"Disable Auth": "Anmeldung 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,5 +90,13 @@
|
|||||||
"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…"
|
||||||
}
|
}
|
@ -95,8 +95,9 @@
|
|||||||
"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"
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"languageName": "Francais",
|
"languageName": "Français",
|
||||||
"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",
|
||||||
@ -26,7 +26,7 @@
|
|||||||
"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érale",
|
"general": "Général",
|
||||||
"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 à YAML",
|
"applyToYAML": "Appliquer au YAML",
|
||||||
"createExternalNetwork": "Créer",
|
"createExternalNetwork": "Créer",
|
||||||
"addInternalNetwork": "Ajouter",
|
"addInternalNetwork": "Ajouter",
|
||||||
"Save": "Enregistrer",
|
"Save": "Enregistrer",
|
||||||
@ -90,5 +90,13 @@
|
|||||||
"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…"
|
||||||
}
|
}
|
||||||
|
@ -91,5 +91,11 @@
|
|||||||
"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…"
|
||||||
}
|
}
|
||||||
|
98
frontend/src/lang/ja.json
Normal file
98
frontend/src/lang/ja.json
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
{
|
||||||
|
"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...": "ソケットサーバーに接続中…"
|
||||||
|
}
|
@ -90,5 +90,13 @@
|
|||||||
"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...": "재연결 중…"
|
||||||
}
|
}
|
||||||
|
102
frontend/src/lang/nl.json
Normal file
102
frontend/src/lang/nl.json
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
102
frontend/src/lang/ro.json
Normal file
102
frontend/src/lang/ro.json
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
{
|
||||||
|
"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."
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
"PasswordsDoNotMatch": "Пароль не совпадает.",
|
"PasswordsDoNotMatch": "Пароль не совпадает.",
|
||||||
"Repeat Password": "Повторите пароль",
|
"Repeat Password": "Повторите пароль",
|
||||||
"Create": "Создать",
|
"Create": "Создать",
|
||||||
"signedInDisp": "Авторизлван как {0}",
|
"signedInDisp": "Авторизован как",
|
||||||
"signedInDispDisabled": "Авторизация выключена.",
|
"signedInDispDisabled": "Авторизация выключена.",
|
||||||
"home": "Главная",
|
"home": "Главная",
|
||||||
"console": "Консоль",
|
"console": "Консоль",
|
||||||
|
@ -90,5 +90,13 @@
|
|||||||
"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 | URL’ler",
|
||||||
|
"Cannot connect to the socket server.": "Soket sunucusuna bağlanılamıyor.",
|
||||||
|
"downStack": "Durdur & Kapat"
|
||||||
}
|
}
|
||||||
|
@ -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}",
|
||||||
@ -13,7 +13,7 @@
|
|||||||
"compose": "Compose",
|
"compose": "Compose",
|
||||||
"addFirstStackMsg": "Додайте свій перший стек!",
|
"addFirstStackMsg": "Додайте свій перший стек!",
|
||||||
"stackName": "Назва стеку",
|
"stackName": "Назва стеку",
|
||||||
"deployStack": "Розрознути",
|
"deployStack": "Розгорнути",
|
||||||
"deleteStack": "Видалити",
|
"deleteStack": "Видалити",
|
||||||
"stopStack": "Зупинити",
|
"stopStack": "Зупинити",
|
||||||
"restartStack": "Перезапустити",
|
"restartStack": "Перезапустити",
|
||||||
@ -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,5 +90,13 @@
|
|||||||
"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": "Додатково"
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
"stopStack": "روکو",
|
"stopStack": "روکو",
|
||||||
"restartStack": "دوبارہ شروع کریں",
|
"restartStack": "دوبارہ شروع کریں",
|
||||||
"updateStack": "اپ ڈیٹ",
|
"updateStack": "اپ ڈیٹ",
|
||||||
"startStack": "شروع کریں۔",
|
"startStack": "شروع کریں",
|
||||||
"editStack": "ترمیم",
|
"editStack": "ترمیم",
|
||||||
"discardStack": "رد کر دیں۔",
|
"discardStack": "رد کر دیں",
|
||||||
"saveStackDraft": "محفوظ کریں۔",
|
"saveStackDraft": "محفوظ کریں۔",
|
||||||
"notAvailableShort": "N / A",
|
"notAvailableShort": "N / A",
|
||||||
"deleteStackMsg": "کیا آپ واقعی اس اسٹیک کو حذف کرنا چاہتے ہیں؟",
|
"deleteStackMsg": "کیا آپ واقعی اس اسٹیک کو حذف کرنا چاہتے ہیں؟",
|
||||||
@ -28,7 +28,7 @@
|
|||||||
"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,5 +90,13 @@
|
|||||||
"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 کے لیے ترتیب دینے کا طریقہ چیک کریں"
|
||||||
}
|
}
|
||||||
|
@ -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,5 +90,13 @@
|
|||||||
"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": "停止并删除"
|
||||||
}
|
}
|
||||||
|
@ -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,5 +90,13 @@
|
|||||||
"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": "額外"
|
||||||
}
|
}
|
||||||
|
@ -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-info me-3">
|
<a v-if="hasNewVersion" target="_blank" href="https://github.com/louislam/dockge/releases" class="btn btn-warning me-3">
|
||||||
<font-awesome-icon icon="arrow-alt-circle-up" /> {{ $t("New Update") }}
|
<font-awesome-icon icon="arrow-alt-circle-up" /> {{ $t("newUpdate") }}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<ul class="nav nav-pills">
|
<ul class="nav nav-pills">
|
||||||
|
@ -109,7 +109,7 @@ export default defineComponent({
|
|||||||
}, 1500);
|
}, 1500);
|
||||||
|
|
||||||
socket = io(url, {
|
socket = io(url, {
|
||||||
transports: [ "websocket" ]
|
transports: [ "websocket", "polling" ]
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on("connect", () => {
|
socket.on("connect", () => {
|
||||||
|
@ -154,7 +154,7 @@
|
|||||||
ref="editor"
|
ref="editor"
|
||||||
v-model="stack.composeYAML"
|
v-model="stack.composeYAML"
|
||||||
class="yaml-editor"
|
class="yaml-editor"
|
||||||
:highlight="highlighter"
|
:highlight="highlighterYAML"
|
||||||
line-numbers :readonly="!isEditMode"
|
line-numbers :readonly="!isEditMode"
|
||||||
@input="yamlCodeChange"
|
@input="yamlCodeChange"
|
||||||
@focus="editorFocus = true"
|
@focus="editorFocus = true"
|
||||||
@ -165,6 +165,22 @@
|
|||||||
{{ 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">
|
||||||
@ -215,7 +231,7 @@ import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
|
|||||||
import {
|
import {
|
||||||
COMBINED_TERMINAL_COLS,
|
COMBINED_TERMINAL_COLS,
|
||||||
COMBINED_TERMINAL_ROWS,
|
COMBINED_TERMINAL_ROWS,
|
||||||
copyYAMLComments,
|
copyYAMLComments, envsubstYAML,
|
||||||
getCombinedTerminalName,
|
getCombinedTerminalName,
|
||||||
getComposeTerminalName,
|
getComposeTerminalName,
|
||||||
PROGRESS_TERMINAL_ROWS,
|
PROGRESS_TERMINAL_ROWS,
|
||||||
@ -223,6 +239,7 @@ 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:
|
||||||
@ -232,10 +249,16 @@ 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: {
|
||||||
@ -255,6 +278,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
editorFocus: false,
|
editorFocus: false,
|
||||||
jsonConfig: {},
|
jsonConfig: {},
|
||||||
|
envsubstJSONConfig: {},
|
||||||
yamlError: "",
|
yamlError: "",
|
||||||
processing: true,
|
processing: true,
|
||||||
showProgressTerminal: false,
|
showProgressTerminal: false,
|
||||||
@ -350,6 +374,17 @@ 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) {
|
||||||
@ -381,19 +416,26 @@ 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,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -492,7 +534,7 @@ export default {
|
|||||||
|
|
||||||
this.bindTerminal(this.terminalName);
|
this.bindTerminal(this.terminalName);
|
||||||
|
|
||||||
this.$root.getSocket().emit("deployStack", this.stack.name, this.stack.composeYAML, this.isAdd, (res) => {
|
this.$root.getSocket().emit("deployStack", this.stack.name, this.stack.composeYAML, this.stack.composeENV, this.isAdd, (res) => {
|
||||||
this.processing = false;
|
this.processing = false;
|
||||||
this.$root.toastRes(res);
|
this.$root.toastRes(res);
|
||||||
|
|
||||||
@ -506,7 +548,7 @@ export default {
|
|||||||
saveStack() {
|
saveStack() {
|
||||||
this.processing = true;
|
this.processing = true;
|
||||||
|
|
||||||
this.$root.getSocket().emit("saveStack", this.stack.name, this.stack.composeYAML, this.isAdd, (res) => {
|
this.$root.getSocket().emit("saveStack", this.stack.name, this.stack.composeYAML, this.stack.composeENV, this.isAdd, (res) => {
|
||||||
this.processing = false;
|
this.processing = false;
|
||||||
this.$root.toastRes(res);
|
this.$root.toastRes(res);
|
||||||
|
|
||||||
@ -576,13 +618,48 @@ export default {
|
|||||||
this.isEditMode = false;
|
this.isEditMode = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
highlighter(code) {
|
highlighterYAML(code) {
|
||||||
return highlight(code, languages.yaml);
|
if (!languages.yaml_with_symbols) {
|
||||||
|
languages.yaml_with_symbols = languages.insertBefore("yaml", "punctuation", {
|
||||||
|
"symbol": prismjsSymbolDefinition["symbol"]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return highlight(code, languages.yaml_with_symbols);
|
||||||
},
|
},
|
||||||
|
|
||||||
yamlCodeChange() {
|
highlighterENV(code) {
|
||||||
try {
|
if (!languages.docker_env) {
|
||||||
let doc = parseDocument(this.stack.composeYAML);
|
languages.docker_env = {
|
||||||
|
"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];
|
||||||
}
|
}
|
||||||
@ -599,9 +676,23 @@ 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) {
|
||||||
|
14
package.json
14
package.json
@ -1,7 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "dockge",
|
"name": "dockge",
|
||||||
"version": "1.1.1",
|
"version": "1.3.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18.0.0 && <= 18.17.1"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"fmt": "eslint \"**/*.{ts,vue}\" --fix",
|
"fmt": "eslint \"**/*.{ts,vue}\" --fix",
|
||||||
"lint": "eslint \"**/*.{ts,vue}\"",
|
"lint": "eslint \"**/*.{ts,vue}\"",
|
||||||
@ -14,12 +17,15 @@
|
|||||||
"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",
|
||||||
@ -28,6 +34,7 @@
|
|||||||
"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",
|
||||||
@ -36,12 +43,13 @@
|
|||||||
"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": "~3.14.0",
|
"tsx": "~4.6.2",
|
||||||
"type-fest": "~4.3.3",
|
"type-fest": "~4.3.3",
|
||||||
"yaml": "~2.3.4"
|
"yaml": "~2.3.4"
|
||||||
},
|
},
|
||||||
|
521
pnpm-lock.yaml
generated
521
pnpm-lock.yaml
generated
@ -8,6 +8,9 @@ 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
|
||||||
@ -32,6 +35,9 @@ 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
|
||||||
@ -56,6 +62,9 @@ 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)
|
||||||
@ -72,8 +81,8 @@ dependencies:
|
|||||||
specifier: ~2.5.1
|
specifier: ~2.5.1
|
||||||
version: 2.5.1
|
version: 2.5.1
|
||||||
tsx:
|
tsx:
|
||||||
specifier: ~3.14.0
|
specifier: ~4.6.2
|
||||||
version: 3.14.0
|
version: 4.6.2
|
||||||
type-fest:
|
type-fest:
|
||||||
specifier: ~4.3.3
|
specifier: ~4.3.3
|
||||||
version: 4.3.3
|
version: 4.3.3
|
||||||
@ -242,6 +251,13 @@ 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'}
|
||||||
@ -815,6 +831,18 @@ 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'}
|
||||||
@ -873,12 +901,10 @@ 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==}
|
||||||
@ -886,7 +912,6 @@ 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==}
|
||||||
@ -1648,6 +1673,13 @@ 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
|
||||||
@ -1657,6 +1689,24 @@ 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
|
||||||
@ -1754,16 +1804,11 @@ 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:
|
||||||
@ -1877,6 +1922,15 @@ 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:
|
||||||
@ -2105,6 +2159,15 @@ 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
|
||||||
@ -2142,7 +2205,6 @@ 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==}
|
||||||
@ -2151,6 +2213,11 @@ 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
|
||||||
@ -2248,6 +2315,69 @@ 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'}
|
||||||
@ -2327,6 +2457,11 @@ 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'}
|
||||||
@ -2536,7 +2671,6 @@ 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==}
|
||||||
@ -2550,7 +2684,6 @@ 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==}
|
||||||
@ -2564,7 +2697,6 @@ 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==}
|
||||||
@ -2617,6 +2749,12 @@ 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'}
|
||||||
@ -2669,6 +2807,20 @@ 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'}
|
||||||
@ -2725,6 +2877,14 @@ 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:
|
||||||
@ -2744,7 +2904,6 @@ 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==}
|
||||||
@ -2783,6 +2942,13 @@ 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'}
|
||||||
@ -2795,6 +2961,17 @@ 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:
|
||||||
@ -2808,6 +2985,10 @@ 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'}
|
||||||
@ -2833,6 +3014,13 @@ 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
|
||||||
@ -2922,7 +3110,6 @@ 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==}
|
||||||
@ -2968,6 +3155,15 @@ 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'}
|
||||||
@ -2990,6 +3186,20 @@ 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'}
|
||||||
@ -2997,6 +3207,14 @@ 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'}
|
||||||
@ -3004,15 +3222,26 @@ 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==}
|
||||||
@ -3024,7 +3253,6 @@ 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==}
|
||||||
@ -3032,10 +3260,21 @@ 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==}
|
||||||
@ -3051,6 +3290,51 @@ 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
|
||||||
@ -3391,6 +3675,11 @@ 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
|
||||||
@ -3398,7 +3687,6 @@ 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==}
|
||||||
@ -3411,7 +3699,6 @@ 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==}
|
||||||
@ -3685,6 +3972,21 @@ 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'}
|
||||||
@ -3796,7 +4098,6 @@ 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==}
|
||||||
@ -3813,7 +4114,6 @@ 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==}
|
||||||
@ -3887,6 +4187,11 @@ 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'}
|
||||||
@ -3927,7 +4232,6 @@ 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==}
|
||||||
@ -4002,6 +4306,15 @@ 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'}
|
||||||
@ -4043,7 +4356,6 @@ 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==}
|
||||||
@ -4075,12 +4387,29 @@ 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
|
||||||
@ -4157,6 +4486,15 @@ 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
|
||||||
@ -4205,6 +4543,11 @@ 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'}
|
||||||
@ -4290,18 +4633,6 @@ 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
|
||||||
@ -4362,6 +4693,45 @@ 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
|
||||||
@ -4479,7 +4849,6 @@ 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==}
|
||||||
@ -4514,13 +4883,13 @@ packages:
|
|||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/tsx@3.14.0:
|
/tsx@4.6.2:
|
||||||
resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==}
|
resolution: {integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==}
|
||||||
|
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
|
||||||
@ -4561,6 +4930,44 @@ 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'}
|
||||||
@ -4577,6 +4984,15 @@ 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==}
|
||||||
|
|
||||||
@ -4841,10 +5257,31 @@ 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'}
|
||||||
|
Reference in New Issue
Block a user